luat_pm.h 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  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. LUAT_PM_POWER_WIFI,
  49. LUAT_PM_POWER_QTY,
  50. };
  51. // 电平类
  52. enum
  53. {
  54. LUAT_PM_ALL_GPIO,
  55. LUAT_PM_LDO_TYPE_VMMC,
  56. LUAT_PM_LDO_TYPE_VLCD,
  57. LUAT_PM_LDO_TYPE_CAMA,
  58. LUAT_PM_LDO_TYPE_CAMD,
  59. LUAT_PM_LDO_TYPE_VLP33,//8910没有
  60. LUAT_PM_LDO_TYPE_VLP18,//8910没有
  61. LUAT_PM_LDO_TYPE_VIO18,
  62. LUAT_PM_LDO_TYPE_VIBR, //8850没有
  63. LUAT_PM_LDO_TYPE_KEYLED,
  64. LUAT_PM_LDO_TYPE_VSIM1, //不一定起作用,尽量不要用
  65. LUAT_PM_LDO_TYPE_WPA,
  66. LUAT_PM_LDO_TYPE_QTY,
  67. };
  68. /**
  69. * @brief 请求进入指定的休眠模式
  70. * @param mode 休眠模式 见LUAT_PM_SLEEP_MODE_XXX
  71. * @return int =0成功,其他失败
  72. */
  73. int luat_pm_request(int mode);
  74. /**
  75. * @brief 退出休眠模式
  76. * @param mode 休眠模式 见LUAT_PM_SLEEP_MODE_XXX
  77. * @return int =0成功,其他失败
  78. */
  79. int luat_pm_release(int mode);
  80. /**
  81. * @brief 启动底层定时器,在休眠模式下依然生效. 只触发一次
  82. * @param id 定时器id, 通常为0-3
  83. * @param timeout 定时时长, 单位毫秒
  84. * @return int =0成功,其他失败
  85. */
  86. int luat_pm_dtimer_start(int id, size_t timeout);
  87. /**
  88. * @brief 停止底层定时器
  89. * @param id 定时器id, 通常为0-3
  90. * @return int =0成功,其他失败
  91. */
  92. int luat_pm_dtimer_stop(int id);
  93. /**
  94. * @brief 检查底层定时器运行状态
  95. * @param id 定时器id, 通常为0-3
  96. * @return int =1正在运行,0为未运行
  97. */
  98. int luat_pm_dtimer_check(int id);
  99. // void luat_pm_cb(int event, int arg, void* args);
  100. /**
  101. * @brief 唤醒原因,用于判断是从开机是否是由休眠状态下开机/唤醒
  102. * @param lastState 0-普通开机(上电/复位),3-深睡眠开机,4-休眠开机
  103. * @param rtcOrPad 0-上电/复位开机, 1-RTC开机, 2-WakeupIn/Pad/IO开机, 3-Wakeup/RTC开机
  104. * @return int =0成功,其他失败
  105. */
  106. int luat_pm_last_state(int *lastState, int *rtcOrPad);
  107. /**
  108. * @brief 强制进入指定的休眠模式,忽略某些外设的影响,比如USB
  109. * @param mode 休眠模式 见LUAT_PM_SLEEP_MODE_XXX
  110. * @return int =0成功,其他失败
  111. */
  112. int luat_pm_force(int mode);
  113. /**
  114. * @brief 检查休眠状态
  115. * @return int ,见LUAT_PM_SLEEP_MODE_XXX
  116. */
  117. int luat_pm_check(void);
  118. /**
  119. * @brief 获取所有深度休眠定时器的剩余时间,单位ms
  120. * @param count [OUT]定时器数量
  121. * @param list [OUT]剩余时间列表
  122. * @return int =0成功,其他失败
  123. */
  124. int luat_pm_dtimer_list(size_t* count, size_t* list);
  125. /**
  126. * @brief 获取唤醒定时器id
  127. * @param id 唤醒的定时id
  128. * @return int =0成功,其他失败
  129. */
  130. int luat_pm_dtimer_wakeup_id(int* id);
  131. /**
  132. * @brief 关机
  133. *
  134. */
  135. int luat_pm_poweroff(void);
  136. /**
  137. * @brief 重启
  138. *
  139. */
  140. int luat_pm_reset(void);
  141. /**
  142. * @brief 开启内部的电源控制,注意不是所有的平台都支持,可能部分平台支持部分选项,看硬件
  143. * @param id 电源控制id, 见LUAT_PM_POWER_XXX
  144. * @param val 开关true/1开,false/0关,默认关,部分选项支持数值
  145. * @return int =0成功,其他失败
  146. */
  147. int luat_pm_power_ctrl(int id, uint8_t val);
  148. /**
  149. * @brief 开机原因
  150. * @return int ,见LUAT_PM_POWERON_REASON
  151. */
  152. int luat_pm_get_poweron_reason(void);
  153. /**
  154. * @brief 设置IO电压域的电平
  155. * @param id 电压域ID,移芯平台忽略
  156. * @param val 期望的电平值,单位mv
  157. * @return int 成功返回0,其他失败
  158. */
  159. int luat_pm_iovolt_ctrl(int id, int val);
  160. /**
  161. * @brief 配置唤醒引脚,只针对esp系列
  162. * @param pin 引脚
  163. * @param val 电平
  164. * @return
  165. */
  166. int luat_pm_wakeup_pin(int pin, int val);
  167. /**
  168. * @brief 设置联网低功耗模式,等同于AT+POWERMODE
  169. * @param 低功耗主模式 见LUAT_PM_POWER_MODE_XXX
  170. * @param 预留,低功耗次级模式,当主模式设置成LUAT_PM_POWER_MODE_BALANCED,可以微调功耗模式,当前不可用
  171. * @return int =0成功,其他失败
  172. * @note 和luat_pm_set_sleep_mode,luat_pm_set_usb_power冲突,不可以同时使用
  173. */
  174. int luat_pm_set_power_mode(uint8_t mode, uint8_t sub_mode);
  175. /**
  176. * @brief 最后一次请求的休眠模式
  177. * @return int ,见LUAT_PM_SLEEP_MODE_XXX
  178. */
  179. int luat_pm_get_last_req_mode(void);
  180. /**
  181. * @brief 深度休眠定时器剩余时间,单位ms
  182. * @param id 定时器ID
  183. * @return uint32_t 0xffffffff失败,其他是剩余时间
  184. */
  185. uint32_t luat_pm_dtimer_remain(int id);
  186. #ifdef LUAT_USE_YHM27XX
  187. /**
  188. * @brief 单总线命令读写YHM27XX
  189. * @param pin yhm27xx_CMD引脚(可选,若传入nil则根据模组型号自动选择)
  190. * @param chip_id 芯片ID
  191. * @param reg_addr 读写寄存器地址
  192. * @param reg_data 要写入的数据,如果没填,则表示从寄存器读取数据
  193. * @return boolean 成功返回true,失败返回false
  194. * @return int 读取成功返回寄存器值,写入成功无返回
  195. */
  196. int l_pm_chgcmd(lua_State *L);
  197. /**
  198. * @brief 获取最新的寄存器信息(异步)
  199. * @param pin yhm27xx_CMD引脚(可选,若传入nil则根据模组型号自动选择)
  200. * @param chip_id 芯片ID
  201. * @return nil 无返回值
  202. */
  203. int l_pm_chginfo(lua_State *L);
  204. #endif
  205. /** @}*/
  206. #endif