test_rtcio.c 9.3 KB

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