mirror of
https://github.com/RGBCube/serenity
synced 2025-07-26 02:27:43 +00:00
Use a CircularQueue for the PS/2 mouse driver.
This commit is contained in:
parent
8ad2dfb6e1
commit
09ba129bcf
2 changed files with 12 additions and 5 deletions
|
@ -44,7 +44,9 @@ void PS2MouseDevice::handle_irq()
|
||||||
(m_data[0] & 2) ? "Right" : ""
|
(m_data[0] & 2) ? "Right" : ""
|
||||||
);
|
);
|
||||||
#endif
|
#endif
|
||||||
m_buffer.write((const byte*)m_data, 3);
|
m_queue.enqueue(m_data[0]);
|
||||||
|
m_queue.enqueue(m_data[1]);
|
||||||
|
m_queue.enqueue(m_data[2]);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -118,12 +120,18 @@ byte PS2MouseDevice::mouse_read()
|
||||||
|
|
||||||
bool PS2MouseDevice::can_read(Process&) const
|
bool PS2MouseDevice::can_read(Process&) const
|
||||||
{
|
{
|
||||||
return !m_buffer.is_empty();
|
return !m_queue.is_empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
ssize_t PS2MouseDevice::read(Process&, byte* buffer, size_t size)
|
ssize_t PS2MouseDevice::read(Process&, byte* buffer, size_t size)
|
||||||
{
|
{
|
||||||
return m_buffer.read(buffer, size);
|
ssize_t nread = 0;
|
||||||
|
while ((size_t)nread < size) {
|
||||||
|
if (m_queue.is_empty())
|
||||||
|
break;
|
||||||
|
buffer[nread++] = m_queue.dequeue();
|
||||||
|
}
|
||||||
|
return nread;
|
||||||
}
|
}
|
||||||
|
|
||||||
ssize_t PS2MouseDevice::write(Process&, const byte*, size_t)
|
ssize_t PS2MouseDevice::write(Process&, const byte*, size_t)
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <VirtualFileSystem/CharacterDevice.h>
|
#include <VirtualFileSystem/CharacterDevice.h>
|
||||||
#include "DoubleBuffer.h"
|
|
||||||
#include "IRQHandler.h"
|
#include "IRQHandler.h"
|
||||||
|
|
||||||
class PS2MouseDevice final : public IRQHandler, public CharacterDevice {
|
class PS2MouseDevice final : public IRQHandler, public CharacterDevice {
|
||||||
|
@ -29,7 +28,7 @@ private:
|
||||||
void wait_then_write(byte port, byte data);
|
void wait_then_write(byte port, byte data);
|
||||||
byte wait_then_read(byte port);
|
byte wait_then_read(byte port);
|
||||||
|
|
||||||
DoubleBuffer m_buffer;
|
CircularQueue<byte, 600> m_queue;
|
||||||
byte m_data_state { 0 };
|
byte m_data_state { 0 };
|
||||||
signed_byte m_data[3];
|
signed_byte m_data[3];
|
||||||
};
|
};
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue