rtc_io.c 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. /*
  2. * SPDX-FileCopyrightText: 2019-2021 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. static const char __attribute__((__unused__)) *RTCIO_TAG = "RTCIO";
  16. extern portMUX_TYPE rtc_spinlock; //TODO: Will be placed in the appropriate position after the rtc module is finished.
  17. #define RTCIO_ENTER_CRITICAL() portENTER_CRITICAL(&rtc_spinlock)
  18. #define RTCIO_EXIT_CRITICAL() portEXIT_CRITICAL(&rtc_spinlock)
  19. #if SOC_RTCIO_INPUT_OUTPUT_SUPPORTED
  20. /*---------------------------------------------------------------
  21. RTC IO
  22. ---------------------------------------------------------------*/
  23. esp_err_t rtc_gpio_init(gpio_num_t gpio_num)
  24. {
  25. ESP_RETURN_ON_FALSE(rtc_gpio_is_valid_gpio(gpio_num), ESP_ERR_INVALID_ARG, RTCIO_TAG, "RTCIO number error");
  26. RTCIO_ENTER_CRITICAL();
  27. rtcio_hal_function_select(rtc_io_number_get(gpio_num), RTCIO_FUNC_RTC);
  28. RTCIO_EXIT_CRITICAL();
  29. return ESP_OK;
  30. }
  31. esp_err_t rtc_gpio_deinit(gpio_num_t gpio_num)
  32. {
  33. ESP_RETURN_ON_FALSE(rtc_gpio_is_valid_gpio(gpio_num), ESP_ERR_INVALID_ARG, RTCIO_TAG, "RTCIO number error");
  34. RTCIO_ENTER_CRITICAL();
  35. // Select Gpio as Digital Gpio
  36. rtcio_hal_function_select(rtc_io_number_get(gpio_num), RTCIO_FUNC_DIGITAL);
  37. RTCIO_EXIT_CRITICAL();
  38. return ESP_OK;
  39. }
  40. esp_err_t rtc_gpio_set_level(gpio_num_t gpio_num, uint32_t level)
  41. {
  42. ESP_RETURN_ON_FALSE(rtc_gpio_is_valid_gpio(gpio_num), ESP_ERR_INVALID_ARG, RTCIO_TAG, "RTCIO number error");
  43. RTCIO_ENTER_CRITICAL();
  44. rtcio_hal_set_level(rtc_io_number_get(gpio_num), level);
  45. RTCIO_EXIT_CRITICAL();
  46. return ESP_OK;
  47. }
  48. uint32_t rtc_gpio_get_level(gpio_num_t gpio_num)
  49. {
  50. ESP_RETURN_ON_FALSE(rtc_gpio_is_valid_gpio(gpio_num), ESP_ERR_INVALID_ARG, RTCIO_TAG, "RTCIO number error");
  51. return rtcio_hal_get_level(rtc_io_number_get(gpio_num));
  52. }
  53. esp_err_t rtc_gpio_set_drive_capability(gpio_num_t gpio_num, gpio_drive_cap_t strength)
  54. {
  55. ESP_RETURN_ON_FALSE(rtc_gpio_is_valid_gpio(gpio_num), ESP_ERR_INVALID_ARG, RTCIO_TAG, "RTCIO number error");
  56. ESP_RETURN_ON_FALSE(GPIO_IS_VALID_OUTPUT_GPIO(gpio_num), ESP_ERR_INVALID_ARG, RTCIO_TAG, "Output pad only");
  57. ESP_RETURN_ON_FALSE(strength < GPIO_DRIVE_CAP_MAX, ESP_ERR_INVALID_ARG, RTCIO_TAG, "RTCIO drive capability error");
  58. RTCIO_ENTER_CRITICAL();
  59. rtcio_hal_set_drive_capability(rtc_io_number_get(gpio_num), strength);
  60. RTCIO_EXIT_CRITICAL();
  61. return ESP_OK;
  62. }
  63. esp_err_t rtc_gpio_get_drive_capability(gpio_num_t gpio_num, gpio_drive_cap_t *strength)
  64. {
  65. ESP_RETURN_ON_FALSE(rtc_gpio_is_valid_gpio(gpio_num), ESP_ERR_INVALID_ARG, RTCIO_TAG, "RTCIO number error");
  66. ESP_RETURN_ON_FALSE(GPIO_IS_VALID_OUTPUT_GPIO(gpio_num), ESP_ERR_INVALID_ARG, RTCIO_TAG, "Output pad only");
  67. ESP_RETURN_ON_FALSE(strength != NULL, ESP_ERR_INVALID_ARG, RTCIO_TAG, "GPIO drive pointer error");
  68. *strength = (gpio_drive_cap_t)rtcio_hal_get_drive_capability(rtc_io_number_get(gpio_num));
  69. return ESP_OK;
  70. }
  71. esp_err_t rtc_gpio_set_direction(gpio_num_t gpio_num, rtc_gpio_mode_t mode)
  72. {
  73. ESP_RETURN_ON_FALSE(rtc_gpio_is_valid_gpio(gpio_num), ESP_ERR_INVALID_ARG, RTCIO_TAG, "RTCIO number error");
  74. RTCIO_ENTER_CRITICAL();
  75. rtcio_hal_set_direction(rtc_io_number_get(gpio_num), mode);
  76. RTCIO_EXIT_CRITICAL();
  77. return ESP_OK;
  78. }
  79. esp_err_t rtc_gpio_set_direction_in_sleep(gpio_num_t gpio_num, rtc_gpio_mode_t mode)
  80. {
  81. ESP_RETURN_ON_FALSE(rtc_gpio_is_valid_gpio(gpio_num), ESP_ERR_INVALID_ARG, RTCIO_TAG, "RTCIO number error");
  82. RTCIO_ENTER_CRITICAL();
  83. rtcio_hal_set_direction_in_sleep(rtc_io_number_get(gpio_num), mode);
  84. RTCIO_EXIT_CRITICAL();
  85. return ESP_OK;
  86. }
  87. esp_err_t rtc_gpio_pullup_en(gpio_num_t gpio_num)
  88. {
  89. ESP_RETURN_ON_FALSE(rtc_gpio_is_valid_gpio(gpio_num), ESP_ERR_INVALID_ARG, RTCIO_TAG, "RTCIO number error");
  90. RTCIO_ENTER_CRITICAL();
  91. rtcio_hal_pullup_enable(rtc_io_number_get(gpio_num));
  92. RTCIO_EXIT_CRITICAL();
  93. return ESP_OK;
  94. }
  95. esp_err_t rtc_gpio_pullup_dis(gpio_num_t gpio_num)
  96. {
  97. ESP_RETURN_ON_FALSE(rtc_gpio_is_valid_gpio(gpio_num), ESP_ERR_INVALID_ARG, RTCIO_TAG, "RTCIO number error");
  98. RTCIO_ENTER_CRITICAL();
  99. rtcio_hal_pullup_disable(rtc_io_number_get(gpio_num));
  100. RTCIO_EXIT_CRITICAL();
  101. return ESP_OK;
  102. }
  103. esp_err_t rtc_gpio_pulldown_en(gpio_num_t gpio_num)
  104. {
  105. ESP_RETURN_ON_FALSE(rtc_gpio_is_valid_gpio(gpio_num), ESP_ERR_INVALID_ARG, RTCIO_TAG, "RTCIO number error");
  106. RTCIO_ENTER_CRITICAL();
  107. rtcio_hal_pulldown_enable(rtc_io_number_get(gpio_num));
  108. RTCIO_EXIT_CRITICAL();
  109. return ESP_OK;
  110. }
  111. esp_err_t rtc_gpio_pulldown_dis(gpio_num_t gpio_num)
  112. {
  113. ESP_RETURN_ON_FALSE(rtc_gpio_is_valid_gpio(gpio_num), ESP_ERR_INVALID_ARG, RTCIO_TAG, "RTCIO number error");
  114. RTCIO_ENTER_CRITICAL();
  115. rtcio_hal_pulldown_disable(rtc_io_number_get(gpio_num));
  116. RTCIO_EXIT_CRITICAL();
  117. return ESP_OK;
  118. }
  119. #endif // SOC_RTCIO_INPUT_OUTPUT_SUPPORTED
  120. #if SOC_RTCIO_HOLD_SUPPORTED
  121. esp_err_t rtc_gpio_hold_en(gpio_num_t gpio_num)
  122. {
  123. ESP_RETURN_ON_FALSE(rtc_gpio_is_valid_gpio(gpio_num), ESP_ERR_INVALID_ARG, RTCIO_TAG, "RTCIO number error");
  124. RTCIO_ENTER_CRITICAL();
  125. rtcio_hal_hold_enable(rtc_io_number_get(gpio_num));
  126. RTCIO_EXIT_CRITICAL();
  127. return ESP_OK;
  128. }
  129. esp_err_t rtc_gpio_hold_dis(gpio_num_t gpio_num)
  130. {
  131. ESP_RETURN_ON_FALSE(rtc_gpio_is_valid_gpio(gpio_num), ESP_ERR_INVALID_ARG, RTCIO_TAG, "RTCIO number error");
  132. RTCIO_ENTER_CRITICAL();
  133. rtcio_hal_hold_disable(rtc_io_number_get(gpio_num));
  134. RTCIO_EXIT_CRITICAL();
  135. return ESP_OK;
  136. }
  137. esp_err_t rtc_gpio_isolate(gpio_num_t gpio_num)
  138. {
  139. ESP_RETURN_ON_FALSE(rtc_gpio_is_valid_gpio(gpio_num), ESP_ERR_INVALID_ARG, RTCIO_TAG, "RTCIO number error");
  140. RTCIO_ENTER_CRITICAL();
  141. rtcio_hal_isolate(rtc_io_number_get(gpio_num));
  142. RTCIO_EXIT_CRITICAL();
  143. return ESP_OK;
  144. }
  145. esp_err_t rtc_gpio_force_hold_en_all(void)
  146. {
  147. RTCIO_ENTER_CRITICAL();
  148. rtcio_hal_hold_all();
  149. RTCIO_EXIT_CRITICAL();
  150. return ESP_OK;
  151. }
  152. esp_err_t rtc_gpio_force_hold_dis_all(void)
  153. {
  154. RTCIO_ENTER_CRITICAL();
  155. rtcio_hal_unhold_all();
  156. RTCIO_EXIT_CRITICAL();
  157. return ESP_OK;
  158. }
  159. #endif // SOC_RTCIO_HOLD_SUPPORTED
  160. #if SOC_RTCIO_WAKE_SUPPORTED
  161. esp_err_t rtc_gpio_wakeup_enable(gpio_num_t gpio_num, gpio_int_type_t intr_type)
  162. {
  163. ESP_RETURN_ON_FALSE(rtc_gpio_is_valid_gpio(gpio_num), ESP_ERR_INVALID_ARG, RTCIO_TAG, "RTCIO number error");
  164. if (intr_type == GPIO_INTR_POSEDGE || intr_type == GPIO_INTR_NEGEDGE || intr_type == GPIO_INTR_ANYEDGE) {
  165. return ESP_ERR_INVALID_ARG; // Dont support this mode.
  166. }
  167. RTCIO_ENTER_CRITICAL();
  168. rtcio_hal_wakeup_enable(rtc_io_number_get(gpio_num), intr_type);
  169. RTCIO_EXIT_CRITICAL();
  170. return ESP_OK;
  171. }
  172. esp_err_t rtc_gpio_wakeup_disable(gpio_num_t gpio_num)
  173. {
  174. ESP_RETURN_ON_FALSE(rtc_gpio_is_valid_gpio(gpio_num), ESP_ERR_INVALID_ARG, RTCIO_TAG, "RTCIO number error");
  175. RTCIO_ENTER_CRITICAL();
  176. rtcio_hal_wakeup_disable(rtc_io_number_get(gpio_num));
  177. RTCIO_EXIT_CRITICAL();
  178. return ESP_OK;
  179. }
  180. #endif // SOC_RTCIO_WAKE_SUPPORTED