summaryrefslogtreecommitdiff
path: root/src/drivers/hdi/ps2/mouse.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/drivers/hdi/ps2/mouse.c')
-rw-r--r--src/drivers/hdi/ps2/mouse.c263
1 files changed, 0 insertions, 263 deletions
diff --git a/src/drivers/hdi/ps2/mouse.c b/src/drivers/hdi/ps2/mouse.c
deleted file mode 100644
index 1afd8d2..0000000
--- a/src/drivers/hdi/ps2/mouse.c
+++ /dev/null
@@ -1,263 +0,0 @@
-#include "mouse.h"
-
-#include "stdio.h"
-
-// status register on command port (read)
-#define STATUS_REG_OUTPUT_BUF_FULL 0x01
-#define STATUS_REG_INPUT_BUF_FULL 0x02
-#define STATUS_REG_OUTPUT_BUF2_FULL 0x20
-
-// status control register flags
-#define STATUS_CONTROL_CONFIG_ENABLE_IRQ_PORT2 0x02
-#define STATUS_CONTROL_CONFIG_CLOCK_PORT2 0x20
-
-// generic PS/2 commands
-#define COMMAND_GET_STATE 0x20
-#define COMMAND_SET_STATE 0x60
-#define COMMAND_DISABLE_PORT2 0xA7
-#define COMMAND_ENABLE_PORT2 0xA8
-#define COMMAND_SEND_TO_PORT2 0xD4
-
-// mouse commands
-#define MOUSE_COMMAND_GET_DEVICE_ID 0xF2
-#define MOUSE_COMMAND_SET_SAMPLE_RATE 0xF3
-#define MOUSE_COMMAND_ENABLE_DATAREPORTING 0xF4
-#define MOUSE_COMMAND_SET_DEFAULTS 0xF6
-#define DEFAULT_NOF_PACKETS 3
-
-// mouse data packet one
-#define MOUSE_BYTE1_LEFT_BUTTON 0x01
-#define MOUSE_BYTE1_RIGHT_BUTTON 0x02
-#define MOUSE_BYTE1_MIDDLE_BUTTON 0x04
-#define MOUSE_BYTE1_ID_BIT 0x08
-#define MOUSE_BYTE1_X_SIGN 0x10
-#define MOUSE_BYTE1_Y_SIGN 0x20
-#define MOUSE_BYTE1_X_OVERFLOW 0x40
-#define MOUSE_BYTE1_Y_OVERFLOW 0x80
-
-#undef DEBUG
-
-static uint8_t read_data( mouse_t *mouse )
-{
- while( ( port8_read( &mouse->command_port ) & STATUS_REG_OUTPUT_BUF_FULL ) == 0 ) { }
- return port8_read( &mouse->data_port );
-}
-
-static void send_command( mouse_t *mouse, uint8_t command )
-{
- while( port8_read( &mouse->command_port ) & STATUS_REG_INPUT_BUF_FULL ) { }
- port8_write( &mouse->command_port, command );
-}
-
-static void write_data( mouse_t *mouse, uint8_t data )
-{
- while( port8_read( &mouse->command_port ) & STATUS_REG_INPUT_BUF_FULL ) { }
- port8_write( &mouse->data_port, data );
-}
-
-static void read_ack( mouse_t *mouse )
-{
- uint8_t data = read_data( mouse );
- if( data == 0xFA ) {
- return;
- } else {
- printf( "ERR PS/2 mouse: acknoledgment failed 0x%X\n", data );
- }
-}
-
-static void set_sample_rate( mouse_t *mouse, uint8_t samples )
-{
- send_command( mouse, COMMAND_SEND_TO_PORT2 );
- write_data( mouse, MOUSE_COMMAND_SET_SAMPLE_RATE );
- read_ack( mouse );
-
- send_command( mouse, COMMAND_SEND_TO_PORT2 );
- write_data( mouse, samples );
- read_ack( mouse );
-}
-
-static mouse_vtable_t const mouse_vtable = {
- {
- mouse_activate,
- mouse_deactivate,
- mouse_deinit,
- mouse_print_info
- }
-};
-
-void mouse_init( mouse_t *mouse, mouse_event_handler_t handler, interrupt_t *interrupt, void *context )
-{
- memset( mouse, 0, sizeof( mouse_t ) );
-
- driver_init( (driver_t *)mouse, DRIVER_TYPE_MOUSE, interrupt, context );
-
- // TODO: we should probe for wheel mouse and more than 3 packets
- mouse->nof_packets = DEFAULT_NOF_PACKETS;
-
- mouse->handler = handler;
-
- port8_init( &mouse->command_port, 0x64 );
- port8_init( &mouse->data_port, 0x60 );
-
- ((driver_t *)mouse)->vtable = (driver_vtable_t *)&mouse_vtable;
-}
-
-void mouse_activate( void *obj )
-{
- puts( "Activating driver for PS/2 mouse.." );
-
- driver_t *driver = obj;
- mouse_t *mouse = obj;
-
- // enable port 2
- send_command( mouse, COMMAND_ENABLE_PORT2 );
-
- // enable interrupts for port 2
- send_command( mouse, COMMAND_GET_STATE );
- uint8_t status = read_data( mouse );
- status |= STATUS_CONTROL_CONFIG_ENABLE_IRQ_PORT2;
- status &= ~STATUS_CONTROL_CONFIG_CLOCK_PORT2;
- send_command( mouse, COMMAND_SET_STATE );
- write_data( mouse, status );
-
- // detecting mouse wheel (and 4th data packet)
- set_sample_rate( mouse, 200 );
- set_sample_rate( mouse, 100 );
- set_sample_rate( mouse, 80 );
- send_command( mouse, COMMAND_SEND_TO_PORT2 );
- write_data( mouse, MOUSE_COMMAND_GET_DEVICE_ID );
- read_ack( mouse );
- uint8_t id = read_data( mouse );
- printf( "PS/2 mouse model id is 0x%X\n", id );
- if( id == 0x03 ) {
- mouse->nof_packets = 4;
- }
-
- // set mouse defaults
-// send_command( mouse, COMMAND_SEND_TO_PORT2 );
-// write_data( mouse, MOUSE_COMMAND_SET_DEFAULTS );
-
- interrupt_handler_init( &mouse->interrupt_handler, IRQ_BASE + 0x0C, driver->interrupt, mouse_handle_interrupt, obj );
- interrupts_register_interrupt_handler( mouse->interrupt_handler );
-
- // enable mouse on second port
- send_command( mouse, COMMAND_SEND_TO_PORT2 );
- write_data( mouse, MOUSE_COMMAND_ENABLE_DATAREPORTING );
- read_ack( mouse );
-}
-
-void mouse_deactivate( void *obj )
-{
- puts( "Dectivating driver for PS/2 mouse.." );
-
- mouse_t *mouse = obj;
-
- send_command( mouse, COMMAND_DISABLE_PORT2 );
-}
-
-void mouse_deinit( void *obj )
-{
- // nothing to do
-}
-
-uint32_t mouse_handle_interrupt( interrupt_handler_t *handler, uint32_t esp )
-{
- mouse_t *mouse = (mouse_t *)handler->driver;
-
- uint8_t status = port8_read( &mouse->command_port );
- if( !( status & STATUS_REG_OUTPUT_BUF2_FULL ) ) {
- return esp;
- }
-
- mouse->buf[mouse->offset] = port8_read( &mouse->data_port );
-
-#ifdef DEBUG
- printf( "MOUSE: %d 0x%X\n", mouse->offset, mouse->buf[mouse->offset] );
-#endif
-
- switch( mouse->offset ) {
- case 0:
- if( mouse->buf[0] & MOUSE_BYTE1_ID_BIT ) {
- for( int i = 0; i < 3; i++ ) {
- if( ( mouse->buf[0] & ( 0x01 << i ) ) != ( mouse->buttons & ( 0x01 << i ) ) ) {
- mouse_event_t event;
- event.button = i + 1;
- if( mouse->buttons & ( 0x01 << i ) ) {
- event.type = MOUSE_EVENT_TYPE_BUTTON_UP;
- } else {
- event.type = MOUSE_EVENT_TYPE_BUTTON_DOWN;
- }
- event.cursor_x = mouse->cursor_x;
- event.cursor_y = mouse->cursor_y;
- mouse->handler( &event, mouse->base.context );
- }
- }
- mouse->buttons = mouse->buf[0];
- }
- break;
-
- case 1:
- // delay evaluation of move events till second byte
- break;
-
- case 2:
- if( mouse->buf[1] !=0 || mouse->buf[2] != 0 ) {
-
- mouse_event_t event;
- event.type = MOUSE_EVENT_TYPE_MOVE;
- event.old_cursor_x = mouse->cursor_x;
- event.old_cursor_y = mouse->cursor_y;
-
- mouse->cursor_x += (int8_t)mouse->buf[1];
- mouse->cursor_y -= (int8_t)mouse->buf[2];
- if( mouse->cursor_x < 0 ) {
- mouse->cursor_x = 0;
- }
- if( mouse->cursor_x > mouse->res_x - 1 ) {
- mouse->cursor_x = mouse->res_x - 1;
- }
- if( mouse->cursor_y < 0 ) {
- mouse->cursor_y = 0;
- }
- if( mouse->cursor_y > mouse->res_y - 1 ) {
- mouse->cursor_y = mouse->res_y - 1;
- }
-
- event.cursor_x = mouse->cursor_x;
- event.cursor_y = mouse->cursor_y;
-
- mouse->handler( &event, mouse->base.context );
- }
-
- break;
-
- case 3:
- // TODO: read fourth data packet, but don't handle
- // it yet
- break;
- }
-
- // advance offset
- mouse->offset = ( mouse->offset + 1 ) % mouse->nof_packets;
-
- return esp;
-}
-
-void mouse_print_info( void *obj )
-{
- puts( "PS/2 mouse driver" );
-}
-
-void mouse_set_resolution( mouse_t *mouse, const uint32_t res_x, const uint32_t res_y )
-{
- mouse->res_x = res_x;
- mouse->res_y = res_y;
- mouse->cursor_x = mouse->res_x / 2;
- mouse->cursor_y = mouse->res_y / 2;
-}
-
-void mouse_set_position( mouse_t *mouse, const uint32_t x, const uint32_t y )
-{
- mouse->cursor_x = x;
- mouse->cursor_y = y;
-}