MT7621方案 LED 燈控制 (基於OpenWrt平臺)
注:出處不明,最開始是在這裡看到的,圖竟然沒有。。。沒有。。。相關資料也幾乎木有。。。datasheet裡也沒有暫存器配置說明。。。。。。MT7621還真是坑爹啊!
目前市面上大部分路由器方案是基於MT7620的,LED的控制比較簡單,直接修改dts檔案,系統會自動生成相應的檔案系統節點,從而可以很方便的控制,當然這些LED控制都是基於CPU的GPIO來控制,包括LAN燈、WIFI燈。但MT7621方案開始,對於LED燈的控制有所區別,LAN燈直接由晶片內部的SWITCH(MT7503)直接控制,而且預定義是自動配好的,有資料收發時會自動閃爍,插上網線會自動亮,拔掉會自動滅,這部分LED控制完全是硬體自動實現,不再贅述。
USB2.0和USB3.0燈是由CPU直接控制的,可以增加dts的LED節點即可:
gpio-leds {
compatible = "gpio-leds";
usb2 {
label = "green:usb2";
gpios = <&gpio0 14 1>;
};
usb3 {
label = "green:usb3";
gpios = <&gpio0 17 1>;
};
};
核心解析完dts檔案後,會在/sys/devices/platform/gpio-leds/leds 目錄下生成兩個目錄,分別為green:usb2 和green:usb3,進入這兩個資料夾,可以通過echo命令來操作LED燈:
操作USB燈(例如USB2.0燈):
cd sk:green:usb2
echo 1 > brightness // 開啟usb2.0 燈
echo 0 > brightness // 關閉usb2.0 燈
MT7621方案,一般會由兩個射頻晶片和MT7621相連,一個是MT7612e (5G WIFI) ,一個是MT7602e(2.4G WIFI,也有用MT7603的) ,我的demo板是MT7612e + MT7602e 。 5G WIFI 和 2.4G WIFI 指示燈 分別由 這兩個晶片控制(區別於MT7620由CPU的GPIO控制):
【我猜此處應有圖】
在OpenWrt中的公版驅動中,這兩個晶片的驅動是通用的,所以控制方式一致。我是通過操作晶片的LED_CTRL暫存器直接控制的,對於WIFI指示燈,對應該暫存器中的LED2對應的幾個bit:
【我猜此處應有圖】
通過測試 ,發現LED燈是由 電平脈衝 形式觸發,LED2_KICK置為1,則表示產生一個脈衝。LED2_TX_BLINK_MODE置為1,表示有資料傳送時,LED燈會自動閃爍。LED2_POL表示LED極性。
對於本單板:
LED2_KICK = 1 , LED2_POL = 0 , LED燈常亮 (LED_CTRL寫 0x800000)
LED2_KICK = 1 , LED2_POL = 1, LED燈常滅 (LED_CTRL寫 0x820000)
LED2_KICK = 1,LED2_TX_BLINK_MODE , LED自動閃爍 (LED_CTRL寫 0x840000)
MT76x2的暫存器讀寫,可通過openwrt 的mt76x2驅動提供的除錯命令實現,例如要實現MT7612E LED常亮:
cd /sys/kernel/debug/ieee80211/phy0/mt76
echo 0x770 > regidx //設定相對偏移地址
echo 0x800000 > regval //寫暫存器
至此,MT7621方案的LED控制完成。