drv_gpio.c 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910
  1. /*
  2. * Copyright (c) 2006-2024, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2024-04-08 QT-one first version
  9. */
  10. #include "drv_gpio.h"
  11. #ifdef RT_USING_PIN
  12. #define __HT32_PIN(index, gpio, pin) \
  13. { \
  14. index, HT_GPIO##gpio, GPIO_PIN_##pin \
  15. }
  16. struct pin_index
  17. {
  18. int index;
  19. HT_GPIO_TypeDef *gpio;
  20. uint32_t pin;
  21. };
  22. struct pin_irq_map
  23. {
  24. rt_uint16_t pinbit;
  25. IRQn_Type irqno;
  26. };
  27. static const struct pin_index pins[] =
  28. {
  29. #if defined(HT_GPIOA)
  30. __HT32_PIN(0, A, 0),
  31. __HT32_PIN(1, A, 1),
  32. __HT32_PIN(2, A, 2),
  33. __HT32_PIN(3, A, 3),
  34. __HT32_PIN(4, A, 4),
  35. __HT32_PIN(5, A, 5),
  36. __HT32_PIN(6, A, 6),
  37. __HT32_PIN(7, A, 7),
  38. __HT32_PIN(8, A, 8),
  39. __HT32_PIN(9, A, 9),
  40. __HT32_PIN(10, A, 10),
  41. __HT32_PIN(11, A, 11),
  42. __HT32_PIN(12, A, 12),
  43. __HT32_PIN(13, A, 13),
  44. __HT32_PIN(14, A, 14),
  45. __HT32_PIN(15, A, 15),
  46. #if defined(HT_GPIOB)
  47. __HT32_PIN(16, B, 0),
  48. __HT32_PIN(17, B, 1),
  49. __HT32_PIN(18, B, 2),
  50. __HT32_PIN(19, B, 3),
  51. __HT32_PIN(20, B, 4),
  52. __HT32_PIN(21, B, 5),
  53. __HT32_PIN(22, B, 6),
  54. __HT32_PIN(23, B, 7),
  55. __HT32_PIN(24, B, 8),
  56. __HT32_PIN(25, B, 9),
  57. __HT32_PIN(26, B, 10),
  58. __HT32_PIN(27, B, 11),
  59. __HT32_PIN(28, B, 12),
  60. __HT32_PIN(29, B, 13),
  61. __HT32_PIN(30, B, 14),
  62. __HT32_PIN(31, B, 15),
  63. #if defined(HT_GPIOC)
  64. __HT32_PIN(32, C, 0),
  65. __HT32_PIN(33, C, 1),
  66. __HT32_PIN(34, C, 2),
  67. __HT32_PIN(35, C, 3),
  68. __HT32_PIN(36, C, 4),
  69. __HT32_PIN(37, C, 5),
  70. __HT32_PIN(38, C, 6),
  71. __HT32_PIN(39, C, 7),
  72. __HT32_PIN(40, C, 8),
  73. __HT32_PIN(41, C, 9),
  74. __HT32_PIN(42, C, 10),
  75. __HT32_PIN(43, C, 11),
  76. __HT32_PIN(44, C, 12),
  77. __HT32_PIN(45, C, 13),
  78. __HT32_PIN(46, C, 14),
  79. __HT32_PIN(47, C, 15),
  80. #if defined(HT_GPIOD)
  81. __HT32_PIN(48, D, 0),
  82. __HT32_PIN(49, D, 1),
  83. __HT32_PIN(50, D, 2),
  84. __HT32_PIN(51, D, 3),
  85. __HT32_PIN(52, D, 4),
  86. __HT32_PIN(53, D, 5),
  87. __HT32_PIN(54, D, 6),
  88. __HT32_PIN(55, D, 7),
  89. __HT32_PIN(56, D, 8),
  90. __HT32_PIN(57, D, 9),
  91. __HT32_PIN(58, D, 10),
  92. __HT32_PIN(59, D, 11),
  93. __HT32_PIN(60, D, 12),
  94. __HT32_PIN(61, D, 13),
  95. __HT32_PIN(62, D, 14),
  96. __HT32_PIN(63, D, 15),
  97. #if defined(HT_GPIOE)
  98. __HT32_PIN(64, E, 0),
  99. __HT32_PIN(65, E, 1),
  100. __HT32_PIN(66, E, 2),
  101. __HT32_PIN(67, E, 3),
  102. __HT32_PIN(68, E, 4),
  103. __HT32_PIN(69, E, 5),
  104. __HT32_PIN(70, E, 6),
  105. __HT32_PIN(71, E, 7),
  106. __HT32_PIN(72, E, 8),
  107. __HT32_PIN(73, E, 9),
  108. __HT32_PIN(74, E, 10),
  109. __HT32_PIN(75, E, 11),
  110. __HT32_PIN(76, E, 12),
  111. __HT32_PIN(77, E, 13),
  112. __HT32_PIN(78, E, 14),
  113. __HT32_PIN(79, E, 15),
  114. #if defined(HT_GPIOF)
  115. __HT32_PIN(80, F, 0),
  116. __HT32_PIN(81, F, 1),
  117. __HT32_PIN(82, F, 2),
  118. __HT32_PIN(83, F, 3),
  119. __HT32_PIN(84, F, 4),
  120. __HT32_PIN(85, F, 5),
  121. __HT32_PIN(86, F, 6),
  122. __HT32_PIN(87, F, 7),
  123. __HT32_PIN(88, F, 8),
  124. __HT32_PIN(89, F, 9),
  125. __HT32_PIN(90, F, 10),
  126. __HT32_PIN(91, F, 11),
  127. __HT32_PIN(92, F, 12),
  128. __HT32_PIN(93, F, 13),
  129. __HT32_PIN(94, F, 14),
  130. __HT32_PIN(95, F, 15),
  131. #endif /* defined(HT_GPIOF) */
  132. #endif /* defined(HT_GPIOE) */
  133. #endif /* defined(HT_GPIOD) */
  134. #endif /* defined(HT_GPIOC) */
  135. #endif /* defined(HT_GPIOB) */
  136. #endif /* defined(HT_GPIOA) */
  137. };
  138. static const struct pin_irq_map pin_irq_map[] =
  139. {
  140. {GPIO_PIN_0, EXTI0_IRQn},
  141. {GPIO_PIN_1, EXTI1_IRQn},
  142. {GPIO_PIN_2, EXTI2_IRQn},
  143. {GPIO_PIN_3, EXTI3_IRQn},
  144. {GPIO_PIN_4, EXTI4_IRQn},
  145. {GPIO_PIN_5, EXTI5_IRQn},
  146. {GPIO_PIN_6, EXTI6_IRQn},
  147. {GPIO_PIN_7, EXTI7_IRQn},
  148. {GPIO_PIN_8, EXTI8_IRQn},
  149. {GPIO_PIN_9, EXTI9_IRQn},
  150. {GPIO_PIN_10, EXTI10_IRQn},
  151. {GPIO_PIN_11, EXTI11_IRQn},
  152. {GPIO_PIN_12, EXTI12_IRQn},
  153. {GPIO_PIN_13, EXTI13_IRQn},
  154. {GPIO_PIN_14, EXTI14_IRQn},
  155. {GPIO_PIN_15, EXTI15_IRQn},
  156. };
  157. static struct rt_pin_irq_hdr pin_irq_hdr_tab[] =
  158. {
  159. {-1, 0, RT_NULL, RT_NULL},
  160. {-1, 0, RT_NULL, RT_NULL},
  161. {-1, 0, RT_NULL, RT_NULL},
  162. {-1, 0, RT_NULL, RT_NULL},
  163. {-1, 0, RT_NULL, RT_NULL},
  164. {-1, 0, RT_NULL, RT_NULL},
  165. {-1, 0, RT_NULL, RT_NULL},
  166. {-1, 0, RT_NULL, RT_NULL},
  167. {-1, 0, RT_NULL, RT_NULL},
  168. {-1, 0, RT_NULL, RT_NULL},
  169. {-1, 0, RT_NULL, RT_NULL},
  170. {-1, 0, RT_NULL, RT_NULL},
  171. {-1, 0, RT_NULL, RT_NULL},
  172. {-1, 0, RT_NULL, RT_NULL},
  173. {-1, 0, RT_NULL, RT_NULL},
  174. {-1, 0, RT_NULL, RT_NULL},
  175. };
  176. #define ITEM_NUM(items) sizeof(items) / sizeof(items[0])
  177. static const struct pin_index *get_pin(rt_uint8_t pin)
  178. {
  179. const struct pin_index *index;
  180. if (pin < ITEM_NUM(pins))
  181. {
  182. index = &pins[pin];
  183. if (index->index == -1)
  184. index = RT_NULL;
  185. }
  186. else
  187. {
  188. index = RT_NULL;
  189. }
  190. return index;
  191. }
  192. static void ht32_pin_mode(rt_device_t dev, rt_base_t pin, rt_uint8_t mode)
  193. {
  194. const struct pin_index *index;
  195. index = get_pin(pin);
  196. if (index == RT_NULL)
  197. {
  198. return;
  199. }
  200. CKCU_PeripClockConfig_TypeDef CKCUClock = {{0}};
  201. if ((index->gpio) == HT_GPIOA)
  202. CKCUClock.Bit.PA = 1;
  203. else if ((index->gpio) == HT_GPIOB)
  204. CKCUClock.Bit.PB = 1;
  205. #if defined(HT_GPIOC)
  206. else if ((index->gpio) == HT_GPIOC)
  207. CKCUClock.Bit.PC = 1;
  208. #endif
  209. #if defined(HT_GPIOD)
  210. else if ((index->gpio) == HT_GPIOD)
  211. CKCUClock.Bit.PD = 1;
  212. #endif
  213. #if defined(HT_GPIOE)
  214. else if ((index->gpio) == HT_GPIOE)
  215. CKCUClock.Bit.PE = 1;
  216. #endif
  217. #if defined(HT_GPIOF)
  218. else if ((index->gpio) == HT_GPIOF)
  219. CKCUClock.Bit.PF = 1;
  220. #endif
  221. CKCUClock.Bit.AFIO = 1;
  222. CKCUClock.Bit.BKP = 1;
  223. CKCU_PeripClockConfig(CKCUClock, ENABLE);
  224. if ((index->gpio) == HT_GPIOA)
  225. AFIO_GPxConfig(GPIO_PA, index->pin, AFIO_MODE_1);
  226. else if ((index->gpio) == HT_GPIOB)
  227. AFIO_GPxConfig(GPIO_PB, index->pin, AFIO_MODE_1);
  228. #if defined(HT_GPIOC)
  229. else if ((index->gpio) == HT_GPIOC)
  230. AFIO_GPxConfig(GPIO_PC, index->pin, AFIO_MODE_1);
  231. #endif
  232. #if defined(HT_GPIOD)
  233. else if ((index->gpio) == HT_GPIOD)
  234. AFIO_GPxConfig(GPIO_PD, index->pin, AFIO_MODE_1);
  235. #endif
  236. #if defined(HT_GPIOE)
  237. else if ((index->gpio) == HT_GPIOE)
  238. AFIO_GPxConfig(GPIO_PE, index->pin, AFIO_MODE_1);
  239. #endif
  240. #if defined(HT_GPIOF)
  241. else if ((index->gpio) == HT_GPIOF)
  242. AFIO_GPxConfig(GPIO_PF, index->pin, AFIO_MODE_1);
  243. #endif
  244. switch (mode)
  245. {
  246. case PIN_MODE_OUTPUT:
  247. /* output setting */
  248. GPIO_DirectionConfig(index->gpio, index->pin, GPIO_DIR_OUT);
  249. GPIO_PullResistorConfig(index->gpio, index->pin, GPIO_PR_DISABLE);
  250. break;
  251. case PIN_MODE_OUTPUT_OD:
  252. /* output setting: od. */
  253. GPIO_DirectionConfig(index->gpio, index->pin, GPIO_DIR_OUT);
  254. GPIO_PullResistorConfig(index->gpio, index->pin, GPIO_PR_DISABLE);
  255. break;
  256. case PIN_MODE_INPUT:
  257. /* input setting: not pull. */
  258. GPIO_DirectionConfig(index->gpio, index->pin, GPIO_DIR_IN);
  259. GPIO_PullResistorConfig(index->gpio, index->pin, GPIO_PR_DISABLE);
  260. GPIO_InputConfig(index->gpio, index->pin, ENABLE);
  261. break;
  262. case PIN_MODE_INPUT_PULLUP:
  263. /* input setting: pull up. */
  264. GPIO_DirectionConfig(index->gpio, index->pin, GPIO_DIR_IN);
  265. GPIO_PullResistorConfig(index->gpio, index->pin, GPIO_PR_UP);
  266. GPIO_InputConfig(index->gpio, index->pin, ENABLE);
  267. break;
  268. case PIN_MODE_INPUT_PULLDOWN:
  269. /* input setting: pull down. */
  270. GPIO_DirectionConfig(index->gpio, index->pin, GPIO_DIR_IN);
  271. GPIO_PullResistorConfig(index->gpio, index->pin, GPIO_PR_DOWN);
  272. GPIO_InputConfig(index->gpio, index->pin, ENABLE);
  273. break;
  274. default:
  275. break;
  276. }
  277. }
  278. static void ht32_pin_write(rt_device_t dev, rt_base_t pin, rt_uint8_t value)
  279. {
  280. const struct pin_index *index;
  281. index = get_pin(pin);
  282. if (index == RT_NULL)
  283. {
  284. return;
  285. }
  286. if (value == PIN_LOW)
  287. {
  288. GPIO_ClearOutBits(index->gpio, index->pin);
  289. }
  290. else
  291. {
  292. GPIO_SetOutBits(index->gpio, index->pin);
  293. }
  294. }
  295. static rt_ssize_t ht32_pin_read(rt_device_t dev, rt_base_t pin)
  296. {
  297. int value;
  298. const struct pin_index *index;
  299. value = PIN_LOW;
  300. index = get_pin(pin);
  301. if (index == RT_NULL)
  302. {
  303. return value;
  304. }
  305. value = GPIO_ReadInBit(index->gpio, index->pin);
  306. return value;
  307. }
  308. rt_inline rt_int32_t bit2bitno(rt_uint32_t bit)
  309. {
  310. rt_uint8_t i;
  311. for (i = 0; i < 32; i++)
  312. {
  313. if ((0x01 << i) == bit)
  314. {
  315. return i;
  316. }
  317. }
  318. return -1;
  319. }
  320. rt_inline const struct pin_irq_map *get_pin_irq_map(rt_uint32_t pinbit)
  321. {
  322. rt_int32_t mapindex = bit2bitno(pinbit);
  323. if (mapindex < 0 || mapindex >= ITEM_NUM(pin_irq_map))
  324. {
  325. return RT_NULL;
  326. }
  327. return &pin_irq_map[mapindex];
  328. }
  329. static rt_err_t ht32_pin_attach_irq(struct rt_device *device,
  330. rt_base_t pin,
  331. rt_uint8_t mode,
  332. void (*hdr)(void *args),
  333. void *args)
  334. {
  335. const struct pin_index *index;
  336. rt_base_t level;
  337. rt_int32_t hdr_index = -1;
  338. index = get_pin(pin);
  339. if (index == RT_NULL)
  340. {
  341. return RT_ERROR;
  342. }
  343. hdr_index = bit2bitno(index->pin);
  344. if (hdr_index < 0 || hdr_index >= ITEM_NUM(pin_irq_map))
  345. {
  346. return RT_ERROR;
  347. }
  348. level = rt_hw_interrupt_disable();
  349. if (pin_irq_hdr_tab[hdr_index].pin == pin &&
  350. pin_irq_hdr_tab[hdr_index].hdr == hdr &&
  351. pin_irq_hdr_tab[hdr_index].mode == mode &&
  352. pin_irq_hdr_tab[hdr_index].args == args)
  353. {
  354. rt_hw_interrupt_enable(level);
  355. return RT_EOK;
  356. }
  357. if (pin_irq_hdr_tab[hdr_index].pin != -1)
  358. {
  359. rt_hw_interrupt_enable(level);
  360. return RT_ERROR;
  361. }
  362. pin_irq_hdr_tab[hdr_index].pin = pin;
  363. pin_irq_hdr_tab[hdr_index].hdr = hdr;
  364. pin_irq_hdr_tab[hdr_index].mode = mode;
  365. pin_irq_hdr_tab[hdr_index].args = args;
  366. rt_hw_interrupt_enable(level);
  367. return RT_EOK;
  368. }
  369. static rt_err_t ht32_pin_detach_irq(struct rt_device *device, rt_base_t pin)
  370. {
  371. const struct pin_index *index;
  372. rt_base_t level;
  373. rt_int32_t hdr_index = -1;
  374. index = get_pin(pin);
  375. if (index == RT_NULL)
  376. {
  377. return RT_ERROR;
  378. }
  379. hdr_index = bit2bitno(index->pin);
  380. if (hdr_index < 0 || hdr_index >= ITEM_NUM(pin_irq_map))
  381. {
  382. return RT_ERROR;
  383. }
  384. level = rt_hw_interrupt_disable();
  385. if (pin_irq_hdr_tab[hdr_index].pin == -1)
  386. {
  387. rt_hw_interrupt_enable(level);
  388. return RT_EOK;
  389. }
  390. pin_irq_hdr_tab[hdr_index].pin = -1;
  391. pin_irq_hdr_tab[hdr_index].hdr = RT_NULL;
  392. pin_irq_hdr_tab[hdr_index].mode = 0;
  393. pin_irq_hdr_tab[hdr_index].args = RT_NULL;
  394. rt_hw_interrupt_enable(level);
  395. return RT_EOK;
  396. }
  397. static rt_err_t ht32_pin_irq_enable(struct rt_device *device, rt_base_t pin, rt_uint8_t enabled)
  398. {
  399. const struct pin_index *index;
  400. const struct pin_irq_map *irqmap;
  401. rt_base_t level;
  402. rt_int32_t hdr_index = -1;
  403. EXTI_InitTypeDef EXTI_InitStruct;
  404. index = get_pin(pin);
  405. if (index == RT_NULL)
  406. {
  407. return RT_ERROR;
  408. }
  409. if (enabled == PIN_IRQ_ENABLE)
  410. {
  411. hdr_index = bit2bitno(index->pin);
  412. if (hdr_index < 0 || hdr_index >= ITEM_NUM(pin_irq_map))
  413. {
  414. return RT_ERROR;
  415. }
  416. level = rt_hw_interrupt_disable();
  417. if (pin_irq_hdr_tab[hdr_index].pin == -1)
  418. {
  419. rt_hw_interrupt_enable(level);
  420. return RT_ERROR;
  421. }
  422. irqmap = &pin_irq_map[hdr_index];
  423. CKCU_PeripClockConfig_TypeDef CKCUClock = {{0}};
  424. CKCUClock.Bit.AFIO = 1;
  425. CKCUClock.Bit.EXTI = 1;
  426. if ((index->gpio) == HT_GPIOA)
  427. CKCUClock.Bit.PA = 1;
  428. else if ((index->gpio) == HT_GPIOB)
  429. CKCUClock.Bit.PB = 1;
  430. #if defined(HT_GPIOC)
  431. else if ((index->gpio) == HT_GPIOC)
  432. CKCUClock.Bit.PC = 1;
  433. #endif
  434. #if defined(HT_GPIOD)
  435. else if ((index->gpio) == HT_GPIOD)
  436. CKCUClock.Bit.PD = 1;
  437. #endif
  438. #if defined(HT_GPIOE)
  439. else if ((index->gpio) == HT_GPIOE)
  440. CKCUClock.Bit.PE = 1;
  441. #endif
  442. #if defined(HT_GPIOF)
  443. else if ((index->gpio) == HT_GPIOF)
  444. CKCUClock.Bit.PF = 1;
  445. #endif
  446. CKCU_PeripClockConfig(CKCUClock, ENABLE);
  447. if ((index->gpio) == HT_GPIOA)
  448. {
  449. AFIO_GPxConfig(GPIO_PA, index->pin, AFIO_MODE_1);
  450. GPIO_InputConfig(HT_GPIOA, index->pin, ENABLE);
  451. AFIO_EXTISourceConfig(hdr_index, AFIO_ESS_PA);
  452. }
  453. else if ((index->gpio) == HT_GPIOB)
  454. {
  455. AFIO_GPxConfig(GPIO_PB, index->pin, AFIO_MODE_1);
  456. GPIO_InputConfig(HT_GPIOB, index->pin, ENABLE);
  457. AFIO_EXTISourceConfig(hdr_index, AFIO_ESS_PB);
  458. }
  459. #if defined(HT_GPIOC)
  460. else if ((index->gpio) == HT_GPIOC)
  461. {
  462. AFIO_GPxConfig(GPIO_PC, index->pin, AFIO_MODE_1);
  463. GPIO_InputConfig(HT_GPIOC, index->pin, ENABLE);
  464. AFIO_EXTISourceConfig(hdr_index, AFIO_ESS_PC);
  465. }
  466. #endif
  467. #if defined(HT_GPIOD)
  468. else if ((index->gpio) == HT_GPIOD)
  469. {
  470. AFIO_GPxConfig(GPIO_PD, index->pin, AFIO_MODE_1);
  471. GPIO_InputConfig(HT_GPIOD, index->pin, ENABLE);
  472. AFIO_EXTISourceConfig(hdr_index, AFIO_ESS_PD);
  473. }
  474. #endif
  475. #if defined(HT_GPIOE)
  476. else if ((index->gpio) == HT_GPIOE)
  477. {
  478. AFIO_GPxConfig(GPIO_PE, index->pin, AFIO_MODE_1);
  479. GPIO_InputConfig(HT_GPIOE, index->pin, ENABLE);
  480. AFIO_EXTISourceConfig(hdr_index, AFIO_ESS_PE);
  481. }
  482. #endif
  483. #if defined(HT_GPIOF)
  484. else if ((index->gpio) == HT_GPIOF)
  485. {
  486. AFIO_GPxConfig(GPIO_PF, index->pin, AFIO_MODE_1);
  487. GPIO_InputConfig(HT_GPIOF, index->pin, ENABLE);
  488. AFIO_EXTISourceConfig(hdr_index, AFIO_ESS_PF);
  489. }
  490. #endif
  491. switch (pin_irq_hdr_tab[hdr_index].mode)
  492. {
  493. case PIN_IRQ_MODE_RISING:
  494. GPIO_PullResistorConfig(index->gpio, index->pin, GPIO_PR_DOWN);
  495. EXTI_InitStruct.EXTI_IntType = EXTI_POSITIVE_EDGE;
  496. break;
  497. case PIN_IRQ_MODE_FALLING:
  498. GPIO_PullResistorConfig(index->gpio, index->pin, GPIO_PR_UP);
  499. EXTI_InitStruct.EXTI_IntType = EXTI_NEGATIVE_EDGE;
  500. break;
  501. case PIN_IRQ_MODE_RISING_FALLING:
  502. GPIO_PullResistorConfig(index->gpio, index->pin, GPIO_PR_DISABLE);
  503. EXTI_InitStruct.EXTI_IntType = EXTI_BOTH_EDGE;
  504. break;
  505. case PIN_IRQ_MODE_HIGH_LEVEL:
  506. GPIO_PullResistorConfig(index->gpio, index->pin, GPIO_PR_DOWN);
  507. EXTI_InitStruct.EXTI_IntType = EXTI_HIGH_LEVEL;
  508. break;
  509. case PIN_IRQ_MODE_LOW_LEVEL:
  510. GPIO_PullResistorConfig(index->gpio, index->pin, GPIO_PR_UP);
  511. EXTI_InitStruct.EXTI_IntType = EXTI_LOW_LEVEL;
  512. break;
  513. default:
  514. rt_hw_interrupt_enable(level);
  515. return RT_ERROR;
  516. }
  517. EXTI_InitStruct.EXTI_Channel = hdr_index;
  518. EXTI_InitStruct.EXTI_Debounce = EXTI_DEBOUNCE_DISABLE;
  519. EXTI_InitStruct.EXTI_DebounceCnt = 0;
  520. EXTI_Init(&EXTI_InitStruct);
  521. EXTI_IntConfig(hdr_index, ENABLE);
  522. NVIC_EnableIRQ((irqmap->irqno));
  523. rt_hw_interrupt_enable(level);
  524. }
  525. else if (enabled == PIN_IRQ_DISABLE)
  526. {
  527. irqmap = get_pin_irq_map(index->pin);
  528. if (irqmap == RT_NULL)
  529. {
  530. return RT_ERROR;
  531. }
  532. if ((irqmap->irqno) == EXTI0_IRQn)
  533. EXTI_IntConfig(EXTI_CHANNEL_0, DISABLE);
  534. else if ((irqmap->irqno) == EXTI1_IRQn)
  535. EXTI_IntConfig(EXTI_CHANNEL_1, DISABLE);
  536. else if ((irqmap->irqno) == EXTI2_IRQn)
  537. EXTI_IntConfig(EXTI_CHANNEL_2, DISABLE);
  538. else if ((irqmap->irqno) == EXTI3_IRQn)
  539. EXTI_IntConfig(EXTI_CHANNEL_3, DISABLE);
  540. else if ((irqmap->irqno) == EXTI4_IRQn)
  541. EXTI_IntConfig(EXTI_CHANNEL_4, DISABLE);
  542. else if ((irqmap->irqno) == EXTI5_IRQn)
  543. EXTI_IntConfig(EXTI_CHANNEL_5, DISABLE);
  544. else if ((irqmap->irqno) == EXTI6_IRQn)
  545. EXTI_IntConfig(EXTI_CHANNEL_6, DISABLE);
  546. else if ((irqmap->irqno) == EXTI7_IRQn)
  547. EXTI_IntConfig(EXTI_CHANNEL_7, DISABLE);
  548. else if ((irqmap->irqno) == EXTI8_IRQn)
  549. EXTI_IntConfig(EXTI_CHANNEL_8, DISABLE);
  550. else if ((irqmap->irqno) == EXTI9_IRQn)
  551. EXTI_IntConfig(EXTI_CHANNEL_9, DISABLE);
  552. else if ((irqmap->irqno) == EXTI10_IRQn)
  553. EXTI_IntConfig(EXTI_CHANNEL_10, DISABLE);
  554. else if ((irqmap->irqno) == EXTI11_IRQn)
  555. EXTI_IntConfig(EXTI_CHANNEL_11, DISABLE);
  556. else if ((irqmap->irqno) == EXTI12_IRQn)
  557. EXTI_IntConfig(EXTI_CHANNEL_12, DISABLE);
  558. else if ((irqmap->irqno) == EXTI13_IRQn)
  559. EXTI_IntConfig(EXTI_CHANNEL_13, DISABLE);
  560. else if ((irqmap->irqno) == EXTI14_IRQn)
  561. EXTI_IntConfig(EXTI_CHANNEL_14, DISABLE);
  562. else if ((irqmap->irqno) == EXTI15_IRQn)
  563. EXTI_IntConfig(EXTI_CHANNEL_15, DISABLE);
  564. }
  565. else
  566. {
  567. return RT_ERROR;
  568. }
  569. return RT_EOK;
  570. }
  571. const static struct rt_pin_ops _ht32_pin_ops =
  572. {
  573. .pin_mode = ht32_pin_mode,
  574. .pin_write = ht32_pin_write,
  575. .pin_read = ht32_pin_read,
  576. .pin_attach_irq = ht32_pin_attach_irq,
  577. .pin_detach_irq = ht32_pin_detach_irq,
  578. .pin_irq_enable = ht32_pin_irq_enable,
  579. .pin_get = NULL,
  580. };
  581. int rt_hw_pin_init(void)
  582. {
  583. int result;
  584. result = rt_device_pin_register("pin", &_ht32_pin_ops, RT_NULL);
  585. return result;
  586. }
  587. INIT_BOARD_EXPORT(rt_hw_pin_init);
  588. rt_inline void pin_irq_hdr(int irqno)
  589. {
  590. if (pin_irq_hdr_tab[irqno].hdr)
  591. {
  592. pin_irq_hdr_tab[irqno].hdr(pin_irq_hdr_tab[irqno].args);
  593. }
  594. }
  595. #ifdef SOC_SERIES_HT32F5
  596. void EXTI0_1_IRQHandler(void)
  597. {
  598. rt_interrupt_enter();
  599. if (EXTI_GetEdgeStatus(EXTI_CHANNEL_0, EXTI_EDGE_POSITIVE))
  600. {
  601. EXTI_ClearEdgeFlag(EXTI_CHANNEL_0);
  602. pin_irq_hdr(0);
  603. }
  604. else if (EXTI_GetEdgeStatus(EXTI_CHANNEL_1, EXTI_EDGE_POSITIVE))
  605. {
  606. EXTI_ClearEdgeFlag(EXTI_CHANNEL_1);
  607. pin_irq_hdr(1);
  608. }
  609. rt_interrupt_leave();
  610. }
  611. void EXTI2_3_IRQHandler(void)
  612. {
  613. rt_interrupt_enter();
  614. if (EXTI_GetEdgeStatus(EXTI_CHANNEL_2, EXTI_EDGE_POSITIVE))
  615. {
  616. EXTI_ClearEdgeFlag(EXTI_CHANNEL_2);
  617. pin_irq_hdr(2);
  618. }
  619. else if (EXTI_GetEdgeStatus(EXTI_CHANNEL_3, EXTI_EDGE_POSITIVE))
  620. {
  621. EXTI_ClearEdgeFlag(EXTI_CHANNEL_3);
  622. pin_irq_hdr(3);
  623. }
  624. rt_interrupt_leave();
  625. }
  626. void EXTI4_15_IRQHandler(void)
  627. {
  628. rt_interrupt_enter();
  629. if (EXTI_GetEdgeStatus(EXTI_CHANNEL_4, EXTI_EDGE_POSITIVE))
  630. {
  631. EXTI_ClearEdgeFlag(EXTI_CHANNEL_4);
  632. pin_irq_hdr(4);
  633. }
  634. else if (EXTI_GetEdgeStatus(EXTI_CHANNEL_5, EXTI_EDGE_POSITIVE))
  635. {
  636. EXTI_ClearEdgeFlag(EXTI_CHANNEL_5);
  637. pin_irq_hdr(5);
  638. }
  639. else if (EXTI_GetEdgeStatus(EXTI_CHANNEL_6, EXTI_EDGE_POSITIVE))
  640. {
  641. EXTI_ClearEdgeFlag(EXTI_CHANNEL_6);
  642. pin_irq_hdr(6);
  643. }
  644. else if (EXTI_GetEdgeStatus(EXTI_CHANNEL_7, EXTI_EDGE_POSITIVE))
  645. {
  646. EXTI_ClearEdgeFlag(EXTI_CHANNEL_7);
  647. pin_irq_hdr(7);
  648. }
  649. else if (EXTI_GetEdgeStatus(EXTI_CHANNEL_8, EXTI_EDGE_POSITIVE))
  650. {
  651. EXTI_ClearEdgeFlag(EXTI_CHANNEL_8);
  652. pin_irq_hdr(8);
  653. }
  654. else if (EXTI_GetEdgeStatus(EXTI_CHANNEL_9, EXTI_EDGE_POSITIVE))
  655. {
  656. EXTI_ClearEdgeFlag(EXTI_CHANNEL_9);
  657. pin_irq_hdr(9);
  658. }
  659. else if (EXTI_GetEdgeStatus(EXTI_CHANNEL_10, EXTI_EDGE_POSITIVE))
  660. {
  661. EXTI_ClearEdgeFlag(EXTI_CHANNEL_10);
  662. pin_irq_hdr(10);
  663. }
  664. else if (EXTI_GetEdgeStatus(EXTI_CHANNEL_11, EXTI_EDGE_POSITIVE))
  665. {
  666. EXTI_ClearEdgeFlag(EXTI_CHANNEL_11);
  667. pin_irq_hdr(11);
  668. }
  669. else if (EXTI_GetEdgeStatus(EXTI_CHANNEL_12, EXTI_EDGE_POSITIVE))
  670. {
  671. EXTI_ClearEdgeFlag(EXTI_CHANNEL_12);
  672. pin_irq_hdr(12);
  673. }
  674. else if (EXTI_GetEdgeStatus(EXTI_CHANNEL_13, EXTI_EDGE_POSITIVE))
  675. {
  676. EXTI_ClearEdgeFlag(EXTI_CHANNEL_13);
  677. pin_irq_hdr(13);
  678. }
  679. else if (EXTI_GetEdgeStatus(EXTI_CHANNEL_14, EXTI_EDGE_POSITIVE))
  680. {
  681. EXTI_ClearEdgeFlag(EXTI_CHANNEL_14);
  682. pin_irq_hdr(14);
  683. }
  684. else if (EXTI_GetEdgeStatus(EXTI_CHANNEL_15, EXTI_EDGE_POSITIVE))
  685. {
  686. EXTI_ClearEdgeFlag(EXTI_CHANNEL_15);
  687. pin_irq_hdr(15);
  688. }
  689. rt_interrupt_leave();
  690. }
  691. #endif
  692. #ifdef SOC_SERIES_HT32F1
  693. void EXTI0_IRQHandler(void)
  694. {
  695. rt_interrupt_enter();
  696. if (EXTI_GetEdgeStatus(EXTI_CHANNEL_0, EXTI_EDGE_POSITIVE))
  697. {
  698. EXTI_ClearEdgeFlag(EXTI_CHANNEL_0);
  699. pin_irq_hdr(0);
  700. }
  701. rt_interrupt_leave();
  702. }
  703. void EXTI1_IRQHandler(void)
  704. {
  705. rt_interrupt_enter();
  706. if (EXTI_GetEdgeStatus(EXTI_CHANNEL_1, EXTI_EDGE_POSITIVE))
  707. {
  708. EXTI_ClearEdgeFlag(EXTI_CHANNEL_1);
  709. pin_irq_hdr(1);
  710. }
  711. rt_interrupt_leave();
  712. }
  713. void EXTI2_IRQHandler(void)
  714. {
  715. rt_interrupt_enter();
  716. if (EXTI_GetEdgeStatus(EXTI_CHANNEL_2, EXTI_EDGE_POSITIVE))
  717. {
  718. EXTI_ClearEdgeFlag(EXTI_CHANNEL_2);
  719. pin_irq_hdr(2);
  720. }
  721. rt_interrupt_leave();
  722. }
  723. void EXTI3_IRQHandler(void)
  724. {
  725. rt_interrupt_enter();
  726. if (EXTI_GetEdgeStatus(EXTI_CHANNEL_3, EXTI_EDGE_POSITIVE))
  727. {
  728. EXTI_ClearEdgeFlag(EXTI_CHANNEL_3);
  729. pin_irq_hdr(3);
  730. }
  731. rt_interrupt_leave();
  732. }
  733. void EXTI4_IRQHandler(void)
  734. {
  735. rt_interrupt_enter();
  736. if (EXTI_GetEdgeStatus(EXTI_CHANNEL_4, EXTI_EDGE_POSITIVE))
  737. {
  738. EXTI_ClearEdgeFlag(EXTI_CHANNEL_4);
  739. pin_irq_hdr(4);
  740. }
  741. rt_interrupt_leave();
  742. }
  743. void EXTI5_IRQHandler(void)
  744. {
  745. rt_interrupt_enter();
  746. if (EXTI_GetEdgeStatus(EXTI_CHANNEL_5, EXTI_EDGE_POSITIVE))
  747. {
  748. EXTI_ClearEdgeFlag(EXTI_CHANNEL_5);
  749. pin_irq_hdr(5);
  750. }
  751. rt_interrupt_leave();
  752. }
  753. void EXTI6_IRQHandler(void)
  754. {
  755. rt_interrupt_enter();
  756. if (EXTI_GetEdgeStatus(EXTI_CHANNEL_6, EXTI_EDGE_POSITIVE))
  757. {
  758. EXTI_ClearEdgeFlag(EXTI_CHANNEL_6);
  759. pin_irq_hdr(6);
  760. }
  761. rt_interrupt_leave();
  762. }
  763. void EXTI7_IRQHandler(void)
  764. {
  765. rt_interrupt_enter();
  766. if (EXTI_GetEdgeStatus(EXTI_CHANNEL_7, EXTI_EDGE_POSITIVE))
  767. {
  768. EXTI_ClearEdgeFlag(EXTI_CHANNEL_7);
  769. pin_irq_hdr(7);
  770. }
  771. rt_interrupt_leave();
  772. }
  773. void EXTI8_IRQHandler(void)
  774. {
  775. rt_interrupt_enter();
  776. if (EXTI_GetEdgeStatus(EXTI_CHANNEL_8, EXTI_EDGE_POSITIVE))
  777. {
  778. EXTI_ClearEdgeFlag(EXTI_CHANNEL_8);
  779. pin_irq_hdr(8);
  780. }
  781. rt_interrupt_leave();
  782. }
  783. void EXTI9_IRQHandler(void)
  784. {
  785. rt_interrupt_enter();
  786. if (EXTI_GetEdgeStatus(EXTI_CHANNEL_9, EXTI_EDGE_POSITIVE))
  787. {
  788. EXTI_ClearEdgeFlag(EXTI_CHANNEL_9);
  789. pin_irq_hdr(9);
  790. }
  791. rt_interrupt_leave();
  792. }
  793. void EXTI10_IRQHandler(void)
  794. {
  795. rt_interrupt_enter();
  796. if (EXTI_GetEdgeStatus(EXTI_CHANNEL_10, EXTI_EDGE_POSITIVE))
  797. {
  798. EXTI_ClearEdgeFlag(EXTI_CHANNEL_10);
  799. pin_irq_hdr(10);
  800. }
  801. rt_interrupt_leave();
  802. }
  803. void EXTI11_IRQHandler(void)
  804. {
  805. rt_interrupt_enter();
  806. if (EXTI_GetEdgeStatus(EXTI_CHANNEL_11, EXTI_EDGE_POSITIVE))
  807. {
  808. EXTI_ClearEdgeFlag(EXTI_CHANNEL_11);
  809. pin_irq_hdr(11);
  810. }
  811. rt_interrupt_leave();
  812. }
  813. void EXTI12_IRQHandler(void)
  814. {
  815. rt_interrupt_enter();
  816. if (EXTI_GetEdgeStatus(EXTI_CHANNEL_12, EXTI_EDGE_POSITIVE))
  817. {
  818. EXTI_ClearEdgeFlag(EXTI_CHANNEL_12);
  819. pin_irq_hdr(12);
  820. }
  821. rt_interrupt_leave();
  822. }
  823. void EXTI13_IRQHandler(void)
  824. {
  825. rt_interrupt_enter();
  826. if (EXTI_GetEdgeStatus(EXTI_CHANNEL_13, EXTI_EDGE_POSITIVE))
  827. {
  828. EXTI_ClearEdgeFlag(EXTI_CHANNEL_13);
  829. pin_irq_hdr(13);
  830. }
  831. rt_interrupt_leave();
  832. }
  833. void EXTI14_IRQHandler(void)
  834. {
  835. rt_interrupt_enter();
  836. if (EXTI_GetEdgeStatus(EXTI_CHANNEL_14, EXTI_EDGE_POSITIVE))
  837. {
  838. EXTI_ClearEdgeFlag(EXTI_CHANNEL_14);
  839. pin_irq_hdr(14);
  840. }
  841. rt_interrupt_leave();
  842. }
  843. void EXTI15_IRQHandler(void)
  844. {
  845. rt_interrupt_enter();
  846. if (EXTI_GetEdgeStatus(EXTI_CHANNEL_15, EXTI_EDGE_POSITIVE))
  847. {
  848. EXTI_ClearEdgeFlag(EXTI_CHANNEL_15);
  849. pin_irq_hdr(15);
  850. }
  851. rt_interrupt_leave();
  852. }
  853. #endif
  854. #endif