drv_gpio.c 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738
  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. * 2022-05-16 shelton first version
  9. * 2023-01-31 shelton add support f421/f425
  10. * 2023-04-08 shelton add support f423
  11. * 2023-10-18 shelton add support f402/f405
  12. * 2024-04-12 shelton add support a403a and a423
  13. * 2024-08-30 shelton add support m412 and m416
  14. */
  15. #include "drv_common.h"
  16. #include "drv_gpio.h"
  17. #ifdef RT_USING_PIN
  18. #define PIN_NUM(port, no) (((((port) & 0xFu) << 4) | ((no) & 0xFu)))
  19. #define PIN_PORT(pin) ((uint8_t)(((pin) >> 4) & 0xFu))
  20. #define PIN_NO(pin) ((uint8_t)((pin) & 0xFu))
  21. #if defined (SOC_SERIES_AT32F435) || defined (SOC_SERIES_AT32F437) || \
  22. defined (SOC_SERIES_AT32F421) || defined (SOC_SERIES_AT32F425) || \
  23. defined (SOC_SERIES_AT32F423) || defined (SOC_SERIES_AT32F402) || \
  24. defined (SOC_SERIES_AT32F405) || defined (SOC_SERIES_AT32A423) || \
  25. defined (SOC_SERIES_AT32M412) || defined (SOC_SERIES_AT32M416)
  26. #define PIN_ATPORTSOURCE(pin) (scfg_port_source_type)((uint8_t)(((pin) & 0xF0u) >> 4))
  27. #define PIN_ATPINSOURCE(pin) (scfg_pins_source_type)((uint8_t)((pin) & 0xFu))
  28. #else
  29. #define PIN_ATPORTSOURCE(pin) (gpio_port_source_type)((uint8_t)(((pin) & 0xF0u) >> 4))
  30. #define PIN_ATPINSOURCE(pin) (gpio_pins_source_type)((uint8_t)((pin) & 0xFu))
  31. #endif
  32. #define PIN_ATPORT(pin) ((gpio_type *)(GPIOA_BASE + (0x400u * PIN_PORT(pin))))
  33. #define PIN_ATPIN(pin) ((uint16_t)(1u << PIN_NO(pin)))
  34. #if defined(GPIOZ)
  35. #define __AT32_PORT_MAX 12u
  36. #elif defined(GPIOK)
  37. #define __AT32_PORT_MAX 11u
  38. #elif defined(GPIOJ)
  39. #define __AT32_PORT_MAX 10u
  40. #elif defined(GPIOI)
  41. #define __AT32_PORT_MAX 9u
  42. #elif defined(GPIOH)
  43. #define __AT32_PORT_MAX 8u
  44. #elif defined(GPIOG)
  45. #define __AT32_PORT_MAX 7u
  46. #elif defined(GPIOF)
  47. #define __AT32_PORT_MAX 6u
  48. #elif defined(GPIOE)
  49. #define __AT32_PORT_MAX 5u
  50. #elif defined(GPIOD)
  51. #define __AT32_PORT_MAX 4u
  52. #elif defined(GPIOC)
  53. #define __AT32_PORT_MAX 3u
  54. #elif defined(GPIOB)
  55. #define __AT32_PORT_MAX 2u
  56. #elif defined(GPIOA)
  57. #define __AT32_PORT_MAX 1u
  58. #else
  59. #define __AT32_PORT_MAX 0u
  60. #error Unsupported AT32 GPIO peripheral.
  61. #endif
  62. #define PIN_ATPORT_MAX __AT32_PORT_MAX
  63. #if defined (SOC_SERIES_AT32F421) || defined (SOC_SERIES_AT32F425)
  64. static const struct pin_irq_map pin_irq_map[] =
  65. {
  66. {GPIO_PINS_0, EXINT_LINE_0, EXINT1_0_IRQn},
  67. {GPIO_PINS_1, EXINT_LINE_1, EXINT1_0_IRQn},
  68. {GPIO_PINS_2, EXINT_LINE_2, EXINT3_2_IRQn},
  69. {GPIO_PINS_3, EXINT_LINE_3, EXINT3_2_IRQn},
  70. {GPIO_PINS_4, EXINT_LINE_4, EXINT15_4_IRQn},
  71. {GPIO_PINS_5, EXINT_LINE_5, EXINT15_4_IRQn},
  72. {GPIO_PINS_6, EXINT_LINE_6, EXINT15_4_IRQn},
  73. {GPIO_PINS_7, EXINT_LINE_7, EXINT15_4_IRQn},
  74. {GPIO_PINS_8, EXINT_LINE_8, EXINT15_4_IRQn},
  75. {GPIO_PINS_9, EXINT_LINE_9, EXINT15_4_IRQn},
  76. {GPIO_PINS_10, EXINT_LINE_10, EXINT15_4_IRQn},
  77. {GPIO_PINS_11, EXINT_LINE_11, EXINT15_4_IRQn},
  78. {GPIO_PINS_12, EXINT_LINE_12, EXINT15_4_IRQn},
  79. {GPIO_PINS_13, EXINT_LINE_13, EXINT15_4_IRQn},
  80. {GPIO_PINS_14, EXINT_LINE_14, EXINT15_4_IRQn},
  81. {GPIO_PINS_15, EXINT_LINE_15, EXINT15_4_IRQn},
  82. };
  83. #else
  84. static const struct pin_irq_map pin_irq_map[] =
  85. {
  86. {GPIO_PINS_0, EXINT_LINE_0, EXINT0_IRQn},
  87. {GPIO_PINS_1, EXINT_LINE_1, EXINT1_IRQn},
  88. {GPIO_PINS_2, EXINT_LINE_2, EXINT2_IRQn},
  89. {GPIO_PINS_3, EXINT_LINE_3, EXINT3_IRQn},
  90. {GPIO_PINS_4, EXINT_LINE_4, EXINT4_IRQn},
  91. {GPIO_PINS_5, EXINT_LINE_5, EXINT9_5_IRQn},
  92. {GPIO_PINS_6, EXINT_LINE_6, EXINT9_5_IRQn},
  93. {GPIO_PINS_7, EXINT_LINE_7, EXINT9_5_IRQn},
  94. {GPIO_PINS_8, EXINT_LINE_8, EXINT9_5_IRQn},
  95. {GPIO_PINS_9, EXINT_LINE_9, EXINT9_5_IRQn},
  96. {GPIO_PINS_10, EXINT_LINE_10, EXINT15_10_IRQn},
  97. {GPIO_PINS_11, EXINT_LINE_11, EXINT15_10_IRQn},
  98. {GPIO_PINS_12, EXINT_LINE_12, EXINT15_10_IRQn},
  99. {GPIO_PINS_13, EXINT_LINE_13, EXINT15_10_IRQn},
  100. {GPIO_PINS_14, EXINT_LINE_14, EXINT15_10_IRQn},
  101. {GPIO_PINS_15, EXINT_LINE_15, EXINT15_10_IRQn},
  102. };
  103. #endif
  104. static struct rt_pin_irq_hdr pin_irq_handler_tab[] =
  105. {
  106. {-1, 0, RT_NULL, RT_NULL},
  107. {-1, 0, RT_NULL, RT_NULL},
  108. {-1, 0, RT_NULL, RT_NULL},
  109. {-1, 0, RT_NULL, RT_NULL},
  110. {-1, 0, RT_NULL, RT_NULL},
  111. {-1, 0, RT_NULL, RT_NULL},
  112. {-1, 0, RT_NULL, RT_NULL},
  113. {-1, 0, RT_NULL, RT_NULL},
  114. {-1, 0, RT_NULL, RT_NULL},
  115. {-1, 0, RT_NULL, RT_NULL},
  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. };
  123. static uint32_t pin_irq_enable_mask = 0;
  124. #define ITEM_NUM(items) sizeof(items) / sizeof(items[0])
  125. static rt_base_t at32_pin_get(const char *name)
  126. {
  127. rt_base_t pin = 0;
  128. int hw_port_num, hw_pin_num = 0;
  129. int i, name_len;
  130. name_len = rt_strlen(name);
  131. if ((name_len < 4) || (name_len >= 6))
  132. {
  133. return -RT_EINVAL;
  134. }
  135. if ((name[0] != 'P') || (name[2] != '.'))
  136. {
  137. return -RT_EINVAL;
  138. }
  139. if ((name[1] >= 'A') && (name[1] <= 'Z'))
  140. {
  141. hw_port_num = (int)(name[1] - 'A');
  142. }
  143. else
  144. {
  145. return -RT_EINVAL;
  146. }
  147. for (i = 3; i < name_len; i++)
  148. {
  149. hw_pin_num *= 10;
  150. hw_pin_num += name[i] - '0';
  151. }
  152. pin = PIN_NUM(hw_port_num, hw_pin_num);
  153. return pin;
  154. }
  155. static void at32_pin_write(rt_device_t dev, rt_base_t pin, rt_uint8_t value)
  156. {
  157. gpio_type *gpio_port;
  158. uint16_t gpio_pin;
  159. if (PIN_PORT(pin) < PIN_ATPORT_MAX)
  160. {
  161. gpio_port = PIN_ATPORT(pin);
  162. gpio_pin = PIN_ATPIN(pin);
  163. }
  164. else
  165. {
  166. return;
  167. }
  168. gpio_bits_write(gpio_port, gpio_pin, (confirm_state)value);
  169. }
  170. static rt_ssize_t at32_pin_read(rt_device_t dev, rt_base_t pin)
  171. {
  172. gpio_type *gpio_port;
  173. uint16_t gpio_pin;
  174. int value;
  175. value = PIN_LOW;
  176. if (PIN_PORT(pin) < PIN_ATPORT_MAX)
  177. {
  178. gpio_port = PIN_ATPORT(pin);
  179. gpio_pin = PIN_ATPIN(pin);
  180. value = gpio_input_data_bit_read(gpio_port, gpio_pin);
  181. }
  182. else
  183. {
  184. return -RT_EINVAL;
  185. }
  186. return value;
  187. }
  188. static void at32_pin_mode(rt_device_t dev, rt_base_t pin, rt_uint8_t mode)
  189. {
  190. gpio_init_type gpio_init_struct;
  191. gpio_type *gpio_port;
  192. uint16_t gpio_pin;
  193. if (PIN_PORT(pin) < PIN_ATPORT_MAX)
  194. {
  195. gpio_port = PIN_ATPORT(pin);
  196. gpio_pin = PIN_ATPIN(pin);
  197. }
  198. else
  199. {
  200. return;
  201. }
  202. /* configure gpio_init_struct */
  203. gpio_default_para_init(&gpio_init_struct);
  204. gpio_init_struct.gpio_pins = gpio_pin;
  205. gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;
  206. gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
  207. gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
  208. gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  209. if (mode == PIN_MODE_OUTPUT)
  210. {
  211. /* output setting */
  212. gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;
  213. gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
  214. gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
  215. }
  216. else if (mode == PIN_MODE_INPUT)
  217. {
  218. /* input setting: not pull. */
  219. gpio_init_struct.gpio_mode = GPIO_MODE_INPUT;
  220. gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
  221. }
  222. else if (mode == PIN_MODE_INPUT_PULLUP)
  223. {
  224. /* input setting: pull up. */
  225. gpio_init_struct.gpio_mode = GPIO_MODE_INPUT;
  226. gpio_init_struct.gpio_pull = GPIO_PULL_UP;
  227. }
  228. else if (mode == PIN_MODE_INPUT_PULLDOWN)
  229. {
  230. /* input setting: pull down. */
  231. gpio_init_struct.gpio_mode = GPIO_MODE_INPUT;
  232. gpio_init_struct.gpio_pull = GPIO_PULL_DOWN;
  233. }
  234. else if (mode == PIN_MODE_OUTPUT_OD)
  235. {
  236. /* output setting: od. */
  237. gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;
  238. gpio_init_struct.gpio_out_type = GPIO_OUTPUT_OPEN_DRAIN;
  239. }
  240. gpio_init(gpio_port, &gpio_init_struct);
  241. }
  242. rt_inline rt_int32_t bit2bitno(rt_uint32_t bit)
  243. {
  244. rt_int32_t i;
  245. for (i = 0; i < 32; i++)
  246. {
  247. if (((rt_uint32_t)0x01 << i) == bit)
  248. {
  249. return i;
  250. }
  251. }
  252. return -1;
  253. }
  254. rt_inline const struct pin_irq_map *get_pin_irq_map(uint32_t pinbit)
  255. {
  256. rt_int32_t mapindex = bit2bitno(pinbit);
  257. if (mapindex < 0 || mapindex >= ITEM_NUM(pin_irq_map))
  258. {
  259. return RT_NULL;
  260. }
  261. return &pin_irq_map[mapindex];
  262. };
  263. static rt_err_t at32_pin_attach_irq(struct rt_device *device, rt_base_t pin,
  264. rt_uint8_t mode, void (*hdr)(void *args), void *args)
  265. {
  266. uint16_t gpio_pin;
  267. rt_base_t level;
  268. rt_int32_t irqindex = -1;
  269. if (PIN_PORT(pin) < PIN_ATPORT_MAX)
  270. {
  271. gpio_pin = PIN_ATPIN(pin);
  272. }
  273. else
  274. {
  275. return -RT_EINVAL;
  276. }
  277. irqindex = bit2bitno(gpio_pin);
  278. if (irqindex < 0 || irqindex >= ITEM_NUM(pin_irq_map))
  279. {
  280. return -RT_EINVAL;
  281. }
  282. level = rt_hw_interrupt_disable();
  283. if (pin_irq_handler_tab[irqindex].pin == pin &&
  284. pin_irq_handler_tab[irqindex].hdr == hdr &&
  285. pin_irq_handler_tab[irqindex].mode == mode &&
  286. pin_irq_handler_tab[irqindex].args == args)
  287. {
  288. rt_hw_interrupt_enable(level);
  289. return RT_EOK;
  290. }
  291. if (pin_irq_handler_tab[irqindex].pin != -1)
  292. {
  293. rt_hw_interrupt_enable(level);
  294. return -RT_EBUSY;
  295. }
  296. pin_irq_handler_tab[irqindex].pin = pin;
  297. pin_irq_handler_tab[irqindex].hdr = hdr;
  298. pin_irq_handler_tab[irqindex].mode = mode;
  299. pin_irq_handler_tab[irqindex].args = args;
  300. rt_hw_interrupt_enable(level);
  301. return RT_EOK;
  302. }
  303. static rt_err_t at32_pin_dettach_irq(struct rt_device *device, rt_base_t pin)
  304. {
  305. uint16_t gpio_pin;
  306. rt_base_t level;
  307. rt_int32_t irqindex = -1;
  308. if (PIN_PORT(pin) < PIN_ATPORT_MAX)
  309. {
  310. gpio_pin = PIN_ATPIN(pin);
  311. }
  312. else
  313. {
  314. return -RT_EINVAL;
  315. }
  316. irqindex = bit2bitno(gpio_pin);
  317. if (irqindex < 0 || irqindex >= ITEM_NUM(pin_irq_map))
  318. {
  319. return -RT_EINVAL;
  320. }
  321. level = rt_hw_interrupt_disable();
  322. if (pin_irq_handler_tab[irqindex].pin == -1)
  323. {
  324. rt_hw_interrupt_enable(level);
  325. return RT_EOK;
  326. }
  327. pin_irq_handler_tab[irqindex].pin = -1;
  328. pin_irq_handler_tab[irqindex].hdr = RT_NULL;
  329. pin_irq_handler_tab[irqindex].mode = 0;
  330. pin_irq_handler_tab[irqindex].args = RT_NULL;
  331. rt_hw_interrupt_enable(level);
  332. return RT_EOK;
  333. }
  334. static rt_err_t at32_pin_irq_enable(struct rt_device *device, rt_base_t pin,
  335. rt_uint8_t enabled)
  336. {
  337. gpio_init_type gpio_init_struct;
  338. exint_init_type exint_init_struct;
  339. gpio_type *gpio_port;
  340. IRQn_Type irqn;
  341. uint16_t gpio_pin;
  342. const struct pin_irq_map *irqmap;
  343. rt_base_t level;
  344. rt_int32_t irqindex = -1;
  345. if (PIN_PORT(pin) < PIN_ATPORT_MAX)
  346. {
  347. gpio_port = PIN_ATPORT(pin);
  348. gpio_pin = PIN_ATPIN(pin);
  349. }
  350. else
  351. {
  352. return -RT_EINVAL;
  353. }
  354. if (enabled == PIN_IRQ_ENABLE)
  355. {
  356. irqindex = bit2bitno(gpio_pin);
  357. if (irqindex < 0 || irqindex >= ITEM_NUM(pin_irq_map))
  358. {
  359. return -RT_EINVAL;
  360. }
  361. level = rt_hw_interrupt_disable();
  362. if (pin_irq_handler_tab[irqindex].pin == -1)
  363. {
  364. rt_hw_interrupt_enable(level);
  365. return -RT_EINVAL;
  366. }
  367. irqmap = &pin_irq_map[irqindex];
  368. /* configure gpio_init_struct */
  369. gpio_default_para_init(&gpio_init_struct);
  370. exint_default_para_init(&exint_init_struct);
  371. gpio_init_struct.gpio_pins = irqmap->pinbit;
  372. gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  373. exint_init_struct.line_select = irqmap->pinbit;
  374. exint_init_struct.line_mode = EXINT_LINE_INTERRUPUT;
  375. exint_init_struct.line_enable = TRUE;
  376. switch (pin_irq_handler_tab[irqindex].mode)
  377. {
  378. case PIN_IRQ_MODE_RISING:
  379. exint_init_struct.line_polarity = EXINT_TRIGGER_RISING_EDGE;
  380. break;
  381. case PIN_IRQ_MODE_FALLING:
  382. exint_init_struct.line_polarity = EXINT_TRIGGER_FALLING_EDGE;
  383. break;
  384. case PIN_IRQ_MODE_RISING_FALLING:
  385. exint_init_struct.line_polarity = EXINT_TRIGGER_BOTH_EDGE;
  386. break;
  387. }
  388. gpio_init(gpio_port, &gpio_init_struct);
  389. #if defined (SOC_SERIES_AT32F435) || defined (SOC_SERIES_AT32F437) || \
  390. defined (SOC_SERIES_AT32F421) || defined (SOC_SERIES_AT32F425) || \
  391. defined (SOC_SERIES_AT32F423) || defined (SOC_SERIES_AT32F402) || \
  392. defined (SOC_SERIES_AT32F405) || defined (SOC_SERIES_AT32A423) || \
  393. defined (SOC_SERIES_AT32M412) || defined (SOC_SERIES_AT32M416)
  394. scfg_exint_line_config(PIN_ATPORTSOURCE(pin), PIN_ATPINSOURCE(pin));
  395. #else
  396. gpio_exint_line_config(PIN_ATPORTSOURCE(pin), PIN_ATPINSOURCE(pin));
  397. #endif
  398. exint_init(&exint_init_struct);
  399. nvic_irq_enable(irqmap->irqno, 5, 0);
  400. pin_irq_enable_mask |= irqmap->pinbit;
  401. rt_hw_interrupt_enable(level);
  402. }
  403. else if (enabled == PIN_IRQ_DISABLE)
  404. {
  405. irqmap = get_pin_irq_map(gpio_pin);
  406. if (irqmap == RT_NULL)
  407. {
  408. return -RT_EINVAL;
  409. }
  410. level = rt_hw_interrupt_disable();
  411. pin_irq_enable_mask &= ~irqmap->pinbit;
  412. if ((irqmap->pinbit >= GPIO_PINS_5) && (irqmap->pinbit <= GPIO_PINS_9))
  413. {
  414. if (!(pin_irq_enable_mask & (GPIO_PINS_5 | GPIO_PINS_6 | GPIO_PINS_7 | GPIO_PINS_8 | GPIO_PINS_9)))
  415. {
  416. irqn = irqmap->irqno;
  417. }
  418. }
  419. else if ((irqmap->pinbit >= GPIO_PINS_10) && (irqmap->pinbit <= GPIO_PINS_15))
  420. {
  421. if (!(pin_irq_enable_mask & (GPIO_PINS_10 | GPIO_PINS_11 | GPIO_PINS_12 | GPIO_PINS_13 | GPIO_PINS_14 | GPIO_PINS_15)))
  422. {
  423. irqn = irqmap->irqno;
  424. }
  425. }
  426. else
  427. {
  428. irqn = irqmap->irqno;
  429. }
  430. nvic_irq_disable(irqn);
  431. rt_hw_interrupt_enable(level);
  432. }
  433. else
  434. {
  435. return -RT_EINVAL;
  436. }
  437. return RT_EOK;
  438. }
  439. const static struct rt_pin_ops _at32_pin_ops =
  440. {
  441. at32_pin_mode,
  442. at32_pin_write,
  443. at32_pin_read,
  444. at32_pin_attach_irq,
  445. at32_pin_dettach_irq,
  446. at32_pin_irq_enable,
  447. at32_pin_get,
  448. };
  449. rt_inline void pin_irq_handler(int irqno)
  450. {
  451. exint_flag_clear(pin_irq_map[irqno].lineno);
  452. if (pin_irq_handler_tab[irqno].hdr)
  453. {
  454. pin_irq_handler_tab[irqno].hdr(pin_irq_handler_tab[irqno].args);
  455. }
  456. }
  457. void gpio_exint_handler(uint16_t GPIO_Pin)
  458. {
  459. pin_irq_handler(bit2bitno(GPIO_Pin));
  460. }
  461. #if defined (SOC_SERIES_AT32F421) || defined (SOC_SERIES_AT32F425)
  462. void EXINT1_0_IRQHandler(void)
  463. {
  464. rt_interrupt_enter();
  465. if (RESET != exint_flag_get(EXINT_LINE_0))
  466. {
  467. gpio_exint_handler(GPIO_PINS_0);
  468. }
  469. if (RESET != exint_flag_get(EXINT_LINE_1))
  470. {
  471. gpio_exint_handler(GPIO_PINS_1);
  472. }
  473. rt_interrupt_leave();
  474. }
  475. void EXINT3_2_IRQHandler(void)
  476. {
  477. rt_interrupt_enter();
  478. if (RESET != exint_flag_get(EXINT_LINE_2))
  479. {
  480. gpio_exint_handler(GPIO_PINS_2);
  481. }
  482. if (RESET != exint_flag_get(EXINT_LINE_3))
  483. {
  484. gpio_exint_handler(GPIO_PINS_3);
  485. }
  486. rt_interrupt_leave();
  487. }
  488. void EXINT15_4_IRQHandler(void)
  489. {
  490. rt_interrupt_enter();
  491. if (RESET != exint_flag_get(EXINT_LINE_4))
  492. {
  493. gpio_exint_handler(GPIO_PINS_4);
  494. }
  495. if (RESET != exint_flag_get(EXINT_LINE_5))
  496. {
  497. gpio_exint_handler(GPIO_PINS_5);
  498. }
  499. if (RESET != exint_flag_get(EXINT_LINE_6))
  500. {
  501. gpio_exint_handler(GPIO_PINS_6);
  502. }
  503. if (RESET != exint_flag_get(EXINT_LINE_7))
  504. {
  505. gpio_exint_handler(GPIO_PINS_7);
  506. }
  507. if (RESET != exint_flag_get(EXINT_LINE_8))
  508. {
  509. gpio_exint_handler(GPIO_PINS_8);
  510. }
  511. if (RESET != exint_flag_get(EXINT_LINE_9))
  512. {
  513. gpio_exint_handler(GPIO_PINS_9);
  514. }
  515. if (RESET != exint_flag_get(EXINT_LINE_10))
  516. {
  517. gpio_exint_handler(GPIO_PINS_10);
  518. }
  519. if (RESET != exint_flag_get(EXINT_LINE_11))
  520. {
  521. gpio_exint_handler(GPIO_PINS_11);
  522. }
  523. if (RESET != exint_flag_get(EXINT_LINE_12))
  524. {
  525. gpio_exint_handler(GPIO_PINS_12);
  526. }
  527. if (RESET != exint_flag_get(EXINT_LINE_13))
  528. {
  529. gpio_exint_handler(GPIO_PINS_13);
  530. }
  531. if (RESET != exint_flag_get(EXINT_LINE_14))
  532. {
  533. gpio_exint_handler(GPIO_PINS_14);
  534. }
  535. if (RESET != exint_flag_get(EXINT_LINE_15))
  536. {
  537. gpio_exint_handler(GPIO_PINS_15);
  538. }
  539. rt_interrupt_leave();
  540. }
  541. #else
  542. void EXINT0_IRQHandler(void)
  543. {
  544. rt_interrupt_enter();
  545. gpio_exint_handler(GPIO_PINS_0);
  546. rt_interrupt_leave();
  547. }
  548. void EXINT1_IRQHandler(void)
  549. {
  550. rt_interrupt_enter();
  551. gpio_exint_handler(GPIO_PINS_1);
  552. rt_interrupt_leave();
  553. }
  554. void EXINT2_IRQHandler(void)
  555. {
  556. rt_interrupt_enter();
  557. gpio_exint_handler(GPIO_PINS_2);
  558. rt_interrupt_leave();
  559. }
  560. void EXINT3_IRQHandler(void)
  561. {
  562. rt_interrupt_enter();
  563. gpio_exint_handler(GPIO_PINS_3);
  564. rt_interrupt_leave();
  565. }
  566. void EXINT4_IRQHandler(void)
  567. {
  568. rt_interrupt_enter();
  569. gpio_exint_handler(GPIO_PINS_4);
  570. rt_interrupt_leave();
  571. }
  572. void EXINT9_5_IRQHandler(void)
  573. {
  574. rt_interrupt_enter();
  575. if (RESET != exint_flag_get(EXINT_LINE_5))
  576. {
  577. gpio_exint_handler(GPIO_PINS_5);
  578. }
  579. if (RESET != exint_flag_get(EXINT_LINE_6))
  580. {
  581. gpio_exint_handler(GPIO_PINS_6);
  582. }
  583. if (RESET != exint_flag_get(EXINT_LINE_7))
  584. {
  585. gpio_exint_handler(GPIO_PINS_7);
  586. }
  587. if (RESET != exint_flag_get(EXINT_LINE_8))
  588. {
  589. gpio_exint_handler(GPIO_PINS_8);
  590. }
  591. if (RESET != exint_flag_get(EXINT_LINE_9))
  592. {
  593. gpio_exint_handler(GPIO_PINS_9);
  594. }
  595. rt_interrupt_leave();
  596. }
  597. void EXINT15_10_IRQHandler(void)
  598. {
  599. rt_interrupt_enter();
  600. if (RESET != exint_flag_get(EXINT_LINE_10))
  601. {
  602. gpio_exint_handler(GPIO_PINS_10);
  603. }
  604. if (RESET != exint_flag_get(EXINT_LINE_11))
  605. {
  606. gpio_exint_handler(GPIO_PINS_11);
  607. }
  608. if (RESET != exint_flag_get(EXINT_LINE_12))
  609. {
  610. gpio_exint_handler(GPIO_PINS_12);
  611. }
  612. if (RESET != exint_flag_get(EXINT_LINE_13))
  613. {
  614. gpio_exint_handler(GPIO_PINS_13);
  615. }
  616. if (RESET != exint_flag_get(EXINT_LINE_14))
  617. {
  618. gpio_exint_handler(GPIO_PINS_14);
  619. }
  620. if (RESET != exint_flag_get(EXINT_LINE_15))
  621. {
  622. gpio_exint_handler(GPIO_PINS_15);
  623. }
  624. rt_interrupt_leave();
  625. }
  626. #endif
  627. int rt_hw_pin_init(void)
  628. {
  629. #ifdef GPIOA
  630. crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
  631. #endif
  632. #ifdef GPIOB
  633. crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);
  634. #endif
  635. #ifdef GPIOC
  636. crm_periph_clock_enable(CRM_GPIOC_PERIPH_CLOCK, TRUE);
  637. #endif
  638. #ifdef GPIOD
  639. crm_periph_clock_enable(CRM_GPIOD_PERIPH_CLOCK, TRUE);
  640. #endif
  641. #ifdef GPIOE
  642. crm_periph_clock_enable(CRM_GPIOE_PERIPH_CLOCK, TRUE);
  643. #endif
  644. #ifdef GPIOF
  645. crm_periph_clock_enable(CRM_GPIOF_PERIPH_CLOCK, TRUE);
  646. #endif
  647. #ifdef GPIOG
  648. crm_periph_clock_enable(CRM_GPIOG_PERIPH_CLOCK, TRUE);
  649. #endif
  650. #ifdef GPIOH
  651. crm_periph_clock_enable(CRM_GPIOH_PERIPH_CLOCK, TRUE);
  652. #endif
  653. #if defined (SOC_SERIES_AT32F435) || defined (SOC_SERIES_AT32F437) || \
  654. defined (SOC_SERIES_AT32F421) || defined (SOC_SERIES_AT32F425) || \
  655. defined (SOC_SERIES_AT32F423) || defined (SOC_SERIES_AT32F402) || \
  656. defined (SOC_SERIES_AT32F405) || defined (SOC_SERIES_AT32A423) || \
  657. defined (SOC_SERIES_AT32M412) || defined (SOC_SERIES_AT32M416)
  658. crm_periph_clock_enable(CRM_SCFG_PERIPH_CLOCK, TRUE);
  659. #else
  660. crm_periph_clock_enable(CRM_IOMUX_PERIPH_CLOCK, TRUE);
  661. #endif
  662. return rt_device_pin_register("pin", &_at32_pin_ops, RT_NULL);
  663. }
  664. INIT_BOARD_EXPORT(rt_hw_pin_init);
  665. #endif /* RT_USING_PIN */