luat_gpio_air101.c 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. #include "luat_base.h"
  2. #include "luat_malloc.h"
  3. #include "luat_msgbus.h"
  4. #include "luat_timer.h"
  5. #include "luat_gpio.h"
  6. #include "wm_include.h"
  7. #include "luat_irq.h"
  8. #include "luat_gpio.h"
  9. #include "luat_hwtimer.h"
  10. int luat_gpio_irq_default(int pin, void* args);
  11. typedef struct gpio_cb_args
  12. {
  13. luat_gpio_irq_cb irq_cb;
  14. void*irq_args;
  15. }gpio_cb_args_t;
  16. static gpio_cb_args_t gpio_isr_cb[WM_IO_PB_31] = {0};
  17. static void luat_gpio_irq_callback(void *ptr)
  18. {
  19. int pin = (int)ptr;
  20. if (pin < 0 || pin > WM_IO_PB_31)
  21. return;
  22. int ret = tls_get_gpio_irq_status(pin);
  23. if (ret) {
  24. if (gpio_isr_cb[pin].irq_cb){
  25. gpio_isr_cb[pin].irq_cb(pin, gpio_isr_cb[pin].irq_args);
  26. }
  27. else {
  28. luat_gpio_irq_default(pin, (void*)tls_gpio_read(pin));
  29. }
  30. tls_clr_gpio_irq_status(pin);
  31. }
  32. }
  33. int luat_gpio_setup(luat_gpio_t *gpio){
  34. int dir = 0;
  35. int attr = 0;
  36. int irq = 0;
  37. int ret;
  38. if (gpio->pin < 0 || gpio->pin > WM_IO_PB_31) return 0;
  39. switch (gpio->mode){
  40. case Luat_GPIO_OUTPUT:
  41. dir = WM_GPIO_DIR_OUTPUT;
  42. attr = WM_GPIO_ATTR_FLOATING;
  43. break;
  44. case Luat_GPIO_INPUT:
  45. case Luat_GPIO_IRQ:
  46. {
  47. dir = WM_GPIO_DIR_INPUT;
  48. switch (gpio->pull)
  49. {
  50. case Luat_GPIO_PULLUP:
  51. attr = WM_GPIO_ATTR_PULLHIGH;
  52. break;
  53. case Luat_GPIO_PULLDOWN:
  54. attr = WM_GPIO_ATTR_PULLLOW;
  55. break;
  56. case Luat_GPIO_DEFAULT:
  57. default:
  58. attr = WM_GPIO_ATTR_FLOATING;
  59. break;
  60. }
  61. }
  62. break;
  63. default:
  64. dir = WM_GPIO_DIR_INPUT;
  65. attr = WM_GPIO_ATTR_FLOATING;
  66. break;
  67. }
  68. tls_gpio_cfg(gpio->pin, dir, attr);
  69. if (gpio->mode == Luat_GPIO_IRQ)
  70. {
  71. if (gpio->irq == Luat_GPIO_RISING)
  72. {
  73. irq = WM_GPIO_IRQ_TRIG_RISING_EDGE;
  74. }
  75. else if (gpio->irq == Luat_GPIO_FALLING)
  76. {
  77. irq = WM_GPIO_IRQ_TRIG_FALLING_EDGE;
  78. }
  79. else if (gpio->irq == Luat_GPIO_HIGH_IRQ) {
  80. irq = WM_GPIO_IRQ_TRIG_HIGH_LEVEL;
  81. }
  82. else if (gpio->irq == Luat_GPIO_LOW_IRQ) {
  83. irq = WM_GPIO_IRQ_TRIG_LOW_LEVEL;
  84. }
  85. else
  86. {
  87. irq = WM_GPIO_IRQ_TRIG_DOUBLE_EDGE;
  88. }
  89. tls_clr_gpio_irq_status(gpio->pin);
  90. if (gpio->irq_cb) {
  91. gpio_isr_cb[gpio->pin].irq_cb = gpio->irq_cb;
  92. gpio_isr_cb[gpio->pin].irq_args = gpio->irq_args;
  93. }
  94. tls_gpio_isr_register(gpio->pin, luat_gpio_irq_callback, (void *)gpio->pin);
  95. tls_gpio_irq_enable(gpio->pin, irq);
  96. return 0;
  97. }
  98. else{
  99. tls_gpio_irq_disable(gpio->pin);
  100. }
  101. return 0;
  102. }
  103. int luat_gpio_set(int pin, int level)
  104. {
  105. if (pin < 0 || pin > WM_IO_PB_31) return 0;
  106. tls_gpio_write(pin, level);
  107. return 0;
  108. }
  109. //hyj
  110. void luat_gpio_pulse(int pin, uint8_t *level, uint16_t len,uint16_t delay_ns)
  111. {
  112. if (pin < 0 || pin > WM_IO_PB_31) return;
  113. tls_gpio_pulse(pin,level,len,delay_ns);
  114. return;
  115. }
  116. int luat_gpio_get(int pin)
  117. {
  118. if (pin < 0 || pin > WM_IO_PB_31) return 0;
  119. int re = tls_gpio_read(pin);
  120. return re;
  121. }
  122. void luat_gpio_close(int pin)
  123. {
  124. if (pin < 0 || pin > WM_IO_PB_31) return;
  125. tls_gpio_cfg(pin, WM_GPIO_DIR_INPUT, WM_GPIO_ATTR_FLOATING);
  126. tls_gpio_irq_disable(pin);
  127. if (gpio_isr_cb[pin].irq_cb)
  128. {
  129. gpio_isr_cb[pin].irq_cb = 0;
  130. gpio_isr_cb[pin].irq_args = 0;
  131. }
  132. }