luat_pm.h 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. #ifndef LUAT_PM_H
  2. #define LUAT_PM_H
  3. #include "luat_base.h"
  4. /**
  5. * @defgroup luatos_device_pm 电源管理类(低功耗)
  6. * @{
  7. */
  8. #define LUAT_PM_SLEEP_MODE_NONE 0 //系统处于活跃状态,未采取任何的降低功耗状态
  9. #define LUAT_PM_SLEEP_MODE_IDLE 1 //空闲模式,该模式在系统空闲时停止 CPU 和部分时钟,任意事件或中断均可以唤醒
  10. #define LUAT_PM_SLEEP_MODE_LIGHT 2 //轻度睡眠模式,CPU 停止,多数时钟和外设停止
  11. #define LUAT_PM_SLEEP_MODE_DEEP 3 //深度睡眠模式,CPU 停止,仅少数低功耗外设工作,可被特殊中断唤醒
  12. #define LUAT_PM_SLEEP_MODE_STANDBY 4 //待机模式,CPU 停止,设备上下文丢失(可保存至特殊外设),唤醒后通常复位
  13. //#define LUAT_PM_SLEEP_MODE_SHUTDOWN 5 //关断模式,比 Standby 模式功耗更低, 上下文通常不可恢复, 唤醒后复位
  14. #define LUAT_PM_POWER_MODE_NORMAL (0) ///< 去除所有降低功耗的措施
  15. #define LUAT_PM_POWER_MODE_HIGH_PERFORMANCE (1) ///< 尽可能保持性能,兼顾低功耗,使用LUAT_PM_SLEEP_MODE_LIGHT
  16. #define LUAT_PM_POWER_MODE_BALANCED (2) ///< 性能和功耗平衡,使用LUAT_PM_SLEEP_MODE_LIGHT
  17. #define LUAT_PM_POWER_MODE_POWER_SAVER (3) ///< 超低功耗,使用LUAT_PM_SLEEP_MODE_STANDBY,进入PSM模式
  18. /**
  19. * @brief 开机原因
  20. */
  21. typedef enum LUAT_PM_POWERON_REASON
  22. {
  23. LUAT_PM_POWERON_REASON_NORMAL = 0, /**<powerkey或者上电开机*/
  24. LUAT_PM_POWERON_REASON_FOTA, /**<充电或者AT指令下载完成后开机*/
  25. LUAT_PM_POWERON_REASON_ALARM, /**<闹钟开机*/
  26. LUAT_PM_POWERON_REASON_SWRESET, /**<软件重启*/
  27. LUAT_PM_POWERON_REASON_UNKNOWN, /**<未知原因*/
  28. LUAT_PM_POWERON_REASON_HWRESET, /**<RESET键重启*/
  29. LUAT_PM_POWERON_REASON_EXCEPTION, /**<异常重启*/
  30. LUAT_PM_POWERON_REASON_TOOL, /**<工具控制重启*/
  31. LUAT_PM_POWERON_REASON_WDT, /**<内部看门狗重启*/
  32. LUAT_PM_POWERON_REASON_EXTERNAL, /**<外部重启*/
  33. LUAT_PM_POWERON_REASON_CHARGING, /**<充电开机*/
  34. } LUAT_PM_POWERON_REASON_E;
  35. // 开关类
  36. enum
  37. {
  38. LUAT_PM_POWER_USB,
  39. LUAT_PM_POWER_GPS,
  40. LUAT_PM_POWER_GPS_ANT,
  41. LUAT_PM_POWER_CAMERA,
  42. LUAT_PM_POWER_DAC_EN_PIN,
  43. LUAT_PM_POWER_POWERKEY_MODE,
  44. LUAT_PM_POWER_WORK_MODE,
  45. LUAT_PM_POWER_LDO_CTL_PIN,
  46. LUAT_PM_POWER_WIFI_STA_DTIM,
  47. LUAT_PM_POWER_WIFI_AP_DTIM,
  48. };
  49. // 电平类
  50. enum
  51. {
  52. LUAT_PM_ALL_GPIO,
  53. LUAT_PM_LDO_TYPE_VMMC,
  54. LUAT_PM_LDO_TYPE_VLCD,
  55. LUAT_PM_LDO_TYPE_CAMA,
  56. LUAT_PM_LDO_TYPE_CAMD,
  57. LUAT_PM_LDO_TYPE_VLP33,//8910没有
  58. LUAT_PM_LDO_TYPE_VLP18,//8910没有
  59. LUAT_PM_LDO_TYPE_VIO18,
  60. LUAT_PM_LDO_TYPE_VIBR, //8850没有
  61. LUAT_PM_LDO_TYPE_KEYLED,
  62. LUAT_PM_LDO_TYPE_VSIM1, //不一定起作用,尽量不要用
  63. LUAT_PM_LDO_TYPE_WPA,
  64. LUAT_PM_LDO_TYPE_QTY,
  65. };
  66. /**
  67. * @brief 请求进入指定的休眠模式
  68. * @param mode 休眠模式 见LUAT_PM_SLEEP_MODE_XXX
  69. * @return int =0成功,其他失败
  70. */
  71. int luat_pm_request(int mode);
  72. /**
  73. * @brief 退出休眠模式
  74. * @param mode 休眠模式 见LUAT_PM_SLEEP_MODE_XXX
  75. * @return int =0成功,其他失败
  76. */
  77. int luat_pm_release(int mode);
  78. /**
  79. * @brief 启动底层定时器,在休眠模式下依然生效. 只触发一次
  80. * @param id 定时器id, 通常为0-3
  81. * @param timeout 定时时长, 单位毫秒
  82. * @return int =0成功,其他失败
  83. */
  84. int luat_pm_dtimer_start(int id, size_t timeout);
  85. /**
  86. * @brief 停止底层定时器
  87. * @param id 定时器id, 通常为0-3
  88. * @return int =0成功,其他失败
  89. */
  90. int luat_pm_dtimer_stop(int id);
  91. /**
  92. * @brief 检查底层定时器运行状态
  93. * @param id 定时器id, 通常为0-3
  94. * @return int =1正在运行,0为未运行
  95. */
  96. int luat_pm_dtimer_check(int id);
  97. // void luat_pm_cb(int event, int arg, void* args);
  98. /**
  99. * @brief 唤醒原因,用于判断是从开机是否是由休眠状态下开机/唤醒
  100. * @param lastState 0-普通开机(上电/复位),3-深睡眠开机,4-休眠开机
  101. * @param rtcOrPad 0-上电/复位开机, 1-RTC开机, 2-WakeupIn/Pad/IO开机, 3-Wakeup/RTC开机
  102. * @return int =0成功,其他失败
  103. */
  104. int luat_pm_last_state(int *lastState, int *rtcOrPad);
  105. /**
  106. * @brief 强制进入指定的休眠模式,忽略某些外设的影响,比如USB
  107. * @param mode 休眠模式 见LUAT_PM_SLEEP_MODE_XXX
  108. * @return int =0成功,其他失败
  109. */
  110. int luat_pm_force(int mode);
  111. /**
  112. * @brief 检查休眠状态
  113. * @return int ,见LUAT_PM_SLEEP_MODE_XXX
  114. */
  115. int luat_pm_check(void);
  116. /**
  117. * @brief 获取所有深度休眠定时器的剩余时间,单位ms
  118. * @param count [OUT]定时器数量
  119. * @param list [OUT]剩余时间列表
  120. * @return int =0成功,其他失败
  121. */
  122. int luat_pm_dtimer_list(size_t* count, size_t* list);
  123. /**
  124. * @brief 获取唤醒定时器id
  125. * @param id 唤醒的定时id
  126. * @return int =0成功,其他失败
  127. */
  128. int luat_pm_dtimer_wakeup_id(int* id);
  129. /**
  130. * @brief 关机
  131. *
  132. */
  133. int luat_pm_poweroff(void);
  134. /**
  135. * @brief 重启
  136. *
  137. */
  138. int luat_pm_reset(void);
  139. /**
  140. * @brief 开启内部的电源控制,注意不是所有的平台都支持,可能部分平台支持部分选项,看硬件
  141. * @param id 电源控制id, 见LUAT_PM_POWER_XXX
  142. * @param val 开关true/1开,false/0关,默认关,部分选项支持数值
  143. * @return int =0成功,其他失败
  144. */
  145. int luat_pm_power_ctrl(int id, uint8_t val);
  146. /**
  147. * @brief 开机原因
  148. * @return int ,见LUAT_PM_POWERON_REASON
  149. */
  150. int luat_pm_get_poweron_reason(void);
  151. /**
  152. * @brief 设置IO电压域的电平
  153. * @param id 电压域ID,移芯平台忽略
  154. * @param val 期望的电平值,单位mv
  155. * @return int 成功返回0,其他失败
  156. */
  157. int luat_pm_iovolt_ctrl(int id, int val);
  158. /**
  159. * @brief 配置唤醒引脚,只针对esp系列
  160. * @param pin 引脚
  161. * @param val 电平
  162. * @return
  163. */
  164. int luat_pm_wakeup_pin(int pin, int val);
  165. /**
  166. * @brief 设置联网低功耗模式,等同于AT+POWERMODE
  167. * @param 低功耗主模式 见LUAT_PM_POWER_MODE_XXX
  168. * @param 预留,低功耗次级模式,当主模式设置成LUAT_PM_POWER_MODE_BALANCED,可以微调功耗模式,当前不可用
  169. * @return int =0成功,其他失败
  170. * @note 和luat_pm_set_sleep_mode,luat_pm_set_usb_power冲突,不可以同时使用
  171. */
  172. int luat_pm_set_power_mode(uint8_t mode, uint8_t sub_mode);
  173. /**
  174. * @brief 最后一次请求的休眠模式
  175. * @return int ,见LUAT_PM_SLEEP_MODE_XXX
  176. */
  177. int luat_pm_get_last_req_mode(void);
  178. /**
  179. * @brief 深度休眠定时器剩余时间,单位ms
  180. * @param id 定时器ID
  181. * @return uint32_t 0xffffffff失败,其他是剩余时间
  182. */
  183. uint32_t luat_pm_dtimer_remain(int id);
  184. #ifdef LUAT_USE_YHM27XX
  185. /**
  186. * @brief 单总线命令读写YHM27XX
  187. * @param pin yhm27xx_CMD引脚(可选,若传入nil则根据模组型号自动选择)
  188. * @param chip_id 芯片ID
  189. * @param reg_addr 读写寄存器地址
  190. * @param reg_data 要写入的数据,如果没填,则表示从寄存器读取数据
  191. * @return boolean 成功返回true,失败返回false
  192. * @return int 读取成功返回寄存器值,写入成功无返回
  193. */
  194. int l_pm_chgcmd(lua_State *L);
  195. /**
  196. * @brief 获取最新的寄存器信息(异步)
  197. * @param pin yhm27xx_CMD引脚(可选,若传入nil则根据模组型号自动选择)
  198. * @param chip_id 芯片ID
  199. * @return nil 无返回值
  200. */
  201. int l_pm_chginfo(lua_State *L);
  202. #endif
  203. /** @}*/
  204. #endif