gpiotool_main.c 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
  1. #include <stdio.h>
  2. #include <stdint.h>
  3. #include "driver.h"
  4. #include "hal_interface_api.h"
  5. #include <fcntl.h>
  6. typedef struct
  7. {
  8. char pinstr[5];
  9. GPIO_TypeDef *gpioport;
  10. uint16_t gpiopin;
  11. } GPIO_TABLE_T;
  12. const GPIO_TABLE_T gpio_map[] = {
  13. /**** GPIOA ****/
  14. {"PA0", GPIOA, GPIO_PIN_0},
  15. {"PA1", GPIOA, GPIO_PIN_1},
  16. {"PA2", GPIOA, GPIO_PIN_2},
  17. {"PA3", GPIOA, GPIO_PIN_3},
  18. {"PA4", GPIOA, GPIO_PIN_4},
  19. {"PA5", GPIOA, GPIO_PIN_5},
  20. {"PA6", GPIOA, GPIO_PIN_6},
  21. {"PA7", GPIOA, GPIO_PIN_7},
  22. {"PA8", GPIOA, GPIO_PIN_8},
  23. {"PA9", GPIOA, GPIO_PIN_9},
  24. {"PA10", GPIOA, GPIO_PIN_10},
  25. {"PA11", GPIOA, GPIO_PIN_11},
  26. {"PA12", GPIOA, GPIO_PIN_12},
  27. {"PA13", GPIOA, GPIO_PIN_13},
  28. {"PA14", GPIOA, GPIO_PIN_14},
  29. {"PA15", GPIOA, GPIO_PIN_15},
  30. /**** GPIOB ****/
  31. {"PB0", GPIOB, GPIO_PIN_0},
  32. {"PB1", GPIOB, GPIO_PIN_1},
  33. {"PB2", GPIOB, GPIO_PIN_2},
  34. {"PB3", GPIOB, GPIO_PIN_3},
  35. {"PB4", GPIOB, GPIO_PIN_4},
  36. {"PB5", GPIOB, GPIO_PIN_5},
  37. {"PB6", GPIOB, GPIO_PIN_6},
  38. {"PB7", GPIOB, GPIO_PIN_7},
  39. {"PB8", GPIOB, GPIO_PIN_8},
  40. {"PB9", GPIOB, GPIO_PIN_9},
  41. {"PB10", GPIOB, GPIO_PIN_10},
  42. {"PB11", GPIOB, GPIO_PIN_11},
  43. {"PB12", GPIOB, GPIO_PIN_12},
  44. {"PB13", GPIOB, GPIO_PIN_13},
  45. {"PB14", GPIOB, GPIO_PIN_14},
  46. {"PB15", GPIOB, GPIO_PIN_15},
  47. /**** GPIOC ****/
  48. {"PC0", GPIOC, GPIO_PIN_0},
  49. {"PC1", GPIOC, GPIO_PIN_1},
  50. {"PC2", GPIOC, GPIO_PIN_2},
  51. {"PC3", GPIOC, GPIO_PIN_3},
  52. {"PC4", GPIOC, GPIO_PIN_4},
  53. {"PC5", GPIOC, GPIO_PIN_5},
  54. {"PC6", GPIOC, GPIO_PIN_6},
  55. {"PC7", GPIOC, GPIO_PIN_7},
  56. {"PC8", GPIOC, GPIO_PIN_8},
  57. {"PC9", GPIOC, GPIO_PIN_9},
  58. {"PC10", GPIOC, GPIO_PIN_10},
  59. {"PC11", GPIOC, GPIO_PIN_11},
  60. {"PC12", GPIOC, GPIO_PIN_12},
  61. {"PC13", GPIOC, GPIO_PIN_13},
  62. {"PC14", GPIOC, GPIO_PIN_14},
  63. {"PC15", GPIOC, GPIO_PIN_15},
  64. /**** GPIOD ****/
  65. {"PD0", GPIOD, GPIO_PIN_0},
  66. {"PD1", GPIOD, GPIO_PIN_1},
  67. {"PD2", GPIOD, GPIO_PIN_2},
  68. {"PD3", GPIOD, GPIO_PIN_3},
  69. {"PD4", GPIOD, GPIO_PIN_4},
  70. {"PD5", GPIOD, GPIO_PIN_5},
  71. {"PD6", GPIOD, GPIO_PIN_6},
  72. {"PD7", GPIOD, GPIO_PIN_7},
  73. {"PD8", GPIOD, GPIO_PIN_8},
  74. {"PD9", GPIOD, GPIO_PIN_9},
  75. {"PD10", GPIOD, GPIO_PIN_10},
  76. {"PD11", GPIOD, GPIO_PIN_11},
  77. {"PD12", GPIOD, GPIO_PIN_12},
  78. {"PD13", GPIOD, GPIO_PIN_13},
  79. {"PD14", GPIOD, GPIO_PIN_14},
  80. {"PD15", GPIOD, GPIO_PIN_15},
  81. /**** GPIOE ****/
  82. {"PE0", GPIOE, GPIO_PIN_0},
  83. {"PE1", GPIOE, GPIO_PIN_1},
  84. {"PE2", GPIOE, GPIO_PIN_2},
  85. {"PE3", GPIOE, GPIO_PIN_3},
  86. {"PE4", GPIOE, GPIO_PIN_4},
  87. {"PE5", GPIOE, GPIO_PIN_5},
  88. {"PE6", GPIOE, GPIO_PIN_6},
  89. {"PE7", GPIOE, GPIO_PIN_7},
  90. {"PE8", GPIOE, GPIO_PIN_8},
  91. {"PE9", GPIOE, GPIO_PIN_9},
  92. {"PE10", GPIOE, GPIO_PIN_10},
  93. {"PE11", GPIOE, GPIO_PIN_11},
  94. {"PE12", GPIOE, GPIO_PIN_12},
  95. {"PE13", GPIOE, GPIO_PIN_13},
  96. {"PE14", GPIOE, GPIO_PIN_14},
  97. {"PE15", GPIOE, GPIO_PIN_15},
  98. /**** GPIOF ****/
  99. {"PF0", GPIOF, GPIO_PIN_0},
  100. {"PF1", GPIOF, GPIO_PIN_1},
  101. {"PF2", GPIOF, GPIO_PIN_2},
  102. {"PF3", GPIOF, GPIO_PIN_3},
  103. {"PF4", GPIOF, GPIO_PIN_4},
  104. {"PF5", GPIOF, GPIO_PIN_5},
  105. {"PF6", GPIOF, GPIO_PIN_6},
  106. {"PF7", GPIOF, GPIO_PIN_7},
  107. {"PF8", GPIOF, GPIO_PIN_8},
  108. {"PF9", GPIOF, GPIO_PIN_9},
  109. {"PF10", GPIOF, GPIO_PIN_10},
  110. {"PF11", GPIOF, GPIO_PIN_11},
  111. {"PF12", GPIOF, GPIO_PIN_12},
  112. {"PF13", GPIOF, GPIO_PIN_13},
  113. {"PF14", GPIOF, GPIO_PIN_14},
  114. {"PF15", GPIOF, GPIO_PIN_15},
  115. /**** GPIOG ****/
  116. {"PG0", GPIOG, GPIO_PIN_0},
  117. {"PG1", GPIOG, GPIO_PIN_1},
  118. {"PG2", GPIOG, GPIO_PIN_2},
  119. {"PG3", GPIOG, GPIO_PIN_3},
  120. {"PG4", GPIOG, GPIO_PIN_4},
  121. {"PG5", GPIOG, GPIO_PIN_5},
  122. {"PG6", GPIOG, GPIO_PIN_6},
  123. {"PG7", GPIOG, GPIO_PIN_7},
  124. {"PG8", GPIOG, GPIO_PIN_8},
  125. {"PG9", GPIOG, GPIO_PIN_9},
  126. {"PG10", GPIOG, GPIO_PIN_10},
  127. {"PG11", GPIOG, GPIO_PIN_11},
  128. {"PG12", GPIOG, GPIO_PIN_12},
  129. {"PG13", GPIOG, GPIO_PIN_13},
  130. {"PG14", GPIOG, GPIO_PIN_14},
  131. {"PG15", GPIOG, GPIO_PIN_15},
  132. /**** GPIOH ****/
  133. {"PH0", GPIOH, GPIO_PIN_0},
  134. {"PH1", GPIOH, GPIO_PIN_1},
  135. {"PH2", GPIOH, GPIO_PIN_2},
  136. {"PH3", GPIOH, GPIO_PIN_3},
  137. {"PH4", GPIOH, GPIO_PIN_4},
  138. {"PH5", GPIOH, GPIO_PIN_5},
  139. {"PH6", GPIOH, GPIO_PIN_6},
  140. {"PH7", GPIOH, GPIO_PIN_7},
  141. {"PH8", GPIOH, GPIO_PIN_8},
  142. {"PH9", GPIOH, GPIO_PIN_9},
  143. {"PH10", GPIOH, GPIO_PIN_10},
  144. {"PH11", GPIOH, GPIO_PIN_11},
  145. {"PH12", GPIOH, GPIO_PIN_12},
  146. {"PH13", GPIOH, GPIO_PIN_13},
  147. {"PH14", GPIOH, GPIO_PIN_14},
  148. {"PH15", GPIOH, GPIO_PIN_15},
  149. /**** GPIOI ****/
  150. {"PI0", GPIOI, GPIO_PIN_0},
  151. {"PI1", GPIOI, GPIO_PIN_1},
  152. {"PI2", GPIOI, GPIO_PIN_2},
  153. {"PI3", GPIOI, GPIO_PIN_3},
  154. {"PI4", GPIOI, GPIO_PIN_4},
  155. {"PI5", GPIOI, GPIO_PIN_5},
  156. {"PI6", GPIOI, GPIO_PIN_6},
  157. {"PI7", GPIOI, GPIO_PIN_7},
  158. {"PI8", GPIOI, GPIO_PIN_8},
  159. {"PI9", GPIOI, GPIO_PIN_9},
  160. {"PI10", GPIOI, GPIO_PIN_10},
  161. {"PI11", GPIOI, GPIO_PIN_11},
  162. {"PI12", GPIOI, GPIO_PIN_12},
  163. {"PI13", GPIOI, GPIO_PIN_13},
  164. {"PI14", GPIOI, GPIO_PIN_14},
  165. {"PI15", GPIOI, GPIO_PIN_15},
  166. };
  167. void help()
  168. {
  169. printf("gpiotool set <PA0~PI15> <outputpp/outputod/input> <pullup/pulldown/nopull>\n");
  170. printf("gpiotool write <PA0~PI15> <high/low>\n");
  171. printf("gpiotool read <PA0~PI15>\n");
  172. }
  173. int main(int argc, char* argv[])
  174. {
  175. int i;
  176. uint16_t buf;
  177. GPIO_TABLE_T *gpioinfo;
  178. GPIO_TypeDef *GPIO_PORT;
  179. uint16_t GPIO_PIN;
  180. GPIO_InitTypeDef GPIO_InitStruct;
  181. uint8_t pin_state;
  182. if(argc < 3)
  183. {
  184. help();
  185. return -1;
  186. }
  187. for(i=0;i<sizeof(gpio_map)/sizeof(GPIO_TABLE_T);i++)
  188. {
  189. if(strcmp(argv[2], gpio_map[i].pinstr) == 0)
  190. {
  191. GPIO_PORT = gpio_map[i].gpioport;
  192. GPIO_PIN = gpio_map[i].gpiopin;
  193. break;
  194. }
  195. }
  196. if(i == sizeof(gpio_map)/sizeof(GPIO_TABLE_T))
  197. {
  198. printf("Invalid gpio pin %s \n", argv[2]);
  199. help();
  200. return -1;
  201. }
  202. if((strcmp(argv[1], "set") == 0) && (argc == 5))
  203. {
  204. GPIO_InitStruct.Pin = GPIO_PIN;
  205. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  206. if(strcmp(argv[3], "outputpp") == 0)
  207. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  208. else if(strcmp(argv[3], "outputod") == 0)
  209. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
  210. else if(strcmp(argv[3], "input") == 0)
  211. GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  212. else
  213. {
  214. printf("Invalid dir %s\n", argv[3]);
  215. help();
  216. return -1;
  217. }
  218. if(strcmp(argv[4], "pullup") == 0)
  219. GPIO_InitStruct.Pull = GPIO_PULLUP;
  220. else if(strcmp(argv[4], "pulldown") == 0)
  221. GPIO_InitStruct.Pull = GPIO_PULLDOWN;
  222. else if(strcmp(argv[4], "nopull") == 0)
  223. GPIO_InitStruct.Pull = GPIO_NOPULL;
  224. else
  225. {
  226. printf("Invalid pull %s\n", argv[4]);
  227. help();
  228. return -1;
  229. }
  230. stm32_gpio_init(GPIO_PORT, &GPIO_InitStruct);
  231. printf("Set %s %s %s\n", argv[2], argv[3], argv[4]);
  232. }
  233. else if((strcmp(argv[1], "write") == 0) && (argc == 4))
  234. {
  235. if(strcmp(argv[3], "high") == 0)
  236. {
  237. stm32_gpio_write(GPIO_PORT, GPIO_PIN, 1);
  238. printf("Set %s high\n", argv[2]);
  239. }
  240. else if(strcmp(argv[3], "low") == 0)
  241. {
  242. stm32_gpio_write(GPIO_PORT, GPIO_PIN, 0);
  243. printf("Set %s low\n", argv[2]);
  244. }
  245. else
  246. {
  247. printf("Invalid pin state %s\n", argv[3]);
  248. help();
  249. return -1;
  250. }
  251. }
  252. else if((strcmp(argv[1], "read") == 0) && (argc == 3))
  253. {
  254. pin_state = stm32_gpio_read(GPIO_PORT, GPIO_PIN);
  255. if(pin_state)
  256. printf("Read %s high\n", argv[2]);
  257. else
  258. printf("Read %s low\n", argv[2]);
  259. }
  260. else
  261. {
  262. help();
  263. return -1;
  264. }
  265. }