休眠及外部 IO 唤醒
本教程介绍在 Linux 5.4 中如何使用外部 GPIO(如 gpio-keys)或其他外设作为系统休眠(suspend)后的唤醒源(wakeup source)。
一、Wakeup Source 原理
Linux 使用 wakeup source 机制决定哪些设备可以唤醒系统。
查看当前系统的唤醒源:
#挂载debug fs
mount -t debugfs none /sys/kernel/debug
#查看信息
cat /sys/kernel/debug/wakeup_sources
示例:
gpio-keys 100 3000 1
7090000.rtc 0 0 0
字段说明:
| 字段 | 含义 |
|---|---|
| active_count | 激活次数 |
| event_count | 事件(如按键)次数 |
| wakeup_count | 唤醒系统的次数 |
| total_time | 活跃时间 |
当外部按键成功唤醒系统时,wakeup_count 会增加。
二、让 GPIO 成为唤醒源的条件
- 按键驱动必须加载(gpio-keys 或 gpio-keys-polled)
- 设备树节点必须包含:
wakeup-source;
示例:
key_pe1 {
label = "key_pe1";
gpios = <&pio 4 1 GPIO_ACTIVE_LOW>;
linux,code = <2>;
wakeup-source;
};
- 内核必须支持休眠:
CONFIG_PM=y
CONFIG_PM_SLEEP=y
CONFIG_PM_DEBUG=y
- GPIO 必须发生事件(中断或轮询事件)
三、测试前准备
1. 检查按键是否注册成功
cat /proc/bus/input/devices
应看到:
N: Name="gpio-keys"
H: Handlers=event3
2. 查看按键事件
hexdump /dev/input/event3
按下按键时应看到数据变化。
(event3 请根据实际设备号修改)
四、休眠流程(Suspend-to-RAM)
1. 查看系统支持的休眠模式
cat /sys/power/state
通常输出:
freeze mem
2. 进入休眠
echo mem > /sys/power/state
系统进入深度休眠,屏幕黑屏,CPU 停止。
五、外部 IO 唤醒测试(gpio-keys、gpadc、RTC 等)
当系统处于休眠状态:
• 按 GPIO 按键 • 或触发 ADC 键 • 或 RTC 到点 • 其他 wakeup-source 设备
系统应立即恢复运行。
六、验证唤醒是否成功
查看 wakeup source 状态:
cat /sys/kernel/debug/wakeup_sources
应看到 gpio-keys 或其他设备的 wakeup_count 增加,例如:
gpio-keys 2100 34000 1
表示: • 事件(按键)次数:34000 • 唤醒系统:1 次