為mt7620 RT5350新增reset按鍵
阿新 • • 發佈:2019-02-11
openwrt 預設的 mt7620 rt5350 韌體是不帶 reset 引腳功能。需要我們自己去修改 dts 檔案,增加 reset 引腳。
第一步先新增按鍵驅動:
Symbol: PACKAGE_kmod-gpio-button-hotplug [=y]
Type : tristate
Prompt: kmod-gpio-button-hotplug............... Simple GPIO Button Hotp
Location:
-> Kernel modules
-> Other modules
在開發板上監測按鍵的操作結果:
root@OpenWrt:/# cat /sys/kernel/debug/gpio
GPIOs 0-23, platform/10000600.gpio, 10000600.gpio:
gpio-1 (S2 ) in hi
gpio-2 (S3 ) in hi
root@OpenWrt:/#
root@OpenWrt:/#
root@OpenWrt:/# cat /sys/kernel/debug/gpio
GPIOs 0-23, platform/10000600.gpio, 10000600.gpio:
gpio-1 (S2 ) in hi
gpio-2 (S3 ) in lo
可以看到,我第一次不操作按鈕,顯示出來兩個引腳的電平是高電平。第二次我按下其中一個按鈕,該按鈕顯示是低電平的。
開啟openwrt原始碼中的 MT7620a.dts 檔案,我們可以看到預設的配置是有兩個引腳 S2 S3,跟我們上面所看到的是一致的。
我們把,其中的S2改成 reset 功能,修改後的內容如下:
gpio-keys-polled {
compatible = "gpio-keys" ;
#address-cells = <1>;
#size-cells = <0>;
poll-interval = <20>;
wps{
label = "reset";
gpios = <&gpio0 1 1>;
linux,code = <0x198>;
};
s3 {
label = "S3";
gpios = <&gpio0 2 1>;
linux,code = <0x101>;
};
};
對於 RT5350。我修改後的 dts 檔案如下:
gpio-keys-polled {
compatible = "gpio-keys-polled";
#address-cells = <1>;
#size-cells = <0>;
poll-interval = <20>;
wps {
label = "reset";
gpios = <&gpio0 13 1>;
linux,code = <0x198>;
};
};
按鍵名稱為 reset 按鍵值為 0x198。為什麼是0x198呢?
檢視按鍵驅動的原始碼 gpio-button-hotplug.c
可以看到一個結構體陣列 button_map[] 。該陣列對鍵值做了對映
當用戶按下按鈕時,驅動會嚮應用層傳送事件,最終執行 /etc/rc.button/reset 這個指令碼,對應的內容如下:
#!/bin/sh
[ "${ACTION}" = "released" ] || exit 0
. /lib/functions.sh
logger "$BUTTON pressed for $SEEN seconds"
if [ "$SEEN" -lt 1 ]
then
echo "REBOOT" > /dev/console
sync
reboot
elif [ "$SEEN" -gt 5 ]
then
echo "FACTORY RESET" > /dev/console
jffs2reset -y && reboot &
fi
當按下reset按鍵不超過 1s 時,會執行 reboot 重啟命令
當按下reset按鍵超過 5s 時,則恢復出廠設定