#include "driver.h" #include "kernel.h" #include "string.h" #include "stdio.h" #include "stdlib.h" static driver_vtable_t const driver_vtable = { driver_activate, driver_deactivate, driver_deinit, driver_print_info }; 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; driver->vtable = &driver_vtable; } void driver_activate( void *obj ) { } void driver_deactivate( void *obj ) { } void driver_deinit( void *obj ) { } void driver_print_info( void *obj ) { puts( "Unknown driver" ); } void driver_manager_init( driver_manager_t *manager ) { memset( manager, 0, sizeof( driver_manager_t ) ); manager->nof_drivers = 0; } void driver_manager_add_driver( driver_manager_t *manager, driver_t *driver ) { if( manager->nof_drivers >= MAX_NOF_DRIVERS - 1 ) { kernel_panic( "Allocating more than %d drivers.. increase kernel constant MAX_NOF_DRIVERS", MAX_NOF_DRIVERS ); } manager->driver[manager->nof_drivers] = driver; manager->nof_drivers++; } void driver_manager_activate_all( driver_manager_t *manager ) { for( int i = 0; i < manager->nof_drivers; i++ ) { driver_t *driver = (driver_t *)manager->driver[i]; driver->vtable->activate( driver ); } } void driver_manager_deactivate_all( driver_manager_t *manager ) { if( manager->nof_drivers == 0 ) { return; } for( int i = manager->nof_drivers - 1; i >= 0; i-- ) { driver_t *driver = (driver_t *)manager->driver[i]; driver->vtable->deactivate( driver ); } } void driver_manager_deinit( driver_manager_t *manager ) { if( manager->nof_drivers == 0 ) { return; } for( int i = manager->nof_drivers - 1; i >= 0; i-- ) { driver_t *driver = (driver_t *)manager->driver[i]; driver->vtable->deinit( driver ); free( driver ); } } void driver_manager_print_info_all( driver_manager_t *manager ) { for( int i = 0; i < manager->nof_drivers; i++ ) { driver_t *driver = (driver_t *)manager->driver[i]; 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; }