2021-11-16 23:06:01 -05:00
|
|
|
/*
|
2024-01-29 20:40:10 -05:00
|
|
|
* SPDX-FileCopyrightText: 2015-2024 Espressif Systems (Shanghai) CO LTD
|
2021-11-16 23:06:01 -05:00
|
|
|
*
|
|
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
|
|
*/
|
2016-08-17 11:08:22 -04:00
|
|
|
|
|
|
|
#ifndef __ESP_SYSTEM_H__
|
|
|
|
#define __ESP_SYSTEM_H__
|
|
|
|
|
|
|
|
#include <stdint.h>
|
2016-11-21 04:13:55 -05:00
|
|
|
#include <stdbool.h>
|
2016-08-25 04:49:59 -04:00
|
|
|
#include "esp_err.h"
|
global: move the soc component out of the common list
This MR removes the common dependency from every IDF components to the SOC component.
Currently, in the ``idf_functions.cmake`` script, we include the header path of SOC component by default for all components.
But for better code organization (or maybe also benifits to the compiling speed), we may remove the dependency to SOC components for most components except the driver and kernel related components.
In CMAKE, we have two kinds of header visibilities (set by include path visibility):
(Assume component A --(depends on)--> B, B is the current component)
1. public (``COMPONENT_ADD_INCLUDEDIRS``): means this path is visible to other depending components (A) (visible to A and B)
2. private (``COMPONENT_PRIV_INCLUDEDIRS``): means this path is only visible to source files inside the component (visible to B only)
and we have two kinds of depending ways:
(Assume component A --(depends on)--> B --(depends on)--> C, B is the current component)
1. public (```COMPONENT_REQUIRES```): means B can access to public include path of C. All other components rely on you (A) will also be available for the public headers. (visible to A, B)
2. private (``COMPONENT_PRIV_REQUIRES``): means B can access to public include path of C, but don't propagate this relation to other components (A). (visible to B)
1. remove the common requirement in ``idf_functions.cmake``, this makes the SOC components invisible to all other components by default.
2. if a component (for example, DRIVER) really needs the dependency to SOC, add a private dependency to SOC for it.
3. some other components that don't really depends on the SOC may still meet some errors saying "can't find header soc/...", this is because it's depended component (DRIVER) incorrectly include the header of SOC in its public headers. Moving all this kind of #include into source files, or private headers
4. Fix the include requirements for some file which miss sufficient #include directives. (Previously they include some headers by the long long long header include link)
This is a breaking change. Previous code may depends on the long include chain.
You may need to include the following headers for some files after this commit:
- soc/soc.h
- soc/soc_memory_layout.h
- driver/gpio.h
- esp_sleep.h
The major broken include chain includes:
1. esp_system.h no longer includes esp_sleep.h. The latter includes driver/gpio.h and driver/touch_pad.h.
2. ets_sys.h no longer includes soc/soc.h
3. freertos/portmacro.h no longer includes soc/soc_memory_layout.h
some peripheral headers no longer includes their hw related headers, e.g. rom/gpio.h no longer includes soc/gpio_pins.h and soc/gpio_reg.h
BREAKING CHANGE
2019-04-03 01:17:38 -04:00
|
|
|
#include "esp_attr.h"
|
|
|
|
#include "esp_bit_defs.h"
|
2019-03-22 00:40:12 -04:00
|
|
|
#include "esp_idf_version.h"
|
global: move the soc component out of the common list
This MR removes the common dependency from every IDF components to the SOC component.
Currently, in the ``idf_functions.cmake`` script, we include the header path of SOC component by default for all components.
But for better code organization (or maybe also benifits to the compiling speed), we may remove the dependency to SOC components for most components except the driver and kernel related components.
In CMAKE, we have two kinds of header visibilities (set by include path visibility):
(Assume component A --(depends on)--> B, B is the current component)
1. public (``COMPONENT_ADD_INCLUDEDIRS``): means this path is visible to other depending components (A) (visible to A and B)
2. private (``COMPONENT_PRIV_INCLUDEDIRS``): means this path is only visible to source files inside the component (visible to B only)
and we have two kinds of depending ways:
(Assume component A --(depends on)--> B --(depends on)--> C, B is the current component)
1. public (```COMPONENT_REQUIRES```): means B can access to public include path of C. All other components rely on you (A) will also be available for the public headers. (visible to A, B)
2. private (``COMPONENT_PRIV_REQUIRES``): means B can access to public include path of C, but don't propagate this relation to other components (A). (visible to B)
1. remove the common requirement in ``idf_functions.cmake``, this makes the SOC components invisible to all other components by default.
2. if a component (for example, DRIVER) really needs the dependency to SOC, add a private dependency to SOC for it.
3. some other components that don't really depends on the SOC may still meet some errors saying "can't find header soc/...", this is because it's depended component (DRIVER) incorrectly include the header of SOC in its public headers. Moving all this kind of #include into source files, or private headers
4. Fix the include requirements for some file which miss sufficient #include directives. (Previously they include some headers by the long long long header include link)
This is a breaking change. Previous code may depends on the long include chain.
You may need to include the following headers for some files after this commit:
- soc/soc.h
- soc/soc_memory_layout.h
- driver/gpio.h
- esp_sleep.h
The major broken include chain includes:
1. esp_system.h no longer includes esp_sleep.h. The latter includes driver/gpio.h and driver/touch_pad.h.
2. ets_sys.h no longer includes soc/soc.h
3. freertos/portmacro.h no longer includes soc/soc_memory_layout.h
some peripheral headers no longer includes their hw related headers, e.g. rom/gpio.h no longer includes soc/gpio_pins.h and soc/gpio_reg.h
BREAKING CHANGE
2019-04-03 01:17:38 -04:00
|
|
|
|
2016-08-17 11:08:22 -04:00
|
|
|
#ifdef __cplusplus
|
|
|
|
extern "C" {
|
|
|
|
#endif
|
|
|
|
|
2018-07-29 05:57:59 -04:00
|
|
|
/**
|
|
|
|
* @brief Reset reasons
|
|
|
|
*/
|
|
|
|
typedef enum {
|
|
|
|
ESP_RST_UNKNOWN, //!< Reset reason can not be determined
|
|
|
|
ESP_RST_POWERON, //!< Reset due to power-on event
|
|
|
|
ESP_RST_EXT, //!< Reset by external pin (not applicable for ESP32)
|
|
|
|
ESP_RST_SW, //!< Software reset via esp_restart
|
|
|
|
ESP_RST_PANIC, //!< Software reset due to exception/panic
|
|
|
|
ESP_RST_INT_WDT, //!< Reset (software or hardware) due to interrupt watchdog
|
|
|
|
ESP_RST_TASK_WDT, //!< Reset due to task watchdog
|
|
|
|
ESP_RST_WDT, //!< Reset due to other watchdogs
|
|
|
|
ESP_RST_DEEPSLEEP, //!< Reset after exiting deep sleep mode
|
|
|
|
ESP_RST_BROWNOUT, //!< Brownout reset (software or hardware)
|
|
|
|
ESP_RST_SDIO, //!< Reset over SDIO
|
2023-03-08 20:23:22 -05:00
|
|
|
ESP_RST_USB, //!< Reset by USB peripheral
|
2023-08-30 06:12:42 -04:00
|
|
|
ESP_RST_JTAG, //!< Reset by JTAG
|
2024-02-08 05:16:36 -05:00
|
|
|
ESP_RST_EFUSE, //!< Reset due to efuse error
|
|
|
|
ESP_RST_PWR_GLITCH, //!< Reset due to power glitch detected
|
|
|
|
ESP_RST_CPU_LOCKUP, //!< Reset due to CPU lock up
|
2018-07-29 05:57:59 -04:00
|
|
|
} esp_reset_reason_t;
|
|
|
|
|
2018-07-30 09:19:20 -04:00
|
|
|
/**
|
|
|
|
* Shutdown handler type
|
|
|
|
*/
|
2017-08-07 06:30:46 -04:00
|
|
|
typedef void (*shutdown_handler_t)(void);
|
2018-07-30 09:19:20 -04:00
|
|
|
|
2017-08-07 06:30:46 -04:00
|
|
|
/**
|
|
|
|
* @brief Register shutdown handler
|
|
|
|
*
|
2018-07-30 09:19:20 -04:00
|
|
|
* This function allows you to register a handler that gets invoked before
|
|
|
|
* the application is restarted using esp_restart function.
|
2019-04-08 07:30:07 -04:00
|
|
|
* @param handle function to execute on restart
|
|
|
|
* @return
|
|
|
|
* - ESP_OK on success
|
|
|
|
* - ESP_ERR_INVALID_STATE if the handler has already been registered
|
|
|
|
* - ESP_ERR_NO_MEM if no more shutdown handler slots are available
|
2017-08-07 06:30:46 -04:00
|
|
|
*/
|
|
|
|
esp_err_t esp_register_shutdown_handler(shutdown_handler_t handle);
|
|
|
|
|
2019-04-08 07:29:44 -04:00
|
|
|
/**
|
|
|
|
* @brief Unregister shutdown handler
|
|
|
|
*
|
|
|
|
* This function allows you to unregister a handler which was previously
|
|
|
|
* registered using esp_register_shutdown_handler function.
|
|
|
|
* - ESP_OK on success
|
|
|
|
* - ESP_ERR_INVALID_STATE if the given handler hasn't been registered before
|
|
|
|
*/
|
|
|
|
esp_err_t esp_unregister_shutdown_handler(shutdown_handler_t handle);
|
|
|
|
|
2016-08-17 11:08:22 -04:00
|
|
|
/**
|
2016-11-21 04:15:37 -05:00
|
|
|
* @brief Restart PRO and APP CPUs.
|
2016-08-17 11:08:22 -04:00
|
|
|
*
|
2016-11-21 04:15:37 -05:00
|
|
|
* This function can be called both from PRO and APP CPUs.
|
|
|
|
* After successful restart, CPU reset reason will be SW_CPU_RESET.
|
2021-11-16 23:06:01 -05:00
|
|
|
* Peripherals (except for Wi-Fi, BT, UART0, SPI1, and legacy timers) are not reset.
|
2016-11-21 04:15:37 -05:00
|
|
|
* This function does not return.
|
2016-08-17 11:08:22 -04:00
|
|
|
*/
|
2024-01-29 20:40:10 -05:00
|
|
|
void esp_restart(void) __attribute__((__noreturn__));
|
2016-08-17 11:08:22 -04:00
|
|
|
|
2018-07-29 05:57:59 -04:00
|
|
|
/**
|
|
|
|
* @brief Get reason of last reset
|
|
|
|
* @return See description of esp_reset_reason_t for explanation of each value.
|
|
|
|
*/
|
|
|
|
esp_reset_reason_t esp_reset_reason(void);
|
|
|
|
|
2016-08-17 11:08:22 -04:00
|
|
|
/**
|
|
|
|
* @brief Get the size of available heap.
|
|
|
|
*
|
2021-11-16 23:06:01 -05:00
|
|
|
* @note Note that the returned value may be larger than the maximum contiguous block
|
2016-11-21 04:15:37 -05:00
|
|
|
* which can be allocated.
|
2016-08-17 11:08:22 -04:00
|
|
|
*
|
2016-11-21 04:15:37 -05:00
|
|
|
* @return Available heap size, in bytes.
|
2016-08-17 11:08:22 -04:00
|
|
|
*/
|
2016-11-21 04:15:37 -05:00
|
|
|
uint32_t esp_get_free_heap_size(void);
|
2016-08-17 11:08:22 -04:00
|
|
|
|
2020-05-28 04:53:54 -04:00
|
|
|
/**
|
|
|
|
* @brief Get the size of available internal heap.
|
|
|
|
*
|
2021-11-16 23:06:01 -05:00
|
|
|
* @note Note that the returned value may be larger than the maximum contiguous block
|
2020-05-28 04:53:54 -04:00
|
|
|
* which can be allocated.
|
|
|
|
*
|
|
|
|
* @return Available internal heap size, in bytes.
|
|
|
|
*/
|
|
|
|
uint32_t esp_get_free_internal_heap_size(void);
|
|
|
|
|
2017-05-03 04:03:28 -04:00
|
|
|
/**
|
|
|
|
* @brief Get the minimum heap that has ever been available
|
|
|
|
*
|
|
|
|
* @return Minimum free heap ever available
|
|
|
|
*/
|
2024-01-29 20:40:10 -05:00
|
|
|
uint32_t esp_get_minimum_free_heap_size(void);
|
2017-05-03 04:03:28 -04:00
|
|
|
|
2020-02-02 10:23:16 -05:00
|
|
|
/**
|
|
|
|
* @brief Trigger a software abort
|
2020-11-10 02:40:01 -05:00
|
|
|
*
|
2020-02-02 10:23:16 -05:00
|
|
|
* @param details Details that will be displayed during panic handling.
|
|
|
|
*/
|
2023-05-10 22:40:49 -04:00
|
|
|
void __attribute__((__noreturn__)) esp_system_abort(const char* details);
|
2020-02-02 10:23:16 -05:00
|
|
|
|
2016-08-17 11:08:22 -04:00
|
|
|
#ifdef __cplusplus
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#endif /* __ESP_SYSTEM_H__ */
|