目录
gpio_keys说明
key是嵌入式开发中常用到的东西,linux内核中也早已为我们做了一套成熟的机制。
gpio-keys是基于input架构实现的一个通用GPIO按键驱动。该驱动基于platform_driver架构,实现了驱动和设备分离,符合Linux设备驱动模型的思想。
内核部分
linux内核驱动文件:
drivers/input/keyboard/gpio_keys.c
实现了一个体系结构无关的GPIO按键驱动,使用此按键驱动,只需在相应的设备树定义相关的数据即可。
dts部分修改(方法一):
key-pwr {
compatible = "gpio-keys";
autorepeat;
pinctrl-names = "default";
pinctrl-0 = <&pwr_key>;
power {
label = "GPIO Key Power";
linux,code = <KEY_POWER>;
gpios = <&gpio0 RK_PA0 GPIO_ACTIVE_LOW>;
debounce-interval = <15>;
wakeup-source;
};
};
key-home {
compatible = "gpio-keys";
autorepeat;
pinctrl-names = "default";
pinctrl-0 = <&home_key>;
home {
label = "GPIO Home";
linux,code = <KEY_HOME>;
gpios = <&gpio1 RK_PD4 GPIO_ACTIVE_LOW>;
debounce-interval = <15>;
};
};
&pinctrl {
pinctrl-names = "default";
buttons {
home_key: home-key {
rockchip,pins = <1 RK_PD4 RK_FUNC_GPIO &pcfg_pull_up>;
};
pwr_key: pwr-key {
rockchip,pins = <0 RK_PA0 RK_FUNC_GPIO &pcfg_pull_up>;
};
};
方法二:
gpio-keys {
compatible = "gpio-keys";
autorepeat;
pinctrl-names = "default";
pinctrl-0 = <&s8_keys>;
power {
gpios = <&gpio0 RK_PA6 GPIO_ACTIVE_LOW>;
linux,code = <KEY_POWER>;
label = "GPIO Key Power";
debounce-interval = <20>;
};
home {
gpios = <&gpio1 RK_PC6 GPIO_ACTIVE_LOW>;
linux,code = <KEY_HOME>;
label = "GPIO Key Home";
debounce-interval = <20>;
};
};
&pinctrl {
pinctrl-names = "default";
pinctrl-0 = <&pwr_hold &default_gpios>;
buttons {
s8_keys: s8-keys {
rockchip,pins = <0 RK_PA6 RK_FUNC_GPIO &pcfg_pull_up>,
<1 RK_PC6 RK_FUNC_GPIO &pcfg_pull_up>;
};
};
相关配置说明可以看内核说明文档:
kernel/Documentation/devicetree/bingings/input/gpio-keys.txt(RK举例)
1. compatible 属性值一定要设置为“gpio-keys”。
2. autorepeat 支持按键自动重复
3. 所有的 KEY 都是 gpio-keys 的子节点,每个子节点可以用如下属性描述自己:
gpios:所连接的 GPIO 信息。
interrupts:KEY 所使用 GPIO 中断信息,不是必须的,可以不写。
label:KEY 名字
linux,code:KEY 要模拟的按键可以直接填数字
wakeup-source:可以被唤醒
debounce-interval:消抖时间,单位毫秒
linux,input-type:事件类型,默认<1> == EV_KEY
应用部分
- 查看读取event
方法一:
/sys/class/input/inputX/name 或者/sys/class/input/eventX/device/name 如果与节点 key-pwr key-home一致
方法二:
/sys/class/input/inputX/name 或者/sys/class/input/eventX/device/name 如果与节点 gpio-keys一致
对应设备/dev/input/eventX
- 查看文件内容
hexdump /dev/input/eventX
- 具体应用实现
可通过epoll监听