From 8183f17368ea6944c8b36d7cb7564b33d2a0503a Mon Sep 17 00:00:00 2001 From: Andreas Baumann Date: Sun, 16 Jul 2017 09:21:36 +0200 Subject: introduced classes of driver types (graphics, mouse, keyboard, network, etc.) removed direct vga_init from kernel.c, using pci for this now, get the driver of type graphics from driver_manager --- src/drivers/driver.c | 18 +++++++++++++++++- src/drivers/driver.h | 11 ++++++++++- src/drivers/hdi/ps2/keyboard.c | 2 +- src/drivers/hdi/ps2/mouse.c | 2 +- src/drivers/net/rtl8139.c | 2 +- src/drivers/video/vga.c | 2 +- 6 files changed, 31 insertions(+), 6 deletions(-) (limited to 'src/drivers') diff --git a/src/drivers/driver.c b/src/drivers/driver.c index fae54e7..829262e 100644 --- a/src/drivers/driver.c +++ b/src/drivers/driver.c @@ -12,10 +12,11 @@ static driver_vtable_t const driver_vtable = { driver_print_info }; -void driver_init( driver_t *driver, interrupt_t *interrupt, void *context ) +void driver_init( driver_t *driver, driver_type_t type, interrupt_t *interrupt, void *context ) { memset( driver, 0, sizeof( driver_t ) ); + driver->type = type; driver->interrupt = interrupt; driver->context = context; @@ -96,3 +97,18 @@ void driver_manager_print_info_all( driver_manager_t *manager ) driver->vtable->print_info( driver ); } } + +driver_t *driver_manager_find_driver( driver_manager_t *manager, driver_type_t type ) +{ + driver_t *driver; + + for( int i = 0; i < manager->nof_drivers; i++ ) { + driver_t *driver = (driver_t *)manager->driver[i]; + if( driver->type == type ) { + return driver; + } + } + + return NULL; + +} diff --git a/src/drivers/driver.h b/src/drivers/driver.h index 38dfe64..4d5689e 100644 --- a/src/drivers/driver.h +++ b/src/drivers/driver.h @@ -10,13 +10,21 @@ typedef struct { void (*print_info)( void *obj ); } driver_vtable_t; +typedef enum { + DRIVER_TYPE_KEYBOARD, + DRIVER_TYPE_MOUSE, + DRIVER_TYPE_GRAPHICS, + DRIVER_TYPE_NETWORK +} driver_type_t; + typedef struct { driver_vtable_t const *vtable; + driver_type_t type; interrupt_t *interrupt; void *context; } driver_t; -void driver_init( driver_t *driver, interrupt_t *interrupt, void *context ); +void driver_init( driver_t *driver, driver_type_t type, interrupt_t *interrupt, void *context ); void driver_activate( void *obj ); void driver_deactivate( void *obj ); void driver_deinit( void *obj ); @@ -35,5 +43,6 @@ void driver_manager_activate_all( driver_manager_t *manager ); void driver_manager_deactivate_all( driver_manager_t *manager ); void driver_manager_deinit( driver_manager_t *manager ); void driver_manager_print_info_all( driver_manager_t *manager ); +driver_t *driver_manager_find_driver( driver_manager_t *manager, driver_type_t type ); #endif // DRIVER_H diff --git a/src/drivers/hdi/ps2/keyboard.c b/src/drivers/hdi/ps2/keyboard.c index d4003b2..9c5a246 100644 --- a/src/drivers/hdi/ps2/keyboard.c +++ b/src/drivers/hdi/ps2/keyboard.c @@ -77,7 +77,7 @@ void keyboard_init( keyboard_t *keyboard, keyboard_event_handler_t handler, inte { memset( keyboard, 0, sizeof( keyboard_t ) ); - driver_init( (driver_t *)keyboard, interrupt, context ); + driver_init( (driver_t *)keyboard, DRIVER_TYPE_KEYBOARD, interrupt, context ); port8_init( &keyboard->command_port, 0x64 ); port8_init( &keyboard->data_port, 0x60 ); diff --git a/src/drivers/hdi/ps2/mouse.c b/src/drivers/hdi/ps2/mouse.c index 66c0dea..1afd8d2 100644 --- a/src/drivers/hdi/ps2/mouse.c +++ b/src/drivers/hdi/ps2/mouse.c @@ -89,7 +89,7 @@ void mouse_init( mouse_t *mouse, mouse_event_handler_t handler, interrupt_t *int { memset( mouse, 0, sizeof( mouse_t ) ); - driver_init( (driver_t *)mouse, interrupt, context ); + 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; diff --git a/src/drivers/net/rtl8139.c b/src/drivers/net/rtl8139.c index a5c0cd6..a325823 100644 --- a/src/drivers/net/rtl8139.c +++ b/src/drivers/net/rtl8139.c @@ -18,7 +18,7 @@ void rtl8139_init( rtl8139_t *rtl8139, interrupt_t *interrupt, void *context ) { memset( rtl8139, 0, sizeof( rtl8139_t ) ); - driver_init( (driver_t *)rtl8139, interrupt, context ); + driver_init( (driver_t *)rtl8139, DRIVER_TYPE_NETWORK, interrupt, context ); ((driver_t *)rtl8139)->vtable = (driver_vtable_t *)&rtl8139_vtable; } diff --git a/src/drivers/video/vga.c b/src/drivers/video/vga.c index 3db41ad..b6a07a8 100644 --- a/src/drivers/video/vga.c +++ b/src/drivers/video/vga.c @@ -22,7 +22,7 @@ void vga_init( vga_t *vga, interrupt_t *interrupt, void *context ) { memset( vga, 0, sizeof( vga_t ) ); - driver_init( (driver_t *)vga, interrupt, context ); + driver_init( (driver_t *)vga, DRIVER_TYPE_GRAPHICS, interrupt, context ); port8_init( &vga->misc_port, 0x3C2 ); port8_init( &vga->crtc_index_port, 0x3D4 ); -- cgit v1.2.3-54-g00ecf