drv_gpio.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489
  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. * 2019-01-23 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(40, C, 9),
  69. __ES32F0_PIN(41, A, 8),
  70. __ES32F0_PIN(42, A, 9),
  71. __ES32F0_PIN(43, A, 10),
  72. __ES32F0_PIN(44, A, 11),
  73. __ES32F0_PIN(45, A, 12),
  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_3_IRQn},
  102. {GPIO_PIN_1, EXTI0_3_IRQn},
  103. {GPIO_PIN_2, EXTI0_3_IRQn},
  104. {GPIO_PIN_3, EXTI0_3_IRQn},
  105. {GPIO_PIN_4, EXTI4_7_IRQn},
  106. {GPIO_PIN_5, EXTI4_7_IRQn},
  107. {GPIO_PIN_6, EXTI4_7_IRQn},
  108. {GPIO_PIN_7, EXTI4_7_IRQn},
  109. {GPIO_PIN_8, EXTI8_11_IRQn},
  110. {GPIO_PIN_9, EXTI8_11_IRQn},
  111. {GPIO_PIN_10, EXTI8_11_IRQn},
  112. {GPIO_PIN_11, EXTI8_11_IRQn},
  113. {GPIO_PIN_12, EXTI12_15_IRQn},
  114. {GPIO_PIN_13, EXTI12_15_IRQn},
  115. {GPIO_PIN_14, EXTI12_15_IRQn},
  116. {GPIO_PIN_15, EXTI12_15_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 es32f0_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. gpio_write_pin(index->gpio, index->pin, value);
  162. }
  163. int es32f0_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 = gpio_read_pin(index->gpio, index->pin);
  174. return value;
  175. }
  176. void es32f0_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.odrv = GPIO_OUT_DRIVE_NORMAL;
  189. gpio_initstruct.type = GPIO_TYPE_CMOS;
  190. gpio_initstruct.pupd = GPIO_FLOATING;
  191. gpio_initstruct.odos = GPIO_PUSH_PULL;
  192. if (mode == PIN_MODE_OUTPUT)
  193. {
  194. /* output setting */
  195. gpio_initstruct.mode = GPIO_MODE_OUTPUT;
  196. gpio_initstruct.pupd = GPIO_FLOATING;
  197. }
  198. else if (mode == PIN_MODE_INPUT)
  199. {
  200. /* input setting: not pull. */
  201. gpio_initstruct.mode = GPIO_MODE_INPUT;
  202. gpio_initstruct.pupd = GPIO_FLOATING;
  203. }
  204. else if (mode == PIN_MODE_INPUT_PULLUP)
  205. {
  206. /* input setting: pull up. */
  207. gpio_initstruct.mode = GPIO_MODE_INPUT;
  208. gpio_initstruct.pupd = GPIO_PUSH_UP;
  209. }
  210. else if (mode == PIN_MODE_INPUT_PULLDOWN)
  211. {
  212. /* input setting: pull down. */
  213. gpio_initstruct.mode = GPIO_MODE_INPUT;
  214. gpio_initstruct.pupd = GPIO_PUSH_DOWN;
  215. }
  216. else if (mode == PIN_MODE_OUTPUT_OD)
  217. {
  218. /* output setting: od. */
  219. gpio_initstruct.mode = GPIO_MODE_OUTPUT;
  220. gpio_initstruct.pupd = GPIO_FLOATING;
  221. gpio_initstruct.odos = GPIO_OPEN_DRAIN;
  222. }
  223. gpio_init(index->gpio, index->pin, &gpio_initstruct);
  224. }
  225. rt_inline const struct pin_irq_map *get_pin_irq_map(rt_uint16_t gpio_pin)
  226. {
  227. rt_int32_t mapindex = gpio_pin & 0x00FF;
  228. if (mapindex < 0 || mapindex >= ITEM_NUM(pin_irq_map))
  229. {
  230. return RT_NULL;
  231. }
  232. return &pin_irq_map[mapindex];
  233. };
  234. rt_err_t es32f0_pin_attach_irq(struct rt_device *device, rt_int32_t pin,
  235. rt_uint32_t mode, void (*hdr)(void *args), void *args)
  236. {
  237. const struct pin_index *index;
  238. rt_base_t level;
  239. rt_int32_t irqindex;
  240. index = get_pin(pin);
  241. if (index == RT_NULL)
  242. {
  243. return RT_ENOSYS;
  244. }
  245. /* pin no. convert to dec no. */
  246. for (irqindex = 0; irqindex < 16; irqindex++)
  247. {
  248. if ((0x01 << irqindex) == index->pin)
  249. {
  250. break;
  251. }
  252. }
  253. if (irqindex < 0 || irqindex >= ITEM_NUM(pin_irq_map))
  254. {
  255. return RT_ENOSYS;
  256. }
  257. level = rt_hw_interrupt_disable();
  258. if (pin_irq_hdr_tab[irqindex].pin == pin &&
  259. pin_irq_hdr_tab[irqindex].hdr == hdr &&
  260. pin_irq_hdr_tab[irqindex].mode == mode &&
  261. pin_irq_hdr_tab[irqindex].args == args)
  262. {
  263. rt_hw_interrupt_enable(level);
  264. return RT_EOK;
  265. }
  266. if (pin_irq_hdr_tab[irqindex].pin != -1)
  267. {
  268. rt_hw_interrupt_enable(level);
  269. return RT_EBUSY;
  270. }
  271. pin_irq_hdr_tab[irqindex].pin = pin;
  272. pin_irq_hdr_tab[irqindex].hdr = hdr;
  273. pin_irq_hdr_tab[irqindex].mode = mode;
  274. pin_irq_hdr_tab[irqindex].args = args;
  275. rt_hw_interrupt_enable(level);
  276. return RT_EOK;
  277. }
  278. rt_err_t es32f0_pin_detach_irq(struct rt_device *device, rt_int32_t pin)
  279. {
  280. const struct pin_index *index;
  281. rt_base_t level;
  282. rt_int32_t irqindex = -1;
  283. index = get_pin(pin);
  284. if (index == RT_NULL)
  285. {
  286. return RT_ENOSYS;
  287. }
  288. irqindex = index->pin & 0x00FF;
  289. if (irqindex < 0 || irqindex >= ITEM_NUM(pin_irq_map))
  290. {
  291. return RT_ENOSYS;
  292. }
  293. level = rt_hw_interrupt_disable();
  294. if (pin_irq_hdr_tab[irqindex].pin == -1)
  295. {
  296. rt_hw_interrupt_enable(level);
  297. return RT_EOK;
  298. }
  299. pin_irq_hdr_tab[irqindex].pin = -1;
  300. pin_irq_hdr_tab[irqindex].hdr = RT_NULL;
  301. pin_irq_hdr_tab[irqindex].mode = 0;
  302. pin_irq_hdr_tab[irqindex].args = RT_NULL;
  303. rt_hw_interrupt_enable(level);
  304. return RT_EOK;
  305. }
  306. rt_err_t es32f0_pin_irq_enable(struct rt_device *device, rt_base_t pin,
  307. 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 irqindex = -1;
  313. /* Configure GPIO_InitStructure & EXTI_InitStructure */
  314. gpio_init_t gpio_initstruct;
  315. exti_init_t exti_initstruct;
  316. exti_initstruct.filter = DISABLE;
  317. exti_initstruct.cks = EXTI_FILTER_CLOCK_10K;
  318. exti_initstruct.filter_time = 0x0;
  319. index = get_pin(pin);
  320. if (index == RT_NULL)
  321. {
  322. return RT_ENOSYS;
  323. }
  324. if (enabled == PIN_IRQ_ENABLE)
  325. {
  326. /* pin no. convert to dec no. */
  327. for (irqindex = 0; irqindex < 16; irqindex++)
  328. {
  329. if ((0x01 << irqindex) == index->pin)
  330. {
  331. break;
  332. }
  333. }
  334. if (irqindex < 0 || irqindex >= ITEM_NUM(pin_irq_map))
  335. {
  336. return RT_ENOSYS;
  337. }
  338. level = rt_hw_interrupt_disable();
  339. if (pin_irq_hdr_tab[irqindex].pin == -1)
  340. {
  341. rt_hw_interrupt_enable(level);
  342. return RT_ENOSYS;
  343. }
  344. irqmap = &pin_irq_map[irqindex];
  345. gpio_exti_init(index->gpio, index->pin, &exti_initstruct);
  346. /* Configure GPIO_InitStructure */
  347. gpio_initstruct.mode = GPIO_MODE_INPUT;
  348. gpio_initstruct.func = GPIO_FUNC_1;
  349. switch (pin_irq_hdr_tab[irqindex].mode)
  350. {
  351. case PIN_IRQ_MODE_RISING:
  352. gpio_initstruct.pupd = GPIO_PUSH_DOWN;
  353. gpio_exti_interrupt_config(index->pin, EXTI_TRIGGER_RISING_EDGE, ENABLE);
  354. break;
  355. case PIN_IRQ_MODE_FALLING:
  356. gpio_initstruct.pupd = GPIO_PUSH_UP;
  357. gpio_exti_interrupt_config(index->pin, EXTI_TRIGGER_TRAILING_EDGE, ENABLE);
  358. break;
  359. case PIN_IRQ_MODE_RISING_FALLING:
  360. gpio_initstruct.pupd = GPIO_FLOATING;
  361. gpio_exti_interrupt_config(index->pin, EXTI_TRIGGER_BOTH_EDGE, ENABLE);
  362. break;
  363. }
  364. gpio_init(index->gpio, index->pin, &gpio_initstruct);
  365. NVIC_EnableIRQ(irqmap->irqno);
  366. rt_hw_interrupt_enable(level);
  367. }
  368. else if (enabled == PIN_IRQ_DISABLE)
  369. {
  370. irqmap = get_pin_irq_map(index->pin);
  371. if (irqmap == RT_NULL)
  372. {
  373. return RT_ENOSYS;
  374. }
  375. NVIC_DisableIRQ(irqmap->irqno);
  376. }
  377. else
  378. {
  379. return RT_ENOSYS;
  380. }
  381. return RT_EOK;
  382. }
  383. const static struct rt_pin_ops _es32f0_pin_ops =
  384. {
  385. es32f0_pin_mode,
  386. es32f0_pin_write,
  387. es32f0_pin_read,
  388. es32f0_pin_attach_irq,
  389. es32f0_pin_detach_irq,
  390. es32f0_pin_irq_enable,
  391. };
  392. int rt_hw_pin_init(void)
  393. {
  394. int result;
  395. cmu_perh_clock_config(CMU_PERH_GPIO, ENABLE);
  396. result = rt_device_pin_register("pin", &_es32f0_pin_ops, RT_NULL);
  397. return result;
  398. }
  399. INIT_BOARD_EXPORT(rt_hw_pin_init);
  400. rt_inline void pin_irq_hdr(uint16_t GPIO_Pin)
  401. {
  402. uint16_t irqno;
  403. /* pin no. convert to dec no. */
  404. for (irqno = 0; irqno < 16; irqno++)
  405. {
  406. if ((0x01 << irqno) == GPIO_Pin)
  407. {
  408. break;
  409. }
  410. }
  411. if (irqno == 16)
  412. return;
  413. if (pin_irq_hdr_tab[irqno].hdr)
  414. {
  415. pin_irq_hdr_tab[irqno].hdr(pin_irq_hdr_tab[irqno].args);
  416. }
  417. }
  418. void GPIO_EXTI_Callback(uint16_t GPIO_Pin)
  419. {
  420. if (gpio_exti_get_flag_status(GPIO_Pin) != RESET)
  421. {
  422. gpio_exti_clear_flag_status(GPIO_Pin);
  423. pin_irq_hdr(GPIO_Pin);
  424. }
  425. }
  426. void EXTI0_3_Handler(void)
  427. {
  428. rt_interrupt_enter();
  429. GPIO_EXTI_Callback(GPIO_PIN_0);
  430. GPIO_EXTI_Callback(GPIO_PIN_1);
  431. GPIO_EXTI_Callback(GPIO_PIN_2);
  432. GPIO_EXTI_Callback(GPIO_PIN_3);
  433. rt_interrupt_leave();
  434. }
  435. void EXTI4_7_Handler(void)
  436. {
  437. rt_interrupt_enter();
  438. GPIO_EXTI_Callback(GPIO_PIN_4);
  439. GPIO_EXTI_Callback(GPIO_PIN_5);
  440. GPIO_EXTI_Callback(GPIO_PIN_6);
  441. GPIO_EXTI_Callback(GPIO_PIN_7);
  442. rt_interrupt_leave();
  443. }
  444. void EXTI8_11_Handler(void)
  445. {
  446. rt_interrupt_enter();
  447. GPIO_EXTI_Callback(GPIO_PIN_8);
  448. GPIO_EXTI_Callback(GPIO_PIN_9);
  449. GPIO_EXTI_Callback(GPIO_PIN_10);
  450. GPIO_EXTI_Callback(GPIO_PIN_11);
  451. rt_interrupt_leave();
  452. }
  453. void EXTI12_15_Handler(void)
  454. {
  455. rt_interrupt_enter();
  456. GPIO_EXTI_Callback(GPIO_PIN_12);
  457. GPIO_EXTI_Callback(GPIO_PIN_13);
  458. GPIO_EXTI_Callback(GPIO_PIN_14);
  459. GPIO_EXTI_Callback(GPIO_PIN_15);
  460. rt_interrupt_leave();
  461. }
  462. #endif