rtc_io.c 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. /*
  2. * SPDX-FileCopyrightText: 2019-2023 Espressif Systems (Shanghai) CO LTD
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. #include <string.h>
  7. #include "esp_log.h"
  8. #include "esp_err.h"
  9. #include "esp_check.h"
  10. #include "freertos/FreeRTOS.h"
  11. #include "freertos/semphr.h"
  12. #include "freertos/timers.h"
  13. #include "driver/rtc_io.h"
  14. #include "hal/rtc_io_hal.h"
  15. #include "soc/rtc_io_periph.h"
  16. #include "soc/soc_caps.h"
  17. static const char __attribute__((__unused__)) *RTCIO_TAG = "RTCIO";
  18. extern portMUX_TYPE rtc_spinlock; //TODO: Will be placed in the appropriate position after the rtc module is finished.
  19. #define RTCIO_ENTER_CRITICAL() portENTER_CRITICAL(&rtc_spinlock)
  20. #define RTCIO_EXIT_CRITICAL() portEXIT_CRITICAL(&rtc_spinlock)
  21. bool rtc_gpio_is_valid_gpio(gpio_num_t gpio_num)
  22. {
  23. #if SOC_RTCIO_PIN_COUNT > 0
  24. return (gpio_num < GPIO_PIN_COUNT && rtc_io_num_map[gpio_num] >= 0);
  25. #else
  26. return false;
  27. #endif
  28. }
  29. #if SOC_RTCIO_PIN_COUNT > 0
  30. /*---------------------------------------------------------------
  31. RTC IO
  32. ---------------------------------------------------------------*/
  33. int rtc_io_number_get(gpio_num_t gpio_num)
  34. {
  35. return rtc_io_num_map[gpio_num];
  36. }
  37. esp_err_t rtc_gpio_init(gpio_num_t gpio_num)
  38. {
  39. ESP_RETURN_ON_FALSE(rtc_gpio_is_valid_gpio(gpio_num), ESP_ERR_INVALID_ARG, RTCIO_TAG, "RTCIO number error");
  40. RTCIO_ENTER_CRITICAL();
  41. rtcio_hal_function_select(rtc_io_number_get(gpio_num), RTCIO_FUNC_RTC);
  42. RTCIO_EXIT_CRITICAL();
  43. return ESP_OK;
  44. }
  45. esp_err_t rtc_gpio_deinit(gpio_num_t gpio_num)
  46. {
  47. ESP_RETURN_ON_FALSE(rtc_gpio_is_valid_gpio(gpio_num), ESP_ERR_INVALID_ARG, RTCIO_TAG, "RTCIO number error");
  48. RTCIO_ENTER_CRITICAL();
  49. // Select Gpio as Digital Gpio
  50. rtcio_hal_function_select(rtc_io_number_get(gpio_num), RTCIO_FUNC_DIGITAL);
  51. RTCIO_EXIT_CRITICAL();
  52. return ESP_OK;
  53. }
  54. #if SOC_RTCIO_INPUT_OUTPUT_SUPPORTED
  55. esp_err_t rtc_gpio_set_level(gpio_num_t gpio_num, uint32_t level)
  56. {
  57. ESP_RETURN_ON_FALSE(rtc_gpio_is_valid_gpio(gpio_num), ESP_ERR_INVALID_ARG, RTCIO_TAG, "RTCIO number error");
  58. RTCIO_ENTER_CRITICAL();
  59. rtcio_hal_set_level(rtc_io_number_get(gpio_num), level);
  60. RTCIO_EXIT_CRITICAL();
  61. return ESP_OK;
  62. }
  63. uint32_t rtc_gpio_get_level(gpio_num_t gpio_num)
  64. {
  65. ESP_RETURN_ON_FALSE(rtc_gpio_is_valid_gpio(gpio_num), ESP_ERR_INVALID_ARG, RTCIO_TAG, "RTCIO number error");
  66. return rtcio_hal_get_level(rtc_io_number_get(gpio_num));
  67. }
  68. esp_err_t rtc_gpio_set_drive_capability(gpio_num_t gpio_num, gpio_drive_cap_t strength)
  69. {
  70. ESP_RETURN_ON_FALSE(rtc_gpio_is_valid_gpio(gpio_num), ESP_ERR_INVALID_ARG, RTCIO_TAG, "RTCIO number error");
  71. ESP_RETURN_ON_FALSE(GPIO_IS_VALID_OUTPUT_GPIO(gpio_num), ESP_ERR_INVALID_ARG, RTCIO_TAG, "Output pad only");
  72. ESP_RETURN_ON_FALSE(strength < GPIO_DRIVE_CAP_MAX, ESP_ERR_INVALID_ARG, RTCIO_TAG, "RTCIO drive capability error");
  73. RTCIO_ENTER_CRITICAL();
  74. rtcio_hal_set_drive_capability(rtc_io_number_get(gpio_num), strength);
  75. RTCIO_EXIT_CRITICAL();
  76. return ESP_OK;
  77. }
  78. esp_err_t rtc_gpio_get_drive_capability(gpio_num_t gpio_num, gpio_drive_cap_t *strength)
  79. {
  80. ESP_RETURN_ON_FALSE(rtc_gpio_is_valid_gpio(gpio_num), ESP_ERR_INVALID_ARG, RTCIO_TAG, "RTCIO number error");
  81. ESP_RETURN_ON_FALSE(GPIO_IS_VALID_OUTPUT_GPIO(gpio_num), ESP_ERR_INVALID_ARG, RTCIO_TAG, "Output pad only");
  82. ESP_RETURN_ON_FALSE(strength != NULL, ESP_ERR_INVALID_ARG, RTCIO_TAG, "GPIO drive pointer error");
  83. *strength = (gpio_drive_cap_t)rtcio_hal_get_drive_capability(rtc_io_number_get(gpio_num));
  84. return ESP_OK;
  85. }
  86. esp_err_t rtc_gpio_set_direction(gpio_num_t gpio_num, rtc_gpio_mode_t mode)
  87. {
  88. ESP_RETURN_ON_FALSE(rtc_gpio_is_valid_gpio(gpio_num), ESP_ERR_INVALID_ARG, RTCIO_TAG, "RTCIO number error");
  89. RTCIO_ENTER_CRITICAL();
  90. rtcio_hal_set_direction(rtc_io_number_get(gpio_num), mode);
  91. RTCIO_EXIT_CRITICAL();
  92. return ESP_OK;
  93. }
  94. esp_err_t rtc_gpio_set_direction_in_sleep(gpio_num_t gpio_num, rtc_gpio_mode_t mode)
  95. {
  96. ESP_RETURN_ON_FALSE(rtc_gpio_is_valid_gpio(gpio_num), ESP_ERR_INVALID_ARG, RTCIO_TAG, "RTCIO number error");
  97. RTCIO_ENTER_CRITICAL();
  98. rtcio_hal_set_direction_in_sleep(rtc_io_number_get(gpio_num), mode);
  99. RTCIO_EXIT_CRITICAL();
  100. return ESP_OK;
  101. }
  102. esp_err_t rtc_gpio_pullup_en(gpio_num_t gpio_num)
  103. {
  104. ESP_RETURN_ON_FALSE(rtc_gpio_is_valid_gpio(gpio_num), ESP_ERR_INVALID_ARG, RTCIO_TAG, "RTCIO number error");
  105. RTCIO_ENTER_CRITICAL();
  106. rtcio_hal_pullup_enable(rtc_io_number_get(gpio_num));
  107. RTCIO_EXIT_CRITICAL();
  108. return ESP_OK;
  109. }
  110. esp_err_t rtc_gpio_pullup_dis(gpio_num_t gpio_num)
  111. {
  112. ESP_RETURN_ON_FALSE(rtc_gpio_is_valid_gpio(gpio_num), ESP_ERR_INVALID_ARG, RTCIO_TAG, "RTCIO number error");
  113. RTCIO_ENTER_CRITICAL();
  114. rtcio_hal_pullup_disable(rtc_io_number_get(gpio_num));
  115. RTCIO_EXIT_CRITICAL();
  116. return ESP_OK;
  117. }
  118. esp_err_t rtc_gpio_pulldown_en(gpio_num_t gpio_num)
  119. {
  120. ESP_RETURN_ON_FALSE(rtc_gpio_is_valid_gpio(gpio_num), ESP_ERR_INVALID_ARG, RTCIO_TAG, "RTCIO number error");
  121. RTCIO_ENTER_CRITICAL();
  122. rtcio_hal_pulldown_enable(rtc_io_number_get(gpio_num));
  123. RTCIO_EXIT_CRITICAL();
  124. return ESP_OK;
  125. }
  126. esp_err_t rtc_gpio_pulldown_dis(gpio_num_t gpio_num)
  127. {
  128. ESP_RETURN_ON_FALSE(rtc_gpio_is_valid_gpio(gpio_num), ESP_ERR_INVALID_ARG, RTCIO_TAG, "RTCIO number error");
  129. RTCIO_ENTER_CRITICAL();
  130. rtcio_hal_pulldown_disable(rtc_io_number_get(gpio_num));
  131. RTCIO_EXIT_CRITICAL();
  132. return ESP_OK;
  133. }
  134. esp_err_t rtc_gpio_iomux_func_sel(gpio_num_t gpio_num, int func)
  135. {
  136. ESP_RETURN_ON_FALSE(rtc_gpio_is_valid_gpio(gpio_num), ESP_ERR_INVALID_ARG, RTCIO_TAG, "RTCIO number error");
  137. RTCIO_ENTER_CRITICAL();
  138. rtcio_hal_iomux_func_sel(rtc_io_number_get(gpio_num), func);
  139. RTCIO_EXIT_CRITICAL();
  140. return ESP_OK;
  141. }
  142. #endif // SOC_RTCIO_INPUT_OUTPUT_SUPPORTED
  143. #if SOC_RTCIO_HOLD_SUPPORTED
  144. esp_err_t rtc_gpio_hold_en(gpio_num_t gpio_num)
  145. {
  146. ESP_RETURN_ON_FALSE(rtc_gpio_is_valid_gpio(gpio_num), ESP_ERR_INVALID_ARG, RTCIO_TAG, "RTCIO number error");
  147. RTCIO_ENTER_CRITICAL();
  148. rtcio_hal_hold_enable(rtc_io_number_get(gpio_num));
  149. RTCIO_EXIT_CRITICAL();
  150. return ESP_OK;
  151. }
  152. esp_err_t rtc_gpio_hold_dis(gpio_num_t gpio_num)
  153. {
  154. ESP_RETURN_ON_FALSE(rtc_gpio_is_valid_gpio(gpio_num), ESP_ERR_INVALID_ARG, RTCIO_TAG, "RTCIO number error");
  155. RTCIO_ENTER_CRITICAL();
  156. rtcio_hal_hold_disable(rtc_io_number_get(gpio_num));
  157. RTCIO_EXIT_CRITICAL();
  158. return ESP_OK;
  159. }
  160. esp_err_t rtc_gpio_force_hold_en_all(void)
  161. {
  162. RTCIO_ENTER_CRITICAL();
  163. rtcio_hal_hold_all();
  164. RTCIO_EXIT_CRITICAL();
  165. return ESP_OK;
  166. }
  167. esp_err_t rtc_gpio_force_hold_dis_all(void)
  168. {
  169. RTCIO_ENTER_CRITICAL();
  170. rtcio_hal_unhold_all();
  171. RTCIO_EXIT_CRITICAL();
  172. return ESP_OK;
  173. }
  174. #endif // SOC_RTCIO_HOLD_SUPPORTED
  175. #if SOC_RTCIO_HOLD_SUPPORTED && SOC_RTCIO_INPUT_OUTPUT_SUPPORTED
  176. esp_err_t rtc_gpio_isolate(gpio_num_t gpio_num)
  177. {
  178. ESP_RETURN_ON_FALSE(rtc_gpio_is_valid_gpio(gpio_num), ESP_ERR_INVALID_ARG, RTCIO_TAG, "RTCIO number error");
  179. RTCIO_ENTER_CRITICAL();
  180. rtcio_hal_isolate(rtc_io_number_get(gpio_num));
  181. RTCIO_EXIT_CRITICAL();
  182. return ESP_OK;
  183. }
  184. #endif // SOC_RTCIO_HOLD_SUPPORTED && SOC_RTCIO_INPUT_OUTPUT_SUPPORTED
  185. #if SOC_RTCIO_WAKE_SUPPORTED
  186. esp_err_t rtc_gpio_wakeup_enable(gpio_num_t gpio_num, gpio_int_type_t intr_type)
  187. {
  188. ESP_RETURN_ON_FALSE(rtc_gpio_is_valid_gpio(gpio_num), ESP_ERR_INVALID_ARG, RTCIO_TAG, "RTCIO number error");
  189. if (intr_type == GPIO_INTR_POSEDGE || intr_type == GPIO_INTR_NEGEDGE || intr_type == GPIO_INTR_ANYEDGE) {
  190. return ESP_ERR_INVALID_ARG; // Dont support this mode.
  191. }
  192. RTCIO_ENTER_CRITICAL();
  193. rtcio_hal_wakeup_enable(rtc_io_number_get(gpio_num), intr_type);
  194. RTCIO_EXIT_CRITICAL();
  195. return ESP_OK;
  196. }
  197. esp_err_t rtc_gpio_wakeup_disable(gpio_num_t gpio_num)
  198. {
  199. ESP_RETURN_ON_FALSE(rtc_gpio_is_valid_gpio(gpio_num), ESP_ERR_INVALID_ARG, RTCIO_TAG, "RTCIO number error");
  200. RTCIO_ENTER_CRITICAL();
  201. rtcio_hal_wakeup_disable(rtc_io_number_get(gpio_num));
  202. RTCIO_EXIT_CRITICAL();
  203. return ESP_OK;
  204. }
  205. #endif // SOC_RTCIO_WAKE_SUPPORTED
  206. #endif // SOC_RTCIO_PIN_COUNT > 0