1. 问题背景与现象描述
最近在设计一款基于Linux内核的安卓主板时,遇到了一个关于GPIO按键驱动绑定的问题。我需要实现硬件按键功能,Linux内核已经提供了现成的gpio-keys驱动,按理说应该可以直接使用。
按照常规流程,我在设备树中配置了gpio-keys节点,menuconfig中启用了GPIO Buttons选项,编译烧录后启动系统。然而通过cat /proc/bus/input/devices命令查看,发现驱动并没有被加载。更奇怪的是,dmesg中也没有任何关于gpio的错误信息。
提示:在嵌入式Linux开发中,当驱动没有按预期加载时,首先应该检查dmesg输出和系统日志,这是排查硬件驱动问题的第一步。
2. 初步排查与分析
2.1 检查设备树配置
我首先怀疑是设备树配置有问题。gpio-keys的设备树节点配置如下:
dts复制gpio-keys {
compatible = "gpio-keys";
#address-cells = <1>;
#size-cells = <0>;
autorepeat;
power {
label = "Power Button";
gpios = <&gpio0 5 GPIO_ACTIVE_LOW>;
linux,code = <KEY_POWER>;
debounce-interval = <100>;
wakeup-source;
};
};
这个配置看起来是标准的:
compatible属性匹配驱动- 定义了GPIO引脚和按键类型
- 设置了去抖时间
- 启用了唤醒功能
2.2 检查内核配置
确认内核配置中已经启用了相关选项:
code复制CONFIG_KEYBOARD_GPIO=y
CONFIG_INPUT_EVDEV=y
通过make menuconfig检查路径:
code复制Device Drivers
-> Input device support
-> Keyboards
-> GPIO Buttons
