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