1 /* 2 * SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD 3 * 4 * SPDX-License-Identifier: Apache-2.0 5 */ 6 7 #pragma once 8 9 #include <stddef.h> 10 #include <stdbool.h> 11 #include "esp_err.h" 12 13 #ifdef __cplusplus 14 extern "C" { 15 #endif 16 17 18 typedef enum { 19 /** 20 * Using SLEEP_EVENT to determine the execution of specific 21 * code at a particular point in the sleep flow. 22 */ 23 SLEEP_EVENT_HW_EXIT_SLEEP, // CPU wake up and start to work 24 SLEEP_EVENT_SW_CLK_READY, // CPU frequency restore 25 SLEEP_EVENT_SW_EXIT_SLEEP, // End of esp_light_sleep_start 26 SLEEP_EVENT_SW_GOTO_SLEEP, // Beginning of esp_light_sleep_start 27 SLEEP_EVENT_HW_TIME_START, // Start timing the sleep time 28 SLEEP_EVENT_HW_GOTO_SLEEP, // Hardware is about to power off 29 SLEEP_EVENT_SW_CPU_TO_MEM_START, // CPU registers are starting to be saved 30 SLEEP_EVENT_SW_CPU_TO_MEM_END, // CPU registers have finished saving 31 #if CONFIG_IDF_TARGET_ESP32H2 32 SLEEP_EVENT_HW_FLASH_BBPLL_EN_START, // Beginning of rtc_clk_bbpll_enable when using FLASH_PLL 33 SLEEP_EVENT_HW_FLASH_BBPLL_EN_STOP, // End of rtc_clk_bbpll_enable when using FLASH_PLL 34 #endif 35 SLEEP_EVENT_HW_BBPLL_EN_START, // Beginning of rtc_clk_bbpll_enable 36 SLEEP_EVENT_HW_BBPLL_EN_STOP, // End of rtc_clk_bbpll_enable 37 SLEEP_EVENT_CB_INDEX_NUM, 38 } esp_sleep_event_cb_index_t; 39 40 /** 41 * @brief Function prototype for light sleep event callback functions (if CONFIG_FREERTOS_USE_TICKLESS_IDLE). 42 * @param user_arg is the user provided argument while registering callbacks. 43 * @param ext_arg is an externally provided parameter that is used when the callback is executed. 44 * @return None 45 */ 46 47 typedef esp_err_t (*esp_sleep_event_cb_t)(void *user_arg, void *ext_arg); 48 49 /** 50 * @brief Function entry parameter types for light sleep event callback functions (if CONFIG_FREERTOS_USE_TICKLESS_IDLE) 51 */ 52 struct _esp_sleep_event_cb_config_t { 53 /** 54 * Callback function defined by internal developers. 55 */ 56 esp_sleep_event_cb_t cb; 57 /** 58 * Input parameters of callback function defined by internal developers. 59 */ 60 void *user_arg; 61 /** 62 * Execution priority of callback function defined by internal developers. 63 * The smaller the priority, the earlier it executes when call esp_sleep_execute_event_callbacks. 64 * If functions have the same priority, the function registered first will be executed first. 65 */ 66 uint32_t prior; 67 /** 68 * Next callback configuration defined by internal developer. 69 */ 70 struct _esp_sleep_event_cb_config_t *next; 71 }; 72 73 typedef struct _esp_sleep_event_cb_config_t esp_sleep_event_cb_config_t; 74 75 struct _esp_sleep_event_cbs_config_t { 76 /** 77 * Callback configurations defined by internal developers. 78 */ 79 esp_sleep_event_cb_config_t *sleep_event_cb_config[SLEEP_EVENT_CB_INDEX_NUM]; 80 }; 81 82 typedef struct _esp_sleep_event_cbs_config_t esp_sleep_event_cbs_config_t; 83 84 /** 85 * @brief Register event callbacks for light sleep internal events (if CONFIG_FREERTOS_USE_TICKLESS_IDLE) 86 * @param event_id Designed to register the corresponding event_cb in g_sleep_event_cbs_config 87 * @param event_cb_conf Config struct containing event callback function and corresponding argument 88 * @return 89 * - ESP_OK on success 90 * - ESP_ERR_INVALID_ARG if the input parameter event_cb_conf is NULL or event_id is out of range 91 * - ESP_ERR_NO_MEM if the remaining memory is insufficient to support malloc 92 * - ESP_FAIL if register the same function repeatedly 93 * 94 * @note Some of these callback functions are called from IDLE task context hence they cannot call any blocking functions 95 * @note Passing NULL value will not deregister the callbacks, it will silently ignore and return ESP_OK 96 */ 97 esp_err_t esp_sleep_register_event_callback(esp_sleep_event_cb_index_t event_id, const esp_sleep_event_cb_config_t *event_cb_conf); 98 99 /** 100 * @brief Unregister event callbacks for light sleep internal events (if CONFIG_FREERTOS_USE_TICKLESS_IDLE) 101 * @param event_id Designed to unregister the corresponding event_cb in g_sleep_event_cbs_config 102 * @param event_cb_conf Config struct containing event callback function and corresponding argument 103 * @return 104 * - ESP_OK on success 105 * - ESP_ERR_INVALID_ARG if the input parameter cb is NULL or event_id is out of range 106 */ 107 esp_err_t esp_sleep_unregister_event_callback(esp_sleep_event_cb_index_t event_id, esp_sleep_event_cb_t cb); 108 109 /** 110 * @brief Designed to execute functions in the esp_sleep_event_cb_config_t linked list 111 * 112 * @param event_id Designed to annotate the corresponding event_cb in g_sleep_event_cbs_config 113 * @param ext_arg Designed to pass external parameters 114 * @return None 115 */ 116 void esp_sleep_execute_event_callbacks(esp_sleep_event_cb_index_t event_id, void *ext_arg); 117 118 #ifdef __cplusplus 119 } 120 #endif 121