Openwrt按键检测分析-窥探Linux内核与用户空间通讯机制netlink使用

首先看一下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等

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值