summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Baumann <mail@andreasbaumann.cc>2017-07-16 09:21:36 +0200
committerAndreas Baumann <mail@andreasbaumann.cc>2017-07-16 09:21:36 +0200
commit8183f17368ea6944c8b36d7cb7564b33d2a0503a (patch)
treefc9ea3df698cab447dcee86cf94e047db037e9b6
parent1e8bad98827b651009a8ad4b8134d8a72a004be3 (diff)
downloadabaos-8183f17368ea6944c8b36d7cb7564b33d2a0503a.tar.gz
abaos-8183f17368ea6944c8b36d7cb7564b33d2a0503a.tar.bz2
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
-rw-r--r--src/drivers/driver.c18
-rw-r--r--src/drivers/driver.h11
-rw-r--r--src/drivers/hdi/ps2/keyboard.c2
-rw-r--r--src/drivers/hdi/ps2/mouse.c2
-rw-r--r--src/drivers/net/rtl8139.c2
-rw-r--r--src/drivers/video/vga.c2
-rw-r--r--src/hardware/pci.c9
-rw-r--r--src/kernel/kernel.c8
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 );