drv_gpio.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533
  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-10-23 yuzrain the first version
  9. */
  10. #include <rthw.h>
  11. #include <rtdevice.h>
  12. #include "board.h"
  13. #include "drv_gpio.h"
  14. #ifdef RT_USING_PIN
  15. #define __ES32F0_PIN(index, gpio, gpio_index) {index, GPIO##gpio, gpio_index}
  16. #define __ES32F0_PIN_DEFAULT {-1, 0, 0}
  17. /* ES32F0 GPIO driver */
  18. struct pin_index
  19. {
  20. int index;
  21. GPIO_TypeDef *gpio;
  22. uint32_t pin;
  23. };
  24. static const struct pin_index pins[] =
  25. {
  26. __ES32F0_PIN_DEFAULT,
  27. __ES32F0_PIN_DEFAULT,
  28. __ES32F0_PIN(2, C, 13),
  29. __ES32F0_PIN(3, C, 14),
  30. __ES32F0_PIN(4, C, 15),
  31. __ES32F0_PIN(5, D, 14),
  32. __ES32F0_PIN(6, D, 15),
  33. __ES32F0_PIN(7, D, 13),
  34. __ES32F0_PIN(8, C, 0),
  35. __ES32F0_PIN(9, C, 1),
  36. __ES32F0_PIN(10, C, 2),
  37. __ES32F0_PIN(11, C, 3),
  38. __ES32F0_PIN_DEFAULT,
  39. __ES32F0_PIN_DEFAULT,
  40. __ES32F0_PIN(14, A, 0),
  41. __ES32F0_PIN(15, A, 1),
  42. __ES32F0_PIN(16, A, 2),
  43. __ES32F0_PIN(17, A, 3),
  44. __ES32F0_PIN(18, D, 0),
  45. __ES32F0_PIN(19, D, 1),
  46. __ES32F0_PIN(20, A, 4),
  47. __ES32F0_PIN(21, A, 5),
  48. __ES32F0_PIN(22, A, 6),
  49. __ES32F0_PIN(23, A, 7),
  50. __ES32F0_PIN(24, C, 4),
  51. __ES32F0_PIN(25, C, 5),
  52. __ES32F0_PIN(26, B, 0),
  53. __ES32F0_PIN(27, B, 1),
  54. __ES32F0_PIN(28, B, 2),
  55. __ES32F0_PIN(29, B, 10),
  56. __ES32F0_PIN(30, B, 11),
  57. __ES32F0_PIN_DEFAULT,
  58. __ES32F0_PIN_DEFAULT,
  59. __ES32F0_PIN(33, B, 12),
  60. __ES32F0_PIN(34, B, 13),
  61. __ES32F0_PIN(35, B, 14),
  62. __ES32F0_PIN(36, B, 15),
  63. __ES32F0_PIN(37, C, 6),
  64. __ES32F0_PIN(38, C, 7),
  65. __ES32F0_PIN(39, C, 8),
  66. __ES32F0_PIN(40, C, 9),
  67. __ES32F0_PIN(41, A, 8),
  68. __ES32F0_PIN(42, A, 9),
  69. __ES32F0_PIN(43, A, 10),
  70. __ES32F0_PIN(44, A, 11),
  71. __ES32F0_PIN(45, A, 12),
  72. __ES32F0_PIN(46, A, 13),
  73. __ES32F0_PIN_DEFAULT,
  74. __ES32F0_PIN_DEFAULT,
  75. __ES32F0_PIN(49, A, 14),
  76. __ES32F0_PIN(50, A, 15),
  77. __ES32F0_PIN(51, C, 10),
  78. __ES32F0_PIN(52, C, 11),
  79. __ES32F0_PIN(53, C, 12),
  80. __ES32F0_PIN(54, D, 2),
  81. __ES32F0_PIN(55, B, 3),
  82. __ES32F0_PIN(56, B, 4),
  83. __ES32F0_PIN(57, B, 5),
  84. __ES32F0_PIN(58, B, 6),
  85. __ES32F0_PIN(59, B, 7),
  86. __ES32F0_PIN(60, D, 3),
  87. __ES32F0_PIN(61, B, 8),
  88. __ES32F0_PIN(62, B, 9),
  89. __ES32F0_PIN_DEFAULT,
  90. __ES32F0_PIN_DEFAULT,
  91. };
  92. struct pin_irq_map
  93. {
  94. rt_uint16_t pinbit;
  95. IRQn_Type irqno;
  96. };
  97. static const struct pin_irq_map pin_irq_map[] =
  98. {
  99. {0, EXTI_0to1_IRQn},
  100. {1, EXTI_0to1_IRQn},
  101. {2, EXTI_2to3_IRQn},
  102. {3, EXTI_2to3_IRQn},
  103. {4, EXTI_4to15_IRQn},
  104. {5, EXTI_4to15_IRQn},
  105. {6, EXTI_4to15_IRQn},
  106. {7, EXTI_4to15_IRQn},
  107. {8, EXTI_4to15_IRQn},
  108. {9, EXTI_4to15_IRQn},
  109. {10, EXTI_4to15_IRQn},
  110. {11, EXTI_4to15_IRQn},
  111. {12, EXTI_4to15_IRQn},
  112. {13, EXTI_4to15_IRQn},
  113. {14, EXTI_4to15_IRQn},
  114. {15, EXTI_4to15_IRQn},
  115. };
  116. struct rt_pin_irq_hdr pin_irq_hdr_tab[] =
  117. {
  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. { -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. };
  135. #define ITEM_NUM(items) sizeof(items) / sizeof(items[0])
  136. const struct pin_index *get_pin(uint8_t pin)
  137. {
  138. const struct pin_index *index;
  139. if (pin < ITEM_NUM(pins))
  140. {
  141. index = &pins[pin];
  142. if (index->index == -1)
  143. index = RT_NULL;
  144. }
  145. else
  146. {
  147. index = RT_NULL;
  148. }
  149. return index;
  150. };
  151. void es32f0_pin_write(rt_device_t dev, rt_base_t pin, rt_base_t value)
  152. {
  153. const struct pin_index *index;
  154. index = get_pin(pin);
  155. if (index == RT_NULL)
  156. {
  157. return;
  158. }
  159. /* Write GPIO */
  160. if (value == 0)
  161. SET_BIT(index->gpio->BSBR, 0x1<<(index->pin+16));
  162. else
  163. SET_BIT(index->gpio->BSBR, 0x1<<index->pin);
  164. }
  165. int es32f0_pin_read(rt_device_t dev, rt_base_t pin)
  166. {
  167. int value;
  168. const struct pin_index *index;
  169. value = PIN_LOW;
  170. index = get_pin(pin);
  171. if (index == RT_NULL)
  172. {
  173. return value;
  174. }
  175. /* Read the GPIO value with the spcified index */
  176. value = (index->gpio->IDATA & (0x1<<index->pin)) != 0;
  177. return value;
  178. }
  179. void es32f0_pin_mode(rt_device_t dev, rt_base_t pin, rt_base_t mode)
  180. {
  181. const struct pin_index *index;
  182. GPIO_TypeDef *gpiox;
  183. index = get_pin(pin);
  184. if (index == RT_NULL)
  185. {
  186. return;
  187. }
  188. /* Get the IO port */
  189. gpiox = index->gpio;
  190. /* Config GPIO */
  191. switch(mode)
  192. {
  193. case PIN_MODE_OUTPUT:
  194. {
  195. /* pushpull & output & 16mA */
  196. MODIFY_REG(gpiox->MOD, (0x3<<(index->pin*2)), (0x1<<(index->pin*2)));
  197. CLEAR_BIT(gpiox->OT, (0x1<<index->pin));
  198. CLEAR_BIT(gpiox->DS, (0x1<<index->pin));
  199. break;
  200. }
  201. case PIN_MODE_OUTPUT_OD:
  202. {
  203. /* opendrain & output & 16mA */
  204. MODIFY_REG(gpiox->MOD, (0x3<<index->pin), (0x1<<index->pin));
  205. SET_BIT(gpiox->OT, (0x1<<index->pin));
  206. CLEAR_BIT(gpiox->DS, (0x1<<index->pin));
  207. break;
  208. }
  209. case PIN_MODE_INPUT:
  210. {
  211. /* input & no pull & CMOS & filter */
  212. MODIFY_REG(gpiox->MOD, (0x3<<index->pin), (0x0<<index->pin));
  213. MODIFY_REG(gpiox->PUD, (0x3<<index->pin), (0x0<<index->pin));
  214. SET_BIT(gpiox->IST, (0x1<<index->pin));
  215. SET_BIT(gpiox->FIR, (0x1<<index->pin));
  216. break;
  217. }
  218. case PIN_MODE_INPUT_PULLUP:
  219. {
  220. /* input & pull up & CMOS & filter */
  221. MODIFY_REG(gpiox->MOD, (0x3<<index->pin), (0x0<<index->pin));
  222. MODIFY_REG(gpiox->PUD, (0x3<<index->pin), (0x1<<index->pin));
  223. SET_BIT(gpiox->IST, (0x1<<index->pin));
  224. SET_BIT(gpiox->FIR, (0x1<<index->pin));
  225. break;
  226. }
  227. case PIN_MODE_INPUT_PULLDOWN:
  228. {
  229. /* input & pull down & CMOS & filter */
  230. MODIFY_REG(gpiox->MOD, (0x3<<index->pin), (0x0<<index->pin));
  231. MODIFY_REG(gpiox->PUD, (0x3<<index->pin), (0x2<<index->pin));
  232. SET_BIT(gpiox->IST, (0x1<<index->pin));
  233. SET_BIT(gpiox->FIR, (0x1<<index->pin));
  234. break;
  235. }
  236. default:
  237. {
  238. /* output */
  239. MODIFY_REG(gpiox->MOD, (0x3<<index->pin), (0x1<<index->pin));
  240. }
  241. }
  242. }
  243. rt_inline const struct pin_irq_map *get_pin_irq_map(rt_uint16_t gpio_pin)
  244. {
  245. rt_int32_t mapindex = gpio_pin & 0x00FF;
  246. if (mapindex < 0 || mapindex >= ITEM_NUM(pin_irq_map))
  247. {
  248. return RT_NULL;
  249. }
  250. return &pin_irq_map[mapindex];
  251. };
  252. rt_err_t es32f0_pin_attach_irq(struct rt_device *device, rt_int32_t pin,
  253. rt_uint32_t mode, void (*hdr)(void *args), void *args)
  254. {
  255. const struct pin_index *index;
  256. rt_base_t level;
  257. rt_int32_t irqindex;
  258. index = get_pin(pin);
  259. if (index == RT_NULL)
  260. {
  261. return RT_ENOSYS;
  262. }
  263. /* pin no. convert to dec no. */
  264. for (irqindex = 0; irqindex < 16; irqindex++)
  265. {
  266. if ((0x01 << irqindex) == index->pin)
  267. {
  268. break;
  269. }
  270. }
  271. if (irqindex < 0 || irqindex >= ITEM_NUM(pin_irq_map))
  272. {
  273. return RT_ENOSYS;
  274. }
  275. level = rt_hw_interrupt_disable();
  276. if (pin_irq_hdr_tab[irqindex].pin == pin &&
  277. pin_irq_hdr_tab[irqindex].hdr == hdr &&
  278. pin_irq_hdr_tab[irqindex].mode == mode &&
  279. pin_irq_hdr_tab[irqindex].args == args)
  280. {
  281. rt_hw_interrupt_enable(level);
  282. return RT_EOK;
  283. }
  284. if (pin_irq_hdr_tab[irqindex].pin != -1)
  285. {
  286. rt_hw_interrupt_enable(level);
  287. return RT_EBUSY;
  288. }
  289. pin_irq_hdr_tab[irqindex].pin = pin;
  290. pin_irq_hdr_tab[irqindex].hdr = hdr;
  291. pin_irq_hdr_tab[irqindex].mode = mode;
  292. pin_irq_hdr_tab[irqindex].args = args;
  293. rt_hw_interrupt_enable(level);
  294. return RT_EOK;
  295. }
  296. rt_err_t es32f0_pin_detach_irq(struct rt_device *device, rt_int32_t pin)
  297. {
  298. const struct pin_index *index;
  299. rt_base_t level;
  300. rt_int32_t irqindex = -1;
  301. index = get_pin(pin);
  302. if (index == RT_NULL)
  303. {
  304. return RT_ENOSYS;
  305. }
  306. irqindex = index->pin & 0x00FF;
  307. if (irqindex < 0 || irqindex >= ITEM_NUM(pin_irq_map))
  308. {
  309. return RT_ENOSYS;
  310. }
  311. level = rt_hw_interrupt_disable();
  312. if (pin_irq_hdr_tab[irqindex].pin == -1)
  313. {
  314. rt_hw_interrupt_enable(level);
  315. return RT_EOK;
  316. }
  317. pin_irq_hdr_tab[irqindex].pin = -1;
  318. pin_irq_hdr_tab[irqindex].hdr = RT_NULL;
  319. pin_irq_hdr_tab[irqindex].mode = 0;
  320. pin_irq_hdr_tab[irqindex].args = RT_NULL;
  321. rt_hw_interrupt_enable(level);
  322. return RT_EOK;
  323. }
  324. rt_err_t es32f0_pin_irq_enable(struct rt_device *device, rt_base_t pin,
  325. rt_uint32_t enabled)
  326. {
  327. const struct pin_index *index;
  328. const struct pin_irq_map *irqmap;
  329. GPIO_TypeDef *gpiox;
  330. rt_base_t level;
  331. rt_int32_t irqindex = -1;
  332. index = get_pin(pin);
  333. if (index == RT_NULL)
  334. {
  335. return RT_ENOSYS;
  336. }
  337. /* Get the IO port */
  338. gpiox = index->gpio;
  339. if (enabled == PIN_IRQ_ENABLE)
  340. {
  341. /* pin no. convert to dec no. */
  342. for (irqindex = 0; irqindex < 16; irqindex++)
  343. {
  344. if ((0x01 << irqindex) == index->pin)
  345. {
  346. break;
  347. }
  348. }
  349. if (irqindex < 0 || irqindex >= ITEM_NUM(pin_irq_map))
  350. {
  351. return RT_ENOSYS;
  352. }
  353. level = rt_hw_interrupt_disable();
  354. if (pin_irq_hdr_tab[irqindex].pin == -1)
  355. {
  356. rt_hw_interrupt_enable(level);
  357. return RT_ENOSYS;
  358. }
  359. irqmap = &pin_irq_map[irqindex];
  360. /* Config EXTI */
  361. MODIFY_REG(gpiox->MOD, (0x3<<index->pin), (0x0<<index->pin));
  362. SET_BIT(gpiox->FIR, index->pin);
  363. SET_BIT(gpiox->IST, index->pin);
  364. MODIFY_REG(((uint32_t *)(&EXTI->ICFG1))[index->pin/8],
  365. 0xF<<(index->pin%8),
  366. (((uint32_t)(index->gpio) - AHB2_BASE)/0x400)<<(index->pin%8));
  367. SET_BIT(EXTI->DB, 0x1<<index->pin);
  368. switch (pin_irq_hdr_tab[irqindex].mode)
  369. {
  370. case PIN_IRQ_MODE_RISING:
  371. {
  372. /* pull down the pin */
  373. MODIFY_REG(gpiox->PUD, (0x3<<index->pin), (0x2<<index->pin));
  374. /* Enable EXTI rising interrupt and disable falling interrupt */
  375. SET_BIT(EXTI->RTS, (0x1<<index->pin));
  376. CLEAR_BIT(EXTI->FTS, (0x1<<index->pin));
  377. break;
  378. }
  379. case PIN_IRQ_MODE_FALLING:
  380. {
  381. /* pull up the pin */
  382. MODIFY_REG(gpiox->PUD, (0x3<<index->pin), (0x1<<index->pin));
  383. /* Enable EXTI falling interrupt and disable rising interrupt */
  384. CLEAR_BIT(EXTI->RTS, (0x1<<index->pin));
  385. SET_BIT(EXTI->FTS, (0x1<<index->pin));
  386. break;
  387. }
  388. case PIN_IRQ_MODE_RISING_FALLING:
  389. {
  390. /* pull up the pin */
  391. MODIFY_REG(gpiox->PUD, (0x3<<index->pin), (0x1<<index->pin));
  392. /* Enable EXTI falling interrupt and enable rising interrupt */
  393. SET_BIT(EXTI->RTS, (0x1<<index->pin));
  394. SET_BIT(EXTI->FTS, (0x1<<index->pin));
  395. break;
  396. }
  397. }
  398. /* Enable EXTI interrupt */
  399. SET_BIT(EXTI->IER, (0x1<<index->pin));
  400. NVIC_EnableIRQ(irqmap->irqno);
  401. rt_hw_interrupt_enable(level);
  402. }
  403. else if (enabled == PIN_IRQ_DISABLE)
  404. {
  405. irqmap = get_pin_irq_map(index->pin);
  406. if (irqmap == RT_NULL)
  407. {
  408. return RT_ENOSYS;
  409. }
  410. NVIC_DisableIRQ(irqmap->irqno);
  411. }
  412. else
  413. {
  414. return RT_ENOSYS;
  415. }
  416. return RT_EOK;
  417. }
  418. const static struct rt_pin_ops _es32f0_pin_ops =
  419. {
  420. es32f0_pin_mode,
  421. es32f0_pin_write,
  422. es32f0_pin_read,
  423. es32f0_pin_attach_irq,
  424. es32f0_pin_detach_irq,
  425. es32f0_pin_irq_enable,
  426. RT_NULL,
  427. };
  428. int rt_hw_pin_init(void)
  429. {
  430. int result;
  431. /* Open IO clock */
  432. SET_BIT(RCU->AHBEN, RCU_AHBEN_GPDEN_MSK|RCU_AHBEN_GPCEN_MSK \
  433. |RCU_AHBEN_GPBEN_MSK|RCU_AHBEN_GPAEN_MSK);
  434. /* register IO device */
  435. result = rt_device_pin_register("pin", &_es32f0_pin_ops, RT_NULL);
  436. return result;
  437. }
  438. INIT_BOARD_EXPORT(rt_hw_pin_init);
  439. rt_inline void pin_irq_hdr(uint16_t GPIO_Pin)
  440. {
  441. uint16_t irqno;
  442. /* pin no. convert to dec no. */
  443. for (irqno = 0; irqno < 16; irqno++)
  444. {
  445. if ((0x01 << irqno) == GPIO_Pin)
  446. {
  447. break;
  448. }
  449. }
  450. if (irqno == 16)
  451. return;
  452. if (pin_irq_hdr_tab[irqno].hdr)
  453. {
  454. pin_irq_hdr_tab[irqno].hdr(pin_irq_hdr_tab[irqno].args);
  455. }
  456. }
  457. void GPIO_EXTI_Callback(uint16_t GPIO_Pin)
  458. {
  459. /* Read the exti interrupt then clear the flag */
  460. if ((EXTI->RIF & (0x1<<GPIO_Pin)) != RESET)
  461. {
  462. SET_BIT(EXTI->ICR, 0x1<<GPIO_Pin);
  463. pin_irq_hdr(GPIO_Pin);
  464. }
  465. }
  466. void EXTI0_1_IRQHandler(void)
  467. {
  468. rt_interrupt_enter();
  469. GPIO_EXTI_Callback(0);
  470. GPIO_EXTI_Callback(1);
  471. rt_interrupt_leave();
  472. }
  473. void EXTI2_3_IRQHandler(void)
  474. {
  475. rt_interrupt_enter();
  476. GPIO_EXTI_Callback(2);
  477. GPIO_EXTI_Callback(3);
  478. rt_interrupt_leave();
  479. }
  480. void EXTI4_15_IRQHandler(void)
  481. {
  482. rt_interrupt_enter();
  483. GPIO_EXTI_Callback(4);
  484. GPIO_EXTI_Callback(5);
  485. GPIO_EXTI_Callback(6);
  486. GPIO_EXTI_Callback(7);
  487. GPIO_EXTI_Callback(8);
  488. GPIO_EXTI_Callback(9);
  489. GPIO_EXTI_Callback(10);
  490. GPIO_EXTI_Callback(11);
  491. GPIO_EXTI_Callback(12);
  492. GPIO_EXTI_Callback(13);
  493. GPIO_EXTI_Callback(14);
  494. GPIO_EXTI_Callback(15);
  495. rt_interrupt_leave();
  496. }
  497. #endif