drv_gpio.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576
  1. /*
  2. * Copyright (c) 2021-2024 HPMicro
  3. *
  4. * SPDX-License-Identifier: BSD-3-Clause
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2022-01-11 HPMicro First version
  9. * 2022-07-28 HPMicro Fixed compiling warnings
  10. * 2023-05-08 HPMicro Adapt RT-Thread V5.0.0
  11. * 2023-08-15 HPMicro Enable pad loopback feature
  12. * 2024-01-08 HPMicro Implemented pin_get
  13. * 2024-04-17 HPMicro Refined pin irq implementation
  14. * 2024-05-31 HPMicro Adapt later PIN driver framework
  15. * 2024-07-03 HPMicro Determined the existence of GPIO via GPIO_DO_GPIOx macro
  16. */
  17. #include <rtthread.h>
  18. #ifdef BSP_USING_GPIO
  19. #include <rthw.h>
  20. #include <rtdevice.h>
  21. #include "drv_gpio.h"
  22. #include "hpm_gpio_drv.h"
  23. #include "hpm_gpiom_drv.h"
  24. #include "hpm_clock_drv.h"
  25. #include "hpm_soc_feature.h"
  26. typedef struct
  27. {
  28. uint32_t gpio_idx;
  29. uint32_t irq_num;
  30. uint8_t irq_priority;
  31. struct rt_pin_irq_hdr *pin_irq_tbl;
  32. } gpio_irq_map_t;
  33. #ifdef GPIO_DO_GPIOA
  34. static struct rt_pin_irq_hdr hpm_gpio0_a_pin_hdr[32];
  35. #endif
  36. #ifdef GPIO_DO_GPIOB
  37. static struct rt_pin_irq_hdr hpm_gpio0_b_pin_hdr[32];
  38. #endif
  39. #ifdef GPIO_DO_GPIOC
  40. static struct rt_pin_irq_hdr hpm_gpio0_c_pin_hdr[32];
  41. #endif
  42. #ifdef GPIO_DO_GPIOD
  43. static struct rt_pin_irq_hdr hpm_gpio0_d_pin_hdr[32];
  44. #endif
  45. #ifdef GPIO_DO_GPIOE
  46. static struct rt_pin_irq_hdr hpm_gpio0_e_pin_hdr[32];
  47. #endif
  48. #ifdef GPIO_DO_GPIOF
  49. static struct rt_pin_irq_hdr hpm_gpio0_f_pin_hdr[32];
  50. #endif
  51. #ifdef GPIO_DO_GPIOV
  52. static struct rt_pin_irq_hdr hpm_gpio0_v_pin_hdr[32];
  53. #endif
  54. #ifdef GPIO_DO_GPIOW
  55. static struct rt_pin_irq_hdr hpm_gpio0_w_pin_hdr[32];
  56. #endif
  57. #ifdef GPIO_DO_GPIOX
  58. static struct rt_pin_irq_hdr hpm_gpio0_x_pin_hdr[32];
  59. #endif
  60. #ifdef GPIO_DO_GPIOY
  61. static struct rt_pin_irq_hdr hpm_gpio0_y_pin_hdr[32];
  62. #endif
  63. #ifdef GPIO_DO_GPIOZ
  64. static struct rt_pin_irq_hdr hpm_gpio0_z_pin_hdr[32];
  65. #endif
  66. static const gpio_irq_map_t hpm_gpio_irq_map[] = {
  67. #ifdef GPIO_DO_GPIOA
  68. {
  69. GPIO_IE_GPIOA,
  70. IRQn_GPIO0_A,
  71. #if defined(BSP_GPIO_IRQ_PRIORITY)
  72. BSP_GPIO_IRQ_PRIORITY,
  73. #else
  74. 1,
  75. #endif
  76. hpm_gpio0_a_pin_hdr
  77. },
  78. #endif
  79. #ifdef GPIO_DO_GPIOB
  80. {
  81. GPIO_IE_GPIOB,
  82. IRQn_GPIO0_B,
  83. #if defined(BSP_GPIO_IRQ_PRIORITY)
  84. BSP_GPIO_IRQ_PRIORITY,
  85. #else
  86. 1,
  87. #endif
  88. hpm_gpio0_b_pin_hdr
  89. },
  90. #endif
  91. #ifdef GPIO_DO_GPIOC
  92. {
  93. GPIO_IE_GPIOC,
  94. IRQn_GPIO0_C,
  95. #if defined(BSP_GPIO_IRQ_PRIORITY)
  96. BSP_GPIO_IRQ_PRIORITY,
  97. #else
  98. 1,
  99. #endif
  100. hpm_gpio0_c_pin_hdr
  101. },
  102. #endif
  103. #ifdef GPIO_DO_GPIOD
  104. {
  105. GPIO_IE_GPIOD,
  106. IRQn_GPIO0_D,
  107. #if defined(BSP_GPIO_IRQ_PRIORITY)
  108. BSP_GPIO_IRQ_PRIORITY,
  109. #else
  110. 1,
  111. #endif
  112. hpm_gpio0_d_pin_hdr
  113. },
  114. #endif
  115. #ifdef GPIO_DO_GPIOE
  116. {
  117. GPIO_IE_GPIOE,
  118. IRQn_GPIO0_E,
  119. #if defined(BSP_GPIO_IRQ_PRIORITY)
  120. BSP_GPIO_IRQ_PRIORITY,
  121. #else
  122. 1,
  123. #endif
  124. hpm_gpio0_e_pin_hdr
  125. },
  126. #endif
  127. #ifdef GPIO_DO_GPIOF
  128. {
  129. GPIO_IE_GPIOF,
  130. IRQn_GPIO0_F,
  131. #if defined(BSP_GPIO_IRQ_PRIORITY)
  132. BSP_GPIO_IRQ_PRIORITY,
  133. #else
  134. 1,
  135. #endif
  136. hpm_gpio0_f_pin_hdr
  137. },
  138. #endif
  139. #ifdef GPIO_DO_GPIOV
  140. {
  141. GPIO_IE_GPIOV,
  142. IRQn_GPIO0_V,
  143. #if defined(BSP_GPIO_IRQ_PRIORITY)
  144. BSP_GPIO_IRQ_PRIORITY,
  145. #else
  146. 1,
  147. #endif
  148. hpm_gpio0_v_pin_hdr
  149. },
  150. #endif
  151. #ifdef GPIO_DO_GPIOW
  152. {
  153. GPIO_IE_GPIOW,
  154. IRQn_GPIO0_W,
  155. #if defined(BSP_GPIO_IRQ_PRIORITY)
  156. BSP_GPIO_IRQ_PRIORITY,
  157. #else
  158. 1,
  159. #endif
  160. hpm_gpio0_w_pin_hdr
  161. },
  162. #endif
  163. #ifdef GPIO_DO_GPIOX
  164. {
  165. GPIO_IE_GPIOX,
  166. IRQn_GPIO0_X,
  167. #if defined(BSP_GPIO_IRQ_PRIORITY)
  168. BSP_GPIO_IRQ_PRIORITY,
  169. #else
  170. 1,
  171. #endif
  172. hpm_gpio0_x_pin_hdr },
  173. #endif
  174. #ifdef GPIO_DO_GPIOY
  175. {
  176. GPIO_IE_GPIOY,
  177. IRQn_GPIO0_Y,
  178. #if defined(BSP_GPIO_IRQ_PRIORITY)
  179. BSP_GPIO_IRQ_PRIORITY,
  180. #else
  181. 1,
  182. #endif
  183. hpm_gpio0_y_pin_hdr
  184. },
  185. #endif
  186. #ifdef GPIO_DO_GPIOZ
  187. {
  188. GPIO_IE_GPIOZ,
  189. IRQn_GPIO0_Z,
  190. #if defined(BSP_GPIO_IRQ_PRIORITY)
  191. BSP_GPIO_IRQ_PRIORITY,
  192. #else
  193. 1,
  194. #endif
  195. hpm_gpio0_z_pin_hdr },
  196. #endif
  197. };
  198. static struct rt_pin_irq_hdr *lookup_pin_irq_hdr_tbl(rt_base_t pin)
  199. {
  200. struct rt_pin_irq_hdr *pin_irq_hdr_tbl = RT_NULL;
  201. uint32_t gpio_idx = pin >> 5;
  202. for (uint32_t i = 0; i < ARRAY_SIZE(hpm_gpio_irq_map); i++)
  203. {
  204. if (hpm_gpio_irq_map[i].gpio_idx == gpio_idx)
  205. {
  206. pin_irq_hdr_tbl = hpm_gpio_irq_map[i].pin_irq_tbl;
  207. break;
  208. }
  209. }
  210. return pin_irq_hdr_tbl;
  211. }
  212. static int hpm_get_gpio_irq_num(uint32_t gpio_idx)
  213. {
  214. int irq_num = -1;
  215. for (uint32_t i = 0; i < ARRAY_SIZE(hpm_gpio_irq_map); i++)
  216. {
  217. if (hpm_gpio_irq_map[i].gpio_idx == gpio_idx)
  218. {
  219. irq_num = hpm_gpio_irq_map[i].irq_num;
  220. break;
  221. }
  222. }
  223. return irq_num;
  224. }
  225. static int hpm_get_gpio_irq_priority(uint32_t gpio_idx)
  226. {
  227. int irq_priority = -1;
  228. for (uint32_t i = 0; i < ARRAY_SIZE(hpm_gpio_irq_map); i++)
  229. {
  230. if (hpm_gpio_irq_map[i].gpio_idx == gpio_idx)
  231. {
  232. irq_priority = hpm_gpio_irq_map[i].irq_priority;
  233. break;
  234. }
  235. }
  236. return irq_priority;
  237. }
  238. static void hpm_gpio_isr(uint32_t gpio_idx, GPIO_Type *base)
  239. {
  240. /* Lookup the Pin IRQ Header Table */
  241. struct rt_pin_irq_hdr *pin_irq_hdr = RT_NULL;
  242. for (uint32_t i = 0; i < ARRAY_SIZE(hpm_gpio_irq_map); i++)
  243. {
  244. if (hpm_gpio_irq_map[i].gpio_idx == gpio_idx)
  245. {
  246. pin_irq_hdr = hpm_gpio_irq_map[i].pin_irq_tbl;
  247. break;
  248. }
  249. }
  250. for(uint32_t pin_idx = 0; pin_idx < 32; pin_idx++)
  251. {
  252. if (gpio_check_pin_interrupt_flag(base, gpio_idx, pin_idx))
  253. {
  254. gpio_clear_pin_interrupt_flag(base, gpio_idx, pin_idx);
  255. if (pin_irq_hdr[pin_idx].hdr != RT_NULL)
  256. {
  257. pin_irq_hdr[pin_idx].hdr(pin_irq_hdr[pin_idx].args);
  258. }
  259. }
  260. }
  261. }
  262. #ifdef GPIO_DO_GPIOA
  263. SDK_DECLARE_EXT_ISR_M(IRQn_GPIO0_A, gpioa_isr)
  264. void gpioa_isr(void)
  265. {
  266. hpm_gpio_isr(GPIO_IF_GPIOA, HPM_GPIO0);
  267. }
  268. #endif
  269. #ifdef GPIO_DO_GPIOB
  270. SDK_DECLARE_EXT_ISR_M(IRQn_GPIO0_B, gpiob_isr)
  271. void gpiob_isr(void)
  272. {
  273. hpm_gpio_isr(GPIO_IF_GPIOB, HPM_GPIO0);
  274. }
  275. #endif
  276. #ifdef GPIO_DO_GPIOC
  277. SDK_DECLARE_EXT_ISR_M(IRQn_GPIO0_C, gpioc_isr)
  278. void gpioc_isr(void)
  279. {
  280. hpm_gpio_isr(GPIO_IF_GPIOC, HPM_GPIO0);
  281. }
  282. #endif
  283. #ifdef GPIO_DO_GPIOD
  284. SDK_DECLARE_EXT_ISR_M(IRQn_GPIO0_D, gpiod_isr)
  285. void gpiod_isr(void)
  286. {
  287. hpm_gpio_isr(GPIO_IF_GPIOD, HPM_GPIO0);
  288. }
  289. #endif
  290. #ifdef GPIO_DO_GPIOE
  291. SDK_DECLARE_EXT_ISR_M(IRQn_GPIO0_E, gpioe_isr)
  292. void gpioe_isr(void)
  293. {
  294. hpm_gpio_isr(GPIO_IF_GPIOE, HPM_GPIO0);
  295. }
  296. #endif
  297. #ifdef GPIO_DO_GPIOF
  298. SDK_DECLARE_EXT_ISR_M(IRQn_GPIO0_F, gpiof_isr)
  299. void gpiof_isr(void)
  300. {
  301. hpm_gpio_isr(GPIO_IF_GPIOF, HPM_GPIO0);
  302. }
  303. #endif
  304. #ifdef GPIO_DO_GPIOV
  305. SDK_DECLARE_EXT_ISR_M(IRQn_GPIO0_V, gpiox_isr)
  306. void gpiov_isr(void)
  307. {
  308. hpm_gpio_isr(GPIO_IF_GPIOV, HPM_GPIO0);
  309. }
  310. #endif
  311. #ifdef GPIO_DO_GPIOW
  312. SDK_DECLARE_EXT_ISR_M(IRQn_GPIO0_W, gpiox_isr)
  313. void gpiow_isr(void)
  314. {
  315. hpm_gpio_isr(GPIO_IF_GPIOW, HPM_GPIO0);
  316. }
  317. #endif
  318. #ifdef GPIO_DO_GPIOX
  319. SDK_DECLARE_EXT_ISR_M(IRQn_GPIO0_X, gpiox_isr)
  320. void gpiox_isr(void)
  321. {
  322. hpm_gpio_isr(GPIO_IF_GPIOX, HPM_GPIO0);
  323. }
  324. #endif
  325. #ifdef GPIO_DO_GPIOY
  326. SDK_DECLARE_EXT_ISR_M(IRQn_GPIO0_Y, gpioy_isr)
  327. void gpioy_isr(void)
  328. {
  329. hpm_gpio_isr(GPIO_IF_GPIOY, HPM_GPIO0);
  330. }
  331. #endif
  332. #ifdef GPIO_DO_GPIOZ
  333. SDK_DECLARE_EXT_ISR_M(IRQn_GPIO0_Z, gpioz_isr)
  334. void gpioz_isr(void)
  335. {
  336. hpm_gpio_isr(GPIO_IF_GPIOZ, HPM_GPIO0);
  337. }
  338. #endif
  339. /**
  340. * @brief Get Pin index from name
  341. *
  342. * Name rule is : <GPIO NAME><Index>
  343. * for example: PA00, PZ03
  344. *
  345. **/
  346. static rt_base_t hpm_pin_get(const char *name)
  347. {
  348. if (!( (rt_strlen(name) == 4) &&
  349. (name[0] == 'P') &&
  350. ((('A' <= name[1]) && (name[1] <= 'F')) || (('V' <= name[1]) && (name[1] <= 'Z'))) &&
  351. (('0' <= name[2]) && (name[2] <= '9')) &&
  352. (('0' <= name[3]) && (name[3] <= '9'))
  353. ))
  354. {
  355. return -RT_EINVAL;
  356. }
  357. uint32_t gpio_idx = (name[1] <= 'F') ? (name[1] - 'A') : (11 + name[1] - 'V');
  358. uint32_t pin_idx = (uint32_t)(name[2] - '0') * 10 + (name[3] - '0');
  359. return (gpio_idx * 32 + pin_idx);
  360. }
  361. static void hpm_pin_mode(rt_device_t dev, rt_base_t pin, rt_uint8_t mode)
  362. {
  363. /* TODO: Check the validity of the pin value */
  364. uint32_t gpio_idx = pin >> 5;
  365. uint32_t pin_idx = pin & 0x1FU;
  366. gpiom_set_pin_controller(HPM_GPIOM, gpio_idx, pin_idx, gpiom_soc_gpio0);
  367. HPM_IOC->PAD[pin].FUNC_CTL = 0;
  368. switch (gpio_idx)
  369. {
  370. case GPIO_DI_GPIOY :
  371. HPM_PIOC->PAD[pin].FUNC_CTL = 3;
  372. break;
  373. #ifdef GPIO_DI_GPIOZ
  374. case GPIO_DI_GPIOZ :
  375. #ifdef HPM_BIOC
  376. HPM_BIOC->PAD[pin].FUNC_CTL = 3;
  377. #endif
  378. break;
  379. #endif
  380. default :
  381. break;
  382. }
  383. switch (mode)
  384. {
  385. case PIN_MODE_OUTPUT:
  386. gpio_set_pin_output(HPM_GPIO0, gpio_idx, pin_idx);
  387. HPM_IOC->PAD[pin].PAD_CTL &= ~(IOC_PAD_PAD_CTL_PS_MASK | IOC_PAD_PAD_CTL_PE_MASK | IOC_PAD_PAD_CTL_OD_MASK);
  388. break;
  389. case PIN_MODE_INPUT:
  390. gpio_set_pin_input(HPM_GPIO0, gpio_idx, pin_idx);
  391. HPM_IOC->PAD[pin].PAD_CTL &= ~(IOC_PAD_PAD_CTL_PS_MASK | IOC_PAD_PAD_CTL_PE_MASK);
  392. break;
  393. case PIN_MODE_INPUT_PULLDOWN:
  394. gpio_set_pin_input(HPM_GPIO0, gpio_idx, pin_idx);
  395. HPM_IOC->PAD[pin].PAD_CTL = (HPM_IOC->PAD[pin].PAD_CTL & ~IOC_PAD_PAD_CTL_PS_MASK) | IOC_PAD_PAD_CTL_PE_SET(1);
  396. break;
  397. case PIN_MODE_INPUT_PULLUP:
  398. gpio_set_pin_input(HPM_GPIO0, gpio_idx, pin_idx);
  399. HPM_IOC->PAD[pin].PAD_CTL = IOC_PAD_PAD_CTL_PE_SET(1) | IOC_PAD_PAD_CTL_PS_SET(1);
  400. break;
  401. case PIN_MODE_OUTPUT_OD:
  402. gpio_set_pin_output(HPM_GPIO0, gpio_idx, pin_idx);
  403. HPM_IOC->PAD[pin].PAD_CTL = (HPM_IOC->PAD[pin].PAD_CTL & ~(IOC_PAD_PAD_CTL_PS_MASK | IOC_PAD_PAD_CTL_PE_MASK)) | IOC_PAD_PAD_CTL_OD_SET(1);
  404. break;
  405. default:
  406. /* Invalid mode */
  407. break;
  408. }
  409. HPM_IOC->PAD[pin].FUNC_CTL = IOC_PAD_FUNC_CTL_LOOP_BACK_MASK;
  410. }
  411. static rt_ssize_t hpm_pin_read(rt_device_t dev, rt_base_t pin)
  412. {
  413. /* TODO: Check the validity of the pin value */
  414. uint32_t gpio_idx = pin >> 5;
  415. uint32_t pin_idx = pin & 0x1FU;
  416. return (rt_ssize_t) gpio_read_pin(HPM_GPIO0, gpio_idx, pin_idx);
  417. }
  418. static void hpm_pin_write(rt_device_t dev, rt_base_t pin, rt_uint8_t value)
  419. {
  420. /* TODO: Check the validity of the pin value */
  421. uint32_t gpio_idx = pin >> 5;
  422. uint32_t pin_idx = pin & 0x1FU;
  423. gpio_write_pin(HPM_GPIO0, gpio_idx, pin_idx, value);
  424. }
  425. static rt_err_t hpm_pin_attach_irq(struct rt_device *device,
  426. rt_base_t pin,
  427. rt_uint8_t mode,
  428. void (*hdr)(void *args),
  429. void *args)
  430. {
  431. struct rt_pin_irq_hdr *pin_irq_hdr_tbl = lookup_pin_irq_hdr_tbl(pin);
  432. if (pin_irq_hdr_tbl == RT_NULL)
  433. {
  434. return -RT_EINVAL;
  435. }
  436. rt_base_t level = rt_hw_interrupt_disable();
  437. uint32_t pin_idx = pin & 0x1FUL;
  438. pin_irq_hdr_tbl[pin_idx].pin = pin;
  439. pin_irq_hdr_tbl[pin_idx].hdr = hdr;
  440. pin_irq_hdr_tbl[pin_idx].mode = mode;
  441. pin_irq_hdr_tbl[pin_idx].args = args;
  442. rt_hw_interrupt_enable(level);
  443. return RT_EOK;
  444. }
  445. static rt_err_t hpm_pin_detach_irq(struct rt_device *device, rt_base_t pin)
  446. {
  447. struct rt_pin_irq_hdr *pin_irq_hdr_tbl = lookup_pin_irq_hdr_tbl(pin);
  448. if (pin_irq_hdr_tbl == RT_NULL)
  449. {
  450. return -RT_EINVAL;
  451. }
  452. rt_base_t level = rt_hw_interrupt_disable();
  453. uint32_t pin_idx = pin & 0x1FUL;
  454. pin_irq_hdr_tbl[pin_idx].pin = -1;
  455. pin_irq_hdr_tbl[pin_idx].hdr = RT_NULL;
  456. pin_irq_hdr_tbl[pin_idx].mode = 0;
  457. pin_irq_hdr_tbl[pin_idx].args = RT_NULL;
  458. rt_hw_interrupt_enable(level);
  459. return RT_EOK;
  460. }
  461. static rt_err_t hpm_pin_irq_enable(struct rt_device *device, rt_base_t pin, rt_uint8_t enabled)
  462. {
  463. /* TODO: Check the validity of the pin value */
  464. uint32_t gpio_idx = pin >> 5;
  465. uint32_t pin_idx = pin & 0x1FU;
  466. struct rt_pin_irq_hdr *pin_irq_hdr_tbl = lookup_pin_irq_hdr_tbl(pin);
  467. if (pin_irq_hdr_tbl == RT_NULL)
  468. {
  469. return -RT_EINVAL;
  470. }
  471. gpio_interrupt_trigger_t trigger;
  472. if (enabled == PIN_IRQ_ENABLE)
  473. {
  474. switch(pin_irq_hdr_tbl[pin_idx].mode)
  475. {
  476. case PIN_IRQ_MODE_RISING:
  477. trigger = gpio_interrupt_trigger_edge_rising;
  478. break;
  479. case PIN_IRQ_MODE_FALLING:
  480. trigger = gpio_interrupt_trigger_edge_falling;
  481. break;
  482. case PIN_IRQ_MODE_HIGH_LEVEL:
  483. trigger = gpio_interrupt_trigger_level_high;
  484. break;
  485. case PIN_IRQ_MODE_LOW_LEVEL:
  486. trigger = gpio_interrupt_trigger_level_low;
  487. break;
  488. default:
  489. trigger = gpio_interrupt_trigger_edge_rising;
  490. break;
  491. }
  492. gpio_config_pin_interrupt(HPM_GPIO0, gpio_idx, pin_idx, trigger);
  493. rt_uint32_t irq_num = hpm_get_gpio_irq_num(gpio_idx);
  494. rt_uint32_t irq_priority = hpm_get_gpio_irq_priority(gpio_idx);
  495. gpio_enable_pin_interrupt(HPM_GPIO0, gpio_idx, pin_idx);
  496. intc_m_enable_irq_with_priority(irq_num, irq_priority);
  497. }
  498. else if (enabled == PIN_IRQ_DISABLE)
  499. {
  500. gpio_disable_pin_interrupt(HPM_GPIO0, gpio_idx, pin_idx);
  501. }
  502. else
  503. {
  504. return -RT_EINVAL;
  505. }
  506. return RT_EOK;
  507. }
  508. const static struct rt_pin_ops hpm_pin_ops = {
  509. .pin_mode = hpm_pin_mode,
  510. .pin_write = hpm_pin_write,
  511. .pin_read = hpm_pin_read,
  512. .pin_attach_irq = hpm_pin_attach_irq,
  513. .pin_detach_irq = hpm_pin_detach_irq,
  514. .pin_irq_enable = hpm_pin_irq_enable,
  515. .pin_get = hpm_pin_get,
  516. };
  517. int rt_hw_pin_init(void)
  518. {
  519. int ret = RT_EOK;
  520. ret = rt_device_pin_register("pin", &hpm_pin_ops, RT_NULL);
  521. return ret;
  522. }
  523. INIT_BOARD_EXPORT(rt_hw_pin_init);
  524. #endif /* BSP_USING_GPIO */