OpenWrt reset按键处理流程(hotplug)
介绍
本文介绍OpenWrt的reset按键的处理过程。一般的路由器都存在一个reset按键,用来进行重启或者恢复出厂操作。
通常的操作对应为:
单击 - 重启设备
长按 – 恢复出厂设置
当然,这些操作都是可以配置的,下面会详细介绍reset按键的处理过程
涉及文件
reset按键的处理过程使用的是hotplug(热插拔)技术。内核空间检测到reset按键状态的改变后,以netlink的方式发送到上层空间
- gpio_button_hotplug 模块:是内核模块,能够一直读取按键状态,并将状态通知到用户空间。(代码路径:openwrt/package/kernel/gpio-button-hotplug)
- hotplug-call 脚本:用户空间脚本,获取到内核的通知消息,并调用相应的执行脚本(/sbin目录下)
- button 脚本:用来处理具体的按键事件(/etc/hotplug.d/button/00-button)名称不固定
- system:配置,/etc/config/system
过程简述
gpio_button_hotplug
该模块检测到reset按键变化之后,会调用button_hotplug_fill_event 函数将事件消息封装:
用户层将使用上述环境变量进行相应处理
消息封装完毕后使用netlink将消息发送到应用层
hotplug-call
应用层脚本:
export HOTPLUG_TYPE="$1"
. /lib/functions.sh
PATH=/bin:/sbin:/usr/bin:/usr/sbin
LOGNAME=root
USER=root
export PATH LOGNAME USER
[ \! -z "$1" -a -d /etc/hotplug.d/$1 ] && {
for script in $(ls /etc/hotplug.d/$1/* 2>&-); do (
[ -f $script ] && . $script
); done
}
它将调用所有的/etc/hotplug.d目录下的脚本。
button
. /etc/functions.sh
do_button () {
local button
local action
local handler
local min
local max
config_get button $1 button
config_get action $1 action
config_get handler $1 handler
config_get min $1 min
config_get max $1 max
[ "$ACTION" = "$action" -a "$BUTTON" = "$button" -a -n "$handler" ] && {
[ -z "$min" -o -z "$max" ] && eval $handler
[ -n "$min" -a -n "$max" ] && {
[ $min -le $SEEN -a $max -ge $SEEN ] && eval $handler
}
}
}
config_load system
config_foreach do_button button
将会读取/etc/config/system配置,然后根据action,button等配置进行
system
以下面为例:
config button
option button 'reset'
option action 'released'
option handler 'reboot'
option min '0'
option max '3'
按键在0-3s,执行reboot命令