diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2016-01-26 09:28:11 +0100 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2016-02-03 10:00:57 +0100 |
commit | 6bf44a581b35aba967034bc3e0348a4d1f36a048 (patch) | |
tree | ae2aeeadbcb930f1e998c9b8c8013c9d08f9c64c /cpukit/libdrvmgr | |
parent | Use linker set for libio initialization (diff) | |
download | rtems-6bf44a581b35aba967034bc3e0348a4d1f36a048.tar.bz2 |
Use linker set for driver manager initialization
Update #2408.
Diffstat (limited to 'cpukit/libdrvmgr')
-rw-r--r-- | cpukit/libdrvmgr/drvmgr.c | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/cpukit/libdrvmgr/drvmgr.c b/cpukit/libdrvmgr/drvmgr.c index 7c37afd808..03af3900c3 100644 --- a/cpukit/libdrvmgr/drvmgr.c +++ b/cpukit/libdrvmgr/drvmgr.c @@ -14,6 +14,8 @@ #include <drvmgr/drvmgr.h> #include <drvmgr/drvmgr_confdefs.h> +#include <rtems/sysinit.h> + #include "drvmgr_internal.h" /* Enable debugging */ @@ -642,3 +644,91 @@ void drvmgr_bus_res_add(struct drvmgr_bus *bus, bres->next = bus->reslist; bus->reslist = bres; } + +#ifdef RTEMS_DRVMGR_STARTUP + +RTEMS_SYSINIT_ITEM( + _DRV_Manager_initialization, + RTEMS_SYSINIT_DRVMGR, + RTEMS_SYSINIT_ORDER_MIDDLE +); + +/* BSPs has already registered their "root bus" driver in the + * bsp_predriver hook or so. + * + * Init Drivers to Level 1, constraints: + * - Interrupts and system clock timer does not work. + * - malloc() work, however other memory services may not + * have been initialized yet. + * - initializes most basic stuff + * + * Typical setup in Level 1: + * - Find most devices in system, do PCI scan and configuration. + * - Reset hardware if needed. + * - Install IRQ driver + * - Install Timer driver + * - Install console driver and debug printk() + * - Install extra memory. + */ +static void _DRV_Manager_init_level_1(void) +{ + _DRV_Manager_init_level(1); +} + +RTEMS_SYSINIT_ITEM( + _DRV_Manager_init_level_1, + RTEMS_SYSINIT_DRVMGR_LEVEL_1, + RTEMS_SYSINIT_ORDER_MIDDLE +); + +/* Init Drivers to Level 2, constraints: + * - Interrupts can be registered and enabled. + * - System Clock is running + * - Console may be used. + * + * This is typically where drivers are initialized + * for the first time. + */ +static void _DRV_Manager_init_level_2(void) +{ + _DRV_Manager_init_level(2); +} + +RTEMS_SYSINIT_ITEM( + _DRV_Manager_init_level_2, + RTEMS_SYSINIT_DRVMGR_LEVEL_2, + RTEMS_SYSINIT_ORDER_MIDDLE +); + +/* Init Drivers to Level 3 + * + * This is typically where normal drivers are initialized + * for the second time, they may depend on other drivers + * API inited in level 2 + */ +static void _DRV_Manager_init_level_3(void) +{ + _DRV_Manager_init_level(3); +} + +RTEMS_SYSINIT_ITEM( + _DRV_Manager_init_level_3, + RTEMS_SYSINIT_DRVMGR_LEVEL_3, + RTEMS_SYSINIT_ORDER_MIDDLE +); + +/* Init Drivers to Level 4, + * Init drivers that depend on services initialized in Level 3 + */ +static void _DRV_Manager_init_level_4(void) +{ + _DRV_Manager_init_level(4); +} + +RTEMS_SYSINIT_ITEM( + _DRV_Manager_init_level_4, + RTEMS_SYSINIT_DRVMGR_LEVEL_4, + RTEMS_SYSINIT_ORDER_MIDDLE +); + +#endif /* RTEMS_DRVMGR_STARTUP */ |