/
U-Boot Ethernet Driver
U-Boot Ethernet Driver
Table of Contents
Introduction
The gigabit Ethernet controller (GEM) implements a 10/100/1000 Mb/s Ethernet MAC that is compatible with the IEEE Standard for Ethernet (IEEE Std 802.3-2008) and capable ofoperating in either half or full-duplex mode in 10/100 mode and full-duplex in 1000 mode. The processing system (PS) is equipped with four gigabit Ethernet controllers. Each
controller can be configured independently. Each controller uses a reduced gigabit media independent interface (RGMII) v2.0 (to save pins).
U-Boot Config
For ZynqMP:
CONFIG_ZYNQ_GEM=y CONFIG_DM_ETH=y CONFIG_NET_RANDOM_ETHADDR=y
For Zynq
CONFIG_ZYNQ_GEM=y CONFIG_NET_RANDOM_ETHADDR=y
Device Tree
For ZynqMP
&gem3 { status = "okay"; phy-handle = <&phy0>; phy-mode = "rgmii-id"; pinctrl-names = "default"; pinctrl-0 = <&pinctrl_gem3_default>; phy0: phy@21 { reg = <21>; ti,rx-internal-delay = <0x8>; ti,tx-internal-delay = <0xa>; ti,fifo-depth = <0x1>; ti,rxctrl-strap-worka; }; }; pinctrl_gem3_default: gem3-default { mux { function = "ethernet3"; groups = "ethernet3_0_grp"; }; conf { groups = "ethernet3_0_grp"; slew-rate = <SLEW_RATE_SLOW>; io-standard = <IO_STANDARD_LVCMOS18>; }; conf-rx { pins = "MIO70", "MIO71", "MIO72", "MIO73", "MIO74","MIO75"; bias-high-impedance; low-power-disable; }; conf-tx { pins = "MIO64", "MIO65", "MIO66", "MIO67", "MIO68","MIO69"; bias-disable; low-power-enable; }; mux-mdio { function = "mdio3"; groups = "mdio3_0_grp"; }; conf-mdio { groups = "mdio3_0_grp"; slew-rate = <SLEW_RATE_SLOW>; io-standard = <IO_STANDARD_LVCMOS18>; bias-disable; }; };
For Zynq
&gem0 { status = "okay"; phy-mode = "rgmii-id"; phy-handle = <ðernet_phy>; pinctrl-names = "default"; pinctrl-0 = <&pinctrl_gem0_default>; ethernet_phy: ethernet-phy@7 { reg = <7>; device_type = "ethernet-phy"; }; }; pinctrl_gem0_default: gem0-default { mux { function = "ethernet0"; groups = "ethernet0_0_grp"; }; conf { groups = "ethernet0_0_grp"; slew-rate = <0>; io-standard = <4>; }; conf-rx { pins = "MIO22", "MIO23", "MIO24", "MIO25", "MIO26", "MIO27"; bias-high-impedance; low-power-disable; }; conf-tx { pins = "MIO16", "MIO17", "MIO18", "MIO19", "MIO20", "MIO21"; low-power-enable; bias-disable; }; mux-mdio { function = "mdio0"; groups = "mdio0_0_grp"; }; conf-mdio { groups = "mdio0_0_grp"; slew-rate = <0>; io-standard = <1>; bias-disable; }; };
Test Procedure
U-Boot 2018.01 Xilinx ZynqMP ZCU102 rev1.0 I2C: ready DRAM: 4 GiB EL Level: EL2 Chip ID: zuunknow ** Bad device mmc 0 ** Using default environment In: serial@ff000000 Out: serial@ff000000 Err: serial@ff000000 Model: ZynqMP ZCU102 Rev1.0 Board: Xilinx ZynqMP Bootmode: JTAG_MODE Net: ZYNQ GEM: ff0e0000, phyaddr c, interface rgmii-id eth0: ethernet@ff0e0000 U-BOOT for xilinx-zcu102-2018_1 BOOTP broadcast 1 DHCP client bound to address 10.0.2.15 (3 ms) Hit any key to stop autoboot: 0 ZynqMP> mii info PHY 0x07: OUI = 0x5043, Model = 0x21, Rev = 0x00, 1000baseX, FDX PHY 0x0C: OUI = 0x5043, Model = 0x21, Rev = 0x00, 1000baseX, FDX ZynqMP> ZynqMP> mii device MII devices: 'eth0' Current device: 'eth0' ZynqMP> ZynqMP> setenv <server_ip> ZynqMP> ping <server_ip>
HW IP features
- Speed support for 10/100/1000 Mbps
- MAC loopback and PHY loopback
- Partial store and forward option
- Packet buffer option
- Flow control - TX/RX pause
- Checksum offload support, CRC checking, FCS stripping
- Promiscuous mode, Broadcast mode
- Collision detection and enforcement - this is an IP feature, no SW support required
- MDIO support for PHY layer management
- Multicasting support
- VLAN tagged frames
- Half duplex support
- Programmable IPG
- External FIFO interface
- Wake on LAN
- IEEE1588 support for ZynqMP
- Jumbo frame size support for ZynqMP
- 64 bit addressing for ZynqMP
- Priority queue support for ZynqMP
- PS SGMII support (hardwired to 1Gbps) is present in ZynqMP
Features supported in driver
(Functional HW IP and stack related features)- Speed support for 10/100/1000 Mbps with clock framework
- MDIO support for PHY layer management
- Multicasting support
- IEEE1588 support for ZynqMP
- Priority queue support for ZynqMP
- PS SGMII support is present in ZynqMP and supported in the driver
- This driver can be used with PL SGMII/1000BaseX driver on Zynq and ZynqMP
- This driver can be used with gmii2rgmii converter driver
- Fixed link support for ZynqMP(Not tested for Zynq).
Missing Features, Known Issues and Limitations
- 64-bit addressing support
Fixed Link Support in ZynqMP
Following are the steps to verify fixed link support in ZynqMP.- Create a design with both GEM2 and GEM3 available and loop back one to the other as mention in below wiki
- Once the design is created export to sdk and create lwip echoserver application to run from R5 processor.
- In this application just confirm that it uses GEM2 in file src/platform_config.h
- In lwip echo server application linkerscript go and modify linker address to 0x10000000 such that it was not overwritten by FSBL or any other images.
- Go to bsp and change bsp settings to select uart1.
- Now got to the corresponding bsp and then to libsrc>lwip141>src>contrib>ports>xilinx>netif>xemacpsif_physpeed.c
- Open the file emacpsif_physpeed.c and go to routine phy_setup.c, comment the line "link_speed=get_IEEE_phy_speed(xemacpsp, phy_addr);" and assign link_speed=1000; Note that same speed should be given in u-boot dts.
- Now save and build it.
- Create FSBL for this design from SDK.
- Also create ATF and PMUFW.
- Now build u-boot for zcu102 with below changes in dts
diff --git a/arch/arm/dts/zynqmp-zcu102-revA.dts b/arch/arm/dts/zynqmp-zcu102-revA.dts index 5cbff57..db256e1 100644 --- a/arch/arm/dts/zynqmp-zcu102-revA.dts +++ b/arch/arm/dts/zynqmp-zcu102-revA.dts @@ -124,6 +124,11 @@ ti,fifo-depth = <0x1>; ti,rxctrl-strap-worka; }; + fixed-link { + speed = <1000>; + full-duplex; + }; + };
- Create a bootable BOOT.BIN using bif with images (pmufw, fsbl, bitstream, lwipapp, atf, u-boot).
- Copy the BOOT.BIN onto SD card and boot from SD on ZCU102 board.
- Open com0 port and you should see lwip prints and wait for print "TCP echo server started @ port 7".
- Now come back to u-boot prompt and set ipaddr as 192.168.1.1 using setenv.
- Now, ping lwip echoserver running on R5 from u-boot and it should success as shown below u-boot log.
ZynqMP> setenv ipaddr 192.168.1.1 ZynqMP> ping 192.168.1.10 Using ethernet@ff0e0000 device host 192.168.1.10 is alive
Related content
U-boot axi ethernet-lite driver
U-boot axi ethernet-lite driver
More like this
U-boot axi ethernet
U-boot axi ethernet
More like this
Standalone Ethernet Driver
Standalone Ethernet Driver
More like this
Linux Ethernet Offload Engine driver
Linux Ethernet Offload Engine driver
More like this
Linux AXI Ethernet driver
Linux AXI Ethernet driver
More like this
AXI Ethernet Standalone Driver
AXI Ethernet Standalone Driver
More like this
© Copyright 2019 - 2022 Xilinx Inc. Privacy Policy