@
本文将基于Microchip SAMA5D2 Xplained开发板,详细介绍如何为嵌入式Linux系统添加对Microchip LAN951x - USB转以太网芯片的支持。
记得关注、点赞与收藏
make menuconfig -> Device Drivers -> Network device support -> USB Network Adapters -> Multi-purpose USB Networking Framework -> SMSC LAN95XX based USB 2.0 10/100 ethernet devices,保存并退出配置




在Linux-5.10内核的Documents下,关于device tree绑定的帮助文档并没有LAN951x的相关文档,但是在稍后的内核版本中,可以找到相关的指导文档。

我们打开smsc95xx.c驱动源码文件,找到关于LAN9512/14的对应的vendor id和product id,如下图红框所标注部分。

我们打将在SAMA5D27这颗处理器的USB端口1中,添加对LAN9512的支持,打开对应的设备树文件,找到对应的USB端口描述,添加红框所示的部分。

#address-cells = <1>;#size-cells = <0>;/* The hub port where LAN951x is connected */ethernet@1 { compatible = "usb424,ec00"; /* Microchip LAN951x */ reg = <1>; /* USB port number */ /* Optional: assign a fixed MAC address */local-mac-address = [56 13 27 94 ac 82];};将LAN9512的评估板通过USB接到SAMA5D27 USB端口1,并重新给系统上电,可以看到USB端口已经识别到LAN9512的设备信息。
usb 1-2.1: new high-speed USB device number 3 using atmel-ehciusb 1-2.1: New USB device found, idVendor=0424, idProduct=ec00, bcdDevice= 2.00usb 1-2.1: New USB device strings: Mfr=0, Product=0, SerialNumber=0smsc95xx v2.0.0EXT4-fs (mmcblk1p2): re-mounted. Opts: (null)libphy: smsc95xx-mdiobus: probedsmsc95xx 1-2.1:1.0 eth0: register 'smsc95xx' at usb-500000.ehci-2.1, smsc95xx USB 2.0 Ethernet, 3a:02:ad:2d:56:7a将LAN9512评估板上的扩展网口接交换机芯片,可以看到看到网络链接已经link up,表示与交换机建立起物理连接。
Starting network: udhcpc: started, v1.33.1SMSC LAN8700 usb-001:003:01: attached PHY driver [SMSC LAN8700] (mii_bus:phy_addr=usb-001:003:01, irq=POLL)smsc95xx 1-2.1:1.0 eth0: hardware isn't capable of remote wakeupsmsc95xx 1-2.1:1.0 eth0: Link is Downudhcpc: sending discoversmsc95xx 1-2.1:1.0 eth0: Link is Up - 100Mbps/Full - flow control offIPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready查看LAN9512的网络信息。
# ifconfig eth0eth0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 inet 192.168.1.101 netmask 255.255.255.0 broadcast 255.255.255.255 inet6 fe80::fc3c:77ff:fe4a:ec63 prefixlen 64 scopeid 0x20<link> ether fe:3c:77:4a:ec:63 txqueuelen 1000 (Ethernet) RX packets 503 bytes 28907 (28.2 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 2724 bytes 226356 (221.0 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0最后我们可以查看下USB 1端口的中断统计计数。
# cat /proc/interrupts | grep -E "ehci|ohci|usb" 18: 0 atmel-aic5 42 Level atmel_usba_udc 19: 144694 atmel-aic5 41 Level ehci_hcd:usb1, ohci_hcd:usb2 80: 0 GPIO 31 Edge atmel_usba_udc