luat_gpio_rtt.c 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  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 "rtthread.h"
  7. #include <rtdevice.h>
  8. #include "drivers/pin.h"
  9. #define DBG_TAG "luat.gpio"
  10. #define DBG_LVL DBG_INFO
  11. #include <rtdbg.h>
  12. // void luat_gpio_mode(int pin, int mode) {
  13. // rt_pin_mode(pin, mode);
  14. // }
  15. static void luat_gpio_irq_callback(void* ptr) {
  16. //LOG_D("IRQ Callback");
  17. int pin = (int)ptr;
  18. int value = rt_pin_read(pin);
  19. rtos_msg_t msg;
  20. msg.handler = l_gpio_handler;
  21. msg.ptr = RT_NULL;
  22. msg.arg1 = pin;
  23. msg.arg2 = value;
  24. luat_msgbus_put(&msg, 1);
  25. }
  26. int luat_gpio_setup(luat_gpio_t* gpio) {
  27. int mode = 0;
  28. switch (gpio->mode)
  29. {
  30. case Luat_GPIO_OUTPUT:
  31. mode = PIN_MODE_OUTPUT;
  32. break;
  33. case Luat_GPIO_INPUT:
  34. case Luat_GPIO_IRQ:
  35. {
  36. switch (gpio->pull)
  37. {
  38. case Luat_GPIO_PULLUP:
  39. mode = PIN_MODE_INPUT_PULLUP;
  40. break;
  41. case Luat_GPIO_PULLDOWN:
  42. mode = PIN_MODE_INPUT_PULLDOWN;
  43. break;
  44. case Luat_GPIO_DEFAULT:
  45. default:
  46. mode = PIN_MODE_INPUT;
  47. break;
  48. }
  49. }
  50. break;
  51. default:
  52. mode = PIN_MODE_INPUT;
  53. break;
  54. }
  55. if (gpio->mode == Luat_GPIO_IRQ) {
  56. int irq = 0;
  57. if (gpio->irq == Luat_GPIO_RISING) {
  58. irq = PIN_IRQ_MODE_RISING;
  59. }
  60. else if (gpio->irq == Luat_GPIO_FALLING) {
  61. irq = PIN_IRQ_MODE_FALLING;
  62. }
  63. else {
  64. irq = PIN_IRQ_MODE_RISING_FALLING;
  65. }
  66. rt_err_t re = rt_pin_attach_irq(gpio->pin, irq, luat_gpio_irq_callback, (void*)gpio->pin);
  67. if (re != RT_EOK) {
  68. return re;
  69. }
  70. rt_pin_irq_enable(gpio->pin, 1);
  71. }
  72. else {
  73. rt_pin_irq_enable(gpio->pin, 0);
  74. }
  75. rt_pin_mode(gpio->pin, mode);
  76. return 0;
  77. }
  78. int luat_gpio_set(int pin, int level) {
  79. //LOG_D("Pin set pin=%d level=%d", pin, level);
  80. rt_pin_write(pin, level);
  81. return 0;
  82. }
  83. int luat_gpio_get(int pin) {
  84. int re = rt_pin_read(pin);
  85. //LOG_D("Pin get pin=%d value=%d", pin, re);
  86. return re;
  87. }
  88. void luat_gpio_close(int pin) {
  89. //LOG_D("Pin Close, pin=%d", pin);
  90. rt_pin_irq_enable(pin, 0);
  91. rt_pin_mode(pin, PIN_MODE_INPUT);
  92. }