Orange Pi GPIO按键编程问题:evtest无响应求助
问题分析与解决方案
你当前的核心问题是两个DTS overlay文件存在语法错误、硬件适配错误,导致内核无法正确识别GPIO按键。以下是具体问题排查和修正方案:
一、第一个GPIO Keys DTS的问题与修正
原文件存在注释语法错误、GPIO引用格式错误、缺少引脚配置和启用状态,修正后内容如下:
/dts-v1/; /plugin/; /{ compatible = "allwinner,sun8i-h3"; fragment@0 { target = <&pio>; _overlay_ { pio_button_0: pio_button_0 { pins = "PA7", "PA8", "PA9"; function = "gpio_in"; bias-pull-up; // 可根据硬件电路调整,若已接下拉电阻则改为bias-pull-down }; gpio_keys_user: gpio_keys_user { compatible = "gpio-keys"; pinctrl-names = "default"; pinctrl-0 = <&pio_button_0>; status = "okay"; play_pause { label = "Play/Pause"; linux,code = <164>; /* KEY_PLAYPAUSE */ gpios = <&pio 0 7 0>; /* PA7,最后一位0表示高电平触发 */ }; next { label = "Next"; linux,code = <163>; /* KEY_NEXTSONG */ gpios = <&pio 0 8 0>; /* PA8 */ }; previous { label = "Previous"; linux,code = <165>; /* KEY_PREVIOUSSONG */ gpios = <&pio 0 9 0>; /* PA9 */ }; }; }; }; };
修正点说明:
- 修复
next节点内的注释语法错误(多余的*/) - 修正
gpios引用的空格问题(< &pio改为<&pio) - 添加
pio_button_0引脚配置节点,指定PA7/8/9为输入模式并配置上拉 - 给
gpio_keys_user添加status = "okay";,确保节点被内核启用
二、第二个Button Overlay DTS的问题与修正
原文件适配的是树莓派BCM芯片,与Orange Pi H3完全不兼容,修正后适配H3的版本如下:
/dts-v1/; /plugin/; /{ compatible = "allwinner,sun8i-h3"; fragment@0 { target = <&pio>; _overlay_ { button8_pin: button8_pin { pins = "PA8"; function = "gpio_in"; bias-pull-up; }; button8: my_button8 { compatible = "gpio-keys"; #address-cells = <1>; #size-cells = <0>; pinctrl-names = "default"; pinctrl-0 = <&button8_pin>; status = "okay"; but-pla { label = "button-gpio8"; linux,code = <8>; /* 可替换为你需要的按键码,比如KEY_PLAYPAUSE对应164 */ gpios = <&pio 0 8 0>; /* H3的GPIO控制器为&pio,0代表PA组,8为引脚号 */ }; }; }; }; };
修正点说明:
- 替换compatible为全志H3的
allwinner,sun8i-h3,移除树莓派BCM兼容项 - 修正
#adress-cells的拼写错误(改为#address-cells) - 给
but-pla节点的label行补充末尾分号 - 修复节点闭合括号错误(
);改为};) - 添加
button8_pin引脚配置节点 - 将
&gpio改为H3正确的GPIO控制器&pio,修正GPIO引用格式
三、后续操作步骤
- 编译DTS:使用dtc工具编译修正后的文件:
dtc -I dts -O dtb -o gpio_keys_user.dtbo gpio_keys_user.dts dtc -I dts -O dtb -o button-overlay.dtbo button-overlay.dts - 加载Overlay:将编译好的
.dtbo文件放到系统overlay目录(通常为/boot/overlay/或/boot/dtb/allwinner/overlay/,依系统版本调整),然后在/boot/armbianEnv.txt或/boot/config.txt中添加加载配置:overlays=gpio_keys_user button-overlay - 重启验证:重启后检查内核日志确认设备加载:
dmesg | grep gpio-keys - 按键测试:用evtest检测按键事件:
选择对应的gpio-keys设备(如evtest/dev/input/eventX),按下按键查看是否有事件输出。
额外注意事项
- 确认硬件电路正确:GPIO引脚与按键的连接是否无误,上拉/下拉电阻配置需与DTS设置匹配
- 按键码可参考内核头文件
include/uapi/linux/input-event-codes.h,确保linux,code值正确
内容的提问来源于stack exchange,提问作者Savoo
相关产品推荐
相关产品推荐

