luat_gpio_air101.c 3.4 KB

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