drv_gpio.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563
  1. /*
  2. * Copyright (C) 2018 Shanghai Eastsoft Microelectronics Co., Ltd.
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2020-01-14 wangyq the first version
  9. */
  10. #include <rthw.h>
  11. #include <rtdevice.h>
  12. #include "board.h"
  13. #include "drv_gpio.h"
  14. #include <ald_cmu.h>
  15. #include <ald_gpio.h>
  16. #ifdef RT_USING_PIN
  17. #define __ES32F0_PIN(index, gpio, gpio_index) {index, GPIO##gpio, GPIO_PIN_##gpio_index}
  18. #define __ES32F0_PIN_DEFAULT {-1, 0, 0}
  19. /* ES32F0 GPIO driver */
  20. struct pin_index
  21. {
  22. int index;
  23. GPIO_TypeDef *gpio;
  24. uint32_t pin;
  25. };
  26. static const struct pin_index pins[] =
  27. {
  28. __ES32F0_PIN_DEFAULT,
  29. __ES32F0_PIN_DEFAULT,
  30. __ES32F0_PIN(2, C, 13),
  31. __ES32F0_PIN(3, C, 14),
  32. __ES32F0_PIN(4, C, 15),
  33. __ES32F0_PIN(5, H, 0),
  34. __ES32F0_PIN(6, H, 1),
  35. __ES32F0_PIN_DEFAULT,
  36. __ES32F0_PIN(8, C, 0),
  37. __ES32F0_PIN(9, C, 1),
  38. __ES32F0_PIN(10, C, 2),
  39. __ES32F0_PIN(11, C, 3),
  40. __ES32F0_PIN(12, H, 3),
  41. __ES32F0_PIN(13, H, 4),
  42. __ES32F0_PIN(14, A, 0),
  43. __ES32F0_PIN(15, A, 1),
  44. __ES32F0_PIN(16, A, 2),
  45. __ES32F0_PIN(17, A, 3),
  46. __ES32F0_PIN(18, F, 0),
  47. __ES32F0_PIN(19, F, 1),
  48. __ES32F0_PIN(20, A, 4),
  49. __ES32F0_PIN(21, A, 5),
  50. __ES32F0_PIN(22, A, 6),
  51. __ES32F0_PIN(23, A, 7),
  52. __ES32F0_PIN(24, C, 4),
  53. __ES32F0_PIN(25, C, 5),
  54. __ES32F0_PIN(26, B, 0),
  55. __ES32F0_PIN(27, B, 1),
  56. __ES32F0_PIN(28, B, 2),
  57. __ES32F0_PIN(29, B, 10),
  58. __ES32F0_PIN(30, B, 11),
  59. __ES32F0_PIN_DEFAULT,
  60. __ES32F0_PIN_DEFAULT,
  61. __ES32F0_PIN(33, B, 12),
  62. __ES32F0_PIN(34, B, 13),
  63. __ES32F0_PIN(35, B, 14),
  64. __ES32F0_PIN(36, B, 15),
  65. __ES32F0_PIN(37, C, 6),
  66. __ES32F0_PIN(38, C, 7),
  67. __ES32F0_PIN(39, C, 8),
  68. __ES32F0_PIN_DEFAULT,
  69. __ES32F0_PIN_DEFAULT,
  70. __ES32F0_PIN_DEFAULT,
  71. __ES32F0_PIN_DEFAULT,
  72. __ES32F0_PIN_DEFAULT,
  73. __ES32F0_PIN_DEFAULT,
  74. __ES32F0_PIN(46, A, 13),
  75. __ES32F0_PIN_DEFAULT,
  76. __ES32F0_PIN_DEFAULT,
  77. __ES32F0_PIN(49, A, 14),
  78. __ES32F0_PIN(50, A, 15),
  79. __ES32F0_PIN(51, C, 10),
  80. __ES32F0_PIN(52, C, 11),
  81. __ES32F0_PIN(53, C, 12),
  82. __ES32F0_PIN(54, D, 2),
  83. __ES32F0_PIN(55, B, 3),
  84. __ES32F0_PIN(56, B, 4),
  85. __ES32F0_PIN(57, B, 5),
  86. __ES32F0_PIN(58, B, 6),
  87. __ES32F0_PIN(59, B, 7),
  88. __ES32F0_PIN(60, H, 2),
  89. __ES32F0_PIN(61, B, 8),
  90. __ES32F0_PIN(62, B, 9),
  91. __ES32F0_PIN_DEFAULT,
  92. __ES32F0_PIN_DEFAULT,
  93. };
  94. struct pin_irq_map
  95. {
  96. rt_uint16_t pinbit;
  97. IRQn_Type irqno;
  98. };
  99. static const struct pin_irq_map pin_irq_map[] =
  100. {
  101. {GPIO_PIN_0, EXTI0_IRQn},
  102. {GPIO_PIN_1, EXTI1_IRQn},
  103. {GPIO_PIN_2, EXTI2_IRQn},
  104. {GPIO_PIN_3, EXTI3_IRQn},
  105. {GPIO_PIN_4, EXTI4_IRQn},
  106. {GPIO_PIN_5, EXTI5_IRQn},
  107. {GPIO_PIN_6, EXTI6_IRQn},
  108. {GPIO_PIN_7, EXTI7_IRQn},
  109. {GPIO_PIN_8, EXTI8_IRQn},
  110. {GPIO_PIN_9, EXTI9_IRQn},
  111. {GPIO_PIN_10, EXTI10_IRQn},
  112. {GPIO_PIN_11, EXTI11_IRQn},
  113. {GPIO_PIN_12, EXTI12_IRQn},
  114. {GPIO_PIN_13, EXTI13_IRQn},
  115. {GPIO_PIN_14, EXTI14_IRQn},
  116. {GPIO_PIN_15, EXTI15_IRQn},
  117. };
  118. struct rt_pin_irq_hdr pin_irq_hdr_tab[] =
  119. {
  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. { -1, 0, RT_NULL, RT_NULL},
  133. { -1, 0, RT_NULL, RT_NULL},
  134. { -1, 0, RT_NULL, RT_NULL},
  135. { -1, 0, RT_NULL, RT_NULL},
  136. };
  137. #define ITEM_NUM(items) sizeof(items) / sizeof(items[0])
  138. const struct pin_index *get_pin(uint8_t pin)
  139. {
  140. const struct pin_index *index;
  141. if (pin < ITEM_NUM(pins))
  142. {
  143. index = &pins[pin];
  144. if (index->index == -1)
  145. index = RT_NULL;
  146. }
  147. else
  148. {
  149. index = RT_NULL;
  150. }
  151. return index;
  152. };
  153. void es32f3_pin_write(rt_device_t dev, rt_base_t pin, rt_base_t value)
  154. {
  155. const struct pin_index *index;
  156. index = get_pin(pin);
  157. if (index == RT_NULL)
  158. {
  159. return;
  160. }
  161. ald_gpio_write_pin(index->gpio, index->pin, value);
  162. }
  163. int es32f3_pin_read(rt_device_t dev, rt_base_t pin)
  164. {
  165. int value;
  166. const struct pin_index *index;
  167. value = PIN_LOW;
  168. index = get_pin(pin);
  169. if (index == RT_NULL)
  170. {
  171. return value;
  172. }
  173. value = ald_gpio_read_pin(index->gpio, index->pin);
  174. return value;
  175. }
  176. void es32f3_pin_mode(rt_device_t dev, rt_base_t pin, rt_base_t mode)
  177. {
  178. const struct pin_index *index;
  179. gpio_init_t gpio_initstruct;
  180. index = get_pin(pin);
  181. if (index == RT_NULL)
  182. {
  183. return;
  184. }
  185. /* Configure GPIO_InitStructure */
  186. gpio_initstruct.mode = GPIO_MODE_OUTPUT;
  187. gpio_initstruct.func = GPIO_FUNC_1;
  188. gpio_initstruct.podrv = GPIO_OUT_DRIVE_1;
  189. gpio_initstruct.nodrv = GPIO_OUT_DRIVE_0_1;
  190. gpio_initstruct.type = GPIO_TYPE_CMOS;
  191. gpio_initstruct.pupd = GPIO_FLOATING;
  192. gpio_initstruct.odos = GPIO_PUSH_PULL;
  193. if (mode == PIN_MODE_OUTPUT)
  194. {
  195. /* output setting */
  196. gpio_initstruct.mode = GPIO_MODE_OUTPUT;
  197. gpio_initstruct.pupd = GPIO_FLOATING;
  198. }
  199. else if (mode == PIN_MODE_INPUT)
  200. {
  201. /* input setting: not pull. */
  202. gpio_initstruct.mode = GPIO_MODE_INPUT;
  203. gpio_initstruct.pupd = GPIO_FLOATING;
  204. }
  205. else if (mode == PIN_MODE_INPUT_PULLUP)
  206. {
  207. /* input setting: pull up. */
  208. gpio_initstruct.mode = GPIO_MODE_INPUT;
  209. gpio_initstruct.pupd = GPIO_PUSH_UP;
  210. }
  211. else if (mode == PIN_MODE_INPUT_PULLDOWN)
  212. {
  213. /* input setting: pull down. */
  214. gpio_initstruct.mode = GPIO_MODE_INPUT;
  215. gpio_initstruct.pupd = GPIO_PUSH_DOWN;
  216. }
  217. else if (mode == PIN_MODE_OUTPUT_OD)
  218. {
  219. /* output setting: od. */
  220. gpio_initstruct.mode = GPIO_MODE_OUTPUT;
  221. gpio_initstruct.pupd = GPIO_FLOATING;
  222. gpio_initstruct.odos = GPIO_OPEN_DRAIN;
  223. }
  224. ald_gpio_init(index->gpio, index->pin, &gpio_initstruct);
  225. }
  226. rt_inline const struct pin_irq_map *get_pin_irq_map(rt_uint16_t gpio_pin)
  227. {
  228. rt_int32_t mapindex = gpio_pin & 0x00FF;
  229. if (mapindex < 0 || mapindex >= ITEM_NUM(pin_irq_map))
  230. {
  231. return RT_NULL;
  232. }
  233. return &pin_irq_map[mapindex];
  234. };
  235. rt_err_t es32f3_pin_attach_irq(struct rt_device *device, rt_int32_t pin,
  236. rt_uint32_t mode, void (*hdr)(void *args), void *args)
  237. {
  238. const struct pin_index *index;
  239. rt_base_t level;
  240. rt_int32_t irqindex;
  241. index = get_pin(pin);
  242. if (index == RT_NULL)
  243. {
  244. return RT_ENOSYS;
  245. }
  246. /* pin no. convert to dec no. */
  247. for (irqindex = 0; irqindex < 16; irqindex++)
  248. {
  249. if ((0x01 << irqindex) == index->pin)
  250. {
  251. break;
  252. }
  253. }
  254. if (irqindex < 0 || irqindex >= ITEM_NUM(pin_irq_map))
  255. {
  256. return RT_ENOSYS;
  257. }
  258. level = rt_hw_interrupt_disable();
  259. if (pin_irq_hdr_tab[irqindex].pin == pin &&
  260. pin_irq_hdr_tab[irqindex].hdr == hdr &&
  261. pin_irq_hdr_tab[irqindex].mode == mode &&
  262. pin_irq_hdr_tab[irqindex].args == args)
  263. {
  264. rt_hw_interrupt_enable(level);
  265. return RT_EOK;
  266. }
  267. if (pin_irq_hdr_tab[irqindex].pin != -1)
  268. {
  269. rt_hw_interrupt_enable(level);
  270. return RT_EBUSY;
  271. }
  272. pin_irq_hdr_tab[irqindex].pin = pin;
  273. pin_irq_hdr_tab[irqindex].hdr = hdr;
  274. pin_irq_hdr_tab[irqindex].mode = mode;
  275. pin_irq_hdr_tab[irqindex].args = args;
  276. rt_hw_interrupt_enable(level);
  277. return RT_EOK;
  278. }
  279. rt_err_t es32f3_pin_detach_irq(struct rt_device *device, rt_int32_t pin)
  280. {
  281. const struct pin_index *index;
  282. rt_base_t level;
  283. rt_int32_t irqindex = -1;
  284. index = get_pin(pin);
  285. if (index == RT_NULL)
  286. {
  287. return RT_ENOSYS;
  288. }
  289. irqindex = index->pin & 0x00FF;
  290. if (irqindex < 0 || irqindex >= ITEM_NUM(pin_irq_map))
  291. {
  292. return RT_ENOSYS;
  293. }
  294. level = rt_hw_interrupt_disable();
  295. if (pin_irq_hdr_tab[irqindex].pin == -1)
  296. {
  297. rt_hw_interrupt_enable(level);
  298. return RT_EOK;
  299. }
  300. pin_irq_hdr_tab[irqindex].pin = -1;
  301. pin_irq_hdr_tab[irqindex].hdr = RT_NULL;
  302. pin_irq_hdr_tab[irqindex].mode = 0;
  303. pin_irq_hdr_tab[irqindex].args = RT_NULL;
  304. rt_hw_interrupt_enable(level);
  305. return RT_EOK;
  306. }
  307. rt_err_t es32f3_pin_irq_enable(struct rt_device *device, rt_base_t pin,
  308. rt_uint32_t enabled)
  309. {
  310. const struct pin_index *index;
  311. const struct pin_irq_map *irqmap;
  312. rt_base_t level;
  313. rt_int32_t irqindex = -1;
  314. /* Configure GPIO_InitStructure & EXTI_InitStructure */
  315. gpio_init_t gpio_initstruct;
  316. exti_init_t exti_initstruct;
  317. exti_initstruct.filter = DISABLE;
  318. exti_initstruct.cks = EXTI_FILTER_CLOCK_10K;
  319. exti_initstruct.filter_time = 0x0;
  320. index = get_pin(pin);
  321. if (index == RT_NULL)
  322. {
  323. return RT_ENOSYS;
  324. }
  325. if (enabled == PIN_IRQ_ENABLE)
  326. {
  327. /* pin no. convert to dec no. */
  328. for (irqindex = 0; irqindex < 16; irqindex++)
  329. {
  330. if ((0x01 << irqindex) == index->pin)
  331. {
  332. break;
  333. }
  334. }
  335. if (irqindex < 0 || irqindex >= ITEM_NUM(pin_irq_map))
  336. {
  337. return RT_ENOSYS;
  338. }
  339. level = rt_hw_interrupt_disable();
  340. if (pin_irq_hdr_tab[irqindex].pin == -1)
  341. {
  342. rt_hw_interrupt_enable(level);
  343. return RT_ENOSYS;
  344. }
  345. irqmap = &pin_irq_map[irqindex];
  346. ald_gpio_exti_init(index->gpio, index->pin, &exti_initstruct);
  347. /* Configure GPIO_InitStructure */
  348. gpio_initstruct.mode = GPIO_MODE_INPUT;
  349. gpio_initstruct.func = GPIO_FUNC_1;
  350. switch (pin_irq_hdr_tab[irqindex].mode)
  351. {
  352. case PIN_IRQ_MODE_RISING:
  353. gpio_initstruct.pupd = GPIO_PUSH_DOWN;
  354. ald_gpio_exti_interrupt_config(index->pin, EXTI_TRIGGER_RISING_EDGE, ENABLE);
  355. break;
  356. case PIN_IRQ_MODE_FALLING:
  357. gpio_initstruct.pupd = GPIO_PUSH_UP;
  358. ald_gpio_exti_interrupt_config(index->pin, EXTI_TRIGGER_TRAILING_EDGE, ENABLE);
  359. break;
  360. case PIN_IRQ_MODE_RISING_FALLING:
  361. gpio_initstruct.pupd = GPIO_FLOATING;
  362. ald_gpio_exti_interrupt_config(index->pin, EXTI_TRIGGER_BOTH_EDGE, ENABLE);
  363. break;
  364. }
  365. ald_gpio_init(index->gpio, index->pin, &gpio_initstruct);
  366. NVIC_EnableIRQ(irqmap->irqno);
  367. rt_hw_interrupt_enable(level);
  368. }
  369. else if (enabled == PIN_IRQ_DISABLE)
  370. {
  371. irqmap = get_pin_irq_map(index->pin);
  372. if (irqmap == RT_NULL)
  373. {
  374. return RT_ENOSYS;
  375. }
  376. NVIC_DisableIRQ(irqmap->irqno);
  377. }
  378. else
  379. {
  380. return RT_ENOSYS;
  381. }
  382. return RT_EOK;
  383. }
  384. const static struct rt_pin_ops _es32f3_pin_ops =
  385. {
  386. es32f3_pin_mode,
  387. es32f3_pin_write,
  388. es32f3_pin_read,
  389. es32f3_pin_attach_irq,
  390. es32f3_pin_detach_irq,
  391. es32f3_pin_irq_enable,
  392. RT_NULL,
  393. };
  394. int rt_hw_pin_init(void)
  395. {
  396. int result;
  397. ald_cmu_perh_clock_config(CMU_PERH_GPIO, ENABLE);
  398. result = rt_device_pin_register("pin", &_es32f3_pin_ops, RT_NULL);
  399. return result;
  400. }
  401. INIT_BOARD_EXPORT(rt_hw_pin_init);
  402. rt_inline void pin_irq_hdr(uint16_t GPIO_Pin)
  403. {
  404. uint16_t irqno;
  405. /* pin no. convert to dec no. */
  406. for (irqno = 0; irqno < 16; irqno++)
  407. {
  408. if ((0x01 << irqno) == GPIO_Pin)
  409. {
  410. break;
  411. }
  412. }
  413. if (irqno == 16)
  414. return;
  415. if (pin_irq_hdr_tab[irqno].hdr)
  416. {
  417. pin_irq_hdr_tab[irqno].hdr(pin_irq_hdr_tab[irqno].args);
  418. }
  419. }
  420. void GPIO_EXTI_Callback(uint16_t GPIO_Pin)
  421. {
  422. if (ald_gpio_exti_get_flag_status(GPIO_Pin) != RESET)
  423. {
  424. ald_gpio_exti_clear_flag_status(GPIO_Pin);
  425. pin_irq_hdr(GPIO_Pin);
  426. }
  427. }
  428. void EXTI0_Handler(void)
  429. {
  430. rt_interrupt_enter();
  431. GPIO_EXTI_Callback(GPIO_PIN_0);
  432. rt_interrupt_leave();
  433. }
  434. void EXTI1_Handler(void)
  435. {
  436. rt_interrupt_enter();
  437. GPIO_EXTI_Callback(GPIO_PIN_1);
  438. rt_interrupt_leave();
  439. }
  440. void EXTI2_Handler(void)
  441. {
  442. rt_interrupt_enter();
  443. GPIO_EXTI_Callback(GPIO_PIN_2);
  444. rt_interrupt_leave();
  445. }
  446. void EXTI3_Handler(void)
  447. {
  448. rt_interrupt_enter();
  449. GPIO_EXTI_Callback(GPIO_PIN_3);
  450. rt_interrupt_leave();
  451. }
  452. void EXTI4_Handler(void)
  453. {
  454. rt_interrupt_enter();
  455. GPIO_EXTI_Callback(GPIO_PIN_4);
  456. rt_interrupt_leave();
  457. }
  458. void EXTI5_Handler(void)
  459. {
  460. rt_interrupt_enter();
  461. GPIO_EXTI_Callback(GPIO_PIN_5);
  462. rt_interrupt_leave();
  463. }
  464. void EXTI6_Handler(void)
  465. {
  466. rt_interrupt_enter();
  467. GPIO_EXTI_Callback(GPIO_PIN_6);
  468. rt_interrupt_leave();
  469. }
  470. void EXTI7_Handler(void)
  471. {
  472. rt_interrupt_enter();
  473. GPIO_EXTI_Callback(GPIO_PIN_7);
  474. rt_interrupt_leave();
  475. }
  476. void EXTI8_Handler(void)
  477. {
  478. rt_interrupt_enter();
  479. GPIO_EXTI_Callback(GPIO_PIN_8);
  480. rt_interrupt_leave();
  481. }
  482. void EXTI9_Handler(void)
  483. {
  484. rt_interrupt_enter();
  485. GPIO_EXTI_Callback(GPIO_PIN_9);
  486. rt_interrupt_leave();
  487. }
  488. void EXTI10_Handler(void)
  489. {
  490. rt_interrupt_enter();
  491. GPIO_EXTI_Callback(GPIO_PIN_10);
  492. rt_interrupt_leave();
  493. }
  494. void EXTI11_Handler(void)
  495. {
  496. rt_interrupt_enter();
  497. GPIO_EXTI_Callback(GPIO_PIN_11);
  498. rt_interrupt_leave();
  499. }
  500. void EXTI12_Handler(void)
  501. {
  502. rt_interrupt_enter();
  503. GPIO_EXTI_Callback(GPIO_PIN_12);
  504. rt_interrupt_leave();
  505. }
  506. void EXTI13_Handler(void)
  507. {
  508. rt_interrupt_enter();
  509. GPIO_EXTI_Callback(GPIO_PIN_13);
  510. rt_interrupt_leave();
  511. }
  512. void EXTI14_Handler(void)
  513. {
  514. rt_interrupt_enter();
  515. GPIO_EXTI_Callback(GPIO_PIN_14);
  516. rt_interrupt_leave();
  517. }
  518. void EXTI15_Handler(void)
  519. {
  520. rt_interrupt_enter();
  521. GPIO_EXTI_Callback(GPIO_PIN_15);
  522. rt_interrupt_leave();
  523. }
  524. #endif