基于Lineage OS 14.1的树莓派3 GPIO-Keys中断唤醒屏幕问题
解决树莓派3 LineageOS 14.1 中 gpio-keys 无法唤醒休眠屏幕的问题
看起来你已经搞定了gpio-keys的输入事件注册,就差唤醒这最后一步了!这种情况通常是因为gpio-keys设备没被标记为唤醒源,或者系统电源管理的配置没跟上。下面是具体的排查和修复步骤:
1. 修改设备树覆盖文件,添加唤醒属性
你的设备树片段里必须给gpio-keys节点加上wakeup-source属性,同时要确保按键对应的GPIO配置了正确的中断触发方式(比如上升沿/下降沿)。给你一个完整的设备树覆盖示例参考:
/dts-v1/; /plugin/; / { compatible = "brcm,bcm2835", "brcm,bcm2708", "brcm,bcm2709"; fragment@0 { target = <&gpio>; __overlay__ { my_key_pins: my_key_pins { brcm,pins = <4>; // 替换成你实际用的GPIO引脚号 brcm,function = <0>; // 0代表GPIO输入模式 brcm,pull = <2>; // 2代表上拉电阻,根据你的按键电路调整 }; }; }; fragment@1 { target-path = "/"; __overlay__ { gpio_keys: gpio_keys { compatible = "gpio-keys"; pinctrl-names = "default"; pinctrl-0 = <&my_key_pins>; status = "okay"; power_key { label = "Power Key"; linux,code = <116>; // KEY_POWER对应的输入事件码,也可换成其他按键码 gpios = <&gpio 4 1>; // 最后一位1表示低电平触发,根据你的电路调整 wakeup-source; // 关键!添加这个属性标记为系统唤醒源 }; }; }; }; };
注意点:
- 把
<4>替换成你实际使用的GPIO引脚 gpios字段最后一位的触发方式要和按键电路匹配(1=低电平触发,0=高电平触发)- 如果你想用其他按键码,比如KEY_HOME(102)也可以,但KEY_POWER是系统默认优先支持唤醒的按键码
2. 验证设备树是否正确加载
编译并加载修改后的设备树覆盖后,用这条命令检查唤醒属性是否生效:
cat /proc/device-tree/gpio_keys/power_key/wakeup-source
如果能正常输出内容,说明wakeup-source属性已经成功加载。
3. 开启输入设备的唤醒权限
就算设备树加了属性,有时候系统还需要明确允许这个输入设备唤醒。按以下步骤操作:
# 先找到gpio-keys对应的输入设备,比如/dev/input/eventX cat /proc/bus/input/devices | grep -A 5 "gpio-keys" # 假设找到的是event2,执行这条命令开启唤醒权限 echo enabled > /sys/class/input/event2/power/wakeup
可以把这条命令加到开机自启动脚本里(比如/system/etc/init.d/目录下的脚本),确保每次开机都自动启用唤醒权限。
4. 检查LineageOS的电源管理设置
进入LineageOS的设置 -> 显示 -> 休眠,确认休眠时间已经正常设置,并且没有第三方应用或系统设置阻止唤醒。另外,有些ROM可能需要在开发者选项里开启“允许唤醒锁定”相关选项。
5. 测试与日志排查
让设备进入休眠状态,按下你的GPIO按键,看看屏幕是否能唤醒。如果还是不行,用这条命令查看内核日志找问题:
dmesg | grep -i wake
日志里会提示具体的失败原因,比如中断没触发、唤醒源没注册等,方便你进一步排查。
内容的提问来源于stack exchange,提问作者JoeG




