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命令