From beadaa8efc4340c2f616871a7c0e4827c506cdf2 Mon Sep 17 00:00:00 2001 From: Martin 'povik' Poviser Date: Thu, 19 Feb 2009 21:25:44 +0100 Subject: [PATCH] Driver rewrited without interrupt. --- kernel/.config | 3 +- kernel/core/commands.c | 26 ++++---- kernel/core/dev.c | 3 +- kernel/drivers/char/mouse/ps2.c | 130 +++++++++++++++++++--------------------- 4 files changed, 77 insertions(+), 85 deletions(-) diff --git a/kernel/.config b/kernel/.config index 5f3536c..5267982 100644 --- a/kernel/.config +++ b/kernel/.config @@ -1,6 +1,7 @@ +# # Automatically generated make config: don't edit # ZeX/OS version: .. -# Wed Feb 11 18:37:50 2009 +# Thu Feb 12 13:52:11 2009 # # diff --git a/kernel/core/commands.c b/kernel/core/commands.c index bd536a3..7b671a5 100644 --- a/kernel/core/commands.c +++ b/kernel/core/commands.c @@ -44,6 +44,7 @@ #include #include #include +#include command_t command_list; extern partition_t partition_list; @@ -930,34 +931,27 @@ unsigned command_test4 (char *command, unsigned len) return 1; } -/* -extern void ps2mouse_get_status (int *x, int *y, int *state); -extern unsigned ps2mouse_install (); unsigned command_mouse (char *command, unsigned len) { printf ("PS/2 Mouse test\n"); - ps2mouse_install (); + dev_t *dev = dev_find ("/dev/ps2mouse"); - int x, y, state; - int x2, y2, state2; + if (!dev) + return 0; - while (1) { - - ps2mouse_get_status (&x, &y, &state); + dev_mouse_t mouse; - if (x != x2 && y != y2) - printf ("mys: %d %d %d\n", x, y, state); + while (!key_pressed (1)) { + dev->handler (DEV_ACT_READ, &mouse, sizeof (dev_mouse_t)); - x2 = x; - y2 = y; - state2 = state; + kprintf ("ps2mouse: x,y: %d, %d | 0x%x \n", mouse.pos_x, mouse.pos_y, mouse.flags); schedule (); } return 1; -}*/ +} unsigned command_vesa (char *command, unsigned len) { @@ -1872,7 +1866,7 @@ unsigned int init_commands () #ifdef CONFIG_DRV_PCI command_register ("lspci", "list all pci devices", &command_lspci, 0); #endif - //command_register ("mouse", "ps2 mouse test", &command_mouse, 0); + command_register ("mouse", "ps2 mouse test", &command_mouse, 0); command_register ("iflist", "Show network interface", &command_iflist, 0); command_register ("ifconfig", "Configure network interface", &command_ifconfig, 0); command_register ("ifroute", "Configure gateway address", &command_ifroute, 0); diff --git a/kernel/core/dev.c b/kernel/core/dev.c index 1479f2a..0d2063e 100644 --- a/kernel/core/dev.c +++ b/kernel/core/dev.c @@ -1,3 +1,4 @@ + /* * ZeX/OS * Copyright (C) 2007 Tomas 'ZeXx86' Jedrzejek (zexx86@gmail.com) @@ -195,7 +196,7 @@ void dev_install () #endif #endif - dev_register ("ps2", "Mouse driver", DEV_ATTR_CHAR, (dev_handler_t *) &ps2mouse_acthandler); + dev_register ("ps2mouse", "Mouse driver", DEV_ATTR_CHAR, (dev_handler_t *) &ps2mouse_acthandler); } unsigned int init_dev () diff --git a/kernel/drivers/char/mouse/ps2.c b/kernel/drivers/char/mouse/ps2.c index f858206..704147b 100644 --- a/kernel/drivers/char/mouse/ps2.c +++ b/kernel/drivers/char/mouse/ps2.c @@ -1,3 +1,29 @@ + + + + + + + + +/* + * ZeX/OS + * Copyright (C) 2009 Martin 'povik' Poviser (martin.povik@gmail.com) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + #include #ifdef ARCH_i386 @@ -20,14 +46,13 @@ #define PS2MOUSE_COMMAND_ENABLE_PACKETS 0xF4 #define PS2MOUSE_COMMAND_SET_SAMPLERATE 0xF3 #define PS2MOUSE_COMMAND_SET_RESOLUTION 0xE8 -#define PS2MOUSE_COMMAND_GET_ST_BYTE 0x20 -#define PS2MOUSE_COMMAND_SET_ST_BYTE 0X60 +#define PS2MOUSE_COMMAND_SET_REMOTE 0xF0 #define PS2MOUSE_RESET_ACK 0xAA #define PS2MOUSE_IRQ 12 -#define PS2MOUSE_SAMPLERATE_80 0x50 -#define PS2MOUSE_SAMPLERATE_100 0x64 -#define PS2MOUSE_SAMPLERATE_200 0xC8 +#define PS2MOUSE_SAMPLERATE_80 0x50 +#define PS2MOUSE_SAMPLERATE_100 0x64 +#define PS2MOUSE_SAMPLERATE_200 0xC8 #define PS2MOUSE_SAMPLERATE PS2MOUSE_SAMPLERATE_100 @@ -45,7 +70,7 @@ short ps2mouse_read (); /* ps2mouse_reset - reset mouse */ -bool ps2mouse_reset() +bool ps2mouse_reset () { int timeout; @@ -76,7 +101,7 @@ bool ps2mouse_reset() /* ps2mouse_write - send a command to mouse */ -bool ps2mouse_write(unsigned char command) +bool ps2mouse_write (unsigned char command) { int timeout; @@ -117,33 +142,28 @@ short ps2mouse_read() return -1; } -void ps2mouse_handler (struct regs *r) +/* ps2mouse_get_state - get a mouse state */ + +bool ps2mouse_get_state () { - int timeout; unsigned char b1, b2, b3, b4 = 0; - - for (timeout = 0; timeout < PS2MOUSE_TIMEOUT; timeout ++) - { - if((inb (PS2MOUSE_CTRL) && 0x02) != 0x02) - break; - schedule (); - } - - outb (PS2MOUSE_CTRL, 0xAD); - - b1 = ps2mouse_read(); - b2 = ps2mouse_read(); - b3 = ps2mouse_read(); - if (ps2mouse_extwheel || ps2mouse_extbuttons) - b4 = ps2mouse_read(); + if (ps2mouse_write (PS2MOUSE_COMMAND_GET_PACKET) == -1) + return 0; + + b1 = ps2mouse_read (); + b2 = ps2mouse_read (); + b3 = ps2mouse_read (); + if (ps2mouse_extwheel || ps2mouse_extbuttons) + b4 = ps2mouse_read (); + ps2mouse_state.flags = 0; - ps2mouse_state.flags = ps2mouse_state.flags | ((b1 && 1) ? MOUSE_FLAG_BUTTON1 : 0); - ps2mouse_state.flags = ps2mouse_state.flags | ((b1 && 2) ? MOUSE_FLAG_BUTTON2 : 0); - ps2mouse_state.flags = ps2mouse_state.flags | ((b1 && 3) ? MOUSE_FLAG_BUTTON3 : 0); - ps2mouse_state.flags = ps2mouse_state.flags | ((b1 && 4) ? MOUSE_FLAG_BUTTON4 : 0); - ps2mouse_state.flags = ps2mouse_state.flags | ((b1 && 5) ? MOUSE_FLAG_BUTTON5 : 0); + ps2mouse_state.flags |= ((b1 & 1) ? MOUSE_FLAG_BUTTON1 : 0); + ps2mouse_state.flags |= ((b1 & 2) ? MOUSE_FLAG_BUTTON2 : 0); + ps2mouse_state.flags |= ((b1 & 3) ? MOUSE_FLAG_BUTTON3 : 0); + ps2mouse_state.flags |= ((b1 & 4) ? MOUSE_FLAG_BUTTON4 : 0); + ps2mouse_state.flags |= ((b1 & 5) ? MOUSE_FLAG_BUTTON5 : 0); short dx, dy, dz; @@ -156,13 +176,15 @@ void ps2mouse_handler (struct regs *r) if (dy > 5 || dy < -5) dy *= 4; - ps2mouse_state.pos_x += dx; - ps2mouse_state.pos_y += dy; + ps2mouse_state.pos_x = dx; + ps2mouse_state.pos_y = dy; if (dz > 0) ps2mouse_state.flags = ps2mouse_state.flags | MOUSE_FLAG_SCROLLUP; if (dz < 0) ps2mouse_state.flags = ps2mouse_state.flags | MOUSE_FLAG_SCROLLDOWN; + + return 1; } void ps2mouse_get_mouseid () @@ -197,12 +219,11 @@ void ps2mouse_get_mouseid () mouse_id = ps2mouse_read (); if (mouse_id > 3) - ps2mouse_extbuttons = true; + ps2mouse_extbuttons = true; } unsigned ps2mouse_init () { - short status_byte = 0xD8; int timeout; ps2mouse_extbuttons = false; @@ -210,45 +231,17 @@ unsigned ps2mouse_init () if(ps2mouse_reset () == 0) return 0; - + ps2mouse_read (); // Mouse send her ID - + ps2mouse_get_mouseid (); - + if (mouse_id == -1) return 0; - - /* irq installing */ - irq_install_handler (PS2MOUSE_IRQ, ps2mouse_handler); - + + ps2mouse_write (PS2MOUSE_COMMAND_SET_REMOTE); ps2mouse_write (PS2MOUSE_COMMAND_ENABLE_PACKETS); - for (timeout = 0; timeout < PS2MOUSE_TIMEOUT; timeout ++) - { - if((inb (PS2MOUSE_CTRL) && 0x02) != 0x02) - break; - schedule (); - } - - outb (PS2MOUSE_CTRL, PS2MOUSE_COMMAND_GET_ST_BYTE); - - status_byte = ps2mouse_read(); - - if (status_byte == -1) return 0; - if (status_byte == 0xD8) status_byte = ps2mouse_read(); - - status_byte = ((unsigned char)status_byte) | 2; - status_byte = ((unsigned char)status_byte) & 0xDF; - - kprintf ("ps2mouse -> status_byte: %d \n", status_byte); - - outb (PS2MOUSE_CTRL, PS2MOUSE_COMMAND_SET_ST_BYTE); - outb (PS2MOUSE_PORT, status_byte); - - ps2mouse_read(); - - timer_wait(1000); - return 1; } @@ -262,7 +255,10 @@ bool ps2mouse_acthandler (unsigned act, char *block, unsigned block_len) break; case DEV_ACT_READ: { - return 0; + if(!ps2mouse_get_state ()) + return 0; + memcpy (block, &ps2mouse_state, sizeof (dev_mouse_t)); + return 1; } break; case DEV_ACT_WRITE: -- 2.11.4.GIT