luat_gpio.c 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  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 "hardware/gpio.h"
  7. static void luat_gpio_irq_callback(uint gpio, uint32_t events)
  8. {
  9. int pin = (int)gpio;
  10. int value = gpio_get(pin);
  11. rtos_msg_t msg;
  12. msg.handler = l_gpio_handler;
  13. msg.ptr = NULL;
  14. msg.arg1 = pin;
  15. msg.arg2 = value;
  16. luat_msgbus_put(&msg, 1);
  17. }
  18. int luat_gpio_setup(luat_gpio_t *gpio)
  19. {
  20. int dir = 0;
  21. int irq = 0;
  22. int ret;
  23. gpio_init(gpio->pin);
  24. switch (gpio->mode)
  25. {
  26. case Luat_GPIO_OUTPUT:
  27. dir = true;
  28. break;
  29. case Luat_GPIO_INPUT:
  30. case Luat_GPIO_IRQ:
  31. {
  32. dir = false;
  33. switch (gpio->pull)
  34. {
  35. case Luat_GPIO_PULLUP:
  36. gpio_pull_up(gpio->pin);
  37. break;
  38. case Luat_GPIO_PULLDOWN:
  39. gpio_pull_down(gpio->pin);
  40. break;
  41. case Luat_GPIO_DEFAULT:
  42. gpio_disable_pulls(gpio->pin);
  43. default:
  44. gpio_disable_pulls(gpio->pin);
  45. break;
  46. }
  47. }
  48. break;
  49. default:
  50. dir = false;
  51. break;
  52. }
  53. gpio_set_dir(gpio->pin, dir);
  54. if (gpio->mode == Luat_GPIO_IRQ)
  55. {
  56. if (gpio->irq == Luat_GPIO_RISING)
  57. {
  58. irq = GPIO_IRQ_EDGE_RISE;
  59. }
  60. else if (gpio->irq == Luat_GPIO_FALLING)
  61. {
  62. irq = GPIO_IRQ_EDGE_FALL;
  63. }
  64. else
  65. {
  66. irq = GPIO_IRQ_EDGE_RISE;
  67. }
  68. gpio_set_irq_enabled_with_callback(gpio->pin, irq, true, &luat_gpio_irq_callback);
  69. return 0;
  70. }
  71. else
  72. {
  73. gpio_set_irq_enabled(gpio->pin, irq, false);
  74. }
  75. return 0;
  76. }
  77. int luat_gpio_set(int pin, int level)
  78. {
  79. gpio_put(pin,level);
  80. return 0;
  81. }
  82. int luat_gpio_get(int pin)
  83. {
  84. return (gpio_get(pin)? 1 : 0);
  85. }
  86. void luat_gpio_close(int pin)
  87. {
  88. gpio_set_dir(pin, false);
  89. gpio_set_irq_enabled(pin, 0, false);
  90. }