drv_gpio.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776
  1. /*
  2. * Copyright (c) 2006-2022, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2017-10-20 ZYH the first version
  9. * 2017-11-15 ZYH update to 3.0.0
  10. */
  11. #include <rthw.h>
  12. #include <rtdevice.h>
  13. #include <board.h>
  14. #include <rtthread.h>
  15. #include "drivers/pin.h"
  16. #ifdef RT_USING_PIN
  17. #define __CH32_PIN(index, gpio, gpio_index) {index, GPIO##gpio##_CLK_ENABLE, GPIO##gpio, GPIO_Pin_##gpio_index}
  18. #define __CH32_PIN_DEFAULT {-1, 0, 0, 0}
  19. #define PIN_MODE_INPUT_AIN 0x05
  20. #define PIN_MODE_OUTPUT_AF_OD 0x06
  21. #define PIN_MODE_OUTPUT_AF_PP 0x07
  22. static void GPIOA_CLK_ENABLE(void)
  23. {
  24. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  25. }
  26. static void GPIOB_CLK_ENABLE(void)
  27. {
  28. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  29. }
  30. #if (CH32V10X_PIN_NUMBERS >36)
  31. static void GPIOC_CLK_ENABLE(void)
  32. {
  33. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
  34. }
  35. #endif
  36. #if (CH32V10X_PIN_NUMBERS >48)
  37. static void GPIOD_CLK_ENABLE(void)
  38. {
  39. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
  40. }
  41. #endif
  42. #if (CH32V10X_PIN_NUMBERS >64)
  43. static void GPIOE_CLK_ENABLE(void)
  44. {
  45. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);
  46. }
  47. #endif
  48. /* STM32 GPIO driver */
  49. struct pin_index
  50. {
  51. int index;
  52. void (*rcc)(void);
  53. GPIO_TypeDef *gpio;
  54. uint32_t pin;
  55. };
  56. static const struct pin_index pins[] =
  57. {
  58. #if (CH32V10X_PIN_NUMBERS == 36)
  59. __CH32_PIN_DEFAULT,
  60. __CH32_PIN_DEFAULT,
  61. __CH32_PIN_DEFAULT,
  62. __CH32_PIN_DEFAULT,
  63. __CH32_PIN_DEFAULT,
  64. __CH32_PIN_DEFAULT,
  65. __CH32_PIN_DEFAULT,
  66. __CH32_PIN(7, A, 0),
  67. __CH32_PIN(8, A, 1),
  68. __CH32_PIN(9, A, 2),
  69. __CH32_PIN(10, A, 3),
  70. __CH32_PIN(11, A, 4),
  71. __CH32_PIN(12, A, 5),
  72. __CH32_PIN(13, A, 6),
  73. __CH32_PIN(14, A, 7),
  74. __CH32_PIN(15, B, 0),
  75. __CH32_PIN(16, B, 1),
  76. __CH32_PIN(17, B, 2),
  77. __CH32_PIN_DEFAULT,
  78. __CH32_PIN_DEFAULT,
  79. __CH32_PIN(20, A, 8),
  80. __CH32_PIN(21, A, 9),
  81. __CH32_PIN(22, A, 10),
  82. __CH32_PIN(23, A, 11),
  83. __CH32_PIN(24, A, 12),
  84. __CH32_PIN(25, A, 13),
  85. __CH32_PIN_DEFAULT,
  86. __CH32_PIN_DEFAULT,
  87. __CH32_PIN(28, A, 14),
  88. __CH32_PIN(29, A, 15),
  89. __CH32_PIN(30, B, 3),
  90. __CH32_PIN(31, B, 4),
  91. __CH32_PIN(32, B, 5),
  92. __CH32_PIN(33, B, 6),
  93. __CH32_PIN(34, B, 7),
  94. __CH32_PIN_DEFAULT,
  95. __CH32_PIN_DEFAULT,
  96. #endif
  97. #if (CH32V10X_PIN_NUMBERS == 48)
  98. __CH32_PIN_DEFAULT,
  99. __CH32_PIN_DEFAULT,
  100. __CH32_PIN(2, C, 13),
  101. __CH32_PIN(3, C, 14),
  102. __CH32_PIN(4, C, 15),
  103. __CH32_PIN_DEFAULT,
  104. __CH32_PIN_DEFAULT,
  105. __CH32_PIN_DEFAULT,
  106. __CH32_PIN_DEFAULT,
  107. __CH32_PIN_DEFAULT,
  108. __CH32_PIN(10, A, 0),
  109. __CH32_PIN(11, A, 1),
  110. __CH32_PIN(12, A, 2),
  111. __CH32_PIN(13, A, 3),
  112. __CH32_PIN(14, A, 4),
  113. __CH32_PIN(15, A, 5),
  114. __CH32_PIN(16, A, 6),
  115. __CH32_PIN(17, A, 7),
  116. __CH32_PIN(18, B, 0),
  117. __CH32_PIN(19, B, 1),
  118. __CH32_PIN(20, B, 2),
  119. __CH32_PIN(21, B, 10),
  120. __CH32_PIN(22, B, 11),
  121. __CH32_PIN_DEFAULT,
  122. __CH32_PIN_DEFAULT,
  123. __CH32_PIN(25, B, 12),
  124. __CH32_PIN(26, B, 13),
  125. __CH32_PIN(27, B, 14),
  126. __CH32_PIN(28, B, 15),
  127. __CH32_PIN(29, A, 8),
  128. __CH32_PIN(30, A, 9),
  129. __CH32_PIN(31, A, 10),
  130. __CH32_PIN(32, A, 11),
  131. __CH32_PIN(33, A, 12),
  132. __CH32_PIN(34, A, 13),
  133. __CH32_PIN_DEFAULT,
  134. __CH32_PIN_DEFAULT,
  135. __CH32_PIN(37, A, 14),
  136. __CH32_PIN(38, A, 15),
  137. __CH32_PIN(39, B, 3),
  138. __CH32_PIN(40, B, 4),
  139. __CH32_PIN(41, B, 5),
  140. __CH32_PIN(42, B, 6),
  141. __CH32_PIN(43, B, 7),
  142. __CH32_PIN_DEFAULT,
  143. __CH32_PIN(45, B, 8),
  144. __CH32_PIN(46, B, 9),
  145. __CH32_PIN_DEFAULT,
  146. __CH32_PIN_DEFAULT,
  147. #endif
  148. #if (CH32V10X_PIN_NUMBERS == 64)
  149. __CH32_PIN_DEFAULT,
  150. __CH32_PIN_DEFAULT,
  151. __CH32_PIN(2, C, 13),
  152. __CH32_PIN(3, C, 14),
  153. __CH32_PIN(4, C, 15),
  154. __CH32_PIN(5, D, 0),
  155. __CH32_PIN(6, D, 1),
  156. __CH32_PIN_DEFAULT,
  157. __CH32_PIN(8, C, 0),
  158. __CH32_PIN(9, C, 1),
  159. __CH32_PIN(10, C, 2),
  160. __CH32_PIN(11, C, 3),
  161. __CH32_PIN_DEFAULT,
  162. __CH32_PIN_DEFAULT,
  163. __CH32_PIN(14, A, 0),
  164. __CH32_PIN(15, A, 1),
  165. __CH32_PIN(16, A, 2),
  166. __CH32_PIN(17, A, 3),
  167. __CH32_PIN_DEFAULT,
  168. __CH32_PIN_DEFAULT,
  169. __CH32_PIN(20, A, 4),
  170. __CH32_PIN(21, A, 5),
  171. __CH32_PIN(22, A, 6),
  172. __CH32_PIN(23, A, 7),
  173. __CH32_PIN(24, C, 4),
  174. __CH32_PIN(25, C, 5),
  175. __CH32_PIN(26, B, 0),
  176. __CH32_PIN(27, B, 1),
  177. __CH32_PIN(28, B, 2),
  178. __CH32_PIN(29, B, 10),
  179. __CH32_PIN(30, B, 11),
  180. __CH32_PIN_DEFAULT,
  181. __CH32_PIN_DEFAULT,
  182. __CH32_PIN(33, B, 12),
  183. __CH32_PIN(34, B, 13),
  184. __CH32_PIN(35, B, 14),
  185. __CH32_PIN(36, B, 15),
  186. __CH32_PIN(37, C, 6),
  187. __CH32_PIN(38, C, 7),
  188. __CH32_PIN(39, C, 8),
  189. __CH32_PIN(40, C, 9),
  190. __CH32_PIN(41, A, 8),
  191. __CH32_PIN(42, A, 9),
  192. __CH32_PIN(43, A, 10),
  193. __CH32_PIN(44, A, 11),
  194. __CH32_PIN(45, A, 12),
  195. __CH32_PIN(46, A, 13),
  196. __CH32_PIN_DEFAULT,
  197. __CH32_PIN_DEFAULT,
  198. __CH32_PIN(49, A, 14),
  199. __CH32_PIN(50, A, 15),
  200. __CH32_PIN(51, C, 10),
  201. __CH32_PIN(52, C, 11),
  202. __CH32_PIN(53, C, 12),
  203. __CH32_PIN(54, D, 2),
  204. __CH32_PIN(55, B, 3),
  205. __CH32_PIN(56, B, 4),
  206. __CH32_PIN(57, B, 5),
  207. __CH32_PIN(58, B, 6),
  208. __CH32_PIN(59, B, 7),
  209. __CH32_PIN_DEFAULT,
  210. __CH32_PIN(61, B, 8),
  211. __CH32_PIN(62, B, 9),
  212. __CH32_PIN_DEFAULT,
  213. __CH32_PIN_DEFAULT,
  214. #endif
  215. #if (CH32V10X_PIN_NUMBERS == 100)
  216. __CH32_PIN_DEFAULT,
  217. __CH32_PIN(1, E, 2),
  218. __CH32_PIN(2, E, 3),
  219. __CH32_PIN(3, E, 4),
  220. __CH32_PIN(4, E, 5),
  221. __CH32_PIN(5, E, 6),
  222. __CH32_PIN_DEFAULT,
  223. __CH32_PIN(7, C, 13),
  224. __CH32_PIN(8, C, 14),
  225. __CH32_PIN(9, C, 15),
  226. __CH32_PIN_DEFAULT,
  227. __CH32_PIN_DEFAULT,
  228. __CH32_PIN_DEFAULT,
  229. __CH32_PIN_DEFAULT,
  230. __CH32_PIN_DEFAULT,
  231. __CH32_PIN(15, C, 0),
  232. __CH32_PIN(16, C, 1),
  233. __CH32_PIN(17, C, 2),
  234. __CH32_PIN(18, C, 3),
  235. __CH32_PIN_DEFAULT,
  236. __CH32_PIN_DEFAULT,
  237. __CH32_PIN_DEFAULT,
  238. __CH32_PIN_DEFAULT,
  239. __CH32_PIN(23, A, 0),
  240. __CH32_PIN(24, A, 1),
  241. __CH32_PIN(25, A, 2),
  242. __CH32_PIN(26, A, 3),
  243. __CH32_PIN_DEFAULT,
  244. __CH32_PIN_DEFAULT,
  245. __CH32_PIN(29, A, 4),
  246. __CH32_PIN(30, A, 5),
  247. __CH32_PIN(31, A, 6),
  248. __CH32_PIN(32, A, 7),
  249. __CH32_PIN(33, C, 4),
  250. __CH32_PIN(34, C, 5),
  251. __CH32_PIN(35, B, 0),
  252. __CH32_PIN(36, B, 1),
  253. __CH32_PIN(37, B, 2),
  254. __CH32_PIN(38, E, 7),
  255. __CH32_PIN(39, E, 8),
  256. __CH32_PIN(40, E, 9),
  257. __CH32_PIN(41, E, 10),
  258. __CH32_PIN(42, E, 11),
  259. __CH32_PIN(43, E, 12),
  260. __CH32_PIN(44, E, 13),
  261. __CH32_PIN(45, E, 14),
  262. __CH32_PIN(46, E, 15),
  263. __CH32_PIN(47, B, 10),
  264. __CH32_PIN(48, B, 11),
  265. __CH32_PIN_DEFAULT,
  266. __CH32_PIN_DEFAULT,
  267. __CH32_PIN(51, B, 12),
  268. __CH32_PIN(52, B, 13),
  269. __CH32_PIN(53, B, 14),
  270. __CH32_PIN(54, B, 15),
  271. __CH32_PIN(55, D, 8),
  272. __CH32_PIN(56, D, 9),
  273. __CH32_PIN(57, D, 10),
  274. __CH32_PIN(58, D, 11),
  275. __CH32_PIN(59, D, 12),
  276. __CH32_PIN(60, D, 13),
  277. __CH32_PIN(61, D, 14),
  278. __CH32_PIN(62, D, 15),
  279. __CH32_PIN(63, C, 6),
  280. __CH32_PIN(64, C, 7),
  281. __CH32_PIN(65, C, 8),
  282. __CH32_PIN(66, C, 9),
  283. __CH32_PIN(67, A, 8),
  284. __CH32_PIN(68, A, 9),
  285. __CH32_PIN(69, A, 10),
  286. __CH32_PIN(70, A, 11),
  287. __CH32_PIN(71, A, 12),
  288. __CH32_PIN(72, A, 13),
  289. __CH32_PIN_DEFAULT,
  290. __CH32_PIN_DEFAULT,
  291. __CH32_PIN_DEFAULT,
  292. __CH32_PIN(76, A, 14),
  293. __CH32_PIN(77, A, 15),
  294. __CH32_PIN(78, C, 10),
  295. __CH32_PIN(79, C, 11),
  296. __CH32_PIN(80, C, 12),
  297. __CH32_PIN(81, D, 0),
  298. __CH32_PIN(82, D, 1),
  299. __CH32_PIN(83, D, 2),
  300. __CH32_PIN(84, D, 3),
  301. __CH32_PIN(85, D, 4),
  302. __CH32_PIN(86, D, 5),
  303. __CH32_PIN(87, D, 6),
  304. __CH32_PIN(88, D, 7),
  305. __CH32_PIN(89, B, 3),
  306. __CH32_PIN(90, B, 4),
  307. __CH32_PIN(91, B, 5),
  308. __CH32_PIN(92, B, 6),
  309. __CH32_PIN(93, B, 7),
  310. __CH32_PIN_DEFAULT,
  311. __CH32_PIN(95, B, 8),
  312. __CH32_PIN(96, B, 9),
  313. __CH32_PIN(97, E, 0),
  314. __CH32_PIN(98, E, 1),
  315. __CH32_PIN_DEFAULT,
  316. __CH32_PIN_DEFAULT,
  317. #endif
  318. };
  319. struct pin_irq_map
  320. {
  321. rt_uint16_t pinbit;
  322. IRQn_Type irqno;
  323. };
  324. static const struct pin_irq_map pin_irq_map[] =
  325. {
  326. {GPIO_Pin_0, EXTI0_IRQn},
  327. {GPIO_Pin_1, EXTI1_IRQn},
  328. {GPIO_Pin_2, EXTI2_IRQn},
  329. {GPIO_Pin_3, EXTI3_IRQn},
  330. {GPIO_Pin_4, EXTI4_IRQn},
  331. {GPIO_Pin_5, EXTI9_5_IRQn},
  332. {GPIO_Pin_6, EXTI9_5_IRQn},
  333. {GPIO_Pin_7, EXTI9_5_IRQn},
  334. {GPIO_Pin_8, EXTI9_5_IRQn},
  335. {GPIO_Pin_9, EXTI9_5_IRQn},
  336. {GPIO_Pin_10, EXTI15_10_IRQn},
  337. {GPIO_Pin_11, EXTI15_10_IRQn},
  338. {GPIO_Pin_12, EXTI15_10_IRQn},
  339. {GPIO_Pin_13, EXTI15_10_IRQn},
  340. {GPIO_Pin_14, EXTI15_10_IRQn},
  341. {GPIO_Pin_15, EXTI15_10_IRQn},
  342. };
  343. struct rt_pin_irq_hdr pin_irq_hdr_tab[] =
  344. {
  345. { -1, 0, RT_NULL, RT_NULL},
  346. { -1, 0, RT_NULL, RT_NULL},
  347. { -1, 0, RT_NULL, RT_NULL},
  348. { -1, 0, RT_NULL, RT_NULL},
  349. { -1, 0, RT_NULL, RT_NULL},
  350. { -1, 0, RT_NULL, RT_NULL},
  351. { -1, 0, RT_NULL, RT_NULL},
  352. { -1, 0, RT_NULL, RT_NULL},
  353. { -1, 0, RT_NULL, RT_NULL},
  354. { -1, 0, RT_NULL, RT_NULL},
  355. { -1, 0, RT_NULL, RT_NULL},
  356. { -1, 0, RT_NULL, RT_NULL},
  357. { -1, 0, RT_NULL, RT_NULL},
  358. { -1, 0, RT_NULL, RT_NULL},
  359. { -1, 0, RT_NULL, RT_NULL},
  360. { -1, 0, RT_NULL, RT_NULL},
  361. };
  362. #define ITEM_NUM(items) sizeof(items) / sizeof(items[0])
  363. const struct pin_index *get_pin(uint8_t pin)
  364. {
  365. const struct pin_index *index;
  366. if (pin < ITEM_NUM(pins))
  367. {
  368. index = &pins[pin];
  369. if (index->index == -1)
  370. index = RT_NULL;
  371. }
  372. else
  373. {
  374. index = RT_NULL;
  375. }
  376. return index;
  377. };
  378. void ch32_pin_write(rt_device_t dev, rt_base_t pin, rt_base_t value)
  379. {
  380. const struct pin_index *index;
  381. index = get_pin(pin);
  382. if (index == RT_NULL)
  383. {
  384. return;
  385. }
  386. GPIO_WriteBit(index->gpio, index->pin, (BitAction)value);
  387. }
  388. int ch32_pin_read(rt_device_t dev, rt_base_t pin)
  389. {
  390. int value;
  391. const struct pin_index *index;
  392. value = PIN_LOW;
  393. index = get_pin(pin);
  394. if (index == RT_NULL)
  395. {
  396. return value;
  397. }
  398. value = GPIO_ReadInputDataBit(index->gpio, index->pin);
  399. return value;
  400. }
  401. void ch32_pin_mode(rt_device_t dev, rt_base_t pin, rt_base_t mode)
  402. {
  403. const struct pin_index *index;
  404. GPIO_InitTypeDef GPIO_InitStruct;
  405. index = get_pin(pin);
  406. if (index == RT_NULL)
  407. {
  408. return;
  409. }
  410. rt_kprintf("get pin index\r\n");
  411. /* GPIO Periph clock enable */
  412. index->rcc();
  413. /* Configure GPIO_InitStructure */
  414. GPIO_InitStruct.GPIO_Pin = index->pin;
  415. GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
  416. GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  417. if (mode == PIN_MODE_OUTPUT)
  418. {
  419. /* output setting */
  420. GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
  421. }
  422. else if (mode == PIN_MODE_INPUT_AIN)
  423. {
  424. /* input setting: not pull. */
  425. GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;
  426. }
  427. else if (mode == PIN_MODE_INPUT)
  428. {
  429. /* input setting: pull up. */
  430. GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  431. }
  432. else if (mode == PIN_MODE_INPUT_PULLDOWN)
  433. {
  434. /* input setting: pull down. */
  435. GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPD;
  436. // GPIO_InitStruct.Pull = GPIO_PULLDOWN;
  437. }
  438. else if (mode == PIN_MODE_INPUT_PULLUP)
  439. {
  440. /* output setting: od. */
  441. GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
  442. // GPIO_InitStruct.Pull = GPIO_NOPULL;
  443. }
  444. else if (mode == PIN_MODE_OUTPUT_OD)
  445. {
  446. GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_OD;
  447. }
  448. else if (mode == PIN_MODE_OUTPUT_AF_OD)
  449. {
  450. GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_OD;
  451. }
  452. else if (mode == PIN_MODE_OUTPUT_AF_PP)
  453. {
  454. GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
  455. }
  456. GPIO_Init(index->gpio, &GPIO_InitStruct);
  457. }
  458. rt_inline rt_int32_t bit2bitno(rt_uint32_t bit)
  459. {
  460. int i;
  461. for (i = 0; i < 32; i++)
  462. {
  463. if ((0x01 << i) == bit)
  464. {
  465. return i;
  466. }
  467. }
  468. return -1;
  469. }
  470. rt_inline const struct pin_irq_map *get_pin_irq_map(uint32_t pinbit)
  471. {
  472. rt_int32_t mapindex = bit2bitno(pinbit);
  473. if (mapindex < 0 || mapindex >= ITEM_NUM(pin_irq_map))
  474. {
  475. return RT_NULL;
  476. }
  477. return &pin_irq_map[mapindex];
  478. };
  479. rt_err_t ch32_pin_attach_irq(struct rt_device *device, rt_int32_t pin,
  480. rt_uint32_t mode, void (*hdr)(void *args), void *args)
  481. {
  482. const struct pin_index *index;
  483. rt_base_t level;
  484. rt_int32_t irqindex = -1;
  485. index = get_pin(pin);
  486. if (index == RT_NULL)
  487. {
  488. return RT_ENOSYS;
  489. }
  490. irqindex = bit2bitno(index->pin);
  491. if (irqindex < 0 || irqindex >= ITEM_NUM(pin_irq_map))
  492. {
  493. return RT_ENOSYS;
  494. }
  495. level = rt_hw_interrupt_disable();
  496. if (pin_irq_hdr_tab[irqindex].pin == pin &&
  497. pin_irq_hdr_tab[irqindex].hdr == hdr &&
  498. pin_irq_hdr_tab[irqindex].mode == mode &&
  499. pin_irq_hdr_tab[irqindex].args == args)
  500. {
  501. rt_hw_interrupt_enable(level);
  502. return RT_EOK;
  503. }
  504. if (pin_irq_hdr_tab[irqindex].pin != -1)
  505. {
  506. rt_hw_interrupt_enable(level);
  507. return RT_EBUSY;
  508. }
  509. pin_irq_hdr_tab[irqindex].pin = pin;
  510. pin_irq_hdr_tab[irqindex].hdr = hdr;
  511. pin_irq_hdr_tab[irqindex].mode = mode;
  512. pin_irq_hdr_tab[irqindex].args = args;
  513. rt_hw_interrupt_enable(level);
  514. return RT_EOK;
  515. }
  516. rt_err_t ch32_pin_dettach_irq(struct rt_device *device, rt_int32_t pin)
  517. {
  518. const struct pin_index *index;
  519. rt_base_t level;
  520. rt_int32_t irqindex = -1;
  521. index = get_pin(pin);
  522. if (index == RT_NULL)
  523. {
  524. return RT_ENOSYS;
  525. }
  526. irqindex = bit2bitno(index->pin);
  527. if (irqindex < 0 || irqindex >= ITEM_NUM(pin_irq_map))
  528. {
  529. return RT_ENOSYS;
  530. }
  531. level = rt_hw_interrupt_disable();
  532. if (pin_irq_hdr_tab[irqindex].pin == -1)
  533. {
  534. rt_hw_interrupt_enable(level);
  535. return RT_EOK;
  536. }
  537. pin_irq_hdr_tab[irqindex].pin = -1;
  538. pin_irq_hdr_tab[irqindex].hdr = RT_NULL;
  539. pin_irq_hdr_tab[irqindex].mode = 0;
  540. pin_irq_hdr_tab[irqindex].args = RT_NULL;
  541. rt_hw_interrupt_enable(level);
  542. return RT_EOK;
  543. }
  544. rt_err_t ch32_pin_irq_enable(struct rt_device *device, rt_base_t pin,
  545. rt_uint32_t enabled)
  546. {
  547. const struct pin_index *index;
  548. const struct pin_irq_map *irqmap;
  549. rt_base_t level;
  550. rt_int32_t irqindex = -1;
  551. GPIO_InitTypeDef GPIO_InitStruct;
  552. EXTI_InitTypeDef EXTI_InitStructure;
  553. index = get_pin(pin);
  554. if (index == RT_NULL)
  555. {
  556. return RT_ENOSYS;
  557. }
  558. if (enabled == PIN_IRQ_ENABLE)
  559. {
  560. irqindex = bit2bitno(index->pin);
  561. if (irqindex < 0 || irqindex >= ITEM_NUM(pin_irq_map))
  562. {
  563. return RT_ENOSYS;
  564. }
  565. level = rt_hw_interrupt_disable();
  566. if (pin_irq_hdr_tab[irqindex].pin == -1)
  567. {
  568. rt_hw_interrupt_enable(level);
  569. return RT_ENOSYS;
  570. }
  571. irqmap = &pin_irq_map[irqindex];
  572. /* GPIO Periph clock enable */
  573. index->rcc();
  574. RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
  575. /* Configure GPIO_InitStructure */
  576. GPIO_InitStruct.GPIO_Pin = index->pin;
  577. GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  578. EXTI_InitStructure.EXTI_Line=index->pin;/* �ⲿ�ж��ߺ����źŶ�Ӧ */
  579. EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  580. EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  581. switch (pin_irq_hdr_tab[irqindex].mode)
  582. {
  583. case PIN_IRQ_MODE_RISING:
  584. GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPD;
  585. EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
  586. break;
  587. case PIN_IRQ_MODE_FALLING:
  588. GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
  589. EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  590. break;
  591. case PIN_IRQ_MODE_RISING_FALLING:
  592. GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  593. EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
  594. break;
  595. }
  596. GPIO_Init(index->gpio, &GPIO_InitStruct);
  597. EXTI_Init(&EXTI_InitStructure);
  598. NVIC_SetPriority(irqmap->irqno,5<<4);
  599. NVIC_EnableIRQ( irqmap->irqno );
  600. rt_hw_interrupt_enable(level);
  601. }
  602. else if (enabled == PIN_IRQ_DISABLE)
  603. {
  604. irqmap = get_pin_irq_map(index->pin);
  605. if (irqmap == RT_NULL)
  606. {
  607. return RT_ENOSYS;
  608. }
  609. NVIC_DisableIRQ(irqmap->irqno);
  610. }
  611. else
  612. {
  613. return RT_ENOSYS;
  614. }
  615. return RT_EOK;
  616. }
  617. const static struct rt_pin_ops _ch32_pin_ops =
  618. {
  619. ch32_pin_mode,
  620. ch32_pin_write,
  621. ch32_pin_read,
  622. ch32_pin_attach_irq,
  623. ch32_pin_dettach_irq,
  624. ch32_pin_irq_enable,
  625. };
  626. int rt_hw_pin_init(void)
  627. {
  628. int result;
  629. result = rt_device_pin_register("pin", &_ch32_pin_ops, RT_NULL);
  630. return result;
  631. }
  632. INIT_BOARD_EXPORT(rt_hw_pin_init);
  633. rt_inline void pin_irq_hdr(int irqno)
  634. {
  635. if (pin_irq_hdr_tab[irqno].hdr)
  636. {
  637. pin_irq_hdr_tab[irqno].hdr(pin_irq_hdr_tab[irqno].args);
  638. }
  639. }
  640. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
  641. {
  642. pin_irq_hdr(bit2bitno(GPIO_Pin));
  643. }
  644. void EXTI0_IRQHandler(void) __attribute__((interrupt()));
  645. void EXTI1_IRQHandler(void) __attribute__((interrupt()));
  646. void EXTI3_IRQHandler(void) __attribute__((interrupt()));
  647. void EXTI4_IRQHandler(void) __attribute__((interrupt()));
  648. void EXTI9_5_IRQHandler(void) __attribute__((interrupt()));
  649. void EXTI0_IRQHandler(void)
  650. {
  651. GET_INT_SP();
  652. rt_interrupt_enter();
  653. if(EXTI_GetITStatus(EXTI_Line0)!=RESET)
  654. {
  655. HAL_GPIO_EXTI_Callback(GPIO_Pin_0);
  656. EXTI_ClearITPendingBit(EXTI_Line0);
  657. }
  658. rt_interrupt_leave();
  659. FREE_INT_SP();
  660. }
  661. void EXTI1_IRQHandler(void)
  662. {
  663. GET_INT_SP();
  664. rt_interrupt_enter();
  665. if(EXTI_GetITStatus(EXTI_Line1)!=RESET)
  666. {
  667. HAL_GPIO_EXTI_Callback(GPIO_Pin_1);
  668. EXTI_ClearITPendingBit(EXTI_Line1);
  669. }
  670. rt_interrupt_leave();
  671. FREE_INT_SP();
  672. }
  673. void EXTI2_IRQHandler(void)
  674. {
  675. GET_INT_SP();
  676. rt_interrupt_enter();
  677. if(EXTI_GetITStatus(EXTI_Line2)!=RESET)
  678. {
  679. HAL_GPIO_EXTI_Callback(GPIO_Pin_2);
  680. EXTI_ClearITPendingBit(EXTI_Line2);
  681. }
  682. rt_interrupt_leave();
  683. FREE_INT_SP();
  684. }
  685. void EXTI3_IRQHandler(void)
  686. {
  687. GET_INT_SP();
  688. rt_interrupt_enter();
  689. if(EXTI_GetITStatus(EXTI_Line3)!=RESET)
  690. {
  691. HAL_GPIO_EXTI_Callback(GPIO_Pin_3);
  692. EXTI_ClearITPendingBit(EXTI_Line3);
  693. }
  694. rt_interrupt_leave();
  695. FREE_INT_SP();
  696. }
  697. void EXTI4_IRQHandler(void)
  698. {
  699. GET_INT_SP();
  700. rt_interrupt_enter();
  701. if(EXTI_GetITStatus(EXTI_Line4)!=RESET)
  702. {
  703. HAL_GPIO_EXTI_Callback(GPIO_Pin_4);
  704. EXTI_ClearITPendingBit(EXTI_Line4);
  705. }
  706. rt_interrupt_leave();
  707. FREE_INT_SP();
  708. }
  709. void EXTI9_5_IRQHandler(void)
  710. {
  711. GET_INT_SP();
  712. rt_interrupt_enter();
  713. if( (EXTI_GetITStatus(EXTI_Line5)!=RESET)|| \
  714. (EXTI_GetITStatus(EXTI_Line6)!=RESET)|| \
  715. (EXTI_GetITStatus(EXTI_Line7)!=RESET)|| \
  716. (EXTI_GetITStatus(EXTI_Line8)!=RESET)|| \
  717. (EXTI_GetITStatus(EXTI_Line9)!=RESET) )
  718. {
  719. HAL_GPIO_EXTI_Callback(GPIO_Pin_5);
  720. HAL_GPIO_EXTI_Callback(GPIO_Pin_6);
  721. HAL_GPIO_EXTI_Callback(GPIO_Pin_7);
  722. HAL_GPIO_EXTI_Callback(GPIO_Pin_8);
  723. HAL_GPIO_EXTI_Callback(GPIO_Pin_9);
  724. EXTI_ClearITPendingBit(EXTI_Line5|EXTI_Line6|EXTI_Line7|EXTI_Line8|EXTI_Line9);
  725. }
  726. rt_interrupt_leave();
  727. FREE_INT_SP();
  728. }
  729. #endif