drv_gpio.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490
  1. /*
  2. * Copyright (c) 2006-2021, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2021-06-20 RiceChen the first version
  9. */
  10. #include <rtdevice.h>
  11. #include <rthw.h>
  12. #ifdef RT_USING_PIN
  13. #include "drv_gpio.h"
  14. static const struct pin_index pins[] =
  15. {
  16. GD32_PIN(1, A, 0),
  17. GD32_PIN(2, A, 1),
  18. GD32_PIN(3, A, 2),
  19. GD32_PIN(4, A, 3),
  20. GD32_PIN(5, A, 4),
  21. GD32_PIN(6, A, 5),
  22. GD32_PIN(7, A, 6),
  23. GD32_PIN(8, A, 7),
  24. GD32_PIN(9, A, 8),
  25. GD32_PIN(10, A, 9),
  26. GD32_PIN(11, A, 10),
  27. GD32_PIN(12, A, 11),
  28. GD32_PIN(13, A, 12),
  29. GD32_PIN(14, A, 13),
  30. GD32_PIN(15, A, 14),
  31. GD32_PIN(16, A, 15),
  32. GD32_PIN(17, B, 0),
  33. GD32_PIN(18, B, 1),
  34. GD32_PIN(19, B, 2),
  35. GD32_PIN(20, B, 3),
  36. GD32_PIN(21, B, 4),
  37. GD32_PIN(22, B, 5),
  38. GD32_PIN(23, B, 6),
  39. GD32_PIN(24, B, 7),
  40. GD32_PIN(25, B, 8),
  41. GD32_PIN(26, B, 9),
  42. GD32_PIN(27, B, 10),
  43. GD32_PIN(28, B, 11),
  44. GD32_PIN(29, B, 12),
  45. GD32_PIN(30, B, 13),
  46. GD32_PIN(31, B, 14),
  47. GD32_PIN(32, B, 15),
  48. GD32_PIN(33, C, 0),
  49. GD32_PIN(34, C, 1),
  50. GD32_PIN(35, C, 2),
  51. GD32_PIN(36, C, 3),
  52. GD32_PIN(37, C, 4),
  53. GD32_PIN(38, C, 5),
  54. GD32_PIN(39, C, 6),
  55. GD32_PIN(40, C, 7),
  56. GD32_PIN(41, C, 8),
  57. GD32_PIN(42, C, 9),
  58. GD32_PIN(43, C, 10),
  59. GD32_PIN(44, C, 11),
  60. GD32_PIN(45, C, 12),
  61. GD32_PIN(46, C, 13),
  62. GD32_PIN(47, C, 14),
  63. GD32_PIN(48, C, 15),
  64. GD32_PIN(51, D, 2),
  65. GD32_PIN_DEFAULT,
  66. GD32_PIN_DEFAULT,
  67. GD32_PIN_DEFAULT,
  68. GD32_PIN_DEFAULT,
  69. GD32_PIN_DEFAULT,
  70. GD32_PIN_DEFAULT,
  71. GD32_PIN_DEFAULT,
  72. GD32_PIN_DEFAULT,
  73. GD32_PIN_DEFAULT,
  74. GD32_PIN_DEFAULT,
  75. GD32_PIN_DEFAULT,
  76. GD32_PIN_DEFAULT,
  77. GD32_PIN_DEFAULT,
  78. GD32_PIN(65, F, 0),
  79. GD32_PIN(66, F, 1),
  80. GD32_PIN_DEFAULT,
  81. GD32_PIN_DEFAULT,
  82. GD32_PIN(69, F, 4),
  83. GD32_PIN(70, F, 5),
  84. GD32_PIN(71, F, 6),
  85. GD32_PIN(72, F, 7),
  86. GD32_PIN_DEFAULT,
  87. GD32_PIN_DEFAULT,
  88. GD32_PIN_DEFAULT,
  89. GD32_PIN_DEFAULT,
  90. GD32_PIN_DEFAULT,
  91. GD32_PIN_DEFAULT,
  92. GD32_PIN_DEFAULT,
  93. GD32_PIN_DEFAULT,
  94. };
  95. static const struct pin_irq_map pin_irq_map[] =
  96. {
  97. {GPIO_PIN_0, EXTI0_1_IRQn},
  98. {GPIO_PIN_1, EXTI0_1_IRQn},
  99. {GPIO_PIN_2, EXTI2_3_IRQn},
  100. {GPIO_PIN_3, EXTI2_3_IRQn},
  101. {GPIO_PIN_4, EXTI4_15_IRQn},
  102. {GPIO_PIN_5, EXTI4_15_IRQn},
  103. {GPIO_PIN_6, EXTI4_15_IRQn},
  104. {GPIO_PIN_7, EXTI4_15_IRQn},
  105. {GPIO_PIN_8, EXTI4_15_IRQn},
  106. {GPIO_PIN_9, EXTI4_15_IRQn},
  107. {GPIO_PIN_10, EXTI4_15_IRQn},
  108. {GPIO_PIN_11, EXTI4_15_IRQn},
  109. {GPIO_PIN_12, EXTI4_15_IRQn},
  110. {GPIO_PIN_13, EXTI4_15_IRQn},
  111. {GPIO_PIN_14, EXTI4_15_IRQn},
  112. {GPIO_PIN_15, EXTI4_15_IRQn},
  113. };
  114. struct rt_pin_irq_hdr pin_irq_hdr_tab[] =
  115. {
  116. {-1, 0, RT_NULL, RT_NULL},
  117. {-1, 0, RT_NULL, RT_NULL},
  118. {-1, 0, RT_NULL, RT_NULL},
  119. {-1, 0, RT_NULL, RT_NULL},
  120. {-1, 0, RT_NULL, RT_NULL},
  121. {-1, 0, RT_NULL, RT_NULL},
  122. {-1, 0, RT_NULL, RT_NULL},
  123. {-1, 0, RT_NULL, RT_NULL},
  124. {-1, 0, RT_NULL, RT_NULL},
  125. {-1, 0, RT_NULL, RT_NULL},
  126. {-1, 0, RT_NULL, RT_NULL},
  127. {-1, 0, RT_NULL, RT_NULL},
  128. {-1, 0, RT_NULL, RT_NULL},
  129. {-1, 0, RT_NULL, RT_NULL},
  130. {-1, 0, RT_NULL, RT_NULL},
  131. {-1, 0, RT_NULL, RT_NULL},
  132. };
  133. #define ITEM_NUM(items) sizeof(items) / sizeof(items[0])
  134. const struct pin_index *get_pin(rt_uint8_t pin)
  135. {
  136. const struct pin_index *index;
  137. if (pin < ITEM_NUM(pins))
  138. {
  139. index = &pins[pin];
  140. if (index->index == -1)
  141. index = RT_NULL;
  142. }
  143. else
  144. {
  145. index = RT_NULL;
  146. }
  147. return index;
  148. };
  149. void gd32_pin_mode(rt_device_t dev, rt_base_t pin, rt_base_t mode)
  150. {
  151. const struct pin_index *index = RT_NULL;
  152. rt_uint32_t pin_mode = 0, pin_pupd = 0, pin_odpp = 0;
  153. index = get_pin(pin);
  154. if (index == RT_NULL)
  155. {
  156. return;
  157. }
  158. /* GPIO Periph clock enable */
  159. rcu_periph_clock_enable(index->clk);
  160. pin_mode = GPIO_MODE_OUTPUT;
  161. switch(mode)
  162. {
  163. case PIN_MODE_OUTPUT:
  164. /* output setting */
  165. pin_mode = GPIO_MODE_OUTPUT;
  166. pin_pupd = GPIO_PUPD_NONE;
  167. pin_odpp = GPIO_OTYPE_PP;
  168. break;
  169. case PIN_MODE_OUTPUT_OD:
  170. /* output setting: od. */
  171. pin_mode = GPIO_MODE_OUTPUT;
  172. pin_pupd = GPIO_PUPD_NONE;
  173. pin_odpp = GPIO_OTYPE_OD;
  174. break;
  175. case PIN_MODE_INPUT:
  176. /* input setting: not pull. */
  177. pin_mode = GPIO_MODE_INPUT;
  178. pin_pupd = GPIO_PUPD_PULLUP | GPIO_PUPD_PULLDOWN;
  179. break;
  180. case PIN_MODE_INPUT_PULLUP:
  181. /* input setting: pull up. */
  182. pin_mode = GPIO_MODE_INPUT;
  183. pin_pupd = GPIO_PUPD_PULLUP;
  184. break;
  185. case PIN_MODE_INPUT_PULLDOWN:
  186. /* input setting: pull down. */
  187. pin_mode = GPIO_MODE_INPUT;
  188. pin_pupd = GPIO_PUPD_PULLDOWN;
  189. break;
  190. default:
  191. break;
  192. }
  193. gpio_mode_set(index->gpio_periph, pin_mode, pin_pupd, index->pin);
  194. if(pin_mode == GPIO_MODE_OUTPUT)
  195. {
  196. gpio_output_options_set(index->gpio_periph, pin_odpp, GPIO_OSPEED_50MHZ, index->pin);
  197. }
  198. }
  199. void gd32_pin_write(rt_device_t dev, rt_base_t pin, rt_base_t value)
  200. {
  201. const struct pin_index *index = RT_NULL;
  202. index = get_pin(pin);
  203. if (index == RT_NULL)
  204. {
  205. return;
  206. }
  207. gpio_bit_write(index->gpio_periph, index->pin, (bit_status)value);
  208. }
  209. int gd32_pin_read(rt_device_t dev, rt_base_t pin)
  210. {
  211. int value = PIN_LOW;
  212. const struct pin_index *index = RT_NULL;
  213. index = get_pin(pin);
  214. if (index == RT_NULL)
  215. {
  216. return value;
  217. }
  218. value = gpio_input_bit_get(index->gpio_periph, index->pin);
  219. return value;
  220. }
  221. rt_inline rt_int32_t bit2bitno(rt_uint32_t bit)
  222. {
  223. rt_uint8_t i;
  224. for (i = 0; i < 32; i++)
  225. {
  226. if ((0x01 << i) == bit)
  227. {
  228. return i;
  229. }
  230. }
  231. return -1;
  232. }
  233. rt_inline const struct pin_irq_map *get_pin_irq_map(rt_uint32_t pinbit)
  234. {
  235. rt_int32_t map_index = bit2bitno(pinbit);
  236. if (map_index < 0 || map_index >= ITEM_NUM(pin_irq_map))
  237. {
  238. return RT_NULL;
  239. }
  240. return &pin_irq_map[map_index];
  241. };
  242. rt_err_t gd32_pin_attach_irq(struct rt_device *device, rt_int32_t pin,
  243. rt_uint32_t mode, void (*hdr)(void *args), void *args)
  244. {
  245. const struct pin_index *index = RT_NULL;
  246. rt_base_t level;
  247. rt_int32_t hdr_index = -1;
  248. index = get_pin(pin);
  249. if (index == RT_NULL)
  250. {
  251. return RT_EINVAL;
  252. }
  253. hdr_index = bit2bitno(index->pin);
  254. if (hdr_index < 0 || hdr_index >= ITEM_NUM(pin_irq_map))
  255. {
  256. return RT_EINVAL;
  257. }
  258. level = rt_hw_interrupt_disable();
  259. if (pin_irq_hdr_tab[hdr_index].pin == pin &&
  260. pin_irq_hdr_tab[hdr_index].hdr == hdr &&
  261. pin_irq_hdr_tab[hdr_index].mode == mode &&
  262. pin_irq_hdr_tab[hdr_index].args == args)
  263. {
  264. rt_hw_interrupt_enable(level);
  265. return RT_EOK;
  266. }
  267. if (pin_irq_hdr_tab[hdr_index].pin != -1)
  268. {
  269. rt_hw_interrupt_enable(level);
  270. return RT_EFULL;
  271. }
  272. pin_irq_hdr_tab[hdr_index].pin = pin;
  273. pin_irq_hdr_tab[hdr_index].hdr = hdr;
  274. pin_irq_hdr_tab[hdr_index].mode = mode;
  275. pin_irq_hdr_tab[hdr_index].args = args;
  276. rt_hw_interrupt_enable(level);
  277. return RT_EOK;
  278. }
  279. rt_err_t gd32_pin_detach_irq(struct rt_device *device, rt_int32_t pin)
  280. {
  281. const struct pin_index *index = RT_NULL;
  282. rt_base_t level;
  283. rt_int32_t hdr_index = -1;
  284. index = get_pin(pin);
  285. if (index == RT_NULL)
  286. {
  287. return RT_EINVAL;
  288. }
  289. hdr_index = bit2bitno(index->pin);
  290. if (hdr_index < 0 || hdr_index >= ITEM_NUM(pin_irq_map))
  291. {
  292. return RT_EINVAL;
  293. }
  294. level = rt_hw_interrupt_disable();
  295. if (pin_irq_hdr_tab[hdr_index].pin == -1)
  296. {
  297. rt_hw_interrupt_enable(level);
  298. return RT_EOK;
  299. }
  300. pin_irq_hdr_tab[hdr_index].pin = -1;
  301. pin_irq_hdr_tab[hdr_index].hdr = RT_NULL;
  302. pin_irq_hdr_tab[hdr_index].mode = 0;
  303. pin_irq_hdr_tab[hdr_index].args = RT_NULL;
  304. rt_hw_interrupt_enable(level);
  305. return RT_EOK;
  306. }
  307. rt_err_t gd32_pin_irq_enable(struct rt_device *device, rt_base_t pin, rt_uint32_t enabled)
  308. {
  309. const struct pin_index *index;
  310. const struct pin_irq_map *irqmap;
  311. rt_base_t level;
  312. rt_int32_t hdr_index = -1;
  313. exti_trig_type_enum trigger_mode;
  314. index = get_pin(pin);
  315. if (index == RT_NULL)
  316. {
  317. return RT_EINVAL;
  318. }
  319. if (enabled == PIN_IRQ_ENABLE)
  320. {
  321. hdr_index = bit2bitno(index->pin);
  322. if (hdr_index < 0 || hdr_index >= ITEM_NUM(pin_irq_map))
  323. {
  324. return RT_EINVAL;
  325. }
  326. level = rt_hw_interrupt_disable();
  327. if (pin_irq_hdr_tab[hdr_index].pin == -1)
  328. {
  329. rt_hw_interrupt_enable(level);
  330. return RT_EINVAL;
  331. }
  332. irqmap = &pin_irq_map[hdr_index];
  333. switch (pin_irq_hdr_tab[hdr_index].mode)
  334. {
  335. case PIN_IRQ_MODE_RISING:
  336. trigger_mode = EXTI_TRIG_RISING;
  337. break;
  338. case PIN_IRQ_MODE_FALLING:
  339. trigger_mode = EXTI_TRIG_FALLING;
  340. break;
  341. case PIN_IRQ_MODE_RISING_FALLING:
  342. trigger_mode = EXTI_TRIG_BOTH;
  343. break;
  344. default:
  345. rt_hw_interrupt_enable(level);
  346. return RT_EINVAL;
  347. }
  348. rcu_periph_clock_enable(RCU_CFGCMP);
  349. /* enable and set interrupt priority */
  350. nvic_irq_enable(irqmap->irqno, 5U, 0U);
  351. /* connect EXTI line to GPIO pin */
  352. syscfg_exti_line_config(index->port_src, index->pin_src);
  353. /* configure EXTI line */
  354. exti_init((exti_line_enum)(index->pin), EXTI_INTERRUPT, trigger_mode);
  355. exti_interrupt_flag_clear((exti_line_enum)(index->pin));
  356. rt_hw_interrupt_enable(level);
  357. }
  358. else if (enabled == PIN_IRQ_DISABLE)
  359. {
  360. irqmap = get_pin_irq_map(index->pin);
  361. if (irqmap == RT_NULL)
  362. {
  363. return RT_EINVAL;
  364. }
  365. nvic_irq_disable(irqmap->irqno);
  366. }
  367. else
  368. {
  369. return RT_EINVAL;
  370. }
  371. return RT_EOK;
  372. }
  373. const static struct rt_pin_ops gd32_pin_ops =
  374. {
  375. gd32_pin_mode,
  376. gd32_pin_write,
  377. gd32_pin_read,
  378. gd32_pin_attach_irq,
  379. gd32_pin_detach_irq,
  380. gd32_pin_irq_enable,
  381. RT_NULL,
  382. };
  383. rt_inline void pin_irq_hdr(int irqno)
  384. {
  385. if (pin_irq_hdr_tab[irqno].hdr)
  386. {
  387. pin_irq_hdr_tab[irqno].hdr(pin_irq_hdr_tab[irqno].args);
  388. }
  389. }
  390. void GD32_GPIO_EXTI_IRQHandler(rt_int8_t exti_line)
  391. {
  392. if(RESET != exti_interrupt_flag_get((exti_line_enum)(1 << exti_line)))
  393. {
  394. pin_irq_hdr(exti_line);
  395. exti_interrupt_flag_clear((exti_line_enum)(1 << exti_line));
  396. }
  397. }
  398. void EXTI0_1_IRQHandler(void)
  399. {
  400. rt_interrupt_enter();
  401. GD32_GPIO_EXTI_IRQHandler(0);
  402. GD32_GPIO_EXTI_IRQHandler(1);
  403. rt_interrupt_leave();
  404. }
  405. void EXTI2_3_IRQHandler(void)
  406. {
  407. rt_interrupt_enter();
  408. GD32_GPIO_EXTI_IRQHandler(2);
  409. GD32_GPIO_EXTI_IRQHandler(3);
  410. rt_interrupt_leave();
  411. }
  412. void EXTI4_15_IRQHandler(void)
  413. {
  414. rt_interrupt_enter();
  415. GD32_GPIO_EXTI_IRQHandler(4);
  416. GD32_GPIO_EXTI_IRQHandler(5);
  417. GD32_GPIO_EXTI_IRQHandler(6);
  418. GD32_GPIO_EXTI_IRQHandler(7);
  419. GD32_GPIO_EXTI_IRQHandler(8);
  420. GD32_GPIO_EXTI_IRQHandler(9);
  421. GD32_GPIO_EXTI_IRQHandler(10);
  422. GD32_GPIO_EXTI_IRQHandler(11);
  423. GD32_GPIO_EXTI_IRQHandler(12);
  424. GD32_GPIO_EXTI_IRQHandler(13);
  425. GD32_GPIO_EXTI_IRQHandler(14);
  426. GD32_GPIO_EXTI_IRQHandler(15);
  427. rt_interrupt_leave();
  428. }
  429. int rt_hw_pin_init(void)
  430. {
  431. int result;
  432. result = rt_device_pin_register("pin", &gd32_pin_ops, RT_NULL);
  433. return result;
  434. }
  435. INIT_BOARD_EXPORT(rt_hw_pin_init);
  436. #endif