休眠及外部 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 成为唤醒源的条件

  1. 按键驱动必须加载(gpio-keys 或 gpio-keys-polled)
  2. 设备树节点必须包含:
wakeup-source;

示例:

key_pe1 {
    label = "key_pe1";
    gpios = <&pio 4 1 GPIO_ACTIVE_LOW>;
    linux,code = <2>;
    wakeup-source;
};
  1. 内核必须支持休眠:
CONFIG_PM=y
CONFIG_PM_SLEEP=y
CONFIG_PM_DEBUG=y
  1. 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 次