Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 | /* * Copyright (c) 2015 Intel Corporation. * * SPDX-License-Identifier: Apache-2.0 */ #ifndef ZEPHYR_INCLUDE_INIT_H_ #define ZEPHYR_INCLUDE_INIT_H_ #include <zephyr/toolchain.h> #include <zephyr/kernel.h> #include <zephyr/types.h> #ifdef __cplusplus extern "C" { #endif /* * System initialization levels. The PRE_KERNEL_1 and PRE_KERNEL_2 levels are * executed in the kernel's initialization context, which uses the interrupt * stack. The remaining levels are executed in the kernel's main task. */ #define _SYS_INIT_LEVEL_PRE_KERNEL_1 0 #define _SYS_INIT_LEVEL_PRE_KERNEL_2 1 #define _SYS_INIT_LEVEL_POST_KERNEL 2 #define _SYS_INIT_LEVEL_APPLICATION 3 #ifdef CONFIG_SMP #define _SYS_INIT_LEVEL_SMP 4 #endif struct device; /** * @brief Static init entry structure for each device driver or services * * @param init init function for the init entry which will take the dev * attribute as parameter. See below. * @param dev pointer to a device driver instance structure. Can be NULL * if the init entry is not used for a device driver but a service. */ struct init_entry { /** Initialization function for the init entry which will take * the dev attribute as parameter. See below. */ int (*init)(const struct device *dev); /** Pointer to a device driver instance structure. Can be NULL * if the init entry is not used for a device driver but a services. */ const struct device *dev; }; void z_sys_init_run_level(int32_t level); /** * @brief Construct a namespaced identifier for SYS_INIT instance * * @param _name Base unique name */ #define Z_SYS_NAME(_name) _CONCAT(sys_init_, _name) /** * @brief Construct a namespaced identifier for @ref init_entry instance * * @param _entry_name Base unique name */ #define Z_INIT_ENTRY_NAME(_entry_name) _CONCAT(__init_, _entry_name) /** * @brief Create an init entry object and set it up for boot time initialization * * @details This macro defines an init entry object that will be automatically * configured by the kernel during system initialization. Note that * init entries will not be accessible from user mode. Also this macro should * not be used directly, use relevant macro such as SYS_INIT() or * DEVICE_DEFINE() instead. * * @param _entry_name Init entry name. It is the name this instance exposes to * the system. * * @param _init_fn Address to the init function of the entry. * * @param _device A device driver instance pointer or NULL * * @param _level The initialization level at which configuration * occurs. See SYS_INIT(). * * @param prio The initialization priority of the object, relative to * other objects of the same initialization level. See SYS_INIT(). */ #define Z_INIT_ENTRY_DEFINE(_entry_name, _init_fn, _device, _level, _prio) \ static const Z_DECL_ALIGN(struct init_entry) \ Z_INIT_ENTRY_NAME(_entry_name) __used __noasan \ __attribute__((__section__(".z_init_" #_level STRINGIFY(_prio)"_"))) = { \ .init = (_init_fn), \ .dev = (_device), \ } /** * @ingroup device_model * * @brief Run an initialization function at boot at specified priority * * @details This macro lets you run a function at system boot. * * @param _init_fn Pointer to the boot function to run * * @param _level The initialization level at which configuration occurs. * Must be one of the following symbols, which are listed in the order * they are performed by the kernel: * \n * \li PRE_KERNEL_1: Used for initialization objects that have no dependencies, * such as those that rely solely on hardware present in the processor/SOC. * These objects cannot use any kernel services during configuration, since * they are not yet available. * \n * \li PRE_KERNEL_2: Used for initialization objects that rely on objects * initialized as part of the PRE_KERNEL_1 level. These objects cannot use any * kernel services during configuration, since they are not yet available. * \n * \li POST_KERNEL: Used for initialization objects that require kernel services * during configuration. * \n * \li POST_KERNEL_SMP: Used for initialization objects that require kernel * services during configuration after SMP initialization. * \n * \li APPLICATION: Used for application components (i.e. non-kernel components) * that need automatic configuration. These objects can use all services * provided by the kernel during configuration. * * @param _prio The initialization priority of the object, relative to * other objects of the same initialization level. Specified as an integer * value in the range 0 to 99; lower values indicate earlier initialization. * Must be a decimal integer literal without leading zeroes or sign (e.g. 32), * or an equivalent symbolic name (e.g. \#define MY_INIT_PRIO 32); symbolic * expressions are *not* permitted * (e.g. CONFIG_KERNEL_INIT_PRIORITY_DEFAULT + 5). */ #define SYS_INIT(_init_fn, _level, _prio) \ SYS_INIT_NAMED(_init_fn, _init_fn, _level, _prio) /** * @ingroup device_model * * @brief Run an initialization function at boot at specified priority * * @details This macro lets you run a function at system boot. * * @param _name Unique name for SYS_INIT entry. Allows specifying multiple init * entries that utilise the same function. * * @param _init_fn See @ref SYS_INIT * * @param _level See @ref SYS_INIT * * @param _prio See @ref SYS_INIT */ #define SYS_INIT_NAMED(_name, _init_fn, _level, _prio) \ Z_INIT_ENTRY_DEFINE(Z_SYS_NAME(_name), _init_fn, NULL, _level, _prio) #ifdef __cplusplus } #endif #endif /* ZEPHYR_INCLUDE_INIT_H_ */ |