forked from Imagelibrary/rtems
IO_MANAGER: early dynamic driver registration
Adds the possibility to register drivers before the IO Manager has completed the initialization. Sometimes the BSP may want to register a driver dynamically early in the boot process.
This commit is contained in:
@@ -21,10 +21,14 @@
|
|||||||
|
|
||||||
#include <rtems/io.h>
|
#include <rtems/io.h>
|
||||||
|
|
||||||
|
int _IO_Manager_drivers_inititalized = 0;
|
||||||
|
|
||||||
void _IO_Initialize_all_drivers( void )
|
void _IO_Initialize_all_drivers( void )
|
||||||
{
|
{
|
||||||
rtems_device_major_number major;
|
rtems_device_major_number major;
|
||||||
|
|
||||||
|
_IO_Manager_drivers_inititalized = 1;
|
||||||
|
|
||||||
for ( major=0 ; major < _IO_Number_of_drivers ; major ++ )
|
for ( major=0 ; major < _IO_Number_of_drivers ; major ++ )
|
||||||
(void) rtems_io_initialize( major, 0, NULL );
|
(void) rtems_io_initialize( major, 0, NULL );
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,6 +25,8 @@
|
|||||||
#include <rtems/rtems/intr.h>
|
#include <rtems/rtems/intr.h>
|
||||||
#include <rtems/score/threaddispatch.h>
|
#include <rtems/score/threaddispatch.h>
|
||||||
|
|
||||||
|
extern int _IO_Manager_drivers_inititalized;
|
||||||
|
|
||||||
static inline bool rtems_io_is_empty_table(
|
static inline bool rtems_io_is_empty_table(
|
||||||
const rtems_driver_address_table *table
|
const rtems_driver_address_table *table
|
||||||
)
|
)
|
||||||
@@ -108,5 +110,15 @@ rtems_status_code rtems_io_register_driver(
|
|||||||
|
|
||||||
_Thread_Enable_dispatch();
|
_Thread_Enable_dispatch();
|
||||||
|
|
||||||
|
if ( _IO_Manager_drivers_inititalized ) {
|
||||||
|
/* Other drivers have already been initialized, we initialize
|
||||||
|
* the driver directly.
|
||||||
|
*/
|
||||||
return rtems_io_initialize( major, 0, NULL );
|
return rtems_io_initialize( major, 0, NULL );
|
||||||
|
} else {
|
||||||
|
/* The driver will be initialized together with all other drivers
|
||||||
|
* in a later stage by _IO_Initialize_all_drivers().
|
||||||
|
*/
|
||||||
|
return RTEMS_SUCCESSFUL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user