drv_pin.c 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. #include <rthw.h>
  2. #include <rtdevice.h>
  3. #include <hal_gpio.h>
  4. static void hal_pin_mode(struct rt_device *device, rt_base_t pin, rt_uint8_t mode)
  5. {
  6. switch (mode)
  7. {
  8. case PIN_MODE_OUTPUT:
  9. hal_gpio_set_direction(pin,GPIO_DIRECTION_OUTPUT);
  10. break;
  11. case PIN_MODE_INPUT:
  12. hal_gpio_set_direction(pin,GPIO_DIRECTION_INPUT);
  13. break;
  14. case PIN_MODE_INPUT_PULLDOWN:
  15. hal_gpio_set_pull(pin, GPIO_PULL_DOWN);
  16. hal_gpio_set_direction(pin,GPIO_DIRECTION_INPUT);
  17. break;
  18. case PIN_MODE_INPUT_PULLUP:
  19. hal_gpio_set_pull(pin,GPIO_PULL_UP);
  20. hal_gpio_set_direction(pin,GPIO_DIRECTION_INPUT);
  21. break;
  22. case PIN_MODE_OUTPUT_OD:
  23. hal_gpio_set_pull(pin, GPIO_PULL_DOWN_DISABLED);
  24. hal_gpio_set_direction(pin,GPIO_DIRECTION_OUTPUT);
  25. break;
  26. }
  27. }
  28. static void hal_pin_write(struct rt_device *device, rt_base_t pin, rt_uint8_t value)
  29. {
  30. hal_gpio_set_data(pin,value);
  31. }
  32. static rt_int8_t hal_pin_read(struct rt_device *device, rt_base_t pin)
  33. {
  34. gpio_data_t value;
  35. hal_gpio_get_data(pin,&value);
  36. return (rt_int8_t)value;
  37. }
  38. static rt_err_t hal_pin_attach_irq(struct rt_device *device, rt_base_t pin,
  39. rt_uint8_t mode, void (*hdr)(void *args),
  40. void *args)
  41. {
  42. rt_base_t level = 0;
  43. uint32_t irq;
  44. int ret = 0;
  45. ret = hal_gpio_to_irq(pin, &irq);
  46. if (ret < 0)
  47. {
  48. rt_kprintf("gpio to irq error, irq num:%lu error num: %d", irq, ret);
  49. return -RT_ERROR;
  50. }
  51. level = rt_hw_interrupt_disable();
  52. hal_gpio_set_debounce(pin, 1); // enable debounce 24Mhz
  53. ret = hal_gpio_irq_attach(irq, hdr, mode + 1, args);
  54. if (ret < 0)
  55. {
  56. rt_hw_interrupt_enable(level);
  57. rt_kprintf("request irq error, irq num:%lu error num: %d", irq, ret);
  58. return -RT_ERROR;
  59. }
  60. rt_hw_interrupt_enable(level);
  61. return RT_EOK;
  62. }
  63. static rt_err_t hal_pin_detach_irq(struct rt_device *device, rt_base_t pin)
  64. {
  65. rt_base_t level = 0;
  66. uint32_t irq;
  67. int ret;
  68. ret = hal_gpio_to_irq(pin, &irq);
  69. if (ret < 0)
  70. {
  71. rt_kprintf("gpio to irq error, irq num:%lu error num: %d", irq, ret);
  72. return -RT_ERROR;
  73. }
  74. level = rt_hw_interrupt_disable();
  75. ret = hal_gpio_irq_free(irq);
  76. if (ret < 0)
  77. {
  78. rt_hw_interrupt_enable(level);
  79. rt_kprintf("free irq error, error num: %d", ret);
  80. return -RT_ERROR;
  81. }
  82. return RT_EOK;
  83. }
  84. static rt_err_t hal_pin_irq_enable(struct rt_device *device, rt_base_t pin, rt_uint8_t enabled)
  85. {
  86. uint32_t irq;
  87. int ret;
  88. ret = hal_gpio_to_irq(pin, &irq);
  89. if (ret < 0)
  90. {
  91. rt_kprintf("gpio to irq error, irq num:%lu error num: %d", irq, ret);
  92. return -RT_ERROR;
  93. }
  94. if (enabled == PIN_IRQ_ENABLE)
  95. {
  96. ret = hal_gpio_irq_enable(irq);
  97. if (ret < 0)
  98. {
  99. rt_kprintf("request irq error, error num: %d", ret);
  100. return -RT_ERROR;
  101. }
  102. }
  103. else
  104. {
  105. ret = hal_gpio_irq_disable(irq);
  106. if (ret < 0)
  107. {
  108. rt_kprintf("disable irq error, irq num:%lu, error num: %d", irq, ret);
  109. return -RT_ERROR;
  110. }
  111. }
  112. return RT_EOK;
  113. }
  114. static const struct rt_pin_ops gpio_ops =
  115. {
  116. hal_pin_mode,
  117. hal_pin_write,
  118. hal_pin_read,
  119. hal_pin_attach_irq,
  120. hal_pin_detach_irq,
  121. hal_pin_irq_enable,
  122. RT_NULL,
  123. };
  124. int hal_hw_pin_init(void)
  125. {
  126. return rt_device_pin_register("pin", &gpio_ops, RT_NULL);
  127. }
  128. INIT_BOARD_EXPORT(hal_hw_pin_init);