luat_lib_yhm27xx.c 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  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_pm.h"
  12. #include "luat_base.h"
  13. #include "luat_timer.h"
  14. #include "luat_mem.h"
  15. #include "luat_gpio.h"
  16. #include "luat_zbuff.h"
  17. #include "luat_msgbus.h"
  18. #include "luat_gpio.h"
  19. #ifdef LUAT_USE_DRV_GPIO
  20. #include "luat/drv_gpio.h"
  21. #endif
  22. #define LUAT_LOG_TAG "yhm27xx"
  23. #include "luat_log.h"
  24. /*
  25. 单总线命令读写YHM27XX
  26. @api yhm27xx.cmd(pin, chip_id, reg, data)
  27. @int gpio端口号
  28. @int 芯片ID
  29. @int 寄存器地址
  30. @int 要写入的数据,如果没填,则表示从寄存器读取数据
  31. @return boolean 成功返回true,失败返回false
  32. @return int 读取成功返回寄存器值,写入成功无返回
  33. @usage
  34. while 1 do
  35. sys.wait(1000)
  36. local result, data = yhm27xx.cmd(15, 0x04, 0x05)
  37. log.info("yhm27xx", result, data)
  38. end
  39. */
  40. static int l_yhm27xx_cmd(lua_State *L)
  41. {
  42. uint8_t pin = luaL_checkinteger(L, 1);
  43. uint8_t chip_id = luaL_checkinteger(L, 2);
  44. uint8_t reg = luaL_checkinteger(L, 3);
  45. uint8_t data = 0;
  46. uint8_t is_read = 1;
  47. int ret = 0;
  48. if (!lua_isnone(L, 4))
  49. {
  50. is_read = 0;
  51. data = luaL_checkinteger(L, 4);
  52. }
  53. #ifdef LUAT_USE_DRV_GPIO
  54. ret = luat_drv_gpio_driver_yhm27xx(pin, chip_id, reg, is_read, &data);
  55. #else
  56. ret = luat_gpio_driver_yhm27xx(pin, chip_id, reg, is_read, &data);
  57. #endif
  58. if (ret != 0)
  59. {
  60. lua_pushboolean(L, 0);
  61. return 1;
  62. }
  63. lua_pushboolean(L, 1);
  64. if (is_read)
  65. {
  66. lua_pushinteger(L, data);
  67. return 2;
  68. }
  69. return 1;
  70. }
  71. static uint8_t reg_infos[9] = {0};
  72. static int l_yhm_27xx_cb(lua_State *L, void *ptr) {
  73. lua_getglobal(L, "sys_pub");
  74. if (lua_isfunction(L, -1)) {
  75. lua_pushstring(L, "YHM27XX_REG");
  76. lua_pushlstring(L, (const char*)reg_infos, 9);
  77. lua_call(L, 2, 0);
  78. }
  79. return 0;
  80. }
  81. static void luat_gpio_driver_yhm27xx_reqinfo(uint8_t pin, uint8_t chip_id) {
  82. for (uint8_t i = 0; i < 9; i++)
  83. {
  84. luat_gpio_driver_yhm27xx(pin, chip_id, i, 1, &(reg_infos[i]));
  85. }
  86. rtos_msg_t msg = {0};
  87. msg.handler = l_yhm_27xx_cb;
  88. luat_msgbus_put(&msg, 0);
  89. }
  90. /*
  91. 获取最新的寄存器信息(异步)
  92. @api yhm27xx.reqinfo(pin, chip_id)
  93. @int gpio端口号
  94. @int 芯片ID
  95. @return nil 无返回值
  96. @usage
  97. sys.subscribe("YHM27XX_REG", function(data)
  98. -- 注意, 会一次性读出0-9,总共8个寄存器值
  99. log.info("yhm27xx", data and data:toHex())
  100. end)
  101. yhm27xx.reqinfo(24, 0x04)
  102. */
  103. static int l_yhm27xx_reqinfo(lua_State *L)
  104. {
  105. uint8_t pin = luaL_checkinteger(L, 1);
  106. uint8_t chip_id = luaL_checkinteger(L, 2);
  107. #ifdef LUAT_USE_DRV_GPIO
  108. if (pin >= 128) {
  109. luat_drv_gpio_driver_yhm27xx_reqinfo(pin, chip_id);
  110. return 0;
  111. }
  112. #endif
  113. luat_gpio_driver_yhm27xx_reqinfo(pin, chip_id);
  114. return 0;
  115. }
  116. #ifdef LUAT_USE_YHM27XX
  117. #include "rotable2.h"
  118. static const rotable_Reg_t reg_yhm27xx[] = {
  119. {"cmd", ROREG_FUNC(l_pm_chgcmd)},
  120. {"reqinfo", ROREG_FUNC(l_pm_chginfo)},
  121. {NULL, ROREG_INT(0)}
  122. };
  123. LUAMOD_API int luaopen_yhm27xx(lua_State *L)
  124. {
  125. luat_newlib2(L, reg_yhm27xx);
  126. return 1;
  127. }
  128. #endif