luat_lib_yhm27xx.c 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. /*
  2. @module yhm27xx
  3. @summary yhm27xx充电芯片
  4. @version 1.0
  5. @date 2025.04.2
  6. @tag LUAT_USE_GPIO
  7. @demo yhm27xxx
  8. @usage
  9. -- 请查阅demo/yhm27xx
  10. */
  11. #include "luat_base.h"
  12. #include "luat_timer.h"
  13. #include "luat_mem.h"
  14. #include "luat_gpio.h"
  15. #include "luat_zbuff.h"
  16. #include "luat_msgbus.h"
  17. #define LUAT_LOG_TAG "yhm27xx"
  18. #include "luat_log.h"
  19. /*
  20. 单总线命令读写YHM27XX
  21. @api yhm27xx.cmd(pin, chip_id, reg, data)
  22. @int gpio端口号
  23. @int 芯片ID
  24. @int 寄存器地址
  25. @int 要写入的数据,如果没填,则表示从寄存器读取数据
  26. @return boolean 成功返回true,失败返回false
  27. @return int 读取成功返回寄存器值,写入成功无返回
  28. @usage
  29. while 1 do
  30. sys.wait(1000)
  31. local result, data = yhm27xx.cmd(15, 0x04, 0x05)
  32. log.info("yhm27xx", result, data)
  33. end
  34. */
  35. static int l_yhm27xx_cmd(lua_State *L)
  36. {
  37. uint8_t pin = luaL_checkinteger(L, 1);
  38. uint8_t chip_id = luaL_checkinteger(L, 2);
  39. uint8_t reg = luaL_checkinteger(L, 3);
  40. uint8_t data = 0;
  41. uint8_t is_read = 1;
  42. if (!lua_isnone(L, 4))
  43. {
  44. is_read = 0;
  45. data = luaL_checkinteger(L, 4);
  46. }
  47. #ifdef LUAT_USE_DRV_GPIO
  48. if(luat_drv_gpio_driver_yhm27xx(pin, chip_id, reg, is_read, &data))
  49. #else
  50. if(luat_gpio_driver_yhm27xx(pin, chip_id, reg, is_read, &data))
  51. #endif
  52. {
  53. lua_pushboolean(L, 0);
  54. return 1;
  55. }
  56. lua_pushboolean(L, 1);
  57. if (is_read)
  58. {
  59. lua_pushinteger(L, data);
  60. return 2;
  61. }
  62. return 1;
  63. }
  64. static uint8_t reg_infos[9] = {0};
  65. static int l_yhm_27xx_cb(lua_State *L, void *ptr) {
  66. lua_getglobal(L, "sys_pub");
  67. if (lua_isfunction(L, -1)) {
  68. lua_pushstring(L, "YHM27XX_REG");
  69. lua_pushlstring(L, (const char*)reg_infos, 9);
  70. lua_call(L, 2, 0);
  71. }
  72. return 0;
  73. }
  74. static void luat_gpio_driver_yhm27xx_reqinfo(uint8_t pin, uint8_t chip_id) {
  75. for (uint8_t i = 0; i < 9; i++)
  76. {
  77. luat_gpio_driver_yhm27xx(pin, chip_id, i, 1, &(reg_infos[i]));
  78. }
  79. rtos_msg_t msg = {0};
  80. msg.handler = l_yhm_27xx_cb;
  81. luat_msgbus_put(&msg, 0);
  82. }
  83. static int l_yhm27xx_reqinfo(lua_State *L)
  84. {
  85. uint8_t pin = luaL_checkinteger(L, 1);
  86. uint8_t chip_id = luaL_checkinteger(L, 2);
  87. #ifdef LUAT_USE_DRV_GPIO
  88. luat_drv_gpio_driver_yhm27xx_reqinfo(pin, chip_id);
  89. #else
  90. luat_gpio_driver_yhm27xx_reqinfo(pin, chip_id);
  91. #endif
  92. return 0;
  93. }
  94. #include "rotable2.h"
  95. static const rotable_Reg_t reg_yhm27xx[] = {
  96. {"cmd", ROREG_FUNC(l_yhm27xx_cmd)},
  97. {"reqinfo", ROREG_FUNC(l_yhm27xx_reqinfo)},
  98. {NULL, ROREG_INT(0)}
  99. };
  100. LUAMOD_API int luaopen_yhm27xx(lua_State *L)
  101. {
  102. luat_newlib2(L, reg_yhm27xx);
  103. return 1;
  104. }