首先看一下Openwrt系统中关于按键功能的使用和修改,以18.06版本为例
按键功能实现在脚本中, 比如18.06/package/base-files/files/etc/rc.button/reset
#!/bin/sh
. /lib/functions.sh
OVERLAY="$( grep ' /overlay ' /proc/mounts )"
case "$ACTION" in
pressed)
[ -z "$OVERLAY" ] && return 0
return 5
;;
timeout)
. /etc/diag.sh
set_state failsafe
;;
released)
if [ "$SEEN" -lt 1 ]
then
echo "REBOOT" > /dev/console
sync
reboot
elif [ "$SEEN" -ge 5 -a -n "$OVERLAY" ]
then
echo "FACTORY RESET" > /dev/console
jffs2reset -y && reboot &
fi
;;
esac
return 0
主要有2个参数, ACTION和SEEN,分别代表按键动作(按下/抬起)和按键持续时间
关于按键GPIO的修改位于dts中,比如target/linux/ramips/dts/GL-MT300N-V2.dts
gpio-keys {
compatible = "gpio-keys-polled";
#address-cells = <1>;
#size-cells = <0>;
poll-interval = <20>;
vccin {
label = "BTN_0";
gpios = <&gpio0 6 0>;
linux,code = <BTN_0>;
};
electricity {
label = "BTN_1";
gpios = <&gpio0 11 0>;
linux,code = <BTN_1>;
};
reset {
label = "reset";
gpios = <&gpio1 7 GPIO_ACTIVE_LOW>;
linux,code = <KEY_RESTART>;
};
};
poll-interval = <20>; 表示轮询检测,防抖时间
label = "reset"; 代表功能实现脚本的名称,对应18.06/package/base-files/files/etc/rc.button/reset
gpios = <&gpio1 7 GPIO_ACTIVE_LOW>; 表示使用GPIO1分组,第7个引脚; 低电平生效
linux,code = <KEY_RESTART>; 按键事件代码,对于linux标准输入输出系统,参考Linux内核头文件input/input.h
compatible = "gpio-keys-polled"; 表示加载驱动gpio-keys-polled
位于18.06/package/kernel/gpio-button-hotplug/src/gpio-button-hotplug.c
它具体实现主要内容如下:
1. 注册2种类型驱动,轮询检测和中断检测
2. 使用netlink与用户空间通讯
3. 自定义上报事件内容, 比如前面功能实现脚本中用到的ACTION以及SEEN等