4.4.11. 低功耗模式调试指南
4.4.11.1. 概述与介绍
低功耗
4.4.11.2. 低功耗调试详细介绍
本
AON (Always On) 电源
域:始终保持 开启 状态。 DSP(DSP 子系统)电源
域:与 数字 信号处理 相关。 SOC(芯片
顶层 子系统)电源 域:涉及 芯片 的 顶层 子系统 功能。 CPU(CPU 子系统)电源
域:包括 CPU 相关 的 电源 管理。 BPU(BPU 子系统)电源
域:与 处理单元 相关 的 电源 域。 DDR(DDR 子系统)电源
域:与 内存 子系统 相关 的 电源 域。 VIDEO(视频
子系统)电源 域:与 视频 处理 相关 的 电源 域。 GPU(GPU 子系统)电源
域:与 图形 处理单元 相关 的 电源 域。 ISP(ISP 子系统)电源
域:与 图像 信号处理 相关 的 电源 域。
下面
| Sub Power Domain | Primary Power Supply | Logic Domain | Switch Control | Default Status |
|---|---|---|---|---|
| AON | VDD_AON | RTC | PMIC | ON |
| GPIO | ||||
| PMU | ||||
| AON_CRM | ||||
| DSP_NOC | ||||
| SRAM | ||||
| SLCR | ||||
| APB BUS | ||||
| DSP | VDD_DSP | DSP_DMA | PMIC | OFF |
| DSP_AXI_NOC | ||||
| APB BUS | ||||
| Timer | ||||
| I2C | ||||
| 12S x2 | ||||
| UART | ||||
| PDM | ||||
| SPI | ||||
| dsp_crm | ||||
| SRAM0/SRMA0 CTL | ||||
| SRAM1/SRMA1 CTL | ||||
| TZC-400 | ||||
| Mailbox | ||||
| DSP.HIFI5 | VDD_HIFI5_SW | HIFI5 | SW-SWT | OFF |
| SOC | VDD_SOC | display | PMIC | ON |
| camera | ||||
| GPU | ||||
| EMMC | ||||
| SDIO/SDIO CTL | ||||
| USB2 | ||||
| USB3 | ||||
| GMAC | ||||
| QSPI | ||||
| DMA | ||||
| WDT | ||||
| SYS_CTRL | ||||
| ADC | ||||
| Timer | ||||
| PVT | ||||
| E-Fuse | ||||
| SPI x6 | ||||
| UART x5 | ||||
| 12C x5 | ||||
| GPIO x16 | ||||
| LPWM x8 | ||||
| SOC.VIDEO | VDD_VIDEO_SW | video | SW-SWT | OFF |
| SOC.ISP | VDD_ISP_SW | isp8000 | SW-SWT | ON |
| CPU | VDD_CPU | CPU_NOC | PMIC | ON |
| asynchronous bridge | ||||
| debug block | ||||
| CPU.COREO | VDD_CORE0_SW | A55 COREO | SW-SWT | ON |
| CPU.CORE1 | VDD_CORE1_SW | A55 CORE1 | SW-SWT | OFF |
| CPU.CORE2 | VDD_CORE2_SW | A55 CORE2 | SW-SWT | OFF |
| CPU.CORE3 | VDD_CORE3_SW | A55 CORE3 | SW-SWT | OFF |
| CPU.CORE4 | VDD_CORE4_SW | A55 CORE4 | SW-SWT | OFF |
| CPU.CORE5 | VDD_CORE5_SW | A55 CORE5 | SW-SWT | OFF |
| CPU.CORE6 | VDD_CORE6_SW | A55 CORE6 | SW-SWT | OFF |
| CPU.CORE7 | VDD_CORE7_SW | A55 CORE7 | SW-SWT | OFF |
| DDR | VDD_DDR | DDR | PMIC | OFF |
| BPU | VDD_BPU | BPU | PMIC | OFF |
| GPU | VDD_BPU | BPU | PMIC | OFF |
从
Sub Power Domain(子
电源 :表示域) 电源 域 的 子 区域 名称,每个 子 电源 域 代表 系统 中 一部分 硬件 的 电源 管理 区域。例如, AON 电源 域、 DSP 电源 域、 SOC 电源 域 等。 Primary Power Supply(主要
电源 :表示供应) 该 电源 域 的 主要 电源 供应 源,即 为 该子 电源 域 提供 电力 的 主要 电源。例如, AON 电源 域 依赖 VDD_AON 电源, DSP 电源 域 依赖 VDD_DSP 电源 等。 Logic Domain(逻辑
功能域) :表示该 电源 域 所 管理 的 逻辑 功能 区域。即 在 此 电源 域 内,管理 和 控制 的 各种 功能模块。例如, AON 电源 域 管理 RTC(实时 时钟)、 GPIO(通用 输入输出)、 PMU(电源 管理 单元)等;而 DSP 电源 域 则 管理 数字 信号处理 相关 的 模块 如 DSP_DMA、 I2C、 UART 等。 Switch Control(电源
切换 :表示控制) 电源 域 的 开关 控制 机制,通常 涉及 到 如何 启用 或 关闭电源 域。例如, AON 电源 域 通过 PMIC 控制 电源开关,而 DSP.HIFI5 电源 域 则 通过 SW-SWT(软件 开关)控制。 Default Status(默认
状态) :表示电源 域 在 系统启动 或 默认 情况 下 的 电源 状态( ON 或 OFF)。 ON 表示 该 电源 域 在 默认 状态 下 为 开启, OFF 表示 该 电源 域 在 默认 状态 下 为 关闭。例如, AON 电源 域 的 默认 状态 是 ON,表示 该 区域 始终保持 开启 状态;而 DSP 电源 域 的 默认 状态 是 OFF,表示 该 区域 通常 在 待机 或 不 需要 时 关闭 以 节省 能量。
系统
OFF(关闭
模式) :此模式 下 所有 电源 域 关闭。 SLEEP(睡眠
模式) :在此 模式 下, AON、 DSP 和 HIFI5 电源 域 保持 开启,支持 硬件 唤醒( RTC、 GPIO、计数器 唤醒)和 语音 唤醒。 HIFI5 看门狗 中断 也 可以 将 系统 唤醒 到 工作 模式。 WORK(工作
模式) :在工作 模式 下, AON、 DSP、 SOC、 CPU 和 DDR 电源 域 必须 开启。 HIFI5 和 各个 CPU 核心( CORE0 到 CORE7 )以及 其他 子系统(如 BPU、 GPU、 ISP、 VIDEO)可 根据 需要 选择 开启 或 关闭。至少 有 一个 A55 核心 处于 开启 状态。系统 可以 通过 软件 配置 进入 睡眠 模式。
为了
4.4.11.3. 动态电压频率调整
动态
芯片
除了
调频调压方式
在
CPU 调频调压
板端
路径 :/sys/devices/system/cpu/cpufreq/policy0/目前
支持 :的 频率 root@buildroot:~# cat /sys/devices/system/cpu/cpufreq/policy0/scaling_available_frequencies 300000 600000 1200000 1500000
查看
当前 CPU 频率: cat /sys/devices/system/cpu/cpufreq/policy0/cpuinfo_cur_freq设置 CPU 频率,可以
通过 以下 命令: # 设置 CPU 频率为 1200000 echo userspace >/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor echo 1200000 >/sys/devices/system/cpu/cpufreq/policy0/scaling_setspeed
超频
功能 : CPU 提供超频 功能,超频 频率 为 1.8G。 启用
超频:
echo 1 >/sys/devices/system/cpu/cpufreq/boost echo performance >/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
1.8G 超频
时, CPU 工作电压 为 1V,其余 频点 对应 的 工作电压 为 850mV。 注意:仅 X5H 支持
超频, X5M 不可 用 超频。 芯片 类型 可 通过 以下 命令 查看,例如 以下 查询 的 芯片 是X5M root@buildroot:~# cat /sys/class/socinfo/soc_name X5M
注意:如果
芯片 类型 是”UKNOWN”,则 属于 是 早期 出厂 芯片,未 在eFUSE中 烧写 对应bit,需要 根据 芯片 丝印 区分 芯片 类型。 目前 CPU 支持
的 governor 如下 :performance:以最高 频率 运行。 ondemand:根据负载 动态 调整 频率。 userspace:用户自定义 频率。 powersave:以最低 频率 运行。 schedutil:结合 CPU 调度器 动态 调整 频率(当前 CPU 的 默认 governor)。
调整 CPU 的 governor,可以
通过 以下 命令: echo performance >/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor echo ondemand >/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor echo userspace >/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor echo powersave >/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor echo schedutil >/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
BPU 调频
板端
路径 :/sys/class/devfreq/3a000000.bpu目前
支持 :的 频率 root@buildroot:~# cat /sys/class/devfreq/3a000000.bpu/available_frequencies 500000000 1000000000
查看
当前 BPU 频率: cat /sys/class/devfreq/3a000000.bpu/cur_freq调整 BPU 频率
命令 如下: echo userspace >/sys/class/devfreq/3a000000.bpu/governor echo 500000000 >/sys/class/devfreq/3a000000.bpu/userspace/set_freq
BPU 支持
的 governor 如下 :userspace:根据
客户 的 配置 指定 频率。 performance:设置
为 最高 频率(当前 BPU 的 默认 governor)。 powersave:以
最低 频率 运行。
调整 BPU 的 governor,可以
通过 以下 命令: echo userspace >/sys/class/devfreq/3a000000.bpu/governor echo performance >/sys/class/devfreq/3a000000.bpu/governor echo powersave >/sys/class/devfreq/3a000000.bpu/governor
GPU 3D 调频
板端
路径 :/sys/class/devfreq/3c000000.gc8000目前
支持 :的 频率 root@buildroot:~# cat /sys/class/devfreq/3c000000.gc8000/available_frequencies 200000000 400000000 750000000 1000000000
查看
当前 频率: cat /sys/class/devfreq/3c000000.gc8000/cur_freq调整 GPU 3D 频率
命令 如下: echo userspace >/sys/class/devfreq/3c000000.gc8000/governor echo 750000000 >/sys/class/devfreq/3c000000.gc8000/userspace/set_freq
GPU 3D 支持
的 governor 如下: userspace:根据
客户 的 配置 指定 频率。 performance: GPU 3D 设置
为 最高 频率。 powersave:以
最低 频率 运行。 simple_ondemand:结合
工作 负载,按 需 调整 频率。
若
要 调整 GPU 3D 的 governor,可以 通过 以下 命令 echo userspace >/sys/class/devfreq/3c000000.gc8000/governor echo performance >/sys/class/devfreq/3c000000.gc8000/governor echo powersave >/sys/class/devfreq/3c000000.gc8000/governor echo simple_ondemand >/sys/class/devfreq/3c000000.gc8000/governor
DDR 调频
板端
路径 :/sys/class/devfreq/soc:ddrc-freq目前
支持 :的 频率 root@buildroot:~# cat /sys/class/devfreq/soc:ddrc-freq/available_frequencies 266000000 2133000000 2844000000 4266000000
查看
当前 DDR 频率: cat /sys/class/devfreq/soc\:ddrc-freq/cur_freq
调整 DDR 频率
命令 如下: echo userspace >/sys/class/devfreq/soc:ddrc-freq/governor echo 266000000 >/sys/class/devfreq/soc:ddrc-freq/userspace/set_freq
DDR 支持
的 governor 如下: userspace:根据
客户 的 配置 指定 频率。 performance: DDR 设置
为 最高 频率。 simple_ondemand:根据 DDR 的
负载 调整 频率。 powersave:以
最低 频率 运行。
若
要 调整 ddr 的 governor,可以 通过 以下 命令: echo userspace >/sys/class/devfreq/soc\:ddrc-freq/governor echo performance >/sys/class/devfreq/soc\:ddrc-freq/governor echo simple_ondemand >/sys/class/devfreq/soc\:ddrc-freq/governor echo powersave >/sys/class/devfreq/soc\:ddrc-freq/governor
动态调整说明
基于负载的动态调整
在
例如,当 CPU 负载ondemand governor 会
echo ondemand >/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
此时,操作系统
基于温度的动态调整
温度thermal 机制
在thermal 系统
在
其他动态调整策略
除了
例如,使用schedutil governor 时,系统
echo schedutil >/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
当前,系统schedutil governor:
root@buildroot:~# cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
schedutil
另外, CPU core 在
echo 0 >/sys/devices/system/cpu/cpu1/online #disable cpu1
echo 1 >/sys/devices/system/cpu/cpu1/online #enable cpu1
移植和开发
内核配置
在
DVFS 支持:
CONFIG_CPU_FREQ:启用 CPU 频率
调整。 CONFIG_CPU_FREQ_STAT:启用 CPU 频率
统计 功能。 CONFIG_CPU_FREQ_GOV_PERFORMANCE:启用
性能 governor。 CONFIG_CPU_FREQ_GOV_ONDEMAND:启用
按 需 governor。 CONFIG_CPU_FREQ_GOV_USERSPACE:启用
用户 空间 governor。 CONFIG_CPU_FREQ_GOV_POWERSAVE:启用
节能 governor。 CONFIG_CPU_FREQ_GOV_SCHEDUTIL:启用
与 调度 器 结合 的 governor。
CPU hotplug 支持:
CONFIG_HOTPLUG_CPU:启用 CPU hotplug 功能。
设备
CONFIG_PM:启用
电源 管理 支持。 CONFIG_PM_DEBUG:启用
电源 管理 调试。 CONFIG_PM_ADVANCED_DEBUG:启用
更 详细 的 电源 管理 调试信息。 CONFIG_PM_TEST_SUSPEND:启用
电源 管理 挂 起 测试 功能。 CONFIG_PM_DEVFREQ:启用
设备 频率 管理(devfreq)。 CONFIG_PM_DEVFREQ_EVENT:启用
设备 频率 管理 事件 支持。
用户./bd.sh boot menuconfig 来
CONFIG_CPU_FREQ=y
CONFIG_CPU_FREQ_STAT=y
CONFIG_CPU_FREQ_GOV_POWERSAVE=y
CONFIG_CPU_FREQ_GOV_USERSPACE=y
CONFIG_CPU_FREQ_GOV_ONDEMAND=y
CONFIG_PM_DEBUG=y
CONFIG_PM_ADVANCED_DEBUG=y
CONFIG_PM_TEST_SUSPEND=y
CONFIG_PM_DEVFREQ=y
CONFIG_PM_DEVFREQ_EVENT=y
Linux Power Management 核心框架
Linux 的
系统
级 :管理系统电源 管理(System Power Management) 整体 的 功耗 状态,包括 对 CPU 的 空闲 状态( C-state)、系统 挂 起( suspend)、休眠( hibernate)等 状态 的 控制。它 确保 在 系统 空闲 时, CPU 和 其他 关键 硬件 进入 低功耗 状态。 设备
电源 :管理管理(Device Power Management) 外部设备 的 功耗,包括 驱动程序 如何 管理 硬件 设备 的 电源开关、挂 起、恢复 等 行为。
Linux 内核

上
cpufreq 子系统
cpufreq是 Linux 内核中 专门 用于 CPU 调频 的 子系统。它 提供 了 一个 统一 的 接口,允许 内核 或 用户 空间 应用程序 动态 调整 CPU 的 频率。 调频
驱动 :不同的 硬件平台 通常 需要 不同 的 调频 驱动 来 支持 CPU 的 调频 操作。常见 的 驱动 包括 intel_pstate(适用于 Intel 处理器)和 acpi-cpufreq(适用于 支持 ACPI 的 系统)。 调度
策略 :cpufreq提供了 几种 调度 策略,例如 ondemand、conservative、performance和powersave,每种策略 根据 系统 负载 动态 调整 频率。
cpuidle 子系统
cpuidle子系统管理 CPU 的 空闲 状态。通过 将 CPU 置于 不同 的 空闲 状态,系统 能够 进一步 降低功耗。 cpuidle与cpufreq协同工作,当 CPU 进入空闲 状态 时,频率 和 电压 会 降低,以 减少 功耗。 devfreq 子系统
devfreq是一个 用于 控制 设备(如 GPU、内存 等)频率 的 子系统。它 允许 设备 根据 负载 调节 其 频率,以 实现 低功耗 运行。
Linux 系统
DVFS 测试
以
查看
root@buildroot:~# cat /sys/devices/virtual/thermal/thermal_zone1/trip_point_1_temp
95000
查看
root@buildroot:~# hrut_somstatus
=====================1=====================
temperature-->
DDR : 46.9 (C)
BPU : 45.6 (C)
CPU : 45.7 (C)
cpu frequency-->
min(M) cur(M) max(M)
cpu0 : 300 1500 1500
cpu1 : 300 1200 1500
cpu2 : 300 300 1500
cpu3 : 300 1200 1500
cpu4 : 300 1200 1500
cpu5 : 300 1200 1500
cpu6 : 300 1200 1500
cpu7 : 300 300 1500
bpu status information---->
min(M) cur(M) max(M) ratio
bpu0 : 500 1000 1000 0
ddr frequency information---->
min(M) cur(M) max(M)
ddr : 266 4266 4266
GPU gc8000 frequency information---->
min(M) cur(M) max(M)
gc8000 : 200 1000 1000
设置 CPU 调频
echo 45000 > /sys/devices/virtual/thermal/thermal_zone1/trip_point_1_temp
再次
root@buildroot:~# hrut_somstatus
=====================1=====================
temperature-->
DDR : 47.6 (C)
BPU : 46.4 (C)
CPU : 46.4 (C)
cpu frequency-->
min(M) cur(M) max(M)
cpu0 : 300 1500 1500
cpu1 : 300 1200 1500
cpu2 : 300 1200 1500
cpu3 : 300 1200 1500
cpu4 : 300 300 1500
cpu5 : 300 1200 1500
cpu6 : 300 1200 1500
cpu7 : 300 1200 1500
bpu status information---->
min(M) cur(M) max(M) ratio
bpu0 : 500 1000 1000 0
ddr frequency information---->
min(M) cur(M) max(M)
ddr : 266 4266 4266
GPU gc8000 frequency information---->
min(M) cur(M) max(M)
gc8000 : 200 1000 1000
上述
注意: 测试
DVFS 调频调压常见问题
问题:调整 CPU 频率
后,系统 性能 下降 明显。 解决
方法 :检查调整 的 频率 是否 在 CPU 支持 的 范围 内,避免 设置 过低 的 频率。同时,可以 尝试 使用 不同 的 governor,例如 ondemand或schedutil,以根据 系统 负载 动态 调整 频率。
问题:调整 GPU 频率
后,出现 图形 渲染 问题。 解决
方法 :确保 GPU 驱动程序支持 动态 频率 调整,并且 调整 的 频率 在 GPU 支持 的 范围 内。同时,可以 检查 GPU 的 电压 是否 与 频率 匹配,避免 因 电压 不足 导致 的 渲染 问题。
问题:禁用 CPU 核心
后,系统 响应 变慢。 解决
方法 :根据系统 的 实际 负载 情况,合理配置 CPU 核心 的 启用 和 禁用 策略。例如,在 高 负载 时 启用 更 多 的 CPU 核心,在 低 负载 时 禁用 部分 CPU 核心。同时,可以 使用 isolcpus参数将 关键 任务 绑定 到 特定 的 CPU 核心,以 保证系统 的 响应速度。
4.4.11.4. 休眠唤醒
休眠
本
休眠唤醒方式
休眠命令
休眠
echo mem > /sys/power/state
该
唤醒命令
RTC 唤醒
命令 :rtcwake -s 2 -m mem
-s:休眠时间,单位 为 秒; -m:休眠模式(如 suspend to ram)。
GPIO 唤醒:
只有 AON 的 GPIO 可以
作为 唤醒 源,如 在 EVB 上,使用 了 AON GPIO2 作为 唤醒 源,拉低 AON GPIO2 唤醒 系统,在 dts 中 需要 将 其 配置 为 唤醒 源。 在
设备树( DTS )中 配置 AON GPIO 为 唤醒 源,如下: gpio-keys { compatible = "gpio-keys"; autorepeat; pinctrl-names = "default"; pinctrl-0 = <&aon_gpio_2>; key-power { debounce-interval = <100>; gpios = <&aon_gpio_porta 2 GPIO_ACTIVE_LOW>; label = "GPIO Key Power"; linux,code = <KEY_POWER>; wakeup-source; }; };
拉低 AON GPIO2 即可
唤醒 系统。用户 可以 根据 自身 硬件 设计,将 对应 的 GPIO 配置 为 唤醒 源。
移植和开发
内核配置
在
CONFIG_SUSPEND:启用
系统 休眠 支持。
用户./bd.sh boot menuconfig 来
Linux 系统休眠 / 恢复流程概述
Linux 系统
系统
准备
挂 :起 调用
pm_suspend()函数,将系统 切换 到 挂 起 状态。 在
调用 pm_suspend()之前, Linux 内核会 执行 一系列 的 准备 工作,如 停止 正在 运行 的 进程、关闭 不必要 的 设备 等。
保存
系统 :状态 系统
调用 suspend_devices()来挂 起 所有 支持 的 设备。 调用
platform_suspend()保存平台 特定 的 硬件 状态。
进入
低功耗 :状态 一旦
所有 设备 和 系统 状态 都 被 保存, CPU 会 进入 低功耗 状态。此时,系统 大部分 硬件 都 处于 挂 起 状态,只有 必要 的 硬件(如 内存)保持 工作。
恢复
系统 :状态 当
系统 从 休眠 或 挂 起 状态 恢复 时,调用 resume_devices()恢复所有 设备 的 状态。 内核
会 重新启动 所有 进程,并 从 内存 或 硬盘 加载 系统 状态,恢复 到 休眠 前 的 工作 状态。
而
系统
准备
恢复 :系统
从 低功耗 状态 或 磁盘 恢复 后,首先 会 调用 pm_resume()函数,开始恢复 系统。 在
调用 pm_resume()之前, Linux 内核会 执行 一系列 准备 工作,如 重新 激活 需要 的 硬件、恢复 系统 状态 等。
恢复
系统 :状态 系统
调用 resume_devices()来恢复 所有 设备 的 状态。此 过程 会 根据 设备 的 驱动程序 恢复 其 工作 状态。 对于
挂 起( Suspend)模式,设备 的 状态 保存 在 内存 中,因此 需要 从 内存 中 恢复 设备 的 状态。 对于
休眠( Hibernate)模式,系统 从 硬盘 读取 保存 的 系统 状态,并 恢复 到 休眠 前 的 状态。
恢复
进程 :和 内存 状态 系统
从 挂 起 或 休眠状态 恢复 后,内核 会 恢复 所有 进程 的 状态,确保 每个 进程 能够 从 暂停状态 继续执行。 对于
休眠 模式,内核 会 从 磁盘 上 的 休眠 镜像 中 加载 进程 和 内存 的 状态,恢复 到 系统 休眠 前 的 状态。
设备
恢复 :和 初始化 恢复
过程 不仅仅 是 恢复 内存 和 进程,所有 硬件 设备 也 需要 重新 初始化。具体 而言: 对于 PCI 设备、 USB 控制器
等 硬件 设备,系统 会 通过 调用 设备 的 resume方法来 重新 启用 设备。 驱动程序
会 确保 硬件 设备 恢复 到 正确 的 工作 状态,例如 重新 启用 中断、恢复 数据传输 等。
系统
恢复 :完成 恢复
过程 中,所有 设备 被 恢复 到 正常 工作 状态,内存 中 的 数据 被 恢复,进程 重新启动 并 继续执行。 系统
恢复 完成 后,用户 可以 继续 使用 计算机,系统 状态 与 休眠 前 基本相同。
系统

Linux 系统

从
应用程序
通过 特定 的 接口 与 Linux PM 交互, Linux PM 通过 PM API 与 设备 驱动 和 核心 服务 交互,最终 影响 硬件 的 电源 状态。 Secure Monitor 在
整个 过程 中 起到 监控 和 保护 的 作用,确保 电源 管理 的 安全性。
以下
Hobot 软件(蓝色):
Power Manager Services:负责管理
电源 的 软件 服务。 App1 和 App2:应用程序,其中 App2 没有
CAP_BLOCK_SUSPEND权限,因此不能 调用 /sys/power/wake_unlock接口。
Linux 内核
软件(绿色) :autosleep work:自动
休眠 的 工作 机制,可能 用于 在 系统 空闲 时 自动 进入 低功耗 状态。 Linux PM(电源
管理) :核心的 电源 管理 模块,负责 协调系统 的 电源 状态。 Driver1 和 Driver2:设备
驱动程序,一般 用于 管理 特定 硬件 的 电源 状态。 CPU Driver (PSCI): CPU 驱动,使用 PSCI( Power State Coordination Interface)接口
来 管理 CPU 的 电源 状态。 Others Core Services:其他
核心 服务,一般 包括 系统日志、安全监控 等。
接口:
/sys/power/autosleep:用于设置 或 查询 自动 休眠 的 接口。 /sys/power/wake_unlock:用于解锁 唤醒 源 的 接口, App2 由于 权限 问题 无法 使用。
Secure Monitor(安全监控):
负责
监控 和 管理 硬件 层面 的 电源 状态,确保 系统 的 安全 和 稳定。
Hardware(硬件):
底层
硬件,与 软件 层 交互 以 实现 电源 管理 功能。
系统休眠和唤醒测试
进行 GPIO 睡眠
# 准备打印日志
dmesg -w&
# 系统休眠
echo mem > /sys/power/state
输入
在 X5 EVB 板端, wakeup 按键
按下 wakeup 按键
root@buildroot:~# dmesg -w&
root@buildroot:~# echo mem > /sys/power/state
NOTICE: mmu enabled from [LIGHT] sleep, pll: 1:1:1:1:1:0 relock: 0:0:0:0:0:0
[ 69.484694] hobot_gmac 35010000.horizon_tsn eth0: mac_config_rx_queues_routing, not support packet mode :
[ 69.644730] usb usb1: root hub lost power or was reset
[ 69.644736] usb usb2: root hub lost power or was reset
[ 69.928800] random: crng reseeded on system resumption
[ 69.145044] PM: suspend entry (deep)
[ 69.148213] Filesystems sync: 0.003 seconds
[ 69.149837] Freezing user space processes
[ 69.150455] remoteproc remoteproc0: clr: 866
[ 69.150475] remoteproc remoteproc0: clr: 866, 0 866
[ 69.151679] Freezing user space processes completed (elapsed 0.001 seconds)
[ 69.151699] OOM killer disabled.
[ 69.151707] Freezing remaining freezable tasks
[ 69.153204] Freezing remaining freezable tasks completed (elapsed 0.001 seconds)
[ 69.153223] printk: Suspending console(s) (use no_console_suspend to debug)
[ 69.154767] HOBOT GDC 3d0c0000.gdc: hobot_gdc_suspend
[ 69.154860] hobot-sif 3d050000.sif: cim_suspend
[ 69.154874] hobot-sif 3d040000.sif: cim_suspend
[ 69.154887] hobot-sif 3d030000.sif: cim_suspend
[ 69.154900] hobot-sif 3d020000.sif: cim_suspend
[ 69.154971] hobot_vpu_dev: [VPUDRV]vpu_suspend:7842: [-]vpu_suspend leave
[ 69.154981] hobot_jpu_dev: [JPUDRV]jpu_suspend:3833: [+]jpu_suspend enter
[ 69.154985] hobot_jpu_dev: [JPUDRV]jpu_suspend:3834: [-]jpu_suspend leave
[ 69.195792] hobot-dsp dsp0: hobot_dsp_suspend dsp0
[ 69.195884] vin mipi0: drivers/media/platform/horizon/camsys/mipi/hobot_mipi_host_ops.c:hobot_mipi_host_suspend_do enter suspend...
[ 69.195893] vin mipi2: drivers/media/platform/horizon/camsys/mipi/hobot_mipi_host_ops.c:hobot_mipi_host_suspend_do enter suspend...
[ 69.195900] vin mipi3: drivers/media/platform/horizon/camsys/mipi/hobot_mipi_host_ops.c:hobot_mipi_host_suspend_do enter suspend...
[ 69.202999] CAM_SUBSYS soc:cam:cam_sys@0: camsys_suspend
[ 69.203140] vin mipi1: drivers/media/platform/horizon/camsys/mipi/hobot_mipi_host_ops.c:hobot_mipi_host_suspend_do enter suspend...
[ 69.203151] [INFO][HOBOT_OSD](hb_osd_suspend) done
[ 69.203172] [CODEC_NODE]:[L731]hobot_codec_node_suspend 731
[ 69.203281] PM: suspend devices took 0.050 seconds
[ 69.205883] Disabling non-boot CPUs ...
[ 69.206416] psci: CPU1 killed (polled 0 ms)
[ 69.207251] psci: CPU2 killed (polled 0 ms)
[ 69.208016] psci: CPU3 killed (polled 0 ms)
[ 69.208612] psci: CPU4 killed (polled 0 ms)
[ 69.209135] psci: CPU5 killed (polled 0 ms)
[ 69.209687] psci: CPU6 killed (polled 0 ms)
[ 69.211256] psci: CPU7 killed (polled 0 ms)
[ 69.211484] Enabling non-boot CPUs ...
[ 69.222647] Detected VIPT I-cache on CPU1
[ 69.222707] GICv3: CPU1: found redistributor 100 region 0:0x0000000030160000
[ 69.222741] CPU1: Booted secondary processor 0x0000000100 [0x412fd050]
[ 69.223109] CPU1 is up
[ 69.234201] Detected VIPT I-cache on CPU2
[ 69.234235] GICv3: CPU2: found redistributor 200 region 0:0x0000000030180000
[ 69.234259] CPU2: Booted secondary processor 0x0000000200 [0x412fd050]
[ 69.234559] CPU2 is up
[ 69.245647] Detected VIPT I-cache on CPU3
[ 69.245679] GICv3: CPU3: found redistributor 300 region 0:0x00000000301a0000
[ 69.245699] CPU3: Booted secondary processor 0x0000000300 [0x412fd050]
[ 69.246028] CPU3 is up
[ 69.257116] Detected VIPT I-cache on CPU4
[ 69.257151] GICv3: CPU4: found redistributor 400 region 0:0x00000000301c0000
[ 69.257174] CPU4: Booted secondary processor 0x0000000400 [0x412fd050]
[ 69.257509] CPU4 is up
[ 69.268597] Detected VIPT I-cache on CPU5
[ 69.268645] GICv3: CPU5: found redistributor 500 region 0:0x00000000301e0000
[ 69.268667] CPU5: Booted secondary processor 0x0000000500 [0x412fd050]
[ 69.269009] CPU5 is up
[ 69.280099] Detected VIPT I-cache on CPU6
[ 69.280148] GICv3: CPU6: found redistributor 600 region 0:0x0000000030200000
[ 69.280171] CPU6: Booted secondary processor 0x0000000600 [0x412fd050]
[ 69.280538] CPU6 is up
[ 69.291624] Detected VIPT I-cache on CPU7
[ 69.291673] GICv3: CPU7: found redistributor 700 region 0:0x0000000030220000
[ 69.291695] CPU7: Booted secondary processor 0x0000000700 [0x412fd050]
[ 69.292097] CPU7 is up
[ 69.306467] [CODEC_NODE]:[L751]hobot_codec_node_resume 751
[ 69.306487] [INFO][HOBOT_OSD](hb_osd_resume) done
[ 69.306494] vin mipi1: drivers/media/platform/horizon/camsys/mipi/hobot_mipi_host_ops.c:hobot_mipi_host_resume_do enter resume...
[ 69.306575] CAM_SUBSYS soc:cam:cam_sys@0: camsys_resume
[ 69.484694] hobot_gmac 35010000.horizon_tsn eth0: mac_config_rx_queues_routing, not support packet mode :\x02
[ 69.484746] hobot_gmac 35010000.horizon_tsn eth0: configuring for phy/rgmii-id link mode
[ 69.524503] vin mipi3: drivers/media/platform/horizon/camsys/mipi/hobot_mipi_host_ops.c:hobot_mipi_host_resume_do enter resume...
[ 69.524512] vin mipi2: drivers/media/platform/horizon/camsys/mipi/hobot_mipi_host_ops.c:hobot_mipi_host_resume_do enter resume...
[ 69.524518] vin mipi0: drivers/media/platform/horizon/camsys/mipi/hobot_mipi_host_ops.c:hobot_mipi_host_resume_do enter resume...
[ 69.524826] hobot-dsp dsp0: hobot_dsp_resume dsp0
[ 69.644730] usb usb1: root hub lost power or was reset
[ 69.644736] usb usb2: root hub lost power or was reset
[ 69.647123] hobot_jpu_dev: [JPUDRV]jpu_resume:3862: [+]jpu_resume enter
[ 69.647129] hobot_jpu_dev: [JPUDRV]jpu_resume:3863: [-]jpu_resume leave
[ 69.647137] hobot_vpu_dev: [VPUDRV]vpu_resume:7887: [+]vpu_resume enter
[ 69.647141] hobot_vpu_dev: [VPUDRV]vpu_resume:8033: [-]vpu_resume leave
[ 69.702201] hobot-sif 3d020000.sif: cim_resume
[ 69.702213] hobot-sif 3d030000.sif: cim_resume
[ 69.702224] hobot-sif 3d040000.sif: cim_resume
[ 69.702234] hobot-sif 3d050000.sif: cim_resume
[ 69.702299] HOBOT GDC 3d0c0000.gdc: hobot_gdc_resume
[ 69.906154] PM: resume devices took 0.600 seconds
[ 69.926659] OOM killer enabled.
[ 69.926675] Restarting tasks ... done.
[ 69.928800] random: crng reseeded on system resumption
[ 69.934105] PM: suspend exit
[ 69.968824] remoteproc remoteproc0: new: 866, 0 0
以下
1 ) 休眠
进入
休眠 :echo mem > /sys/power/state:该命令 将 系统 置于 休眠状态,具体 是“深度 休眠”( deep sleep)。 PM: suspend entry:系统开始 进入 休眠状态。
文件系统
同步 :Filesystems sync: 0.003 seconds:在进入 休眠 之前,系统 进行 了 文件系统 的 同步,确保 所有 数据 写入 磁盘。
冻结
用户 :空间 进程 Freezing user space processes:系统冻结 用户 空间 进程,防止 在 休眠 期间 进程 状态 变化。 Freezing user space processes completed (elapsed 0.001 seconds):冻结过程 完成。
禁用
非 :引导 CPU Disabling non-boot CPUs ...:系统禁用 非 引导 CPU(即 除了 引导 CPU 以外 的 其他 CPU),以 节省 功耗。
2 ) 设备
设备
挂 :起 多个
设备 的 挂 起 操作 被 记录,例如: hobot_gdc_suspend、cim_suspend、vpu_suspend、jpu_suspend等,表明这些 设备 在 进入 休眠状态 时 被 挂 起。
PM: suspend devices took 0.050 seconds:设备挂 起 操作 耗时 50 毫秒。
3 ) 恢复
恢复
设备 :PM: resume devices took 0.600 seconds:恢复设备 的 过程 耗时 600 毫秒。 设备
恢复 的 日志 信息 表明 多个 设备(如 hobot_gdc_resume、cim_resume、vpu_resume、jpu_resume等)被重新 激活。
重新
启用 :非 引导 CPU Enabling non-boot CPUs ...:系统重新 启用 之前 禁用 的 非 引导 CPU。 日志
中 显示 每个 CPU 的 启动 信息,例如 CPU1 is up,表明 CPU 已成功 恢复。
4 ) 其他
USB 设备
状态 :usb usb1: root hub lost power or was reset: USB 根集线器 在 休眠 或 恢复 过程 中 失去 电源 或 被 重置,这 可能 影响 USB 设备 的 正常 工作。
随机数
生成器 :random: crng reseeded on system resumption:在系统 恢复 时,随机数 生成器 被 重新 播种,这是 确保 系统 安全性 的 一部分。
OOM Killer:
OOM killer disabled和OOM killer enabled:在休眠 期间 禁用 了 OOM( Out Of Memory)杀手,以 防止 在 低 内存 情况 下 杀死 进程,而 在 恢复 后 重新 启用。
休眠唤醒常见问题
问题:系统
休眠 后 无法 正常 唤醒。 解决
方法 :检查休眠 唤醒 源 的 配置 是否 正确,例如 RTC 唤醒 的 设置 是否 正确, GPIO 唤醒 的 GPIO 引脚 是否 配置 为 唤醒 源。同时,可以 检查 系统日志,查看 休眠 和 唤醒 过程 中 是否 有 错误信息 或 异常情况。
问题:休眠
唤醒 后,系统 性能 下降。 解决
方法 :在系统 唤醒 后,检查 设备 和 驱动程序 的 状态 是否 正常,确保 所有 设备 和 驱动程序 都 正确 地 恢复 了 工作 状态。同时,可以 尝试 调整 休眠 唤醒 的 策略,例如 使用 不同 的 休眠 方式 或 调整 休眠 时间,以 减少 对系统 性能 的 影响。
4.4.11.5. 典型场景功耗
以 X5 EVB 主板
硬件
环境 : X5 EVB 主板场景
负载 8x CPU @ 1.5G,负载 80%
1x BPU @ 1.0G,负载 80%
LPDDR4 @ 3200MHz,带宽 100%
双路 Camera 接入,负载 2x 1080p @ 30fps
测试方法
结温85度下,统计 X5 芯片
各路 电源 的 平均 电流 数据
测试
结果 X5芯片
平均 功耗 最大值 为 4335mW
| Voltage Domains | Voltage(V) | Avg Current(mA) | Avg Power(mW) |
|---|---|---|---|
| CH0 SOC_1V8 | 1.8 | 16 | 28.8 |
| CH1 DDR_0V8 | 0.8 | 817 | 653.6 |
| CH2 GPU_0V8 | 0.8 | 0 | 0 |
| CH3 SOC_0V8 | 0.8 | 992 | 793.6 |
| CH4 DSP_0V8 | 0.8 | 80 | 64 |
| CH5 18_DSP | 1.8 | 4 | 7.2 |
| CH6 CSI_0V8 | 0.8 | 4 | 3.2 |
| CH7 SOC_3V3 | 3.3 | 0 | 0 |
| CH8 DSI_0V8 | 0.8 | 0 | 0 |
| CH9 AON_0V8 | 0.8 | 7 | 5.6 |
| CH10 AON_1V8 | 1.8 | 0 | 0 |
| CH11 18_SOC | 1.8 | 40 | 72 |
| CH12 USB_3V3 | 3.3 | 28 | 92.4 |
| CH13 CSI_1V8 | 1.8 | 4 | 7.2 |
| CH14 USB_0V8 | 0.8 | 28 | 22.4 |
| CH15 BPU_0V8 | 0.8 | 1033 | 826.4 |
| CH16 DDR_1V1 | 1.1 | 639 | 702.9 |
| CH17 CPU_0V8 | 0.8 | 1295 | 1036 |
| CH18 VDDA_1V | 1.8 | 4 | 7.2 |
| CH19 DDR_PLL | 1.8 | 4 | 7.2 |
| CH20 DSI_1V8 | 1.8 | 0 | 0 |
| CH21 ADC_1V8 | 1.8 | 3 | 5.4 |
| Total Power | 4335.1 |
注意事项
以上

