低功耗管理
低功耗管理用于在M50设备处于空闲状态时,自动降低能耗,从而有效降低设备功耗。
每颗M50芯片在系统中均作为一个独立逻辑设备被识别。低功耗管理针对每个逻辑设备独立生效。当一台M50产品包含多个逻辑设备时,各设备会分别进行低功耗管理与状态切换。
2.2.1. 前提条件
-
操作系统支持 :
-
Ubuntu 20.04、22.04、24.04
-
Windows 11
-
Kylin V11
-
Android 15 (API level 35), arm64-v8a
-
-
软件版本要求 :
安装 v0.4.0 或更高版本的固件镜像和驱动后,低功耗默认启用。
2.2.2. 低功耗模式
后摩M50设备低功耗模式包括:sleep 和 hibernate。
运行时低功耗管理负责在主机保持运行时,根据设备自身空闲状态将设备切换至sleep模式;系统级低功耗管理则随主机电源状态变化,将设备切换至 Sleep 或 Hibernate模式。
2.2.2.1. Sleep模式
Sleep模式指后摩设备进入较深低功耗状态,PMIC模块和芯片内PCIe保持运行,外部DDR内存保持供电,AOSS(Always On Subsystem)和CPUSS(CPU Subsystem)保持供电但处于低功耗状态,其余模块断电并禁用。
2.2.2.2. Hibernate模式
Hibernate模式指后摩设备进入最低功耗状态,具体表现由主机的电源管理机制决定,后摩设备会根据主机能力进行自适应。该模式下可能的组合如下:
-
PMIC模块和芯片内PCIe保持运行,AOSS和CPUSS保持供电但处于低功耗状态,其余模块断电并禁用。
-
PMIC模块保持运行,AOSS保持供电但处于低功耗状态,其余模块断电并禁用。
-
所有模块断电并禁用。
2.2.3. 系统级低功耗管理
系统级低功耗管理是指由主机操作系统的电源状态驱动,后摩设备随主机状态变化而切换至对应的低功耗模式。
2.2.3.1. Linux系统
下表展示了 Linux 主机电源状态与后摩设备低功耗模式的对应关系:
警告
在主机电源状态为 Mem(deep) 或 Disk 的场景下,该功能在当前版本仍处于验证阶段,不属于正式支持特性。由于在不同主机平台或系统配置下,相关行为可能存在差异,建议仅在测试或验证场景中使用该功能,不建议在正式部署环境中使用。
| 表 2.1 主机与设备低功耗模式对应关系(Linux) 主机状态 | 设备状态 |
|---|---|
| Freeze 或 Mem(S2idle) | Sleep |
| Mem(deep) | Hibernate |
| Disk | Hibernate |
当主机恢复运行时,后摩设备会同步唤醒,并切换至正常工作模式。如需进行故障排查,可参看 常见问题解答。
2.2.3.1.1. 休眠唤醒操作
Ubuntu系统中,可以通过创建系统级 hook 脚本来捕获系统休眠和唤醒事件。系统在进入休眠或恢复唤醒时,会调用用户指定的脚本执行相应操作。
- 在
/lib/systemd/system-sleep目录下创建脚本,如test.sh:
sudo nano /lib/systemd/system-sleep/test.sh
test.sh脚本内容如下:
#!/bin/bash
case "$1/$2" in
pre/*)
# 系统即将进入休眠时触发
# 可在这里执行用户自定义操作,例如保存设备状态、停止服务等
echo "$(date '+%F %T') 系统即将进入休眠" >> /var/log/suspend.log
/path/to/your/suspend-script.sh
;;
post/*)
# 系统从休眠恢复后触发
# 可在这里执行用户自定义操作,例如恢复设备、重启服务或启动应用
echo "$(date '+%F %T') 系统已恢复" >> /var/log/suspend.log
/path/to/your/resume-script.sh
;;
esac
上面脚本中:
* 日志文件 `/var/log/suspend.log` 由脚本写入,可记录休眠和唤醒事件,便于调试和审计。
* `suspend-script.sh`:用户需自行编写,放置系统休眠前需要执行的操作,例如保存设备状态或停止服务。
* `resume-script.sh`:用户需自行编写,放置系统唤醒后需要执行的操作,例如恢复设备、重启服务或启动应用。
可参看 示例。
- 设置系统级脚本执行权限:
sudo chmod +x /lib/systemd/system-sleep/test.sh
-
测试方法如下:
- 触发系统休眠:
sudo systemctl suspend
2. 系统唤醒后,查看日志文件:
cat /var/log/suspend.log
2.2.3.1.1.1. 示例
下面 test.sh 脚本示例展示了系统休眠和唤醒的操作。
示例实现如下:
-
系统休眠前:
- 记录休眠事件日志
suspend.log。
- 记录休眠事件日志
-
系统唤醒时:
-
记录系统唤醒日志
suspend.log。 -
配置 Houmo SDK 运行环境。
-
切换工作目录
/home/houmo/v0.7.0/models。 -
执行后摩SMI工具指令
hm_smi -a获取当前后摩设备信息。
-
#!/bin/bash
case $1/$2 in
pre/*)
# 这里可以放置在系统进入休眠前执行的脚本
echo "系统即将进入休眠状态" >> /var/log/suspend.log
;;
post/*)
# 这里可以放置在系统恢复后执行的脚本
echo "系统已恢复" >> /var/log/suspend.log
export HOUMO_SDK_PATH=/usr/local/houmo-sdk
export TCIM_BACKEND=Xh2HalBackend
export HOUMO_TARGET=xh2
export LD_LIBRARY_PATH=/home/houmo/v0.7.0/houmo_tcim_runtime_xh2_linux_x86_64-0.7.0.dev20260110/lib:$LD_LIBRARY_PATH
export TCIM_RUNTIME_PATH=/home/houmo/v0.7.0/houmo_tcim_runtime_xh2_linux_x86_64-0.7.0.dev20260110
cd /home/houmo/v0.7.0/models
#sudo rm -rf run.log
hm_smi -a
;;
esac
2.2.3.2. Windows系统
下表展示了 Windows 主机电源状态与后摩设备低功耗模式的对应关系:
警告
在主机电源状态为 Sleep S3 或 Hibernate S4 的场景下,该功能在当前版本仍处于验证阶段,不属于正式支持特性。由于在不同主机平台或系统配置下,相关行为可能存在差异,建议仅在测试或验证场景中使用该功能,不建议在正式部署环境中使用。
| 表 2.2 主机与设备低功耗模式对应关系(Windows) 主机状态 | 设备状态 |
|---|---|
| Sleep S0iX | Sleep |
| Sleep S3 | Hibernate |
| Hibernate S4 | Hibernate |
当主机恢复运行时,后摩设备会同步唤醒,并切换至正常工作模式。如需进行故障排查,可参看 常见问题解答。
2.2.3.3. Android系统
下表展示了 Android 主机电源状态与后摩设备低功耗模式的对应关系:
| 表 2.3 主机与设备低功耗模式对应关系(Android) 主机状态 | 设备状态 |
|---|---|
| Freeze 或 Mem(S2idle) | Sleep |
| Mem(deep) | Hibernate |
当主机恢复运行时,后摩设备会同步唤醒,并切换至正常工作模式。如需进行故障排查,可参看 常见问题解答。
2.2.4. 运行时低功耗管理
运行时低功耗管理指在主机保持运行的情况下,当后摩设备连续处于空闲状态并超过设定延迟时间时,系统会自动将其切换至低功耗模式。设备会根据空闲状态和功耗需求,自动进入sleep模式,以实现最佳功耗优化。
2.2.4.1. Linux和Android系统
当设备处于空闲状态时,系统会在设定延迟时间后,自动将后摩设备切换至sleep模式,以降低功耗。当后摩设备再次接收到任务时,系统立即唤醒设备,并恢复至正常工作状态。默认情况下,后摩设备在空闲状态持续 5000 ms 后会自动进入sleep模式。
用户可通过Linux sysfs 文件接口查询或设置。
2.2.4.1.1. 查看设备运行时状态
调用下面指令查看后摩设备当前的运行时状态:
cat /sys/bus/pci/devices/<Domain>:<Bus>:<Device>.<Function>/power/runtime_status
其中,<Domain>:<Bus>:<Device>.<Function> 应替换为要查询的后摩设备的 PCIe BDF信息。可通过后摩SMI工具查询,详情参看 《SMI工具使用指南》。
示例如下:
cat /sys/bus/pci/devices/0000:05:00.0/power/runtime_status
返回值如下:
-
active:表示后摩设备处于正常工作模式,所有功能模块均可用。此状态表示设备未进入低功耗模式。 -
suspend:表示后摩设备处于sleep模式,设备已进入低功耗状态。
2.2.4.1.2. 查看设备功耗模式
调用下面指令查看后摩设备当前的功耗模式:
cat /sys/bus/pci/devices/<Domain>:<Bus>:<Device>.<Function>/power/control
其中,<Domain>:<Bus>:<Device>.<Function> 应替换为要查询的后摩设备的 PCIe BDF信息。可通过后摩SMI工具查询,详情参看 《SMI工具使用指南》。
示例如下:
cat /sys/bus/pci/devices/0000:05:00.0/power/control
返回值如下:
-
auto:低功耗模式启动,设备空闲时自动进入sleep模式。 -
on:低功耗模式关闭,设备在空闲状态下保持运行,不会切换至sleep模式。
2.2.4.1.3. 设置设备功耗模式
调用下面指令修改后摩设备的功耗模式:
# 关闭低功耗模式
echo on > /sys/bus/pci/devices/<Domain>:<Bus>:<Device>.<Function>/power/control
# 启用低功耗模式
echo auto > /sys/bus/pci/devices/<Domain>:<Bus>:<Device>.<Function>/power/control
其中,<Domain>:<Bus>:<Device>.<Function> 应替换为要设置的后摩设备的 PCIe BDF信息。可通过后摩SMI工具查询,详情参看 《SMI工具使用指南》。
2.2.4.1.4. 查看设备进入低功耗模式的延迟时间
调用下面指令查看后摩设备在空闲时,自动进入低功耗模式的延迟时间,单位为毫秒:
cat /sys/bus/pci/devices/<Domain>:<Bus>:<Device>.<Function>/power/autosuspend_delay_ms
其中,<Domain>:<Bus>:<Device>.<Function> 应替换为要查询的后摩设备的 PCIe BDF信息。可通过后摩SMI工具查询,详情参看 《SMI工具使用指南》。
示例如下:
cat /sys/bus/pci/devices/0000:05:00.0/power/autosuspend_delay_ms
2.2.4.1.5. 设置设备进入低功耗模式的延迟时间
调用下面指令设置后摩设备在空闲时,自动进入低功耗模式的延迟时间,单位为毫秒,默认为5000毫秒:
echo <latency_time> | sudo tee /sys/bus/pci/devices/<Domain>:<Bus>:<Device>.<Function>/power/autosuspend_delay_ms
其中 <latency_time> 应替换为延迟时间,单位为ms;<Domain>:<Bus>:<Device>.<Function> 应替换为要设置的后摩设备的 PCIe BDF信息。可通过后摩SMI工具查询,详情参看 《SMI工具使用指南》。
下面示例展示如何设置延迟时间为 6000ms:
echo 6000 | sudo tee /sys/bus/pci/devices/0000:05:00.0/power/autosuspend_delay_ms
2.2.4.2. Windows系统
当设备处于空闲状态时,系统会在设定延迟时间后自动将后摩设备置于sleep模式。当后摩设备需要执行任务时,系统立即唤醒设备,并切换至正常工作模式。默认情况下,后摩设备在空闲状态持续2秒后会自动进入sleep模式。
在 Windows 平台中,运行时低功耗管理功能存在以下限制:
-
不支持关闭运行时低功耗管理功能。
-
不支持修改进入sleep模式的延迟时间。
-
不支持查询设备功耗模式。
2.2.5. 常见问题解答
- 系统无法进入休眠(Hibernate)模式。
排查与解决方法
1. 故障边界判定。
1. 断开主机与M50设备的物理连接。
2. 测试主机是否能够正常休眠。
* **若主机仍无法进入休眠:** 说明问题与M50设备无关,主机侧未正确支持休眠功能。建议优先排查主机的电源管理兼容性和系统设置。
* **若主机可以正常进入休眠:** 说明问题与M50设备相关。在连接M50设备的情况下,硬件中断或电源状态转换存在冲突。说明该功能不支持,请联系后摩技术工程师。
2. 状态重置与恢复。当系统因上述问题进入异常状态时:
1. 保持主机处于开机状态,等待至少3分钟。
2. 对主机进行物理断电。
3. 重新上电启动系统。
2. 主机进入休眠后,M50设备未随系统正常恢复,表现为设备不可用或未被识别。
原因
由于不同主机的硬件设计或系统电源管理策略存在差异,可能导致M50设备无法被系统正常唤醒。
解决方法
当前版本建议通过完整复位恢复设备状态:
1. 保持主机处于开机状态,等待至少3分钟。
2. 对主机进行物理断电。
3. 重新上电启动系统。