luat_gpio.h 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. #ifndef LUAT_GPIO_H
  2. #define LUAT_GPIO_H
  3. #include "luat_base.h"
  4. #include "luat_gpio_legacy.h"
  5. // 若bsp没有定义最大PIN编号, 那么默认给个128吧
  6. #ifndef LUAT_GPIO_PIN_MAX
  7. #define LUAT_GPIO_PIN_MAX (128)
  8. #endif
  9. /**
  10. * @defgroup luatos_device_gpio GPIO接口
  11. * @{
  12. */
  13. #define LUAT_GPIO_LOW (Luat_GPIO_LOW) ///< GPIO配置为低电平
  14. #define LUAT_GPIO_HIGH (Luat_GPIO_HIGH) ///< GPIO配置为高电平
  15. #define LUAT_GPIO_OUTPUT (Luat_GPIO_OUTPUT) ///< GPIO配置为输出模式
  16. #define LUAT_GPIO_INPUT (Luat_GPIO_INPUT) ///< GPIO配置为输入模式
  17. #define LUAT_GPIO_IRQ (Luat_GPIO_IRQ) ///< GPIO配置为中断模式
  18. #define LUAT_GPIO_DEFAULT (Luat_GPIO_DEFAULT) ///< GPIO配置为默认模式,EC618平台,上下拉只对输出模式有效,输入模式只有默认上下拉或者取消上下拉,普通的GPIO配置为LUAT_GPIO_DEFAULT,表示完全关闭上下拉;AGPIO软件上不支持配置上下拉,即使配置了也无效,一直是硬件开机或者复位时的默认状态
  19. #define LUAT_GPIO_PULLUP (Luat_GPIO_PULLUP) ///< GPIO配置为上拉模式
  20. #define LUAT_GPIO_PULLDOWN (Luat_GPIO_PULLDOWN)///< GPIO配置为下拉模式
  21. #define LUAT_GPIO_RISING_IRQ (Luat_GPIO_RISING) ///<上升沿中断
  22. #define LUAT_GPIO_FALLING_IRQ (Luat_GPIO_FALLING)///< 下降沿中断
  23. #define LUAT_GPIO_BOTH_IRQ (Luat_GPIO_BOTH) ///< 上升沿 下降沿都中断
  24. #define LUAT_GPIO_HIGH_IRQ (Luat_GPIO_HIGH_IRQ) ///< GPIO配置为高电平中断模式
  25. #define LUAT_GPIO_LOW_IRQ (Luat_GPIO_LOW_IRQ) ///< GPIO配置为低电平模式
  26. #define LUAT_GPIO_NO_IRQ (0xff) ///< GPIO没有中断模式
  27. #define LUAT_GPIO_MAX_ID (Luat_GPIO_MAX_ID) ///< 最大GPIO序号
  28. //无效的GPIO,用作某些函数引脚不指定时使用
  29. #define LUAT_GPIO_NONE (0xff)
  30. /**
  31. * @brief GPIO控制参数
  32. */
  33. typedef struct luat_gpio_cfg
  34. {
  35. int pin; /**<引脚*/
  36. uint8_t mode;/**<GPIO模式*/
  37. uint8_t pull;/**<GPIO上下拉模式*/
  38. uint8_t irq_type;/**<GPIO中断模式*/
  39. uint8_t output_level;/**<GPIO输出高低电平选择*/
  40. luat_gpio_irq_cb irq_cb;/**<GPIO中断回调函数*/
  41. void* irq_args;/**<GPIO中断回调时用户参数*/
  42. uint8_t alt_fun;/**<有些SOC的GPIO会在不同引脚上被复用,通过alt_fun来确定具体用哪个*/
  43. } luat_gpio_cfg_t;
  44. /**
  45. * @brief GPIO上下拉\中断设置参数
  46. */
  47. typedef enum
  48. {
  49. LUAT_GPIO_CMD_SET_PULL_MODE,/**<上下拉模式*/
  50. LUAT_GPIO_CMD_SET_IRQ_MODE,/**<中断模式*/
  51. }LUAT_GPIO_CTRL_CMD_E;
  52. /**
  53. * @brief GPIO设置默认参数
  54. * @param luat_gpio_cfg_t
  55. */
  56. void luat_gpio_set_default_cfg(luat_gpio_cfg_t* gpio);
  57. /**
  58. * @brief 打开GPIO
  59. * @param luat_gpio_cfg_t
  60. */
  61. int luat_gpio_open(luat_gpio_cfg_t* gpio);
  62. /**
  63. * @brief GPIO输出电平
  64. * @param Pin Pin序号
  65. * @param Level 1高电平,0低电平
  66. */
  67. int luat_gpio_set(int pin, int level);
  68. /**
  69. * @brief 读取GPIO输入电平
  70. * @param Pin Pin序号
  71. * @return 1高电平, 0低电平,其他无效
  72. */
  73. int luat_gpio_get(int pin);
  74. /**
  75. * @brief 关闭GPIO
  76. * @param Pin Pin序号
  77. */
  78. void luat_gpio_close(int pin);
  79. /**
  80. * @brief 设置GPIO中断回调函数
  81. * @param Pin Pin序号
  82. * @param cb 中断处理函数
  83. * @param args 中断函数参数
  84. * @return -1 失败 0 成功
  85. */
  86. int luat_gpio_set_irq_cb(int pin, luat_gpio_irq_cb cb, void* args);
  87. /**
  88. * @brief GPIO模拟单线输出模式
  89. * @param Pin Pin序号
  90. * @param Data 输出电平序列
  91. * @param BitLen 输出电平序列中一共有几个bit
  92. * @param Delay 每个bit之间的delay
  93. * @return 无
  94. * @attention 在同一个GPIO输出一组脉冲, 注意, len的单位是bit, 高位在前.
  95. */
  96. void luat_gpio_pulse(int pin, uint8_t *level, uint16_t len, uint16_t delay_ns);
  97. /**
  98. * @brief GPIO上下拉\中断单独设置函数
  99. * @param pin Pin序号
  100. * @param LUAT_GPIO_CTRL_CMD_E 设置命令 LUAT_GPIO_CMD_SET_PULL_MODE 设置上下拉命令 LUAT_GPIO_CMD_SET_IRQ_MODE
  101. * @param param 设置参数 参数取自上下拉、以及中断的宏定义
  102. * @return -1 失败 0 成功
  103. */
  104. int luat_gpio_ctrl(int pin, LUAT_GPIO_CTRL_CMD_E cmd, int param);
  105. void luat_gpio_iomux(int pin, int new_pad, uint8_t alt);
  106. /**
  107. * @brief gpio方式输出bit0和bit1给WS2812B,不输出reset,由于严格的时序要求,会关闭中断来保证时序,因此驱动大量LED灯时会对其他驱动,甚至整个系统有影响。建议用多个GPIO分组驱动大量LED灯,1个GPIO最好不要超过32个灯
  108. * @param pin GPIO号
  109. * @param data 输出的byte数据,驱动不对数据做任何RGB顺序调整,请自行调整
  110. * @param len 输出的byte数量,必须是3的倍数
  111. * @param frame_cnt 在一次关闭全局中断到开启全局中断中间发送的帧数,1帧3个byte。分段发送是为了能让其他中断有响应的时间,但是造成提前发送reset而导致剩下的灯不亮。写0则一次性全部发送
  112. * @param bit0h bit0的高电平额外延迟,默认写10,如果高电平时间不足酌情增加
  113. * @param bit0l bit0的低电平额外延迟,默认写0
  114. * @param bit1h bit1的高电平额外延迟,默认写10,如果高电平时间不足酌情增加
  115. * @param bit1l bit1的低电平额外延迟,默认写0
  116. * @return -1 失败 0 成功
  117. */
  118. int luat_gpio_driver_ws2812b(int pin, uint8_t *data, uint32_t len, uint32_t frame_cnt, uint8_t bit0h, uint8_t bit0l, uint8_t bit1h, uint8_t bit1l);
  119. /** @}*/
  120. void luat_gpio_mode(int pin, int mode, int pull, int initOutput);
  121. #endif