1. 程式人生 > >為mt7620 RT5350新增reset按鍵

為mt7620 RT5350新增reset按鍵

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 時,則恢復出廠設定