summaryrefslogtreecommitdiff
path: root/src/drivers/hdi/ps2
diff options
context:
space:
mode:
Diffstat (limited to 'src/drivers/hdi/ps2')
-rw-r--r--src/drivers/hdi/ps2/keyboard.h69
-rw-r--r--src/drivers/hdi/ps2/ps2keyboard.c (renamed from src/drivers/hdi/ps2/keyboard.c)114
-rw-r--r--src/drivers/hdi/ps2/ps2keyboard.h33
3 files changed, 90 insertions, 126 deletions
diff --git a/src/drivers/hdi/ps2/keyboard.h b/src/drivers/hdi/ps2/keyboard.h
deleted file mode 100644
index a0e06ef..0000000
--- a/src/drivers/hdi/ps2/keyboard.h
+++ /dev/null
@@ -1,69 +0,0 @@
-#ifndef KEYBOARD_H
-#define KEYBOARD_H
-
-#include <stdbool.h>
-
-#include "string.h"
-
-#include "interrupts.h"
-#include "port.h"
-
-#include "driver.h"
-
-typedef enum {
- KEYBOARD_EVENT_TYPE_KEY_PRESSED,
- KEYBOARD_EVENT_TYPE_KEY_RELEASED
-} keyboard_event_type_t;
-
-typedef enum {
- KEYBOARD_MODIFIER_SHIFT = 0x01,
- KEYBOARD_MODIFIER_CTRL = 0x02,
- KEYBOARD_MODIFIER_ALT = 0x04
-} keyboard_modifier_mask_t;
-
-typedef enum {
- KEYBOARD_KEY_UNKNOWN,
- KEYBOARD_KEY_ASCII,
- KEYBOARD_KEY_ESC,
- KEYBOARD_KEY_TAB,
- KEYBOARD_KEY_INS,
- KEYBAORD_KEY_DEL,
- KEYBAORD_KEY_BACKSPACE,
- KEYBAORD_CURSOR_LEFT,
- KEYBOARD_CURSOR_RIGHT,
- KEYBOARD_CURSOR_UP,
- KEYBOARD_CURSOR_DOWN
-} keyboard_key_t;
-
-typedef struct {
- keyboard_event_type_t type;
- keyboard_modifier_mask_t modifiers;
- keyboard_key_t key;
- char ascii_key;
-} keyboard_event_t;
-
-typedef void (*keyboard_event_handler_t)( keyboard_event_t *event, void *context );
-
-typedef struct {
- driver_t base;
- interrupt_t *interrupts;
- port8_t command_port;
- port8_t data_port;
- bool shift;
- keyboard_event_handler_t handler;
- interrupt_handler_t interrupt_handler;
-} keyboard_t;
-
-typedef struct {
- driver_vtable_t base;
-} keyboard_vtable_t;
-
-void keyboard_init( keyboard_t *keyboard, keyboard_event_handler_t handler, interrupt_t *interrupt, void *context );
-void keyboard_activate( void *obj );
-void keyboard_deactivate( void *obj );
-void keyboard_deinit( void *obj );
-void keyboard_print_info( void *obj );
-
-uint32_t keyboard_handle_interrupt( interrupt_handler_t *handler, uint32_t esp );
-
-#endif // KEYBOARD_H
diff --git a/src/drivers/hdi/ps2/keyboard.c b/src/drivers/hdi/ps2/ps2keyboard.c
index 9c5a246..4151c56 100644
--- a/src/drivers/hdi/ps2/keyboard.c
+++ b/src/drivers/hdi/ps2/ps2keyboard.c
@@ -1,4 +1,4 @@
-#include "keyboard.h"
+#include "ps2keyboard.h"
#include "stdio.h"
// status register on command port (read)
@@ -34,28 +34,28 @@
#undef DEBUG
-static uint8_t read_data( keyboard_t *keyboard )
+static uint8_t read_data( ps2keyboard_t *ps2keyboard )
{
- while( ( port8_read( &keyboard->command_port ) & STATUS_REG_OUTPUT_BUF_FULL ) == 0 ) { }
- return port8_read( &keyboard->data_port );
+ while( ( port8_read( &ps2keyboard->command_port ) & STATUS_REG_OUTPUT_BUF_FULL ) == 0 ) { }
+ return port8_read( &ps2keyboard->data_port );
}
-static void send_command( keyboard_t *keyboard, uint8_t command )
+static void send_command( ps2keyboard_t *ps2keyboard, uint8_t command )
{
- while( port8_read( &keyboard->command_port ) & STATUS_REG_INPUT_BUF_FULL ) { }
- port8_write( &keyboard->command_port, command );
+ while( port8_read( &ps2keyboard->command_port ) & STATUS_REG_INPUT_BUF_FULL ) { }
+ port8_write( &ps2keyboard->command_port, command );
}
-static void write_data( keyboard_t *keyboard, uint8_t data )
+static void write_data( ps2keyboard_t *ps2keyboard, uint8_t data )
{
- while( port8_read( &keyboard->command_port ) & STATUS_REG_INPUT_BUF_FULL ) { }
- port8_write( &keyboard->data_port, data );
+ while( port8_read( &ps2keyboard->command_port ) & STATUS_REG_INPUT_BUF_FULL ) { }
+ port8_write( &ps2keyboard->data_port, data );
}
/*
-static void read_ack( keyboard_t *keyboard )
+static void read_ack( ps2keyboard_t *ps2keyboard )
{
- uint8_t data = read_data( keyboard );
+ uint8_t data = read_data( ps2keyboard );
if( data == 0xFA ) {
return;
} else {
@@ -64,82 +64,82 @@ static void read_ack( keyboard_t *keyboard )
}
*/
-static keyboard_vtable_t const keyboard_vtable = {
+static keyboard_vtable_t const ps2keyboard_vtable = {
{
- keyboard_activate,
- keyboard_deactivate,
- keyboard_deinit,
- keyboard_print_info
+ ps2keyboard_activate,
+ ps2keyboard_deactivate,
+ ps2keyboard_deinit,
+ ps2keyboard_print_info
}
};
-void keyboard_init( keyboard_t *keyboard, keyboard_event_handler_t handler, interrupt_t *interrupt, void *context )
+void ps2keyboard_init( ps2keyboard_t *ps2keyboard, keyboard_event_handler_t handler, interrupt_t *interrupt, void *context )
{
- memset( keyboard, 0, sizeof( keyboard_t ) );
+ memset( ps2keyboard, 0, sizeof( ps2keyboard_t ) );
- driver_init( (driver_t *)keyboard, DRIVER_TYPE_KEYBOARD, interrupt, context );
+ driver_init( (driver_t *)ps2keyboard, DRIVER_TYPE_KEYBOARD, interrupt, context );
- port8_init( &keyboard->command_port, 0x64 );
- port8_init( &keyboard->data_port, 0x60 );
+ port8_init( &ps2keyboard->command_port, 0x64 );
+ port8_init( &ps2keyboard->data_port, 0x60 );
- keyboard->shift = false;
- keyboard->handler = handler;
+ ps2keyboard->shift = false;
+ ps2keyboard->base.handler = handler;
- ((driver_t *)keyboard)->vtable = (driver_vtable_t *)&keyboard_vtable;
+ ((driver_t *)ps2keyboard)->vtable = (driver_vtable_t *)&ps2keyboard_vtable;
}
-void keyboard_activate( void *obj )
+void ps2keyboard_activate( void *obj )
{
puts( "Activating driver for PS/2 keyboard.." );
driver_t *driver = obj;
- keyboard_t *keyboard = obj;
+ ps2keyboard_t *ps2keyboard = obj;
// first switch off port 1
- send_command( keyboard, COMMAND_DISABLE_PORT1 );
+ send_command( ps2keyboard, COMMAND_DISABLE_PORT1 );
// consume character pressed before executing the kernel
- while( port8_read( &keyboard->command_port ) & STATUS_REG_OUTPUT_BUF_FULL ) {
- port8_read( &keyboard->data_port );
+ while( port8_read( &ps2keyboard->command_port ) & STATUS_REG_OUTPUT_BUF_FULL ) {
+ port8_read( &ps2keyboard->data_port );
}
// enable interrupts for port 1
- send_command( keyboard, COMMAND_GET_STATE );
- uint8_t status = read_data( keyboard );
+ send_command( ps2keyboard, COMMAND_GET_STATE );
+ uint8_t status = read_data( ps2keyboard );
status |= STATUS_CONTROL_CONFIG_ENABLE_IRQ_PORT1;
status &= ~STATUS_CONTROL_CONFIG_CLOCK_PORT1;
- send_command( keyboard, COMMAND_SET_STATE );
- write_data( keyboard, status );
+ send_command( ps2keyboard, COMMAND_SET_STATE );
+ write_data( ps2keyboard, status );
// disable all LEDs on keyboard
- //~ send_command( keyboard, KBD_COMMAND_SET_LEDS );
- //~ write_data( keyboard, KBD_LED_ALL_ON );
+ //~ send_command( ps2keyboard, KBD_COMMAND_SET_LEDS );
+ //~ write_data( ps2keyboard, KBD_LED_ALL_ON );
// set scan code
- //~ send_command( keyboard, KBD_SET_SCANCODE );
- //~ write_data( keyboard, KBD_SCANCODE_2 );
+ //~ send_command( ps2keyboard, KBD_SET_SCANCODE );
+ //~ write_data( ps2keyboard, KBD_SCANCODE_2 );
// activate keyboard
- //send_command( keyboard, KBD_ACTIVATE );
- //read_ack( keyboard );
+ //send_command( ps2keyboard, KBD_ACTIVATE );
+ //read_ack( ps2keyboard );
- interrupt_handler_init( &keyboard->interrupt_handler, IRQ_BASE + 0x01, driver->interrupt, keyboard_handle_interrupt, obj );
- interrupts_register_interrupt_handler( keyboard->interrupt_handler );
+ interrupt_handler_init( &ps2keyboard->interrupt_handler, IRQ_BASE + 0x01, driver->interrupt, ps2keyboard_handle_interrupt, obj );
+ interrupts_register_interrupt_handler( ps2keyboard->interrupt_handler );
// enable port 1
- send_command( keyboard, COMMAND_ENABLE_PORT1 );
+ send_command( ps2keyboard, COMMAND_ENABLE_PORT1 );
}
-void keyboard_deactivate( void *obj )
+void ps2keyboard_deactivate( void *obj )
{
puts( "Deactivating driver for PS/2 keyboard.." );
- keyboard_t *keyboard = obj;
+ ps2keyboard_t *ps2keyboard = obj;
- send_command( keyboard, COMMAND_DISABLE_PORT1 );
+ send_command( ps2keyboard, COMMAND_DISABLE_PORT1 );
}
-void keyboard_deinit( void *obj )
+void ps2keyboard_deinit( void *obj )
{
// nothing to do
}
@@ -262,13 +262,13 @@ static keycode_t scancode_to_keycode( scancode_set_t set, uint8_t scan_code )
#define SCAN_CODE_LEFT_SHIFT 0x2A
#define SCAN_CODE_RIGHT_SHIFT 0x36
-uint32_t keyboard_handle_interrupt( interrupt_handler_t *handler, uint32_t esp )
+uint32_t ps2keyboard_handle_interrupt( interrupt_handler_t *handler, uint32_t esp )
{
- keyboard_t *keyboard = (keyboard_t *)handler->driver;
+ ps2keyboard_t *ps2keyboard = (ps2keyboard_t *)handler->driver;
// we can only wake up on IRQ1 because we don't send commands
// after initialization
- uint8_t scan_code = port8_read( &keyboard->data_port );
+ uint8_t scan_code = port8_read( &ps2keyboard->data_port );
// we get break code when the high bit is set, so the
// the key is released
@@ -282,14 +282,14 @@ uint32_t keyboard_handle_interrupt( interrupt_handler_t *handler, uint32_t esp )
if( scan_code == SCAN_CODE_LEFT_SHIFT ||
scan_code == SCAN_CODE_RIGHT_SHIFT ) {
if( break_code ) {
- keyboard->shift = false;
+ ps2keyboard->shift = false;
} else {
- keyboard->shift = true;
+ ps2keyboard->shift = true;
}
}
scancode_set_t code_set = SCANCODE_SET_NORMAL;
- if( keyboard->shift ) {
+ if( ps2keyboard->shift ) {
code_set = SCANCODE_SET_SHIFT;
}
@@ -297,7 +297,7 @@ uint32_t keyboard_handle_interrupt( interrupt_handler_t *handler, uint32_t esp )
#ifdef DEBUG
printf( "KBD SCAN:0x%X S:%d B:%d S:%d T:0x%X '%c' 0x%X\n",
- scan_code, code_set, break_code, keyboard->shift,
+ scan_code, code_set, break_code, ps2keyboard->shift,
key_code.type, key_code.c, key_code.c );
#endif
@@ -308,7 +308,7 @@ uint32_t keyboard_handle_interrupt( interrupt_handler_t *handler, uint32_t esp )
event.type = KEYBOARD_EVENT_TYPE_KEY_PRESSED;
}
event.modifiers = 0;
- if( keyboard->shift ) {
+ if( ps2keyboard->shift ) {
event.modifiers |= KEYBOARD_MODIFIER_SHIFT;
}
// TODO: for control, alt, meta, etc.
@@ -320,12 +320,12 @@ uint32_t keyboard_handle_interrupt( interrupt_handler_t *handler, uint32_t esp )
event.key = KEYBOARD_KEY_ESC;
}
- keyboard->handler( &event, keyboard->base.context );
+ ps2keyboard->base.handler( &event, ps2keyboard->base.base.context );
return esp;
}
-void keyboard_print_info( void *obj )
+void ps2keyboard_print_info( void *obj )
{
puts( "PS/2 keyboard driver" );
}
diff --git a/src/drivers/hdi/ps2/ps2keyboard.h b/src/drivers/hdi/ps2/ps2keyboard.h
new file mode 100644
index 0000000..a5b66ca
--- /dev/null
+++ b/src/drivers/hdi/ps2/ps2keyboard.h
@@ -0,0 +1,33 @@
+#ifndef PS2KEYBOARD_H
+#define PS2KEYBOARD_H
+
+#include <stdbool.h>
+
+#include "string.h"
+
+#include "interrupts.h"
+#include "port.h"
+
+#include "keyboard.h"
+
+typedef struct {
+ keyboard_t base;
+ port8_t command_port;
+ port8_t data_port;
+ bool shift;
+ interrupt_handler_t interrupt_handler;
+} ps2keyboard_t;
+
+typedef struct {
+ keyboard_vtable_t base;
+} ps2keyboard_vtable_t;
+
+void ps2keyboard_init( ps2keyboard_t *ps2keyboard, keyboard_event_handler_t handler, interrupt_t *interrupt, void *context );
+void ps2keyboard_activate( void *obj );
+void ps2keyboard_deactivate( void *obj );
+void ps2keyboard_deinit( void *obj );
+void ps2keyboard_print_info( void *obj );
+
+uint32_t ps2keyboard_handle_interrupt( interrupt_handler_t *handler, uint32_t esp );
+
+#endif // PS2KEYBOARD_H