Set up fourth mouse packet

This commit is contained in:
Jeremy Soller 2016-08-31 22:31:51 -06:00
parent 555ad5fd92
commit 3b700191cf

View file

@ -56,11 +56,17 @@ enum KeyboardCommand {
#[repr(u8)] #[repr(u8)]
enum MouseCommand { enum MouseCommand {
GetDeviceId = 0xF2,
EnableReporting = 0xF4, EnableReporting = 0xF4,
SetDefaults = 0xF6, SetDefaults = 0xF6,
Reset = 0xFF Reset = 0xFF
} }
#[repr(u8)]
enum MouseCommandData {
SetSampleRate = 0xF3,
}
bitflags! { bitflags! {
flags MousePacketFlags: u8 { flags MousePacketFlags: u8 {
const LEFT_BUTTON = 1, const LEFT_BUTTON = 1,
@ -78,8 +84,9 @@ pub struct Ps2 {
data: Pio<u8>, data: Pio<u8>,
status: ReadOnly<Pio<u8>>, status: ReadOnly<Pio<u8>>,
command: WriteOnly<Pio<u8>>, command: WriteOnly<Pio<u8>>,
mouse: [u8; 3], mouse: [u8; 4],
mouse_i: usize mouse_i: usize,
mouse_extra: bool
} }
impl Ps2 { impl Ps2 {
@ -88,8 +95,9 @@ impl Ps2 {
data: Pio::new(0x60), data: Pio::new(0x60),
status: ReadOnly::new(Pio::new(0x64)), status: ReadOnly::new(Pio::new(0x64)),
command: WriteOnly::new(Pio::new(0x64)), command: WriteOnly::new(Pio::new(0x64)),
mouse: [0; 3], mouse: [0; 4],
mouse_i: 0 mouse_i: 0,
mouse_extra: false
} }
} }
@ -107,7 +115,7 @@ impl Ps2 {
fn flush_read(&mut self) { fn flush_read(&mut self) {
while self.status().contains(OUTPUT_FULL) { while self.status().contains(OUTPUT_FULL) {
self.data.read(); print!("FLUSH: {:X}\n", self.data.read());
} }
} }
@ -147,6 +155,15 @@ impl Ps2 {
self.read() self.read()
} }
fn mouse_command_data(&mut self, command: MouseCommandData, data: u8) -> u8 {
self.command(Command::WriteSecond);
self.write(command as u8);
self.read();
self.command(Command::WriteSecond);
self.write(data as u8);
self.read()
}
fn init(&mut self) { fn init(&mut self) {
// Disable devices // Disable devices
self.command(Command::DisableFirst); self.command(Command::DisableFirst);
@ -175,6 +192,51 @@ impl Ps2 {
return; return;
} }
// Enable devices
self.command(Command::EnableFirst);
self.command(Command::EnableSecond);
// Reset and enable scanning on keyboard
// TODO: Check for ack
print!("KEYBOARD RESET {:X}\n", self.keyboard_command(KeyboardCommand::Reset));
print!("KEYBOARD RESET RESULT {:X} == 0xAA\n", self.read());
self.flush_read();
// Reset and enable scanning on mouse
// TODO: Check for ack
print!("MOUSE RESET {:X}\n", self.mouse_command(MouseCommand::Reset));
print!("MOUSE RESET RESULT {:X} == 0xAA\n", self.read());
print!("MOUSE RESET ID {:X} == 0x00\n", self.read());
self.flush_read();
// Enable extra packet on mouse
print!("SAMPLE 200 {:X}\n", self.mouse_command_data(MouseCommandData::SetSampleRate, 200));
print!("SAMPLE 100 {:X}\n", self.mouse_command_data(MouseCommandData::SetSampleRate, 100));
print!("SAMPLE 80 {:X}\n", self.mouse_command_data(MouseCommandData::SetSampleRate, 80));
print!("GET ID {:X}\n", self.mouse_command(MouseCommand::GetDeviceId));
let mouse_id = self.read();
print!("MOUSE ID: {:X} == 0x03\n", mouse_id);
self.mouse_extra = mouse_id == 3;
// Enable extra buttons, TODO
/*
if self.mouse_extra {
print!("SAMPLE 200 {:X}\n", self.mouse_command_data(MouseCommandData::SetSampleRate, 200));
print!("SAMPLE 200 {:X}\n", self.mouse_command_data(MouseCommandData::SetSampleRate, 200));
print!("SAMPLE 80 {:X}\n", self.mouse_command_data(MouseCommandData::SetSampleRate, 80));
print!("GET ID {:X}\n", self.mouse_command(MouseCommand::GetDeviceId));
let mouse_id = self.read();
print!("MOUSE ID: {:X} == 0x04\n", mouse_id);
}
*/
// Set sample rate to maximum
print!("SAMPLE 200 {:X}\n", self.mouse_command_data(MouseCommandData::SetSampleRate, 200));
// Enable data reporting
print!("KEYBOARD ENABLE {:X}\n", self.keyboard_command(KeyboardCommand::EnableReporting));
print!("MOUSE ENABLE {:X}\n", self.mouse_command(MouseCommand::EnableReporting));
// Enable clocks and interrupts // Enable clocks and interrupts
{ {
let mut config = self.config(); let mut config = self.config();
@ -184,21 +246,6 @@ impl Ps2 {
config.insert(SECOND_INTERRUPT); config.insert(SECOND_INTERRUPT);
self.set_config(config); self.set_config(config);
} }
// Enable devices
self.command(Command::EnableFirst);
self.command(Command::EnableSecond);
// Reset and enable scanning on keyboard
// TODO: Check for ack
self.keyboard_command(KeyboardCommand::Reset);
self.keyboard_command(KeyboardCommand::EnableReporting);
// Reset and enable scanning on mouse
// TODO: Check for ack
self.mouse_command(MouseCommand::Reset);
self.mouse_command(MouseCommand::EnableReporting);
} }
pub fn on_keyboard(&mut self) { pub fn on_keyboard(&mut self) {
@ -209,7 +256,7 @@ impl Ps2 {
pub fn on_mouse(&mut self) { pub fn on_mouse(&mut self) {
self.mouse[self.mouse_i] = self.data.read(); self.mouse[self.mouse_i] = self.data.read();
self.mouse_i += 1; self.mouse_i += 1;
if self.mouse_i >= self.mouse.len() { if self.mouse_i >= self.mouse.len() || (!self.mouse_extra && self.mouse_i >= 3) {
self.mouse_i = 0; self.mouse_i = 0;
let flags = MousePacketFlags::from_bits_truncate(self.mouse[0]); let flags = MousePacketFlags::from_bits_truncate(self.mouse[0]);
@ -224,7 +271,13 @@ impl Ps2 {
y -= 0x100; y -= 0x100;
} }
print!("MOUSE {}, {}, {:?}\n", x, y, flags); let extra = if self.mouse_extra {
self.mouse[3]
} else {
0
};
print!("MOUSE {:?}, {}, {}, {}\n", flags, x, y, extra);
} }
} }
} }