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 +- src/hardware/pci.c | 9 +++------ src/kernel/kernel.c | 8 ++++---- 8 files changed, 38 insertions(+), 16 deletions(-) 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 ); diff --git a/src/hardware/pci.c b/src/hardware/pci.c index 0945a9a..bba0182 100644 --- a/src/hardware/pci.c +++ b/src/hardware/pci.c @@ -183,12 +183,9 @@ driver_t *pci_device_get_driver( pci_device_descriptor_t *descriptor, interrupt_ switch( descriptor->class_id ) { case 0x03: // graphics switch( descriptor->subclass_id ) { - case 0x00: // VGA - // TODO: we need a memory manager, otherwise we - // cannot load dynamically a VGA driver here! - // for now, let's put it directly into kernel.c - // for testing - // vga_t *vga = malloc( sizeof( vga_t ), interrupt, context ); + case 0x00: // Generic VGA + driver = (driver_t *)malloc( sizeof( vga_t ) ); + vga_init( (vga_t *)driver, interrupt, context ); break; } break; diff --git a/src/kernel/kernel.c b/src/kernel/kernel.c index 31d4ec7..e107b8a 100644 --- a/src/kernel/kernel.c +++ b/src/kernel/kernel.c @@ -108,7 +108,7 @@ void kernel_main( void ) goto TERMINATE; } - // TODO: two demo tasks for now, later we should do something useful in a task + // task manager for VGA graphic refresh task_manager_init( &global_context.task_manager ); task_t taskRefreshScreen; task_init( &taskRefreshScreen, GDT_CODE_SEGMENT_SELECTOR, &refresh_screen ); @@ -145,9 +145,9 @@ void kernel_main( void ) pci_controller_scan_and_register( &pci_controller, &global_context.driver_manager, &interrupt, &global_context ); // TODO: merge with the text mode vga_text_t object - global_context.vga = (vga_t *)malloc( sizeof( vga_t ) ); - vga_init( global_context.vga, &interrupt, &global_context ); - driver_manager_add_driver( &global_context.driver_manager, (driver_t *)global_context.vga ); + // TODO: introduce a graphics driver type, don't cast diretly here + // TODO: also, what to do if there is more than one driver? + global_context.vga = (vga_t *)driver_manager_find_driver( &global_context.driver_manager, DRIVER_TYPE_GRAPHICS ); puts( "Activating drivers" ); driver_manager_activate_all( &global_context.driver_manager ); -- cgit v1.2.3-54-g00ecf