电源管理(高级)
见
04-kernel-driver/17-power-management.md的扩展。
一、电源管理栈
User space (powerd, systemd)
│
System Suspend (S3/S4)
│ /sys/power/state
│
Runtime PM (per-device)
│
CPU idle / cpufreq
│
PMIC / regulator
│
Clock tree
│
硬件
二、CPU 空闲(cpuidle)
1. 状态
- C0:工作
- C1/C1E:低功耗
- C3:深 sleep
- C6:更深
- C7/C8/C9:最深(关闭核心)
2. governor
menu:现代默认ladder:基于深度teo:时间事件导向(推荐)
3. 配置
cat /sys/devices/system/cpu/cpu0/cpuidle/available_governors
echo teo > /sys/devices/system/cpu/cpu0/cpuidle/current_governor
cat /sys/devices/system/cpu/cpu0/cpuidle/state0/disable
三、CPU 频率调节(cpufreq)
1. governor
performance:最高频powersave:最低频ondemand:按负载conservative:保守schedutil:调度器驱动(推荐)
2. 配置文件
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies
echo schedutil > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq
3. EAS(Energy Aware Scheduling)
- 大小核调度
- 优先用小核
- 满载再上大核
四、运行时 PM(Runtime PM)
1. 设备级
echo auto > /sys/devices/.../power/runtime_status
echo on > /sys/devices/.../power/runtime_status
cat /sys/devices/.../power/runtime_status
2. 驱动实现
// .pm_ops
SET_RUNTIME_PM_OPS(my_suspend, my_resume, NULL)
// 手动使用
pm_runtime_get_sync(dev);
pm_runtime_put(dev);
pm_runtime_set_active(dev);
五、系统 Suspend
1. 状态
mem(S3):挂起到内存standby(S1):浅挂起freeze(S2):冻结进程disk(S4):挂起到磁盘
2. 命令
echo mem > /sys/power/state
echo disk > /sys/power/state
3. 唤醒源
# 配置
cat /sys/devices/.../power/wakeup
echo enabled > /sys/devices/.../power/wakeup
# 启用 GPIO 唤醒
cat /sys/power/wakeup_count
4. 驱动回调
SET_SYSTEM_SLEEP_PM_OPS(my_suspend, my_resume)
六、关机(Power Off)
static void my_shutdown(struct platform_device *dev)
{
// 关键状态保存
}
static struct platform_driver my_driver = {
.driver = { ... },
.shutdown = my_shutdown,
};
poweroff
shutdown -h now
七、热管理
1. 温区
ls /sys/class/thermal/
cat /sys/class/thermal/thermal_zone0/temp # 毫摄氏度
cat /sys/class/thermal/thermal_zone0/type # 类型(cpu-thermal)
2. 策略
# 冷却设备
cat /sys/class/thermal/cooling_device0/cur_state
echo 1 > /sys/class/thermal/cooling_device0/cur_state
3. trip points
cat /sys/class/thermal/thermal_zone0/trip_point_0_type
cat /sys/class/thermal/thermal_zone0/trip_point_0_temp
八、PMIC(电源管理芯片)
- 复杂系统的电源管理芯片
- 例如:PMIC 提供多路电压
- 通过 I2C/SPI 接口配置
struct regulator *vdd = devm_regulator_get(dev, "vdd");
regulator_enable(vdd);
regulator_disable(vdd);
九、Battery(电池)
- BMS(电池管理系统)
- 通过 I2C 读 fuel gauge
power_supply子系统
cat /sys/class/power_supply/battery/capacity
cat /sys/class/power_supply/battery/status # Charging / Discharging / Full
cat /sys/class/power_supply/battery/voltage_now
十、嵌入式电源管理建议
- 明确功耗预算(电池容量 / 待机时间)
- 用 SoC 自带 PMIC
- 测量真实功耗(不要靠估算)
- 监控启动电流
- WFI/WFE 状态:空闲用 WFI 节省
- 关闭不用外设时钟
- 用 LDO 替代 DCDC 用于低功耗
- Wakeup latency vs Power 折中
十一、典型电源曲线
上电 ─→ 启动 ─→ 满载工作 ─→ 空闲 ─→ 浅睡 ─→ 深睡
高峰 高 中 低 极低
1A 500mA 100mA 10mA 0.1mA