You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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引用格式

三、后续操作步骤

  1. 编译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
    
  2. 加载Overlay:将编译好的.dtbo文件放到系统overlay目录(通常为/boot/overlay/或/boot/dtb/allwinner/overlay/,依系统版本调整),然后在/boot/armbianEnv.txt或/boot/config.txt中添加加载配置:
    overlays=gpio_keys_user button-overlay
    
  3. 重启验证:重启后检查内核日志确认设备加载:
    dmesg | grep gpio-keys
    
  4. 按键测试:用evtest检测按键事件:
    evtest
    
    选择对应的gpio-keys设备(如/dev/input/eventX),按下按键查看是否有事件输出。

额外注意事项

  • 确认硬件电路正确:GPIO引脚与按键的连接是否无误,上拉/下拉电阻配置需与DTS设置匹配
  • 按键码可参考内核头文件include/uapi/linux/input-event-codes.h,确保linux,code值正确

内容的提问来源于stack exchange,提问作者Savoo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 01:27:33