mirror of
https://github.com/zephyrproject-rtos/zephyr
synced 2025-08-24 19:30:04 +00:00
Device initialization may require use of generic services such as starting up power rails, some of which may be controlled by GPIOs on an external controller that can't be used until full kernel services are available. Generic services can check k_is_in_isr() and mediate their behavior that way, but currently have no way to determine that the kernel is not available. Provide a function that indicates whether initialization is still in pre-kernel stages where no kernel services are available. Signed-off-by: Peter A. Bigot <pab@pabigot.com>
93 lines
2.7 KiB
C
93 lines
2.7 KiB
C
/*
|
|
* Copyright (c) 2015 Intel Corporation.
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
#ifndef ZEPHYR_INCLUDE_INIT_H_
|
|
#define ZEPHYR_INCLUDE_INIT_H_
|
|
|
|
#include <device.h>
|
|
#include <toolchain.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
|
|
|
|
extern s8_t z_sys_device_level;
|
|
|
|
/**
|
|
* @brief Test whether startup is in the before-main-task phase.
|
|
*
|
|
* This impacts which services are available for use, and the context
|
|
* in which functions are run.
|
|
*
|
|
* @return true if and only if start up is still running pre-kernel
|
|
* initialization.
|
|
*/
|
|
static inline bool k_is_pre_kernel(void)
|
|
{
|
|
return (z_sys_device_level < _SYS_INIT_LEVEL_POST_KERNEL);
|
|
}
|
|
|
|
/* A counter is used to avoid issues when two or more system devices
|
|
* are declared in the same C file with the same init function.
|
|
*/
|
|
#define Z_SYS_NAME(init_fn) _CONCAT(_CONCAT(sys_init_, init_fn), __COUNTER__)
|
|
|
|
/**
|
|
* @def SYS_INIT
|
|
*
|
|
* @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, See DEVICE_AND_API_INIT for details.
|
|
*
|
|
* @param prio Priority within the selected initialization level. See
|
|
* DEVICE_AND_API_INIT for details.
|
|
*/
|
|
#define SYS_INIT(init_fn, level, prio) \
|
|
DEVICE_AND_API_INIT(Z_SYS_NAME(init_fn), "", init_fn, NULL, NULL, level,\
|
|
prio, NULL)
|
|
|
|
/**
|
|
* @def SYS_DEVICE_DEFINE
|
|
*
|
|
* @brief Run an initialization function at boot at specified priority,
|
|
* and define device PM control function.
|
|
*
|
|
* @details This macro lets you run a function at system boot.
|
|
*
|
|
* @param drv_name Name of this system device
|
|
* @param init_fn Pointer to the boot function to run
|
|
* @param pm_control_fn Pointer to device_pm_control function.
|
|
* Can be empty function (device_pm_control_nop) if not
|
|
* implemented.
|
|
* @param level The initialization level, See DEVICE_INIT for details.
|
|
* @param prio Priority within the selected initialization level. See
|
|
* DEVICE_INIT for details.
|
|
*/
|
|
#define SYS_DEVICE_DEFINE(drv_name, init_fn, pm_control_fn, level, prio) \
|
|
DEVICE_DEFINE(Z_SYS_NAME(init_fn), drv_name, init_fn, pm_control_fn, \
|
|
NULL, NULL, level, prio, NULL)
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* ZEPHYR_INCLUDE_INIT_H_ */
|