sleep_event.h 4.8 KB

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