From cfc0bfa213a94a6dee80c15047026547847da91c Mon Sep 17 00:00:00 2001 From: Andreas Baumann Date: Sat, 15 Jul 2017 20:50:39 +0200 Subject: reworked driver init and vtable, taking the interrupt manager and the context as parameters when creating a driver --- src/drivers/driver.c | 14 ++++---------- src/drivers/driver.h | 6 ++---- src/drivers/hdi/ps2/keyboard.c | 1 - src/drivers/hdi/ps2/mouse.c | 1 - src/drivers/net/rtl8139.c | 5 +++-- src/drivers/net/rtl8139.h | 2 +- src/drivers/video/vga.c | 5 +++-- src/drivers/video/vga.h | 2 +- src/hardware/pci.c | 2 +- src/kernel/kernel.c | 2 +- 10 files changed, 16 insertions(+), 24 deletions(-) (limited to 'src') diff --git a/src/drivers/driver.c b/src/drivers/driver.c index c9633b8..fae54e7 100644 --- a/src/drivers/driver.c +++ b/src/drivers/driver.c @@ -6,26 +6,20 @@ #include "stdlib.h" static driver_vtable_t const driver_vtable = { - driver_register_interrupt_handler, driver_activate, driver_deactivate, driver_deinit, driver_print_info }; -void driver_init( driver_t *driver ) +void driver_init( driver_t *driver, interrupt_t *interrupt, void *context ) { memset( driver, 0, sizeof( driver_t ) ); - driver->vtable = &driver_vtable; -} - -void driver_register_interrupt_handler( void *obj, interrupt_handler_func_t handler, void *context ) -{ - driver_t *driver = (driver_t *)obj; - - driver->handler = handler; + driver->interrupt = interrupt; driver->context = context; + + driver->vtable = &driver_vtable; } void driver_activate( void *obj ) diff --git a/src/drivers/driver.h b/src/drivers/driver.h index d538f14..38dfe64 100644 --- a/src/drivers/driver.h +++ b/src/drivers/driver.h @@ -4,7 +4,6 @@ #include "interrupts.h" typedef struct { - void (*register_interrupt_handler)( void *obj, interrupt_handler_func_t handler, void *context ); void (*activate)( void *obj ); void (*deactivate)( void *obj ); void (*deinit)( void *obj ); @@ -13,12 +12,11 @@ typedef struct { typedef struct { driver_vtable_t const *vtable; - interrupt_handler_func_t handler; + interrupt_t *interrupt; void *context; } driver_t; -void driver_init( driver_t *driver ); -void driver_register_interrupt_handler( void *obj, interrupt_handler_func_t handler, void *context ); +void driver_init( driver_t *driver, interrupt_t *interrupt, void *context ); void driver_activate( void *obj ); void driver_deactivate( void *obj ); void driver_deinit( void *obj ); diff --git a/src/drivers/hdi/ps2/keyboard.c b/src/drivers/hdi/ps2/keyboard.c index df4edd7..ccae3e7 100644 --- a/src/drivers/hdi/ps2/keyboard.c +++ b/src/drivers/hdi/ps2/keyboard.c @@ -66,7 +66,6 @@ static void read_ack( keyboard_t *keyboard ) static keyboard_vtable_t const keyboard_vtable = { { - driver_register_interrupt_handler, keyboard_activate, keyboard_deactivate, keyboard_deinit, diff --git a/src/drivers/hdi/ps2/mouse.c b/src/drivers/hdi/ps2/mouse.c index bfda08f..1421729 100644 --- a/src/drivers/hdi/ps2/mouse.c +++ b/src/drivers/hdi/ps2/mouse.c @@ -78,7 +78,6 @@ static void set_sample_rate( mouse_t *mouse, uint8_t samples ) static mouse_vtable_t const mouse_vtable = { { - driver_register_interrupt_handler, mouse_activate, mouse_deactivate, mouse_deinit, diff --git a/src/drivers/net/rtl8139.c b/src/drivers/net/rtl8139.c index 139f228..a5c0cd6 100644 --- a/src/drivers/net/rtl8139.c +++ b/src/drivers/net/rtl8139.c @@ -7,7 +7,6 @@ static rtl8139_vtable_t const rtl8139_vtable = { { - driver_register_interrupt_handler, rtl8139_activate, rtl8139_deactivate, rtl8139_deinit, @@ -15,10 +14,12 @@ static rtl8139_vtable_t const rtl8139_vtable = { } }; -void rtl8139_init( rtl8139_t *rtl8139 ) +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_t *)rtl8139)->vtable = (driver_vtable_t *)&rtl8139_vtable; } diff --git a/src/drivers/net/rtl8139.h b/src/drivers/net/rtl8139.h index fd3becc..1bb899c 100644 --- a/src/drivers/net/rtl8139.h +++ b/src/drivers/net/rtl8139.h @@ -11,7 +11,7 @@ typedef struct { driver_vtable_t base; } rtl8139_vtable_t; -void rtl8139_init( rtl8139_t *rtl8139 ); +void rtl8139_init( rtl8139_t *rtl8139, interrupt_t *interrupt, void *context ); void rtl8139_activate( void *obj ); void rtl8139_deactivate( void *obj ); void rtl8139_deinit( void *obj ); diff --git a/src/drivers/video/vga.c b/src/drivers/video/vga.c index 5f9065e..a8836fd 100644 --- a/src/drivers/video/vga.c +++ b/src/drivers/video/vga.c @@ -11,7 +11,6 @@ static vga_vtable_t const vga_vtable = { { - driver_register_interrupt_handler, vga_activate, vga_deactivate, vga_deinit, @@ -19,9 +18,11 @@ static vga_vtable_t const vga_vtable = { } }; -void vga_init( vga_t *vga ) +void vga_init( vga_t *vga, interrupt_t *interrupt, void *context ) { memset( vga, 0, sizeof( vga_t ) ); + + driver_init( (driver_t *)vga, interrupt, context ); port8_init( &vga->misc_port, 0x3C2 ); port8_init( &vga->crtc_index_port, 0x3D4 ); diff --git a/src/drivers/video/vga.h b/src/drivers/video/vga.h index 9a637a2..600180a 100644 --- a/src/drivers/video/vga.h +++ b/src/drivers/video/vga.h @@ -54,7 +54,7 @@ typedef struct { driver_vtable_t base; } vga_vtable_t; -void vga_init( vga_t *vga ); +void vga_init( vga_t *vga, interrupt_t *interrupt, void *context ); void vga_activate( void *obj ); void vga_deactivate( void *obj ); void vga_deinit( void *obj ); diff --git a/src/hardware/pci.c b/src/hardware/pci.c index 6c43448..84249f9 100644 --- a/src/hardware/pci.c +++ b/src/hardware/pci.c @@ -167,7 +167,7 @@ driver_t *pci_device_get_driver( pci_device_descriptor_t *descriptor, interrupt_ switch( descriptor->device_id ) { case 0x8139: // RTL8139 driver = (driver_t *)malloc( sizeof( rtl8139_t ) ); - rtl8139_init( (rtl8139_t *)driver ); + rtl8139_init( (rtl8139_t *)driver, interrupt, NULL ); break; } break; diff --git a/src/kernel/kernel.c b/src/kernel/kernel.c index 00f614f..7d38269 100644 --- a/src/kernel/kernel.c +++ b/src/kernel/kernel.c @@ -151,7 +151,7 @@ void kernel_main( void ) // TODO: merge with the text mode vga_text_t object global_context.vga = (vga_t *)malloc( sizeof( vga_t ) ); - vga_init( global_context.vga ); + vga_init( global_context.vga, &interrupt, NULL ); driver_manager_add_driver( &global_context.driver_manager, (driver_t *)global_context.vga ); puts( "Activating drivers" ); -- cgit v1.2.3-54-g00ecf