drv_gpio.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512
  1. /*
  2. * Copyright (c) 2006-2023, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2018-03-13 Liuguang the first version.
  9. * 2018-03-19 Liuguang add GPIO interrupt mode support.
  10. */
  11. #include <rtthread.h>
  12. #include <rtdevice.h>
  13. #include "drv_gpio.h"
  14. #include "fsl_common.h"
  15. #include "fsl_gpio.h"
  16. #include "fsl_port.h"
  17. #ifdef RT_USING_PIN
  18. struct vega_pin
  19. {
  20. rt_uint16_t pin;
  21. GPIO_Type *gpio;
  22. rt_uint32_t gpio_pin;
  23. };
  24. struct vega_irq
  25. {
  26. rt_uint16_t enable;
  27. struct rt_pin_irq_hdr irq_info;
  28. };
  29. #define __ARRAY_LEN(array) (sizeof(array)/sizeof(array[0]))
  30. #define __VEGA_PIN_DEFAULT {0, 0, 0}
  31. #define __VEGA_PIN(INDEX, PORT, PIN) {INDEX, PORT, PIN}
  32. static const struct vega_pin vega_pin_map[] =
  33. {
  34. __VEGA_PIN_DEFAULT,
  35. /* GPIOA */
  36. __VEGA_PIN(1, GPIOA, 0),
  37. __VEGA_PIN(2, GPIOA, 1),
  38. __VEGA_PIN(3, GPIOA, 2),
  39. __VEGA_PIN(4, GPIOA, 3),
  40. __VEGA_PIN(5, GPIOA, 4),
  41. __VEGA_PIN(6, GPIOA, 5),
  42. __VEGA_PIN(7, GPIOA, 6),
  43. __VEGA_PIN(8, GPIOA, 7),
  44. __VEGA_PIN(9, GPIOA, 8),
  45. __VEGA_PIN(10, GPIOA, 9),
  46. __VEGA_PIN(11, GPIOA, 10),
  47. __VEGA_PIN(12, GPIOA, 11),
  48. __VEGA_PIN(13, GPIOA, 12),
  49. __VEGA_PIN(14, GPIOA, 13),
  50. __VEGA_PIN(15, GPIOA, 14),
  51. __VEGA_PIN(16, GPIOA, 15),
  52. __VEGA_PIN(17, GPIOA, 16),
  53. __VEGA_PIN(18, GPIOA, 17),
  54. __VEGA_PIN(19, GPIOA, 18),
  55. __VEGA_PIN(20, GPIOA, 19),
  56. __VEGA_PIN(21, GPIOA, 20),
  57. __VEGA_PIN(22, GPIOA, 21),
  58. __VEGA_PIN(23, GPIOA, 22),
  59. __VEGA_PIN(24, GPIOA, 23),
  60. __VEGA_PIN(25, GPIOA, 24),
  61. __VEGA_PIN(26, GPIOA, 25),
  62. __VEGA_PIN(27, GPIOA, 26),
  63. __VEGA_PIN(28, GPIOA, 27),
  64. __VEGA_PIN(29, GPIOA, 28),
  65. __VEGA_PIN(30, GPIOA, 29),
  66. __VEGA_PIN(31, GPIOA, 30),
  67. __VEGA_PIN(32, GPIOA, 31),
  68. /* GPIOB */
  69. __VEGA_PIN(33, GPIOB, 0),
  70. __VEGA_PIN(34, GPIOB, 1),
  71. __VEGA_PIN(35, GPIOB, 2),
  72. __VEGA_PIN(36, GPIOB, 3),
  73. __VEGA_PIN(37, GPIOB, 4),
  74. __VEGA_PIN(38, GPIOB, 5),
  75. __VEGA_PIN(39, GPIOB, 6),
  76. __VEGA_PIN(40, GPIOB, 7),
  77. __VEGA_PIN(41, GPIOB, 8),
  78. __VEGA_PIN(42, GPIOB, 9),
  79. __VEGA_PIN(43, GPIOB, 10),
  80. __VEGA_PIN(44, GPIOB, 11),
  81. __VEGA_PIN(45, GPIOB, 12),
  82. __VEGA_PIN(46, GPIOB, 13),
  83. __VEGA_PIN(47, GPIOB, 14),
  84. __VEGA_PIN(48, GPIOB, 15),
  85. __VEGA_PIN(49, GPIOB, 16),
  86. __VEGA_PIN(50, GPIOB, 17),
  87. __VEGA_PIN(51, GPIOB, 18),
  88. __VEGA_PIN(52, GPIOB, 19),
  89. __VEGA_PIN(53, GPIOB, 20),
  90. __VEGA_PIN(54, GPIOB, 21),
  91. __VEGA_PIN(55, GPIOB, 22),
  92. __VEGA_PIN(56, GPIOB, 23),
  93. __VEGA_PIN(57, GPIOB, 24),
  94. __VEGA_PIN(58, GPIOB, 25),
  95. __VEGA_PIN(59, GPIOB, 26),
  96. __VEGA_PIN(60, GPIOB, 27),
  97. __VEGA_PIN(61, GPIOB, 28),
  98. __VEGA_PIN(62, GPIOB, 29),
  99. __VEGA_PIN(63, GPIOB, 30),
  100. __VEGA_PIN(64, GPIOB, 31),
  101. /* GPIOC */
  102. __VEGA_PIN(65, GPIOC, 0),
  103. __VEGA_PIN(66, GPIOC, 1),
  104. __VEGA_PIN(67, GPIOC, 2),
  105. __VEGA_PIN(68, GPIOC, 3),
  106. __VEGA_PIN(69, GPIOC, 4),
  107. __VEGA_PIN(70, GPIOC, 5),
  108. __VEGA_PIN(71, GPIOC, 6),
  109. __VEGA_PIN(72, GPIOC, 7),
  110. __VEGA_PIN(73, GPIOC, 8),
  111. __VEGA_PIN(74, GPIOC, 9),
  112. __VEGA_PIN(75, GPIOC, 10),
  113. __VEGA_PIN(76, GPIOC, 11),
  114. __VEGA_PIN(77, GPIOC, 12),
  115. __VEGA_PIN(78, GPIOC, 13),
  116. __VEGA_PIN(79, GPIOC, 14),
  117. __VEGA_PIN(80, GPIOC, 15),
  118. __VEGA_PIN(81, GPIOC, 16),
  119. __VEGA_PIN(82, GPIOC, 17),
  120. __VEGA_PIN(83, GPIOC, 18),
  121. __VEGA_PIN(84, GPIOC, 19),
  122. __VEGA_PIN(85, GPIOC, 20),
  123. __VEGA_PIN(86, GPIOC, 21),
  124. __VEGA_PIN(87, GPIOC, 22),
  125. __VEGA_PIN(88, GPIOC, 23),
  126. __VEGA_PIN(89, GPIOC, 24),
  127. __VEGA_PIN(90, GPIOC, 25),
  128. __VEGA_PIN(91, GPIOC, 26),
  129. __VEGA_PIN(92, GPIOC, 27),
  130. __VEGA_PIN(93, GPIOC, 28),
  131. __VEGA_PIN(94, GPIOC, 29),
  132. __VEGA_PIN(95, GPIOC, 30),
  133. __VEGA_PIN(96, GPIOC, 31),
  134. /* GPIOD */
  135. __VEGA_PIN(97, GPIOD, 0),
  136. __VEGA_PIN(98, GPIOD, 1),
  137. __VEGA_PIN(99, GPIOD, 2),
  138. __VEGA_PIN(100, GPIOD, 3),
  139. __VEGA_PIN(101, GPIOD, 4),
  140. __VEGA_PIN(102, GPIOD, 5),
  141. __VEGA_PIN(103, GPIOD, 6),
  142. __VEGA_PIN(104, GPIOD, 7),
  143. __VEGA_PIN(105, GPIOD, 8),
  144. __VEGA_PIN(106, GPIOD, 9),
  145. __VEGA_PIN(107, GPIOD, 10),
  146. __VEGA_PIN(108, GPIOD, 11),
  147. __VEGA_PIN(109, GPIOD, 12),
  148. __VEGA_PIN(110, GPIOD, 13),
  149. __VEGA_PIN(111, GPIOD, 14),
  150. __VEGA_PIN(112, GPIOD, 15),
  151. __VEGA_PIN(113, GPIOD, 16),
  152. __VEGA_PIN(114, GPIOD, 17),
  153. __VEGA_PIN(115, GPIOD, 18),
  154. __VEGA_PIN(116, GPIOD, 19),
  155. __VEGA_PIN(117, GPIOD, 20),
  156. __VEGA_PIN(118, GPIOD, 21),
  157. __VEGA_PIN(119, GPIOD, 22),
  158. __VEGA_PIN(120, GPIOD, 23),
  159. __VEGA_PIN(121, GPIOD, 24),
  160. __VEGA_PIN(122, GPIOD, 25),
  161. __VEGA_PIN(123, GPIOD, 26),
  162. __VEGA_PIN(124, GPIOD, 27),
  163. __VEGA_PIN(125, GPIOD, 28),
  164. __VEGA_PIN(126, GPIOD, 29),
  165. __VEGA_PIN(127, GPIOD, 30),
  166. __VEGA_PIN(128, GPIOD, 31),
  167. /* GPIOE */
  168. __VEGA_PIN(129, GPIOE, 0),
  169. __VEGA_PIN(130, GPIOE, 1),
  170. __VEGA_PIN(131, GPIOE, 2),
  171. __VEGA_PIN(132, GPIOE, 3),
  172. __VEGA_PIN(133, GPIOE, 4),
  173. __VEGA_PIN(134, GPIOE, 5),
  174. __VEGA_PIN(135, GPIOE, 6),
  175. __VEGA_PIN(136, GPIOE, 7),
  176. __VEGA_PIN(137, GPIOE, 8),
  177. __VEGA_PIN(138, GPIOE, 9),
  178. __VEGA_PIN(139, GPIOE, 10),
  179. __VEGA_PIN(140, GPIOE, 11),
  180. __VEGA_PIN(141, GPIOE, 12),
  181. __VEGA_PIN(142, GPIOE, 13),
  182. __VEGA_PIN(143, GPIOE, 14),
  183. __VEGA_PIN(144, GPIOE, 15),
  184. __VEGA_PIN(145, GPIOE, 16),
  185. __VEGA_PIN(146, GPIOE, 17),
  186. __VEGA_PIN(147, GPIOE, 18),
  187. __VEGA_PIN(148, GPIOE, 19),
  188. __VEGA_PIN(149, GPIOE, 20),
  189. __VEGA_PIN(150, GPIOE, 21),
  190. __VEGA_PIN(151, GPIOE, 22),
  191. __VEGA_PIN(152, GPIOE, 23),
  192. __VEGA_PIN(153, GPIOE, 24),
  193. __VEGA_PIN(154, GPIOE, 25),
  194. __VEGA_PIN(155, GPIOE, 26),
  195. __VEGA_PIN(156, GPIOE, 27),
  196. __VEGA_PIN(157, GPIOE, 28),
  197. __VEGA_PIN(158, GPIOE, 29),
  198. __VEGA_PIN(159, GPIOE, 30),
  199. __VEGA_PIN(160, GPIOE, 31),
  200. };
  201. static struct vega_irq vega_irq_map[] =
  202. {
  203. {PIN_IRQ_DISABLE, {PIN_IRQ_PIN_NONE, PIN_IRQ_MODE_RISING, RT_NULL, RT_NULL} },
  204. {PIN_IRQ_DISABLE, {PIN_IRQ_PIN_NONE, PIN_IRQ_MODE_RISING, RT_NULL, RT_NULL} },
  205. {PIN_IRQ_DISABLE, {PIN_IRQ_PIN_NONE, PIN_IRQ_MODE_RISING, RT_NULL, RT_NULL} },
  206. {PIN_IRQ_DISABLE, {PIN_IRQ_PIN_NONE, PIN_IRQ_MODE_RISING, RT_NULL, RT_NULL} },
  207. {PIN_IRQ_DISABLE, {PIN_IRQ_PIN_NONE, PIN_IRQ_MODE_RISING, RT_NULL, RT_NULL} },
  208. {PIN_IRQ_DISABLE, {PIN_IRQ_PIN_NONE, PIN_IRQ_MODE_RISING, RT_NULL, RT_NULL} },
  209. {PIN_IRQ_DISABLE, {PIN_IRQ_PIN_NONE, PIN_IRQ_MODE_RISING, RT_NULL, RT_NULL} },
  210. {PIN_IRQ_DISABLE, {PIN_IRQ_PIN_NONE, PIN_IRQ_MODE_RISING, RT_NULL, RT_NULL} },
  211. {PIN_IRQ_DISABLE, {PIN_IRQ_PIN_NONE, PIN_IRQ_MODE_RISING, RT_NULL, RT_NULL} },
  212. {PIN_IRQ_DISABLE, {PIN_IRQ_PIN_NONE, PIN_IRQ_MODE_RISING, RT_NULL, RT_NULL} },
  213. {PIN_IRQ_DISABLE, {PIN_IRQ_PIN_NONE, PIN_IRQ_MODE_RISING, RT_NULL, RT_NULL} },
  214. {PIN_IRQ_DISABLE, {PIN_IRQ_PIN_NONE, PIN_IRQ_MODE_RISING, RT_NULL, RT_NULL} },
  215. {PIN_IRQ_DISABLE, {PIN_IRQ_PIN_NONE, PIN_IRQ_MODE_RISING, RT_NULL, RT_NULL} },
  216. {PIN_IRQ_DISABLE, {PIN_IRQ_PIN_NONE, PIN_IRQ_MODE_RISING, RT_NULL, RT_NULL} },
  217. {PIN_IRQ_DISABLE, {PIN_IRQ_PIN_NONE, PIN_IRQ_MODE_RISING, RT_NULL, RT_NULL} },
  218. {PIN_IRQ_DISABLE, {PIN_IRQ_PIN_NONE, PIN_IRQ_MODE_RISING, RT_NULL, RT_NULL} },
  219. {PIN_IRQ_DISABLE, {PIN_IRQ_PIN_NONE, PIN_IRQ_MODE_RISING, RT_NULL, RT_NULL} },
  220. {PIN_IRQ_DISABLE, {PIN_IRQ_PIN_NONE, PIN_IRQ_MODE_RISING, RT_NULL, RT_NULL} },
  221. {PIN_IRQ_DISABLE, {PIN_IRQ_PIN_NONE, PIN_IRQ_MODE_RISING, RT_NULL, RT_NULL} },
  222. {PIN_IRQ_DISABLE, {PIN_IRQ_PIN_NONE, PIN_IRQ_MODE_RISING, RT_NULL, RT_NULL} },
  223. {PIN_IRQ_DISABLE, {PIN_IRQ_PIN_NONE, PIN_IRQ_MODE_RISING, RT_NULL, RT_NULL} },
  224. {PIN_IRQ_DISABLE, {PIN_IRQ_PIN_NONE, PIN_IRQ_MODE_RISING, RT_NULL, RT_NULL} },
  225. {PIN_IRQ_DISABLE, {PIN_IRQ_PIN_NONE, PIN_IRQ_MODE_RISING, RT_NULL, RT_NULL} },
  226. {PIN_IRQ_DISABLE, {PIN_IRQ_PIN_NONE, PIN_IRQ_MODE_RISING, RT_NULL, RT_NULL} },
  227. {PIN_IRQ_DISABLE, {PIN_IRQ_PIN_NONE, PIN_IRQ_MODE_RISING, RT_NULL, RT_NULL} },
  228. {PIN_IRQ_DISABLE, {PIN_IRQ_PIN_NONE, PIN_IRQ_MODE_RISING, RT_NULL, RT_NULL} },
  229. {PIN_IRQ_DISABLE, {PIN_IRQ_PIN_NONE, PIN_IRQ_MODE_RISING, RT_NULL, RT_NULL} },
  230. {PIN_IRQ_DISABLE, {PIN_IRQ_PIN_NONE, PIN_IRQ_MODE_RISING, RT_NULL, RT_NULL} },
  231. {PIN_IRQ_DISABLE, {PIN_IRQ_PIN_NONE, PIN_IRQ_MODE_RISING, RT_NULL, RT_NULL} },
  232. {PIN_IRQ_DISABLE, {PIN_IRQ_PIN_NONE, PIN_IRQ_MODE_RISING, RT_NULL, RT_NULL} },
  233. {PIN_IRQ_DISABLE, {PIN_IRQ_PIN_NONE, PIN_IRQ_MODE_RISING, RT_NULL, RT_NULL} },
  234. {PIN_IRQ_DISABLE, {PIN_IRQ_PIN_NONE, PIN_IRQ_MODE_RISING, RT_NULL, RT_NULL} }
  235. };
  236. void gpio_isr(GPIO_Type* base, rt_uint32_t gpio_pin)
  237. {
  238. if((GPIO_GetPinsInterruptFlags(base) & (1 << gpio_pin)) != 0)
  239. {
  240. GPIO_ClearPinsInterruptFlags(base, gpio_pin);
  241. if(vega_irq_map[gpio_pin].irq_info.hdr != RT_NULL)
  242. {
  243. vega_irq_map[gpio_pin].irq_info.hdr(vega_irq_map[gpio_pin].irq_info.args);
  244. }
  245. }
  246. }
  247. static IRQn_Type vega_get_irqnum(GPIO_Type *gpio, rt_uint32_t gpio_pin)
  248. {
  249. IRQn_Type irq_num = NotAvail_IRQn; /* Invalid interrupt number */
  250. if(gpio == GPIOA)
  251. {
  252. irq_num = PORTA_IRQn;
  253. }
  254. else if(gpio == GPIOB)
  255. {
  256. irq_num = PORTB_IRQn;
  257. }
  258. else if(gpio == GPIOC)
  259. {
  260. irq_num = PORTC_IRQn;
  261. }
  262. else if(gpio == GPIOD)
  263. {
  264. irq_num = PORTD_IRQn;
  265. }
  266. else if(gpio == GPIOE)
  267. {
  268. irq_num = PORTE_IRQn;
  269. }
  270. return irq_num;
  271. }
  272. static void vega_pin_mode(rt_device_t dev, rt_base_t pin, rt_uint8_t mode)
  273. {
  274. clock_ip_name_t clock;
  275. gpio_pin_config_t gpio;
  276. rt_uint32_t config_value = 0;
  277. if((pin > __ARRAY_LEN(vega_pin_map)) || (pin == 0))
  278. {
  279. return;
  280. }
  281. if (vega_pin_map[pin].gpio == GPIOA)
  282. clock = kCLOCK_PortA;
  283. if (vega_pin_map[pin].gpio == GPIOB)
  284. clock = kCLOCK_PortB;
  285. if (vega_pin_map[pin].gpio == GPIOC)
  286. clock = kCLOCK_PortC;
  287. if (vega_pin_map[pin].gpio == GPIOD)
  288. clock = kCLOCK_PortD;
  289. if (vega_pin_map[pin].gpio == GPIOE)
  290. clock = kCLOCK_PortE;
  291. CLOCK_EnableClock(clock);
  292. gpio.outputLogic = 0;
  293. switch(mode)
  294. {
  295. case PIN_MODE_OUTPUT:
  296. {
  297. config_value = 0x1030U;
  298. gpio.pinDirection = kGPIO_DigitalOutput;
  299. }
  300. break;
  301. case PIN_MODE_INPUT:
  302. {
  303. config_value = 0x1030U;
  304. gpio.pinDirection = kGPIO_DigitalInput;
  305. }
  306. break;
  307. case PIN_MODE_INPUT_PULLDOWN:
  308. {
  309. config_value = 0x1030U;
  310. gpio.pinDirection = kGPIO_DigitalInput;
  311. }
  312. break;
  313. case PIN_MODE_INPUT_PULLUP:
  314. {
  315. config_value = 0x5030U;
  316. gpio.pinDirection = kGPIO_DigitalInput;
  317. }
  318. break;
  319. case PIN_MODE_OUTPUT_OD:
  320. {
  321. config_value = 0x1830U;
  322. gpio.pinDirection = kGPIO_DigitalOutput;
  323. }
  324. break;
  325. }
  326. GPIO_PinInit(vega_pin_map[pin].gpio, vega_pin_map[pin].gpio_pin, &gpio);
  327. }
  328. static rt_ssize_t vega_pin_read(rt_device_t dev, rt_base_t pin)
  329. {
  330. uint32_t value;
  331. value = GPIO_ReadPinInput(vega_pin_map[pin].gpio, vega_pin_map[pin].gpio_pin);
  332. if (value) return PIN_HIGH;
  333. return PIN_LOW;
  334. }
  335. static void vega_pin_write(rt_device_t dev, rt_base_t pin, rt_uint8_t value)
  336. {
  337. if (value == PIN_HIGH)
  338. GPIO_SetPinsOutput(vega_pin_map[pin].gpio, 1U << vega_pin_map[pin].gpio_pin);
  339. else
  340. GPIO_ClearPinsOutput(vega_pin_map[pin].gpio, 1U << vega_pin_map[pin].gpio_pin);
  341. }
  342. static rt_err_t vega_pin_attach_irq(struct rt_device *device, rt_base_t pin,
  343. rt_uint8_t mode, void (*hdr)(void *args), void *args)
  344. {
  345. const struct vega_pin* pin_map = RT_NULL;
  346. struct vega_irq* irq_map = RT_NULL;
  347. pin_map = &vega_pin_map[pin];
  348. irq_map = &vega_irq_map[vega_pin_map[pin].gpio_pin];
  349. if(pin_map == RT_NULL || irq_map == RT_NULL)
  350. {
  351. return -RT_ENOSYS;
  352. }
  353. if(irq_map->enable == PIN_IRQ_ENABLE)
  354. {
  355. return -RT_EBUSY;
  356. }
  357. irq_map->irq_info.pin = pin;
  358. irq_map->irq_info.hdr = hdr;
  359. irq_map->irq_info.mode = mode;
  360. irq_map->irq_info.args = args;
  361. return RT_EOK;
  362. }
  363. static rt_err_t vega_pin_detach_irq(struct rt_device *device, rt_base_t pin)
  364. {
  365. const struct vega_pin* pin_map = RT_NULL;
  366. struct vega_irq* irq_map = RT_NULL;
  367. pin_map = &vega_pin_map[pin];
  368. irq_map = &vega_irq_map[vega_pin_map[pin].gpio_pin];
  369. if(pin_map == RT_NULL || irq_map == RT_NULL)
  370. {
  371. return -RT_ENOSYS;
  372. }
  373. if(irq_map->enable == PIN_IRQ_DISABLE)
  374. {
  375. return RT_EOK;
  376. }
  377. irq_map->irq_info.pin = PIN_IRQ_PIN_NONE;
  378. irq_map->irq_info.hdr = RT_NULL;
  379. irq_map->irq_info.mode = PIN_IRQ_MODE_RISING;
  380. irq_map->irq_info.args = RT_NULL;
  381. return RT_EOK;
  382. }
  383. static rt_err_t vega_pin_irq_enable(struct rt_device *device, rt_base_t pin, rt_uint8_t enabled)
  384. {
  385. gpio_pin_config_t gpio;
  386. IRQn_Type irq_num;
  387. rt_uint32_t config_value = 0x1b0a0;
  388. const struct vega_pin* pin_map = RT_NULL;
  389. struct vega_irq* irq_map = RT_NULL;
  390. pin_map = &vega_pin_map[pin];
  391. irq_map = &vega_irq_map[vega_pin_map[pin].gpio_pin];
  392. if(pin_map == RT_NULL || irq_map == RT_NULL)
  393. {
  394. return -RT_ENOSYS;
  395. }
  396. if(enabled == PIN_IRQ_ENABLE)
  397. {
  398. if(irq_map->enable == PIN_IRQ_ENABLE)
  399. {
  400. return -RT_EBUSY;
  401. }
  402. if(irq_map->irq_info.pin != pin)
  403. {
  404. return -RT_EIO;
  405. }
  406. irq_map->enable = PIN_IRQ_ENABLE;
  407. gpio.pinDirection = kGPIO_DigitalInput;
  408. gpio.outputLogic = 0;
  409. irq_num = vega_get_irqnum(vega_pin_map[pin].gpio, vega_pin_map[pin].gpio_pin);
  410. /* TODOL enable port */
  411. EnableIRQ(irq_num);
  412. GPIO_PinInit(vega_pin_map[pin].gpio, vega_pin_map[pin].gpio_pin, &gpio);
  413. // GPIO_EnablePinsInterruptFlags(vega_pin_map[pin].gpio, 1U << vega_pin_map[pin].gpio_pin);
  414. }
  415. else if(enabled == PIN_IRQ_DISABLE)
  416. {
  417. if(irq_map->enable == PIN_IRQ_DISABLE)
  418. {
  419. return RT_EOK;
  420. }
  421. irq_map->enable = PIN_IRQ_DISABLE;
  422. irq_num = vega_get_irqnum(vega_pin_map[pin].gpio, vega_pin_map[pin].gpio_pin);
  423. DisableIRQ(irq_num);
  424. }
  425. else
  426. {
  427. return -RT_EINVAL;
  428. }
  429. return RT_EOK;
  430. }
  431. static const struct rt_pin_ops vega_pin_ops =
  432. {
  433. vega_pin_mode,
  434. vega_pin_write,
  435. vega_pin_read,
  436. vega_pin_attach_irq,
  437. vega_pin_detach_irq,
  438. vega_pin_irq_enable,
  439. RT_NULL,
  440. };
  441. int rt_hw_pin_init(void)
  442. {
  443. int ret = RT_EOK;
  444. ret = rt_device_pin_register("pin", &vega_pin_ops, RT_NULL);
  445. return ret;
  446. }
  447. INIT_BOARD_EXPORT(rt_hw_pin_init);
  448. #endif /*RT_USING_PIN */