From d08e73cf081568b08646a2e05401d1429f4471d0 Mon Sep 17 00:00:00 2001 From: Martin 'povik' Poviser Date: Wed, 11 Feb 2009 19:20:51 +0100 Subject: [PATCH] Mouse initialization added. --- kernel/drivers/char/mouse/ps2.c | 173 +++++++++++++++++++--------------------- 1 file changed, 82 insertions(+), 91 deletions(-) diff --git a/kernel/drivers/char/mouse/ps2.c b/kernel/drivers/char/mouse/ps2.c index aac3784..7a8122e 100644 --- a/kernel/drivers/char/mouse/ps2.c +++ b/kernel/drivers/char/mouse/ps2.c @@ -31,14 +31,19 @@ #define PS2MOUSE_SAMPLERATE PS2MOUSE_SAMPLERATE_100 + +bool ps2mouse_extwheel = 0; +bool ps2mouse_extbuttons = 0; + +short mouse_id; + static int cursor_x; static int cursor_y; static int cursor_state; bool ps2mouse_reset (); -bool ps2mouse_command_write (unsigned char command); bool ps2mouse_write (unsigned char command); -unsigned char ps2mouse_read (); +short ps2mouse_read (); /* ps2mouse_reset - reset mouse */ @@ -71,37 +76,6 @@ bool ps2mouse_reset() return 0; } -/* ps2mouse_command_write - send a command to mouse */ - -bool ps2mouse_command_write(unsigned char command) -{ - int timeout; - - for (timeout = 0; timeout < PS2MOUSE_TIMEOUT; timeout ++) - { - if((inb (PS2MOUSE_CTRL) && 0x02) != 0x02) - break; - schedule (); - } - - outb (PS2MOUSE_CTRL, PS2MOUSE_COMMAND); - outb (PS2MOUSE_PORT, command); - - for (timeout = 0; timeout < PS2MOUSE_TIMEOUT; timeout ++) - { - int read = ps2mouse_read (); - if (read == PS2MOUSE_ACK) - return 1; - - if (read == -1) - return 0; - - schedule (); - } - - return 0; -} - /* ps2mouse_write - send a command to mouse */ bool ps2mouse_write(unsigned char command) @@ -115,26 +89,23 @@ bool ps2mouse_write(unsigned char command) schedule (); } + outb (PS2MOUSE_CTRL, PS2MOUSE_COMMAND); outb (PS2MOUSE_PORT, command); - for (timeout = 0; timeout < PS2MOUSE_TIMEOUT; timeout ++) - { - int read = ps2mouse_read (); - if (read == PS2MOUSE_ACK) - return 1; - - if (read == -1) - return 0; + short read = ps2mouse_read (); - schedule (); - } + if (read == PS2MOUSE_ACK) + return 1; + + if (read == -1) + return 0; - return -1; + return 0; } /* ps2mouse_read - read a value from mouse */ -unsigned char ps2mouse_read() +short ps2mouse_read() { int timeout; @@ -150,31 +121,19 @@ unsigned char ps2mouse_read() void ps2mouse_handler (struct regs *r) { - kprintf("handler ()\n"); - -/* while (inb(0x64) == 0x02) // Wait until on port 0x64 isn´t 02h - schedule(); - - outb(0x64,0xD4); - outb(0x60,0xEB); - - while (inb(0x64) == 0x01) // Wait until on port 0x64 isn´t 01h - schedule (); - - char b1 = inb (0x60); + unsigned char b1, b2, b3, b4; - while (inb(0x64) == 0x01) // Wait until on port 0x64 isn´t 01h - schedule (); - - char b2 = inb (0x60); - - while (inb(0x64) == 0x01) // Wait until on port 0x64 isn´t 01h - schedule(); + ps2mouse_write (PS2MOUSE_COMMAND_GET_PACKET); - char b3 = inb(0x60); + b1 = ps2mouse_read(); + b2 = ps2mouse_read(); + b3 = ps2mouse_read(); + + if (ps2mouse_extwheel) + b4 = ps2mouse_read(); - if ((b1 & (1 << 6)) == 0) - return; + //if ((b1 & (1 << 6)) == 0) + // return; cursor_x += (int) (char) ((b1 << 6) | (b2 & 0x3f)); cursor_y += (int) (char) (((b1 << 4) & 0xc0) | (b3 & 0x3f)); @@ -191,39 +150,68 @@ void ps2mouse_handler (struct regs *r) if (cursor_x > 319) cursor_x = 319; - cursor_state = (b1 >> 4) & 3;*/ + cursor_state = (b1 >> 4) & 3; + + kprintf ("%d - %d - %d \n", cursor_x, cursor_y, b4); +} + +void ps2mouse_get_mouseid () +{ + ps2mouse_write (PS2MOUSE_COMMAND_SET_SAMPLERATE); + ps2mouse_write (PS2MOUSE_SAMPLERATE_200); + + ps2mouse_write (PS2MOUSE_COMMAND_SET_SAMPLERATE); + ps2mouse_write (PS2MOUSE_SAMPLERATE_100); + + ps2mouse_write (PS2MOUSE_COMMAND_SET_SAMPLERATE); + ps2mouse_write (PS2MOUSE_SAMPLERATE_80); + + ps2mouse_write (PS2MOUSE_COMMAND_GET_MOUSE_ID); + mouse_id = ps2mouse_read (); + + if (mouse_id < 3) + return; + else + ps2mouse_extwheel = true; + + ps2mouse_write (PS2MOUSE_COMMAND_SET_SAMPLERATE); + ps2mouse_write (PS2MOUSE_SAMPLERATE_200); + + ps2mouse_write (PS2MOUSE_COMMAND_SET_SAMPLERATE); + ps2mouse_write (PS2MOUSE_SAMPLERATE_200); + + ps2mouse_write (PS2MOUSE_COMMAND_SET_SAMPLERATE); + ps2mouse_write (PS2MOUSE_SAMPLERATE_80); + + ps2mouse_write (PS2MOUSE_COMMAND_GET_MOUSE_ID); + mouse_id = ps2mouse_read (); + + if (mouse_id > 3) + ps2mouse_extbuttons = true; } unsigned ps2mouse_init () { - unsigned char status_byte = 0xD8; - unsigned char mouse_id; + short status_byte = 0xD8; int timeout; + ps2mouse_extbuttons = false; + ps2mouse_extwheel = false; + if(ps2mouse_reset () == 0) return 0; ps2mouse_read (); // Mouse send her ID - ps2mouse_command_write (PS2MOUSE_COMMAND_SET_SAMPLERATE); - ps2mouse_command_write (PS2MOUSE_SAMPLERATE_200); - - ps2mouse_command_write (PS2MOUSE_COMMAND_SET_SAMPLERATE); - ps2mouse_command_write (PS2MOUSE_SAMPLERATE_100); + ps2mouse_get_mouseid (); - ps2mouse_command_write (PS2MOUSE_COMMAND_SET_SAMPLERATE); - ps2mouse_command_write (PS2MOUSE_SAMPLERATE_80); - - ps2mouse_command_write (PS2MOUSE_COMMAND_GET_MOUSE_ID); - mouse_id = ps2mouse_read (); - - kprintf ("ps2mouse -> ID: %u \n", mouse_id); + if (mouse_id == -1) + return 0; /* irq installing */ -/* irq_install_handler (PS2MOUSE_IRQ, ps2mouse_handler); - ps2mouse_command_write (PS2MOUSE_COMMAND_ENABLE_PACKETS); + ps2mouse_write (PS2MOUSE_COMMAND_ENABLE_PACKETS); for (timeout = 0; timeout < PS2MOUSE_TIMEOUT; timeout ++) { @@ -234,18 +222,21 @@ unsigned ps2mouse_init () outb (PS2MOUSE_CTRL, PS2MOUSE_COMMAND_GET_ST_BYTE); - status_byte = ps2mouse_read (); + status_byte = ps2mouse_read(); - kprintf ("status byte: %d \n", status_byte); + if (status_byte == -1) return 0; + if (status_byte == 0xD8) status_byte = ps2mouse_read(); - status_byte = status_byte | 2; - status_byte = status_byte && 0xDF; + status_byte = ((unsigned char)status_byte) | 2; + status_byte = ((unsigned char)status_byte) & 0xDF; - kprintf ("status byte: %d \n", status_byte); + kprintf ("ps2mouse -> status_byte: %d \n", status_byte); outb (PS2MOUSE_CTRL, PS2MOUSE_COMMAND_SET_ST_BYTE); - ps2mouse_write (status_byte); -*/ + outb (PS2MOUSE_PORT, status_byte); + + ps2mouse_read(); + timer_wait(1000); return 1; -- 2.11.4.GIT