test_rtcio.c 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. /*
  2. * SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. /**
  7. * About test environment UT_T1_GPIO:
  8. * Please connect GPIO18 and GPIO19
  9. */
  10. #include <stdio.h>
  11. #include <string.h>
  12. #include "esp_system.h"
  13. #include "esp_sleep.h"
  14. #include "unity.h"
  15. #include "driver/gpio.h"
  16. #include "driver/rtc_io.h"
  17. #include "freertos/FreeRTOS.h"
  18. #include "freertos/task.h"
  19. #include "freertos/queue.h"
  20. #include "esp_err.h"
  21. #include "esp_log.h"
  22. #include "soc/rtc_io_periph.h"
  23. #if !TEMPORARY_DISABLED_FOR_TARGETS(ESP32S3, ESP32C3, ESP32C2)
  24. #define RTCIO_CHECK(condition) TEST_ASSERT_MESSAGE((condition == ESP_OK), "ret is not ESP_OK")
  25. #define RTCIO_VERIFY(condition, msg) TEST_ASSERT_MESSAGE((condition), msg)
  26. #define TEST_COUNT 10
  27. static const char *TAG = "rtcio_test";
  28. #ifdef CONFIG_IDF_TARGET_ESP32
  29. #define TEST_GPIO_PIN_COUNT 16
  30. const int s_test_map[TEST_GPIO_PIN_COUNT] = {
  31. // GPIO_NUM_0, //GPIO0 // Workaround: GPIO0 is strap pin, can not be used pullup/pulldown test.
  32. GPIO_NUM_2, //GPIO2
  33. GPIO_NUM_4, //GPIO4
  34. // GPIO_NUM_12, //GPIO12 // Workaround: GPIO12 is strap pin, can not be used pullup/pulldown test.
  35. GPIO_NUM_13, //GPIO13
  36. GPIO_NUM_14, //GPIO14
  37. GPIO_NUM_15, //GPIO15
  38. GPIO_NUM_25, //GPIO25
  39. GPIO_NUM_26, //GPIO26
  40. GPIO_NUM_27, //GPIO27
  41. GPIO_NUM_32, //GPIO32
  42. GPIO_NUM_33, //GPIO33
  43. GPIO_NUM_34, //GPIO34
  44. GPIO_NUM_35, //GPIO35
  45. GPIO_NUM_36, //GPIO36
  46. GPIO_NUM_37, //GPIO37
  47. GPIO_NUM_38, //GPIO38
  48. GPIO_NUM_39, //GPIO39
  49. };
  50. #elif defined CONFIG_IDF_TARGET_ESP32S2
  51. #define TEST_GPIO_PIN_COUNT 20
  52. const int s_test_map[TEST_GPIO_PIN_COUNT] = {
  53. // GPIO_NUM_0, //GPIO0 // Workaround: GPIO0 is strap pin, can not be used pullup/pulldown test.
  54. GPIO_NUM_1, //GPIO1
  55. GPIO_NUM_2, //GPIO2
  56. GPIO_NUM_3, //GPIO3
  57. GPIO_NUM_4, //GPIO4
  58. GPIO_NUM_5, //GPIO5
  59. GPIO_NUM_6, //GPIO6
  60. GPIO_NUM_7, //GPIO7
  61. GPIO_NUM_8, //GPIO8
  62. GPIO_NUM_9, //GPIO9
  63. GPIO_NUM_10, //GPIO10
  64. GPIO_NUM_11, //GPIO11
  65. GPIO_NUM_12, //GPIO12
  66. GPIO_NUM_13, //GPIO13
  67. GPIO_NUM_14, //GPIO14
  68. GPIO_NUM_15, //GPIO15
  69. GPIO_NUM_16, //GPIO16
  70. GPIO_NUM_17, //GPIO17
  71. // GPIO_NUM_18, //GPIO18 // Workaround: IO18 is pullup outside in ESP32S2-Saola Runner.
  72. GPIO_NUM_19, //GPIO19
  73. GPIO_NUM_20, //GPIO20
  74. GPIO_NUM_21, //GPIO21
  75. };
  76. #endif
  77. /*
  78. * Test output/input function.
  79. */
  80. TEST_CASE("RTCIO input/output test", "[rtcio]")
  81. {
  82. ESP_LOGI(TAG, "RTCIO input/output test");
  83. // init rtcio
  84. for (int i = 0; i < GPIO_PIN_COUNT; i++) {
  85. if (GPIO_IS_VALID_OUTPUT_GPIO(i) && rtc_gpio_is_valid_gpio(i)) {
  86. RTCIO_CHECK( rtc_gpio_init(i) );
  87. RTCIO_CHECK( rtc_gpio_set_direction(i, RTC_GPIO_MODE_INPUT_OUTPUT) );
  88. RTCIO_CHECK( rtc_gpio_pullup_dis(i) );
  89. RTCIO_CHECK( rtc_gpio_pulldown_dis(i) );
  90. ESP_LOGI(TAG, "gpio %d init", i);
  91. }
  92. }
  93. for (int cnt = 0; cnt < TEST_COUNT; cnt++) {
  94. uint32_t level = cnt % 2;
  95. ESP_LOGI(TAG, "RTCIO output level %d", level);
  96. for (int i = 0; i < GPIO_PIN_COUNT; i++) {
  97. if (GPIO_IS_VALID_OUTPUT_GPIO(i) && rtc_gpio_is_valid_gpio(i)) {
  98. RTCIO_CHECK( rtc_gpio_set_level(i, level) );
  99. vTaskDelay(10 / portTICK_PERIOD_MS);
  100. if (rtc_gpio_get_level(i) != level) {
  101. ESP_LOGE(TAG, "RTCIO input/output test err, gpio%d", i);
  102. }
  103. }
  104. }
  105. vTaskDelay(100 / portTICK_PERIOD_MS);
  106. }
  107. // Deinit rtcio
  108. for (int i = 0; i < GPIO_PIN_COUNT; i++) {
  109. if (GPIO_IS_VALID_OUTPUT_GPIO(i) && rtc_gpio_is_valid_gpio(i)) {
  110. RTCIO_CHECK( rtc_gpio_deinit(i) );
  111. }
  112. }
  113. ESP_LOGI(TAG, "RTCIO input/output test over");
  114. }
  115. /*
  116. * Test pullup/pulldown function.
  117. * Note: extern circuit should not connect.
  118. */
  119. TEST_CASE("RTCIO pullup/pulldown test", "[rtcio]")
  120. {
  121. ESP_LOGI(TAG, "RTCIO pullup/pulldown test");
  122. // init rtcio
  123. for (int i = 0; i < TEST_GPIO_PIN_COUNT; i++) {
  124. int num = rtc_io_number_get(s_test_map[i]);
  125. if (rtc_gpio_is_valid_gpio(s_test_map[i]) && num > 0 && rtc_io_desc[num].pullup != 0) {
  126. RTCIO_CHECK( rtc_gpio_init(s_test_map[i]) );
  127. RTCIO_CHECK( rtc_gpio_set_direction(s_test_map[i], RTC_GPIO_MODE_INPUT_ONLY) );
  128. RTCIO_CHECK( rtc_gpio_pullup_dis(s_test_map[i]) );
  129. RTCIO_CHECK( rtc_gpio_pulldown_dis(s_test_map[i]) );
  130. ESP_LOGI(TAG, "gpio %d init", s_test_map[i]);
  131. }
  132. }
  133. for (int cnt = 0; cnt < TEST_COUNT; cnt++) {
  134. uint32_t level = cnt % 2;
  135. ESP_LOGI(TAG, "RTCIO pull level %d", level);
  136. for (int i = 0; i < TEST_GPIO_PIN_COUNT; i++) {
  137. int num = rtc_io_number_get(s_test_map[i]);
  138. if (rtc_gpio_is_valid_gpio(s_test_map[i]) && num > 0 && rtc_io_desc[num].pullup != 0) {
  139. if (level) {
  140. RTCIO_CHECK( rtc_gpio_pulldown_dis(s_test_map[i]) );
  141. RTCIO_CHECK( rtc_gpio_pullup_en(s_test_map[i]) );
  142. } else {
  143. RTCIO_CHECK( rtc_gpio_pullup_dis(s_test_map[i]) );
  144. RTCIO_CHECK( rtc_gpio_pulldown_en(s_test_map[i]) );
  145. }
  146. vTaskDelay(20 / portTICK_PERIOD_MS);
  147. if (rtc_gpio_get_level(s_test_map[i]) != level) {
  148. ESP_LOGE(TAG, "RTCIO pullup/pulldown test err, gpio%d", s_test_map[i]);
  149. }
  150. }
  151. }
  152. vTaskDelay(100 / portTICK_PERIOD_MS);
  153. }
  154. // Deinit rtcio
  155. for (int i = 0; i < TEST_GPIO_PIN_COUNT; i++) {
  156. int num = rtc_io_number_get(s_test_map[i]);
  157. if (rtc_gpio_is_valid_gpio(s_test_map[i]) && num > 0 && rtc_io_desc[num].pullup != 0) {
  158. RTCIO_CHECK( rtc_gpio_deinit(s_test_map[i]) );
  159. }
  160. }
  161. ESP_LOGI(TAG, "RTCIO pullup/pulldown test over");
  162. }
  163. /*
  164. * Test output OD function.
  165. */
  166. TEST_CASE("RTCIO output OD test", "[rtcio]")
  167. {
  168. ESP_LOGI(TAG, "RTCIO output OD test");
  169. // init rtcio
  170. for (int i = 0; i < GPIO_PIN_COUNT; i++) {
  171. if (GPIO_IS_VALID_OUTPUT_GPIO(i) && rtc_gpio_is_valid_gpio(i)) {
  172. RTCIO_CHECK( rtc_gpio_init(i) );
  173. RTCIO_CHECK( rtc_gpio_set_direction(i, RTC_GPIO_MODE_INPUT_OUTPUT_OD) );
  174. RTCIO_CHECK( rtc_gpio_pullup_en(i) );
  175. RTCIO_CHECK( rtc_gpio_pulldown_dis(i) );
  176. ESP_LOGI(TAG, "gpio %d init", i);
  177. }
  178. }
  179. for (int cnt = 0; cnt < TEST_COUNT; cnt++) {
  180. uint32_t level = cnt % 2;
  181. ESP_LOGI(TAG, "RTCIO output level %d", level);
  182. for (int i = 0; i < GPIO_PIN_COUNT; i++) {
  183. if (GPIO_IS_VALID_OUTPUT_GPIO(i) && rtc_gpio_is_valid_gpio(i)) {
  184. RTCIO_CHECK( rtc_gpio_set_level(i, level) );
  185. vTaskDelay(10 / portTICK_PERIOD_MS);
  186. if (rtc_gpio_get_level(i) != level) {
  187. ESP_LOGE(TAG, "RTCIO output OD test err, gpio%d", i);
  188. }
  189. }
  190. }
  191. vTaskDelay(100 / portTICK_PERIOD_MS);
  192. }
  193. // Deinit rtcio
  194. for (int i = 0; i < GPIO_PIN_COUNT; i++) {
  195. if (GPIO_IS_VALID_OUTPUT_GPIO(i) && rtc_gpio_is_valid_gpio(i)) {
  196. RTCIO_CHECK( rtc_gpio_deinit(i) );
  197. }
  198. }
  199. ESP_LOGI(TAG, "RTCIO output OD test over");
  200. }
  201. /*
  202. * Test rtcio hold function.
  203. */
  204. TEST_CASE("RTCIO output hold test", "[rtcio]")
  205. {
  206. ESP_LOGI(TAG, "RTCIO output hold test");
  207. // init rtcio
  208. for (int i = 0; i < GPIO_PIN_COUNT; i++) {
  209. if (GPIO_IS_VALID_OUTPUT_GPIO(i) && rtc_gpio_is_valid_gpio(i)) {
  210. RTCIO_CHECK( rtc_gpio_init(i) );
  211. RTCIO_CHECK( rtc_gpio_set_direction(i, RTC_GPIO_MODE_INPUT_OUTPUT_OD) );
  212. RTCIO_CHECK( rtc_gpio_pullup_en(i) );
  213. RTCIO_CHECK( rtc_gpio_pulldown_dis(i) );
  214. RTCIO_CHECK( rtc_gpio_set_level(i, 1) );
  215. ESP_LOGI(TAG, "gpio %d init, level 1", i);
  216. }
  217. }
  218. // hold all output rtcio.
  219. for (int i = 0; i < GPIO_PIN_COUNT; i++) {
  220. if (GPIO_IS_VALID_OUTPUT_GPIO(i) && rtc_gpio_is_valid_gpio(i)) {
  221. RTCIO_CHECK( rtc_gpio_hold_en(i) );
  222. vTaskDelay(10 / portTICK_PERIOD_MS);
  223. RTCIO_CHECK( rtc_gpio_set_level(i, 0) );
  224. ESP_LOGI(TAG, "RTCIO output pin hold, then set level 0");
  225. vTaskDelay(10 / portTICK_PERIOD_MS);
  226. if (rtc_gpio_get_level(i) == 0) {
  227. ESP_LOGE(TAG, "RTCIO hold test err, gpio%d", i);
  228. }
  229. }
  230. }
  231. //unhold all rtcio.
  232. for (int i = 0; i < GPIO_PIN_COUNT; i++) {
  233. if (GPIO_IS_VALID_OUTPUT_GPIO(i) && rtc_gpio_is_valid_gpio(i)) {
  234. RTCIO_CHECK( rtc_gpio_hold_dis(i) );
  235. }
  236. }
  237. // check the unhold status
  238. for (int cnt = 0; cnt < 4; cnt++) {
  239. uint32_t level = cnt % 2;
  240. ESP_LOGI(TAG, "RTCIO output level %d", level);
  241. for (int i = 0; i < GPIO_PIN_COUNT; i++) {
  242. if (GPIO_IS_VALID_OUTPUT_GPIO(i) && rtc_gpio_is_valid_gpio(i)) {
  243. RTCIO_CHECK( rtc_gpio_set_level(i, level) );
  244. vTaskDelay(10 / portTICK_PERIOD_MS);
  245. if (rtc_gpio_get_level(i) != level) {
  246. ESP_LOGE(TAG, "RTCIO output OD test err, gpio%d", i);
  247. }
  248. }
  249. }
  250. vTaskDelay(100 / portTICK_PERIOD_MS);
  251. }
  252. // Deinit rtcio
  253. for (int i = 0; i < GPIO_PIN_COUNT; i++) {
  254. if (GPIO_IS_VALID_OUTPUT_GPIO(i) && rtc_gpio_is_valid_gpio(i)) {
  255. RTCIO_CHECK( rtc_gpio_deinit(i) );
  256. }
  257. }
  258. ESP_LOGI(TAG, "RTCIO hold test over");
  259. }
  260. #endif