gpio_demo.c 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. /*================================================================
  2. Copyright (c) 2021, Quectel Wireless Solutions Co., Ltd. All rights reserved.
  3. Quectel Wireless Solutions Proprietary and Confidential.
  4. =================================================================*/
  5. /*=================================================================
  6. EDIT HISTORY FOR MODULE
  7. This section contains comments describing changes made to the module.
  8. Notice that changes are listed in reverse chronological order.
  9. WHEN WHO WHAT, WHERE, WHY
  10. ------------ ------- -------------------------------------------------------------------------------
  11. =================================================================*/
  12. /*===========================================================================
  13. * include files
  14. ===========================================================================*/
  15. #include <stdio.h>
  16. #include <string.h>
  17. #include <stdlib.h>
  18. #include "ql_api_osi.h"
  19. #include "ql_log.h"
  20. #include "ql_pin_cfg.h"
  21. #include "gpio_demo.h"
  22. /*===========================================================================
  23. * Macro Definition
  24. ===========================================================================*/
  25. #define QL_GPIODEMO_LOG_LEVEL QL_LOG_LEVEL_INFO
  26. #define QL_GPIODEMO_LOG(msg, ...) QL_LOG(QL_GPIODEMO_LOG_LEVEL, "ql_GPIODEMO", msg, ##__VA_ARGS__)
  27. #define QL_GPIODEMO_LOG_PUSH(msg, ...) QL_LOG_PUSH("ql_GPIODEMO", msg, ##__VA_ARGS__)
  28. /*===========================================================================
  29. * Variate
  30. ===========================================================================*/
  31. static ql_gpio_cfg _ql_gpio_cfg[] =
  32. { /* gpio_num gpio_dir gpio_pull gpio_lvl */
  33. { GPIO_0, GPIO_INPUT, PULL_DOWN, 0xff }, // set input pull-down
  34. { GPIO_1, GPIO_OUTPUT, 0xff, LVL_HIGH } // set output high-level
  35. };
  36. /*===========================================================================
  37. * Functions
  38. ===========================================================================*/
  39. void _ql_gpio_demo_init( void)
  40. {
  41. uint16_t num;
  42. for( num = 0; num < sizeof(_ql_gpio_cfg)/sizeof(_ql_gpio_cfg[0]); num++ )
  43. {
  44. ql_gpio_deinit(_ql_gpio_cfg[num].gpio_num);
  45. ql_gpio_init(_ql_gpio_cfg[num].gpio_num, _ql_gpio_cfg[num].gpio_dir, _ql_gpio_cfg[num].gpio_pull, _ql_gpio_cfg[num].gpio_lvl);
  46. }
  47. }
  48. static void ql_gpio_demo_thread(void *param)
  49. {
  50. QL_GPIODEMO_LOG("gpio demo thread enter, param 0x%x", param);
  51. ql_event_t event;
  52. uint8_t change_flg = 0;
  53. uint16_t num;
  54. ql_GpioDir gpio_dir;
  55. ql_PullMode gpio_pull;
  56. ql_LvlMode gpio_lvl;
  57. /* init demo gpio array */
  58. ql_pin_set_func(QL_TEST1_PIN_GPIO0, QL_TEST1_PIN_GPIO0_FUNC_GPIO); // TEST1_PIN set GPIO0
  59. ql_pin_set_func(QL_TEST1_PIN_GPIO1, QL_TEST1_PIN_GPIO1_FUNC_GPIO); // TEST1_PIN set GPIO1
  60. ql_pin_set_func(QL_TEST2_PIN_GPIO0, QL_TEST2_PIN_GPIO0_FUNC_LCD_SIO); // TEST2_PIN set spi_lcd_sio
  61. ql_pin_set_func(QL_TEST2_PIN_GPIO1, QL_TEST2_PIN_GPIO1_FUNC_LCD_SDC); // TEST2_PIN set spi_lcd_sdc
  62. _ql_gpio_demo_init();
  63. /* get init info */
  64. for( num = 0; num < sizeof(_ql_gpio_cfg)/sizeof(_ql_gpio_cfg[0]); num++ )
  65. {
  66. ql_gpio_get_direction(_ql_gpio_cfg[num].gpio_num, &gpio_dir);
  67. ql_gpio_get_pull(_ql_gpio_cfg[num].gpio_num, &gpio_pull);
  68. ql_gpio_get_level(_ql_gpio_cfg[num].gpio_num, &gpio_lvl);
  69. QL_GPIODEMO_LOG("gpio[%d] init", _ql_gpio_cfg[num].gpio_num);
  70. QL_GPIODEMO_LOG("gpio[%d] get dir:[%d], pull:[%d], lvl:[%d]", _ql_gpio_cfg[num].gpio_num, gpio_dir, gpio_pull, gpio_lvl);
  71. }
  72. ql_rtos_task_sleep_s(3);
  73. while(1)
  74. {
  75. ql_event_wait(&event, 1);
  76. /* output low test */
  77. gpio_dir = GPIO_OUTPUT;
  78. gpio_lvl = LVL_LOW;
  79. for( num = 0; num < sizeof(_ql_gpio_cfg)/sizeof(_ql_gpio_cfg[0]); num++ )
  80. {
  81. /* set output low */
  82. ql_gpio_set_direction(_ql_gpio_cfg[num].gpio_num, gpio_dir);
  83. ql_gpio_set_level(_ql_gpio_cfg[num].gpio_num, gpio_lvl);
  84. QL_GPIODEMO_LOG("gpio[%d] output low-level", _ql_gpio_cfg[num].gpio_num);
  85. QL_GPIODEMO_LOG("gpio[%d] set dir:[%d], lvl:[%d]", _ql_gpio_cfg[num].gpio_num, gpio_dir, gpio_lvl);
  86. /* get output low */
  87. ql_gpio_get_direction(_ql_gpio_cfg[num].gpio_num, &gpio_dir);
  88. ql_gpio_get_level(_ql_gpio_cfg[num].gpio_num, &gpio_lvl);
  89. QL_GPIODEMO_LOG("gpio[%d] output low-level", _ql_gpio_cfg[num].gpio_num);
  90. QL_GPIODEMO_LOG("gpio[%d] get dir:[%d], lvl:[%d]", _ql_gpio_cfg[num].gpio_num, gpio_dir, gpio_lvl);
  91. }
  92. ql_rtos_task_sleep_s(3);
  93. /* output high test */
  94. gpio_dir = GPIO_OUTPUT;
  95. gpio_lvl = LVL_HIGH;
  96. for( num = 0; num < sizeof(_ql_gpio_cfg)/sizeof(_ql_gpio_cfg[0]); num++ )
  97. {
  98. /* set output high */
  99. ql_gpio_set_direction(_ql_gpio_cfg[num].gpio_num, gpio_dir);
  100. ql_gpio_set_level(_ql_gpio_cfg[num].gpio_num, gpio_lvl);
  101. QL_GPIODEMO_LOG("gpio[%d] output high-level", _ql_gpio_cfg[num].gpio_num);
  102. QL_GPIODEMO_LOG("gpio[%d] set dir:[%d], lvl:[%d]", _ql_gpio_cfg[num].gpio_num, gpio_dir, gpio_lvl);
  103. /* get output high */
  104. ql_gpio_get_direction(_ql_gpio_cfg[num].gpio_num, &gpio_dir);
  105. ql_gpio_get_level(_ql_gpio_cfg[num].gpio_num, &gpio_lvl);
  106. QL_GPIODEMO_LOG("gpio[%d] output high-level", _ql_gpio_cfg[num].gpio_num);
  107. QL_GPIODEMO_LOG("gpio[%d] get dir:[%d], lvl:[%d]", _ql_gpio_cfg[num].gpio_num, gpio_dir, gpio_lvl);
  108. }
  109. ql_rtos_task_sleep_s(3);
  110. /* input pull-down test */
  111. gpio_dir = GPIO_INPUT;
  112. gpio_pull = PULL_DOWN;
  113. for( num = 0; num < sizeof(_ql_gpio_cfg)/sizeof(_ql_gpio_cfg[0]); num++ )
  114. {
  115. /* set input pull-down */
  116. ql_gpio_set_direction(_ql_gpio_cfg[num].gpio_num, gpio_dir);
  117. ql_gpio_set_pull(_ql_gpio_cfg[num].gpio_num, gpio_pull);
  118. QL_GPIODEMO_LOG("gpio[%d] input pull-down", _ql_gpio_cfg[num].gpio_num);
  119. QL_GPIODEMO_LOG("gpio[%d] set dir:[%d], pull:[%d]", _ql_gpio_cfg[num].gpio_num, gpio_dir, gpio_pull);
  120. /* get input pull-down */
  121. ql_gpio_get_direction(_ql_gpio_cfg[num].gpio_num, &gpio_dir);
  122. ql_gpio_get_pull(_ql_gpio_cfg[num].gpio_num, &gpio_pull);
  123. ql_gpio_get_level(_ql_gpio_cfg[num].gpio_num, &gpio_lvl);
  124. QL_GPIODEMO_LOG("gpio[%d] input pull-down", _ql_gpio_cfg[num].gpio_num);
  125. QL_GPIODEMO_LOG("gpio[%d] get dir:[%d], pull:[%d], lvl:[%d]", _ql_gpio_cfg[num].gpio_num, gpio_dir, gpio_pull, gpio_lvl);
  126. }
  127. ql_rtos_task_sleep_s(3);
  128. /* input pull-up test */
  129. gpio_dir = GPIO_INPUT;
  130. gpio_pull = PULL_UP;
  131. for( num = 0; num < sizeof(_ql_gpio_cfg)/sizeof(_ql_gpio_cfg[0]); num++ )
  132. {
  133. /* set input pull-up */
  134. ql_gpio_set_direction(_ql_gpio_cfg[num].gpio_num, gpio_dir);
  135. ql_gpio_set_pull(_ql_gpio_cfg[num].gpio_num, gpio_pull);
  136. QL_GPIODEMO_LOG("gpio[%d] input pull-up", _ql_gpio_cfg[num].gpio_num);
  137. QL_GPIODEMO_LOG("gpio[%d] set dir:[%d], pull:[%d]", _ql_gpio_cfg[num].gpio_num, gpio_dir, gpio_pull);
  138. /* get input pull-up */
  139. ql_gpio_get_direction(_ql_gpio_cfg[num].gpio_num, &gpio_dir);
  140. ql_gpio_get_pull(_ql_gpio_cfg[num].gpio_num, &gpio_pull);
  141. ql_gpio_get_level(_ql_gpio_cfg[num].gpio_num, &gpio_lvl);
  142. QL_GPIODEMO_LOG("gpio[%d] input pull-up", _ql_gpio_cfg[num].gpio_num);
  143. QL_GPIODEMO_LOG("gpio[%d] get dir:[%d], pull:[%d], lvl:[%d]", _ql_gpio_cfg[num].gpio_num, gpio_dir, gpio_pull, gpio_lvl);
  144. }
  145. ql_rtos_task_sleep_s(3);
  146. /* change GPIO's Pin */
  147. if( change_flg == 0 )
  148. {
  149. ql_pin_set_func(QL_TEST1_PIN_GPIO0, QL_TEST1_PIN_GPIO0_FUNC_FLASH1_CLK); // TEST1_PIN set spi_flash1_clk
  150. ql_pin_set_func(QL_TEST1_PIN_GPIO1, QL_TEST1_PIN_GPIO1_FUNC_FLASH1_CS); // TEST1_PIN set spi_flash1_cs
  151. ql_pin_set_func(QL_TEST2_PIN_GPIO0, QL_TEST2_PIN_GPIO0_FUNC_GPIO); // TEST2_PIN set GPIO0
  152. ql_pin_set_func(QL_TEST2_PIN_GPIO1, QL_TEST2_PIN_GPIO1_FUNC_GPIO); // TEST2_PIN set GPIO1
  153. QL_GPIODEMO_LOG("GPIO0/1 pin is TEST1 -> TEST2");
  154. change_flg = 1;
  155. }
  156. else
  157. {
  158. ql_pin_set_func(QL_TEST1_PIN_GPIO0, QL_TEST1_PIN_GPIO0_FUNC_GPIO); // TEST1_PIN set GPIO0
  159. ql_pin_set_func(QL_TEST1_PIN_GPIO1, QL_TEST1_PIN_GPIO1_FUNC_GPIO); // TEST1_PIN set GPIO1
  160. ql_pin_set_func(QL_TEST2_PIN_GPIO0, QL_TEST2_PIN_GPIO0_FUNC_LCD_SIO); // TEST2_PIN set spi_lcd_sio
  161. ql_pin_set_func(QL_TEST2_PIN_GPIO1, QL_TEST2_PIN_GPIO1_FUNC_LCD_SDC); // TEST2_PIN set spi_lcd_sdc
  162. QL_GPIODEMO_LOG("GPIO0/1 pin is TEST2 -> TEST1");
  163. change_flg = 0;
  164. }
  165. }
  166. ql_rtos_task_delete(NULL);
  167. }
  168. void ql_gpio_app_init(void)
  169. {
  170. QlOSStatus err = QL_OSI_SUCCESS;
  171. ql_task_t gpio_task = NULL;
  172. err = ql_rtos_task_create(&gpio_task, 1024, APP_PRIORITY_NORMAL, "ql_gpiodemo", ql_gpio_demo_thread, NULL, 1);
  173. if( err != QL_OSI_SUCCESS )
  174. {
  175. QL_GPIODEMO_LOG("gpio demo task created failed");
  176. }
  177. }