luat_gpio.h 6.2 KB

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