drv_gpio.c 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434
  1. #include <rtthread.h>
  2. #include <rtdevice.h>
  3. #include <rthw.h>
  4. #include "mss_gpio.h"
  5. #include "drv_gpio.h"
  6. #ifdef BSP_USING_GPIO
  7. static struct rt_pin_irq_hdr sf2_pin_irq_hdr_tab[] =
  8. {
  9. /* pin, hdr, mode, args */
  10. {-1, 0, RT_NULL, RT_NULL},
  11. {-1, 0, RT_NULL, RT_NULL},
  12. {-1, 0, RT_NULL, RT_NULL},
  13. {-1, 0, RT_NULL, RT_NULL},
  14. {-1, 0, RT_NULL, RT_NULL},
  15. {-1, 0, RT_NULL, RT_NULL},
  16. {-1, 0, RT_NULL, RT_NULL},
  17. {-1, 0, RT_NULL, RT_NULL},
  18. {-1, 0, RT_NULL, RT_NULL},
  19. {-1, 0, RT_NULL, RT_NULL},
  20. {-1, 0, RT_NULL, RT_NULL},
  21. {-1, 0, RT_NULL, RT_NULL},
  22. {-1, 0, RT_NULL, RT_NULL},
  23. {-1, 0, RT_NULL, RT_NULL},
  24. {-1, 0, RT_NULL, RT_NULL},
  25. {-1, 0, RT_NULL, RT_NULL},
  26. {-1, 0, RT_NULL, RT_NULL},
  27. {-1, 0, RT_NULL, RT_NULL},
  28. {-1, 0, RT_NULL, RT_NULL},
  29. {-1, 0, RT_NULL, RT_NULL},
  30. {-1, 0, RT_NULL, RT_NULL},
  31. {-1, 0, RT_NULL, RT_NULL},
  32. {-1, 0, RT_NULL, RT_NULL},
  33. {-1, 0, RT_NULL, RT_NULL},
  34. {-1, 0, RT_NULL, RT_NULL},
  35. {-1, 0, RT_NULL, RT_NULL},
  36. {-1, 0, RT_NULL, RT_NULL},
  37. {-1, 0, RT_NULL, RT_NULL},
  38. {-1, 0, RT_NULL, RT_NULL},
  39. {-1, 0, RT_NULL, RT_NULL},
  40. {-1, 0, RT_NULL, RT_NULL},
  41. {-1, 0, RT_NULL, RT_NULL},
  42. };
  43. /* configure an individual GPIO port */
  44. static void sf2_pin_mode(rt_device_t dev, rt_base_t pin, rt_base_t mode)
  45. {
  46. uint32_t config;
  47. switch (mode)
  48. {
  49. case PIN_MODE_OUTPUT:
  50. config = MSS_GPIO_OUTPUT_MODE;
  51. break;
  52. case PIN_MODE_INPUT:
  53. config = MSS_GPIO_INPUT_MODE;
  54. break;
  55. default:
  56. config = MSS_GPIO_INOUT_MODE;
  57. break;
  58. }
  59. MSS_GPIO_config((mss_gpio_id_t )pin, config);
  60. }
  61. static int sf2_pin_read(rt_device_t dev, rt_base_t pin)
  62. {
  63. uint32_t value;
  64. value = MSS_GPIO_get_inputs() & (1<<pin);
  65. return ((value) ? PIN_HIGH : PIN_LOW);
  66. }
  67. static void sf2_pin_write(rt_device_t dev, rt_base_t pin, rt_base_t value)
  68. {
  69. if (value == PIN_HIGH)
  70. MSS_GPIO_set_output((mss_gpio_id_t )pin, 1);
  71. else
  72. MSS_GPIO_set_output((mss_gpio_id_t )pin, 0);
  73. }
  74. static rt_err_t sf2_pin_attach_irq(struct rt_device *device, rt_int32_t pin,
  75. rt_uint32_t mode, void (*hdr)(void *args), void *args)
  76. {
  77. rt_base_t level;
  78. level = rt_hw_interrupt_disable();
  79. if (sf2_pin_irq_hdr_tab[pin].pin == pin &&
  80. sf2_pin_irq_hdr_tab[pin].hdr == hdr &&
  81. sf2_pin_irq_hdr_tab[pin].mode == mode &&
  82. sf2_pin_irq_hdr_tab[pin].args == args)
  83. {
  84. rt_hw_interrupt_enable(level);
  85. return RT_EOK;
  86. }
  87. if (sf2_pin_irq_hdr_tab[pin].pin != -1)
  88. {
  89. rt_hw_interrupt_enable(level);
  90. return -RT_EBUSY;
  91. }
  92. sf2_pin_irq_hdr_tab[pin].pin = pin;
  93. sf2_pin_irq_hdr_tab[pin].hdr = hdr;
  94. sf2_pin_irq_hdr_tab[pin].mode = mode;
  95. sf2_pin_irq_hdr_tab[pin].args = args;
  96. rt_hw_interrupt_enable(level);
  97. return RT_EOK;
  98. }
  99. static rt_err_t sf2_pin_detach_irq(struct rt_device *device, rt_int32_t pin)
  100. {
  101. rt_base_t level;
  102. level = rt_hw_interrupt_disable();
  103. if (sf2_pin_irq_hdr_tab[pin].pin == -1)
  104. {
  105. rt_hw_interrupt_enable(level);
  106. return RT_EOK;
  107. }
  108. sf2_pin_irq_hdr_tab[pin].pin = -1;
  109. sf2_pin_irq_hdr_tab[pin].hdr = RT_NULL;
  110. sf2_pin_irq_hdr_tab[pin].mode = 0;
  111. sf2_pin_irq_hdr_tab[pin].args = RT_NULL;
  112. rt_hw_interrupt_enable(level);
  113. return RT_EOK;
  114. }
  115. static rt_err_t sf2_pin_irq_enable(struct rt_device *device, rt_base_t pin, rt_uint32_t enabled)
  116. {
  117. uint32_t mode;
  118. rt_base_t level;
  119. if (enabled == PIN_IRQ_ENABLE)
  120. {
  121. level = rt_hw_interrupt_disable();
  122. if (sf2_pin_irq_hdr_tab[pin].pin == -1)
  123. {
  124. rt_hw_interrupt_enable(level);
  125. return -RT_ENOSYS;
  126. }
  127. switch(sf2_pin_irq_hdr_tab[pin].mode)
  128. {
  129. case PIN_IRQ_MODE_RISING :
  130. mode = MSS_GPIO_IRQ_EDGE_POSITIVE;
  131. break;
  132. case PIN_IRQ_MODE_FALLING :
  133. mode = MSS_GPIO_IRQ_EDGE_NEGATIVE;
  134. break;
  135. case PIN_IRQ_MODE_RISING_FALLING:
  136. mode = MSS_GPIO_IRQ_EDGE_BOTH;
  137. break;
  138. case PIN_IRQ_MODE_HIGH_LEVEL :
  139. mode = MSS_GPIO_IRQ_LEVEL_HIGH;
  140. break;
  141. case PIN_IRQ_MODE_LOW_LEVEL:
  142. mode = MSS_GPIO_IRQ_LEVEL_LOW;
  143. break;
  144. }
  145. MSS_GPIO_config((mss_gpio_id_t )pin, MSS_GPIO_INPUT_MODE | mode);
  146. MSS_GPIO_enable_irq((mss_gpio_id_t )pin);
  147. rt_hw_interrupt_enable(level);
  148. }
  149. else if (enabled == PIN_IRQ_DISABLE)
  150. {
  151. MSS_GPIO_config((mss_gpio_id_t )pin, MSS_GPIO_INPUT_MODE);
  152. MSS_GPIO_disable_irq((mss_gpio_id_t )pin);
  153. }
  154. else
  155. return -RT_ENOSYS;
  156. return RT_EOK;
  157. }
  158. static const struct rt_pin_ops sf2_pin_ops =
  159. {
  160. sf2_pin_mode,
  161. sf2_pin_write,
  162. sf2_pin_read,
  163. sf2_pin_attach_irq,
  164. sf2_pin_detach_irq,
  165. sf2_pin_irq_enable
  166. };
  167. int rt_hw_pin_init(void)
  168. {
  169. rt_err_t result = RT_EOK;
  170. MSS_GPIO_init();
  171. result = rt_device_pin_register("pin", &sf2_pin_ops, RT_NULL);
  172. RT_ASSERT(result == RT_EOK);
  173. return result;
  174. }
  175. INIT_BOARD_EXPORT(rt_hw_pin_init);
  176. rt_inline void pin_irq_hdr(int pin)
  177. {
  178. MSS_GPIO_clear_irq((mss_gpio_id_t )pin);
  179. if (sf2_pin_irq_hdr_tab[pin].hdr)
  180. sf2_pin_irq_hdr_tab[pin].hdr(sf2_pin_irq_hdr_tab[pin].args);
  181. }
  182. void GPIO0_IRQHandler( void )
  183. {
  184. /* enter interrupt */
  185. rt_interrupt_enter();
  186. pin_irq_hdr(0);
  187. /* leave interrupt */
  188. rt_interrupt_leave();
  189. }
  190. void GPIO1_IRQHandler( void )
  191. {
  192. rt_interrupt_enter();
  193. pin_irq_hdr(1);
  194. rt_interrupt_leave();
  195. }
  196. void GPIO2_IRQHandler( void )
  197. {
  198. rt_interrupt_enter();
  199. pin_irq_hdr(2);
  200. rt_interrupt_leave();
  201. }
  202. void GPIO3_IRQHandler( void )
  203. {
  204. rt_interrupt_enter();
  205. pin_irq_hdr(3);
  206. rt_interrupt_leave();
  207. }
  208. void GPIO4_IRQHandler( void )
  209. {
  210. rt_interrupt_enter();
  211. pin_irq_hdr(4);
  212. rt_interrupt_leave();
  213. }
  214. void GPIO5_IRQHandler( void )
  215. {
  216. rt_interrupt_enter();
  217. pin_irq_hdr(5);
  218. rt_interrupt_leave();
  219. }
  220. void GPIO6_IRQHandler( void )
  221. {
  222. rt_interrupt_enter();
  223. pin_irq_hdr(6);
  224. rt_interrupt_leave();
  225. }
  226. void GPIO7_IRQHandler( void )
  227. {
  228. rt_interrupt_enter();
  229. pin_irq_hdr(7);
  230. rt_interrupt_leave();
  231. }
  232. void GPIO8_IRQHandler( void )
  233. {
  234. rt_interrupt_enter();
  235. pin_irq_hdr(8);
  236. rt_interrupt_leave();
  237. }
  238. void GPIO9_IRQHandler( void )
  239. {
  240. rt_interrupt_enter();
  241. pin_irq_hdr(9);
  242. rt_interrupt_leave();
  243. }
  244. void GPIO10_IRQHandler( void )
  245. {
  246. rt_interrupt_enter();
  247. pin_irq_hdr(10);
  248. rt_interrupt_leave();
  249. }
  250. void GPIO11_IRQHandler( void )
  251. {
  252. rt_interrupt_enter();
  253. pin_irq_hdr(11);
  254. rt_interrupt_leave();
  255. }
  256. void GPIO12_IRQHandler( void )
  257. {
  258. rt_interrupt_enter();
  259. pin_irq_hdr(12);
  260. rt_interrupt_leave();
  261. }
  262. void GPIO13_IRQHandler( void )
  263. {
  264. rt_interrupt_enter();
  265. pin_irq_hdr(13);
  266. rt_interrupt_leave();
  267. }
  268. void GPIO14_IRQHandler( void )
  269. {
  270. rt_interrupt_enter();
  271. pin_irq_hdr(14);
  272. rt_interrupt_leave();
  273. }
  274. void GPIO15_IRQHandler( void )
  275. {
  276. rt_interrupt_enter();
  277. pin_irq_hdr(15);
  278. rt_interrupt_leave();
  279. }
  280. void GPIO16_IRQHandler( void )
  281. {
  282. rt_interrupt_enter();
  283. pin_irq_hdr(16);
  284. rt_interrupt_leave();
  285. }
  286. void GPIO17_IRQHandler( void )
  287. {
  288. rt_interrupt_enter();
  289. pin_irq_hdr(17);
  290. rt_interrupt_leave();
  291. }
  292. void GPIO18_IRQHandler( void )
  293. {
  294. rt_interrupt_enter();
  295. pin_irq_hdr(18);
  296. rt_interrupt_leave();
  297. }
  298. void GPIO19_IRQHandler( void )
  299. {
  300. rt_interrupt_enter();
  301. pin_irq_hdr(19);
  302. rt_interrupt_leave();
  303. }
  304. void GPIO20_IRQHandler( void )
  305. {
  306. rt_interrupt_enter();
  307. pin_irq_hdr(20);
  308. rt_interrupt_leave();
  309. }
  310. void GPIO21_IRQHandler( void )
  311. {
  312. rt_interrupt_enter();
  313. pin_irq_hdr(21);
  314. rt_interrupt_leave();
  315. }
  316. void GPIO22_IRQHandler( void )
  317. {
  318. rt_interrupt_enter();
  319. pin_irq_hdr(22);
  320. rt_interrupt_leave();
  321. }
  322. void GPIO23_IRQHandler( void )
  323. {
  324. rt_interrupt_enter();
  325. pin_irq_hdr(23);
  326. rt_interrupt_leave();
  327. }
  328. void GPIO24_IRQHandler( void )
  329. {
  330. rt_interrupt_enter();
  331. pin_irq_hdr(24);
  332. rt_interrupt_leave();
  333. }
  334. void GPIO25_IRQHandler( void )
  335. {
  336. rt_interrupt_enter();
  337. pin_irq_hdr(25);
  338. rt_interrupt_leave();
  339. }
  340. void GPIO26_IRQHandler( void )
  341. {
  342. rt_interrupt_enter();
  343. pin_irq_hdr(26);
  344. rt_interrupt_leave();
  345. }
  346. void GPIO27_IRQHandler( void )
  347. {
  348. rt_interrupt_enter();
  349. pin_irq_hdr(27);
  350. rt_interrupt_leave();
  351. }
  352. void GPIO28_IRQHandler( void )
  353. {
  354. rt_interrupt_enter();
  355. pin_irq_hdr(28);
  356. rt_interrupt_leave();
  357. }
  358. void GPIO29_IRQHandler( void )
  359. {
  360. rt_interrupt_enter();
  361. pin_irq_hdr(29);
  362. rt_interrupt_leave();
  363. }
  364. void GPIO30_IRQHandler( void )
  365. {
  366. rt_interrupt_enter();
  367. pin_irq_hdr(30);
  368. rt_interrupt_leave();
  369. }
  370. void GPIO31_IRQHandler( void )
  371. {
  372. rt_interrupt_enter();
  373. pin_irq_hdr(31);
  374. rt_interrupt_leave();
  375. }
  376. #endif