注:出处不明,最开始是在这里看到的,图竟然没有。。。没有。。。相关资料也几乎木有。。。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控制完成。