gpio_api.c 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. #include <stdio.h>
  2. #include <stdint.h>
  3. #include "fcntl.h"
  4. #include "gpio_api.h"
  5. #include "./../stm32f429xx.h"
  6. #include "./../../driver/GPIO/gpio.h"
  7. static int assert_gpio(gpio_data_t *gpin_data)
  8. {
  9. //check gpio port
  10. if((gpin_data->port != GPIOA)&&(gpin_data->port != GPIOB)\
  11. &&(gpin_data->port != GPIOC)&&(gpin_data->port != GPIOD)\
  12. &&(gpin_data->port != GPIOE)&&(gpin_data->port != GPIOF)\
  13. &&(gpin_data->port != GPIOG)&&(gpin_data->port != GPIOH)\
  14. &&(gpin_data->port != GPIOI)&&(gpin_data->port != GPIOJ)\
  15. &&(gpin_data->port != GPIOK))
  16. {
  17. printf("Error: %s %d Invalid GPIO port!\n",__FILE__,__LINE__);
  18. return -1;
  19. }
  20. //check gpio pin
  21. if((gpin_data->pin != GPIO_PIN_0)&&(gpin_data->pin != GPIO_PIN_1)\
  22. &&(gpin_data->pin != GPIO_PIN_2)&&(gpin_data->pin != GPIO_PIN_3)\
  23. &&(gpin_data->pin != GPIO_PIN_4)&&(gpin_data->pin != GPIO_PIN_5)\
  24. &&(gpin_data->pin != GPIO_PIN_6)&&(gpin_data->pin != GPIO_PIN_7)\
  25. &&(gpin_data->pin != GPIO_PIN_8)&&(gpin_data->pin != GPIO_PIN_9)\
  26. &&(gpin_data->pin != GPIO_PIN_10)&&(gpin_data->pin != GPIO_PIN_11)\
  27. &&(gpin_data->pin != GPIO_PIN_12)&&(gpin_data->pin != GPIO_PIN_13)\
  28. &&(gpin_data->pin != GPIO_PIN_14)&&(gpin_data->pin != GPIO_PIN_15))
  29. {
  30. printf("Error: %s %d Invalid GPIO pin!\n",__FILE__,__LINE__);
  31. return -1;
  32. }
  33. return 0;
  34. }
  35. int set_gpio_input(gpio_data_t *gpin_data)
  36. {
  37. int fd;
  38. int ret = 0;
  39. if(assert_gpio(gpin_data) != 0)
  40. return -1;
  41. fd = open("/dev/gpio",O_RDWR);
  42. if(fd == -1)
  43. {
  44. printf("Error: %s %d Open GPIO fail!\n",__FILE__,__LINE__);
  45. return -1;
  46. }
  47. ret = ioctl(fd,SET_GPIO_INPUT,gpin_data);
  48. if(ret != 0)
  49. {
  50. printf("Error: %s %d Set gpio input fail!\n,__FILE__,__LINE__");
  51. ret = -1;
  52. }
  53. close(fd);
  54. return ret;
  55. }
  56. int set_gpio_push_pull_output(gpio_data_t *gpin_data)
  57. {
  58. int fd;
  59. int ret = 0;
  60. if(assert_gpio(gpin_data) != 0)
  61. return -1;
  62. fd = open("/dev/gpio",O_RDWR);
  63. if(fd == -1)
  64. {
  65. printf("Error: %s %d Open GPIO fail!\n",__FILE__,__LINE__);
  66. return -1;
  67. }
  68. ret = ioctl(fd,SET_GPIO_PUSH_PULL_OUTPUT,gpin_data);
  69. if(ret != 0)
  70. {
  71. printf("Error: %s %d Set gpio push pull output fail!\n,__FILE__,__LINE__");
  72. ret = -1;
  73. }
  74. close(fd);
  75. return ret;
  76. }
  77. int set_gpio_open_drain_output(gpio_data_t *gpin_data)
  78. {
  79. int fd;
  80. int ret = 0;
  81. if(assert_gpio(gpin_data) != 0)
  82. return -1;
  83. fd = open("/dev/gpio",O_RDWR);
  84. if(fd == -1)
  85. {
  86. printf("Error: %s %d Open GPIO fail!\n",__FILE__,__LINE__);
  87. return -1;
  88. }
  89. ret = ioctl(fd,SET_GPIO_OPEN_DRAIN_OUTPUT,gpin_data);
  90. if(ret != 0)
  91. {
  92. printf("Error: %s %d Set gpio open drain output fail!\n,__FILE__,__LINE__");
  93. ret = -1;
  94. }
  95. close(fd);
  96. return ret;
  97. }
  98. int set_gpio_pull_up(gpio_data_t *gpin_data)
  99. {
  100. int fd;
  101. int ret = 0;
  102. if(assert_gpio(gpin_data) != 0)
  103. return -1;
  104. fd = open("/dev/gpio",O_RDWR);
  105. if(fd == -1)
  106. {
  107. printf("Error: %s %d Open GPIO fail!\n",__FILE__,__LINE__);
  108. return -1;
  109. }
  110. ret = ioctl(fd,SET_GPIO_PULL_UP,gpin_data);
  111. if(ret != 0)
  112. {
  113. printf("Error: %s %d Set gpio pull up fail!\n,__FILE__,__LINE__");
  114. ret = -1;
  115. }
  116. close(fd);
  117. return ret;
  118. }
  119. int set_gpio_pull_down(gpio_data_t *gpin_data)
  120. {
  121. int fd;
  122. int ret = 0;
  123. if(assert_gpio(gpin_data) != 0)
  124. return -1;
  125. fd = open("/dev/gpio",O_RDWR);
  126. if(fd == -1)
  127. {
  128. printf("Error: %s %d Open GPIO fail!\n",__FILE__,__LINE__);
  129. return -1;
  130. }
  131. ret = ioctl(fd,SET_GPIO_PULL_DOWN,gpin_data);
  132. if(ret != 0)
  133. {
  134. printf("Error: %s %d Set gpio pull down fail!\n,__FILE__,__LINE__");
  135. ret = -1;
  136. }
  137. close(fd);
  138. return ret;
  139. }
  140. int set_gpio_no_pull(gpio_data_t *gpin_data)
  141. {
  142. int fd;
  143. int ret = 0;
  144. if(assert_gpio(gpin_data) != 0)
  145. return -1;
  146. fd = open("/dev/gpio",O_RDWR);
  147. if(fd == -1)
  148. {
  149. printf("Error: %s %d Open GPIO fail!\n",__FILE__,__LINE__);
  150. return -1;
  151. }
  152. ret = ioctl(fd,SET_GPIO_NO_PULL,gpin_data);
  153. if(ret != 0)
  154. {
  155. printf("Error: %s %d Set gpio no pull fail!\n,__FILE__,__LINE__");
  156. ret = -1;
  157. }
  158. close(fd);
  159. return ret;
  160. }
  161. int set_gpio_speed(gpio_data_t *gpin_data)
  162. {
  163. int fd;
  164. int ret = 0;
  165. if(assert_gpio(gpin_data) != 0)
  166. return -1;
  167. if((gpin_data->data != GPIO_LOW_SPEED)&&(gpin_data->data != GPIO_MEDIUM_SPEED)\
  168. &&(gpin_data->data != GPIO_FAST_SPEED)&&(gpin_data->data != GPIO_HIGH_SPEED))
  169. {
  170. printf("Error: %s %d Invalid gpio speed %#x",__FILE__,__LINE__,gpin_data->data);
  171. }
  172. fd = open("/dev/gpio",O_RDWR);
  173. if(fd == -1)
  174. {
  175. printf("Error: %s %d Open GPIO fail!\n",__FILE__,__LINE__);
  176. return -1;
  177. }
  178. ret = ioctl(fd,SET_GPIO_SPEED,gpin_data);
  179. if(ret != 0)
  180. {
  181. printf("Error: %s %d Set gpio speed fail!\n,__FILE__,__LINE__");
  182. ret = -1;
  183. }
  184. close(fd);
  185. return ret;
  186. }
  187. int set_gpio_value(gpio_data_t *gpin_data)
  188. {
  189. int fd;
  190. int ret = 0;
  191. if(assert_gpio(gpin_data) != 0)
  192. return -1;
  193. fd = open("/dev/gpio",O_RDWR);
  194. if(fd == -1)
  195. {
  196. printf("Error: %s %d Open GPIO fail!\n",__FILE__,__LINE__);
  197. return -1;
  198. }
  199. ret = ioctl(fd,SET_GPIO_VALUE,gpin_data);
  200. if(ret != 0)
  201. {
  202. printf("Error: %s %d Set gpio value fail!\n,__FILE__,__LINE__");
  203. ret = -1;
  204. }
  205. close(fd);
  206. return ret;
  207. }
  208. int get_gpio_value(gpio_data_t *gpin_data)
  209. {
  210. int fd;
  211. int ret = 0;
  212. if(assert_gpio(gpin_data) != 0)
  213. return -1;
  214. fd = open("/dev/gpio",O_RDWR);
  215. if(fd == -1)
  216. {
  217. printf("Error: %s %d Open GPIO fail!\n",__FILE__,__LINE__);
  218. return -1;
  219. }
  220. ret = ioctl(fd,GET_GPIO_VALUE,gpin_data);
  221. if(ret != 0)
  222. {
  223. printf("Error: %s %d Set gpio speed fail!\n,__FILE__,__LINE__");
  224. ret = -1;
  225. }
  226. close(fd);
  227. return ret;
  228. }