#include #include #include extern struct device __initconfig_start[]; extern struct device __initconfig0_start[]; extern struct device __initconfig1_start[]; extern struct device __initconfig2_start[]; extern struct device __initconfig3_start[]; extern struct device __initconfig4_start[]; extern struct device __initconfig5_start[]; extern struct device __initconfig6_start[]; extern struct device __initconfig7_start[]; extern struct device __initconfig_end[]; static struct device *config_levels[] = { __initconfig0_start, __initconfig1_start, __initconfig2_start, __initconfig3_start, __initconfig4_start, __initconfig5_start, __initconfig6_start, __initconfig7_start, __initconfig_end, }; /** * @brief Execute all the driver init functions at a given level * * @details Driver init objects are created with the * __define_initconfig() macro and are placed in RAM by the linker * script. The {nano|micro}kernel code will execute the init level at * the appropriate time. * * @param level init level to run. */ void _sys_device_do_config_level(int level) { struct device *info; for (info = config_levels[level]; info < config_levels[level+1]; info++) { struct device_config *device = info->config; device->init(info); } } /** * @brief Retrieve the device structure for a driver by name * * @details Driver config object are created via the * DECLARE_DEVICE_INIT_CONFIG() macro and placed in ROM by the * linker. If a driver needs to bind to another driver it will use * this function to retrieve the device structure of the lower level * driver by the name the driver exposes to the system. * * @param name driver name to search for. */ struct device* device_get_binding(char *name) { struct device *info; struct device *found = 0; int level; for (level = 0; level < ARRAY_SIZE(config_levels) - 1; level++) { for (info = config_levels[level]; info < config_levels[level+1]; info++) { struct device_config *device = info->config; if (!strcmp(name, device->name)) { return info; } } } return found; }