赞
踩
目录
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
方法一:
/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监听
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。