Ethernet使用参考
REVISION HISTORY¶
Revision No. | Description |
Date |
---|---|---|
1.0 | 04/23/2024 |
1. 概述¶
Ethernet Media Access Controller(以太网媒体访问控制器)简称为EMAC,以太网数据通信中主要负责对物理层和数据链路层之间进行控制和管理。

硬件架构如图, 只有一个EMAC控制器:
EMAC0 。
从硬件角度看:
EMAC0: 支持MII内置Ephy(百兆)、RMII外挂Ephy(百兆)
从软件角度看(默认设定):
-
UBOOT
EMAC0: MII
-
KERNEL
EMAC0: MII
2. DTS & CONFIG¶
2.1. Uboot CONFIG 配置说明¶
-
EMAC相关CONFIG配置
SigmaStar drivers ---> SigmaStar EMAC ---> --- SigmaStar EMAC [*] EMAC 0 [ ] EMAC fix link to mii/rmii [*] EMAC supply to RMII [ ] EMAC supply to IC+ Phy [*] EMAC0 PHY RESET (55) EMAC 0 FOR PHY RESET PAD (20) EMAC 0 FOR PHY RESET HOLD MS (50) EMAC 0 FOR PHY WAIT READY MS [ ] EMAC 1
CONFIG 说明 默认值 备注 [*] EMAC 0 使能EMAC0 使能 [ ] EMAC fix link to mii/rmii 使能 fix link 不使能 [*] EMAC supply to RMII 使能RMII模式 使能 [ ] EMAC supply to IC+ Phy 支持 ICPULS PHY 不使能 [*] EMAC0 PHY RESET 使能 EMAC0 软件 phy reset 不使能 (55) EMAC 0 FOR PHY RESET PAD EMAC0 的 phy reset padmux值 55 (20) EMAC 0 FOR PHY RESET HOLD MS EMAC0 设置低电平的保持时间 20ms (50) EMAC 0 FOR PHY WAIT READY MS EMAC0 设置高电平的等待就绪时间 50ms [ ] EMAC 1 使能EMAC1 不使能 IFADO无EMAC1网卡,无需配置 -
EMAC0 MII
[*] SigmaStar drivers ---> [*] SigmaStar EMAC ---> --- SigmaStar EMAC [ ] EMAC 0 [ ] EMAC 1
-
EMAC0 RMII
[*] SigmaStar drivers ---> [*] SigmaStar EMAC ---> --- SigmaStar EMAC [*] EMAC 0 [ ] EMAC fix link to mii/rmii [*] EMAC supply to RMII [ ] EMAC supply to IC+ Phy [*] EMAC0 PHY RESET (55) EMAC 0 FOR PHY RESET PAD (20) EMAC 0 FOR PHY RESET HOLD MS (50) EMAC 0 FOR PHY WAIT READY MS [ ] EMAC 1
-
EMAC0 RMII Fixed-link
[*] SigmaStar drivers ---> [*] SigmaStar EMAC ---> --- SigmaStar EMAC [*] EMAC 0 [*] EMAC fix link to mii/rmii [*] EMAC supply to RMII [ ] EMAC supply to IC+ Phy [*] EMAC0 PHY RESET (55) EMAC 0 FOR PHY RESET PAD (20) EMAC 0 FOR PHY RESET HOLD MS (50) EMAC 0 FOR PHY WAIT READY MS [ ] EMAC 1
-
Network commands
Command line interface ---> Network commands ---> [*] bootp [*] dhcp [*] tftpboot [*] ping
2.2. Kernel 配置说明¶
2.2.1. Kernel CONFIG¶
-
启用 EMAC driver
Device Drivers ---> SStar Soc platform drivers ---> [*]SSTAR_EMAC
-
启用 nfs cifs
File systems ---> Network File Systems ---> <M> NFS client support <M> NFS client support for NFS version 2 <M> NFS client support for NFS version 3 <M> SMB3 and CIFS support
2.2.2. Kernel DTS¶
2.2.2.1. DTS

- 节点如上图展示,释义分别为:
参数 | 释义 | 备注 |
---|---|---|
compatible | 属性信息 | 与驱动属性值对应 |
interrupts | 中断脚 | 中断的触发引脚驱动获取 |
clocks | EMAC时钟 | 驱动获取时钟节点 |
reg | 寄存器映射的物理地址 | 第一个为emac 寄存器base, 第二个为x32寄存器base, 第三个为内部phy寄存器base |
pad-rmii | padmux | |
bus-mode | mac 选择的mode与phy一致 | 1:MII 2:RMII |
phy-handle | phy节点 | |
status | Driver 开关 | "ok"/"disabled" |
phy-mode | phy 接口选择 | "mii"/"rmii" |
2.2.2.2. 修改DTS节点以启用片外phy 示例
DTS配置:
- 更改bus-mode为2

DTSI配置:
- 打开 EMAC0 rmii padmux并屏蔽有冲突的引脚

2.2.2.3. 修改DTS节点以启用Fixed-link片外phy 示例
DTS配置:
- 更改bus-mode为2
- 删除phy-handle节点
- 删除mdio-bus节点
- 增加fixed-link节点配置如下

DTSI配置:
- 打开 EMAC0 rmii padmux并屏蔽有冲突的引脚
- 需注意fixed-link无需配置MDIO和MDC引脚模式

3. EMAC 功能/机制介绍¶
3.1. FLOW CONTROL¶
数据在传输过程中容易出现数据丢失的现象,例如:两台计算机通过串口传输数据时,或者台式机与单片机之间进行通信时,可能由于两端计算机的处理速度不同,出现接收端的数据缓冲区已满,而发送端依然继续发送数据,则导致数据丢失。
流控制(FLOW CONTROL)的出现就是为了解决这种数据丢失的问题。在全双工应用情形中,会通过PAUSE帧进行流控。
当接收端数据处理不过来时,就发出“不再接收”的信号(PAUSE帧),发送端就停止发送,直到收到“可以继续发送”的信号再发送数据。因此流控制可以控制数据传输的进程,防止数据的丢失。PAUSE 帧即链路层实现流量控制的一个封包,由链路自动处理。
例如,当100M 网卡通过交换机向 10M 网卡发送数据帧的时候,10M 网卡由于速率的限制,会存在缓冲区爆掉导致的丢帧问题;10M网卡当发现自己缓冲区快爆掉之前可以发出一个PAUSE 帧,请收到PAUSE 的设备暂停一段时间再发包。
3.1.1.PAUSE 帧的格式¶
PAUSE 帧的格式如下图所示:

如果是PAUSE_ON pkt, 则time_unit不为0。 当前默认都是 0xFFFF。
如果是PAUSE_OFF pkt, 则time_unit为0。 当收到PAUSE_OFF pkt时,则说明流控已经关掉,可以正常tx pkt了, 即具有唤醒功能。
time-unit 是暂停传送时间参数,单位是当前速率下传输512bit的时间,即slot time;一些常用值可以在下表查看:
value | 10M 暂停时间 | 100M 暂停时间 |
---|---|---|
20 | 1ms | 100us |
200 | 10ms | 1ms |
2000 | 100ms | 10ms |
20000 | 1s | 100ms |
60000 | 3s | 300ms |
65535 | 3.27s | 327ms |
3.1.2.如何启用关闭PAUSE¶
-
通过 hal_emac.h 中的宏 HW_FLOW_CONTROL 开关硬件FLOW CONTROL。
-
ethtool控制, tx指的传输方向流控,表示eth0在传输流量时收到PAUSE帧,能否暂停传输;rx指的接收方向流控,表示eth0能否在接收流量时向对端发送PAUSE帧。
./ethtool -a eth0 显示当前的流控状态 ./ethtool -A eth0 rx on tx on => 打开tx rx 的流控 ./ethtool -A eth0 rx off tx off => 关闭tx rx 的流控
3.2. NETWORK STORM¶
广播风暴(broadcast storm):指广播数据充斥网络无法处理,占用大量网络带宽,导致正常业务不能运行,甚至彻底瘫痪。
针对该问题,可以开启网络风暴保护功能,网卡可以限制 unicast、multicast以及broadcast的收发带宽。针对广播风暴场景,选择使用对broadcast流量限制就能解决问题。
3.2.1. 封包的过滤速率¶
100M速率下 RX_CLK = 25MHZ ,10M速率下 RX_CLK = 2.5MHZ 。
NETWORK STORM的理论限制速率 = RX_CLK / 过滤值(consume), 当前默认过滤值为 2500。
因此默认值在100M RMII 下的限制速率为 25Mhz / 2500 = 10000 Package/s。当默认值不满足需求时,可以通过修改过滤值即可得到想要的限制速率。
max 表示一开始可以全速收(max/consume)个封包,当收满这么多封包后,之后的收包速率按照上文描述的(RXCLK / consume)。
3.2.2. 如何设置封包的过滤速率¶
当前默认提供五个挡位,在 drv_emac.c 中的 Dev_EMAC_init 中三个对应函数设置。
level | consume | 百兆 RMII 的限制速率 Package/s |
---|---|---|
1 | 40000 | 625 |
2 | 20000 | 1250 |
3 | 10000 | 2500 |
4 | 5000 | 5000 |
5 | 2500 | 10000 |
Hal_EMAC_Netsp_Unicast_Setting(hemac->hal, TX_MAX_DEFAULT, TX_CONSUME_LEVEL_5, 1); //限制 unicast 的收发带宽 Hal_EMAC_Netsp_Multicast_Setting(hemac->hal, TX_MAX_DEFAULT, TX_CONSUME_LEVEL_5, 1);//限制 multicast 的收发带宽 Hal_EMAC_Netsp_Broadcast_Setting(hemac->hal, TX_MAX_DEFAULT, TX_CONSUME_LEVEL_5, 1);//限制 broadcast 的收发带宽
3.2.3.使用寄存器启用网络风暴保护¶
如果不满足客户使用需求,下面提供一组默认的设定,可以根据方法自由调整。如果要同时启用只要将对应的使能位开启。
3.2.3.1.emac0
-
unicast 单包保护
/customer/riu_w 1511 50 1A80 //最大值 max 低16位 /customer/riu_w 1511 51 0006 //最大值 max 高16位 /customer/riu_w 1511 52 09C4 //过滤值 counsume 低16位 /customer/riu_w 1511 68 0001 //bit 0 使能
-
multicast 多包保护
/customer/riu_w 1511 58 1A80 /customer/riu_w 1511 59 0006 /customer/riu_w 1511 5A 09C4 /customer/riu_w 1511 68 0002 //bit 1 使能
-
broadcast 广播包保护
/customer/riu_w 1511 60 1A80 /customer/riu_w 1511 61 0006 /customer/riu_w 1511 62 09C4 /customer/riu_w 1511 68 0004 //bit 2 使能
3.3. RX DELAY¶
EMAC RX在收到帧后,会trig中断,唤醒RX线程收包。如果网络流量较多,就会产生大量中断,进而消耗大量CPU性能,导致CPU loading上升。
硬件提供RX delay功能,允许MAC在收到帧后,不会立即trig中断,而是收到的帧达到一定数量(delay_num)或者 未达到数量但超过一定时间(cyc_num)后trig中断。这样通过减少产生的中断数,节省CPU loading。
RX Delay内部还提供 动态调节 的功能: 在网络空闲时,delay_num 和 cyc_num 会较小; 当网络繁忙时,dalay_num 和 cyc_num 会较大。该功能可以通过 drv_emac.h 里的宏 DYNAMIC_INT_RX 进行开关动态调节功能, 默认开启 。
3.4. TX DELAY¶
与RX DELAY类似,EMAC TX在发送完一帧,会trig中断。如果需要发送的帧较多,就会产生大量中断,进而消耗大量CPU性能,导致CPU loading上升。
硬件提供TX delay功能,允许MAC在发出一帧后,不会立即trig中断,而是发送的帧达到一定数量(delay_num)或者 未达到数量但超过一定时间(timeout)后trig中断。这样通过减少产生的中断数,节省CPU loading。
该功能可以通过 hal_emac.h 里的宏 TX_DELAY_INT 进行开关, 默认开启 。
3.5. IPV6¶
kernel提供了ipv6功能,如果需要使用IPV6功能,需要开启对应的CONFIG, (默认关闭) 。
- kernel 中打开 ipv6 支持
-> Networking support (NET [=y]) -> Networking options -> TCP/IP networking (INET [=y]) <*> The IPv6 protocol
4. 常用配置命令¶
4.1. Uboot cmd¶
4.1.1. Uboot cmd参数说明¶
Uboot 下网络主要使用到ping dhcp tftp 命令,在使用这些命令之前需要配置网络使用的环境变量。
4.1.1.1. ENV配置启机网卡自动初始化
可以通过环境变量 autoestart 配置启机自动初始化网卡。但由于 网卡初始化会等待网卡自协商完成,因此会导致启机速度变慢,需要根据需求决定是否配置。
如果autoestart=0,则启机不会初始化网卡。此时如果需要在uboot下使用网络,需要执行 estart 命令进行网卡初始化,否则会提示:No ethernet found。
estart //网卡初始化
如果autoestart=1,则启机自动初始化网卡。
setenv -f autoestart 1 //配置启机自动初始化网卡
4.1.1.2. ENV 配置静态IP
setenv -f ethact sstar_emac //配置网卡驱动为emac setenv -f ethaddr xx:xx:xx:xx:xx:xx //配置 mac 地址 setenv -f ipaddr xxx.xxx.xxx.xxx //配置静态 ip 地址 setenv -f netmask xxx.xxx.xxx.xxx //配置 ip 地址掩码 setenv -f serverip xxx.xxx.xxx.xxx //配置tftp server ip save //保存配置
4.1.1.3. ENV配置&动态获取IP
setenv -f ethact sstar_emac //配置网卡驱动为emac setenv -f ethaddr xx:xx:xx:xx:xx:xx //配置 mac 地址 setenv -f serverip xxx.xxx.xxx.xxx //配置tftp server ip save //保存配置 dhcp //dhcp动态获取ip
4.1.1.4. tftp 命令
tftp 0x20000000 kernel //表示将server 端名字为kernel 的文件通过tftp copy 到地址 0x20000000
4.1.2. Uboot cmd使用实例¶
4.1.2.1. 配置静态IP + ping cmd演示

4.1.2.2. dhcp cmd演示

4.1.2.3. tftp cmd演示

4.2. Kernel cmd¶
4.2.1. Kernel cmd说明¶
-
查看所有网卡信息
ifconfig -a
-
eth0网卡使能
ifconfig eth0 up
-
配置网卡eth0的mac地址为 00:00:83:94:40:01
ifconfig eth0 hw ether 00:00:83:94:40:01
-
配置网卡eth0的静态ip地址为 40.1.1.1/24
ifconfig eth0 40.1.1.1 netmask 255.255.255.0
-
网卡eth0 dhcp获取ip
udhcpc -i eth0 -s /etc/init.d/udhcpc.script
-
挂载nfs目录
mount -t nfs -o nolock xxx.xxx.xxx.xxx:/c/nfs /mnt
参数 说明 xxx.xxx.xxx.xxx nfs服务器ip地址 /c/nfs nfs服务器的目录路径 /mnt 将nfs目录 挂载在设备的 /mnt 路径 -
挂载cifs目录
mount -t cifs //xxx.xxx.xxx.xxx/cifs /mnt -o username=xxx,password=xxx,sec=ntlm,iocharset=utf8,vers=1.0
参数 说明 xxx.xxx.xxx.xxx cifs服务器ip地址 /cifs cifs服务器的共享目录路径 /mnt 将cifs目录 挂载在设备的 /mnt 路径 -
tftp get
tftp -g xxx.xxx.xxx.xxx -r kernel
参数 说明 -g xxx.xxx.xxx.xxx 从 server_ip xxx.xxx.xxx.xxx 获取文件 -r file_name 需要从Server获取的文件名 -
tftp put
tftp -p xxx.xxx.xxx.xxx -r kernel
参数 说明 -p xxx.xxx.xxx.xxx 向 xxx.xxx.xxx.xxx 传输文件 -r file_name 需要传输给Server的文件名
4.2.2 Kernel cmd 使用实例¶
配置eth0 获取动态IP 并 挂载nfs

5. 常用第三方工具和常用命令¶
5.1. iperf3¶
-
iperf3 服务端模式
./iperf3 -s -i 1
选项 说明 -s 服务端模式 -i 1 打印回显间隔(单位: 秒),这里是 1秒 -
iperf3 客户端模式
./iperf3 -c xxx.xxx.xxx.xxx -i 1 -t 36000 -b 95M
选项 说明 -c 客户端模式 xxx.xxx.xxx.xxx 对端的ip地址 -i 1 打印回显间隔,单位 秒,这里是 1秒 -t 36000 打流时间,单位 秒,最高 86400 (24小时) -b 95M 打流速率 95Mbits/sec
5.2. tcpdump¶
tcpdump是一个linux下的抓包工具。
./tcpdump -s 0 -i eth0 -w /tmp/pkt.cap //捕获eth0 网卡的报文并缓存到 pkt.cap
选项 | 说明 |
---|---|
-s 0 | 指定抓包大小,0表示不限制 |
-i eth0 | 表示连接的接口,any表示所有接口 |
-w /tmp/pkt.cap | 表示抓的包写到指定path中。文件为.pcap |
5.3. ethtool¶
-
查看 eth0 网卡信息
ethtool eth0
-
切换 eth0 的网卡速率和双工模式
ethtool -s eth0 speed 100 duplex full
-
开启/关闭 eth0 自协商
ethtool -s eth0 autoneg on/off
-
开启流控 Flow Control
ethtool -A eth0 rx on tx on
-
查看 eth0 收包 statistics
ethtool -S eth0
5.4. phytool¶
-
读取phy reg的值
read IFACE/ADDR/REG
选项 说明 IFACE eth0 or eth1 ADDR mdio bus 上的位置 REG 读取的phy reg eg: 读取 eth0 addr0 reg2
phytool read eth0/0/2
-
往phy reg 写入值
write IFACE/ADDR/REG <0-0xffff>
参数 说明 IFACE eth0 or eth1 ADDR mdio bus 上的位置 REG 写入的phy reg <0-0xffff> 要写入的值 eg: 写入 eth0 的 loopback bit
phytool write eth0/0/0 4000
6. 常用DEBUG节点¶
6.1. dlist emac驱动统计信息节点¶
通过cat dlist查看emac驱动中断/收包统计等信息。
/ # cat /sys/devices/virtual/sstar/emac0/dlist_info RBQP_size=0x100 empty=0x100, hemac->rxBuffIndex=0x7f, u32RBQP_Addr=0x20a07f 0x000: 1111111111111111 1111111111111111 0x020: 1111111111111111 1111111111111111 0x040: 1111111111111111 1111111111111111 0x060: 1111111111111111 1111111111111111 0x080: 1111111111111111 1111111111111111 0x0a0: 1111111111111111 1111111111111111 0x0c0: 1111111111111111 1111111111111111 0x0e0: 1111111111111111 1111111111111111 max_rx_packet_count=4 max_tx_packet_count=1 IDX_CNT_INT_DONE=0 IDX_CNT_INT_RCOM=0 IDX_CNT_INT_RBNA=0 IDX_CNT_INT_TOVR=0 IDX_CNT_INT_TUND=0 IDX_CNT_INT_RTRY=0 IDX_CNT_INT_TCOM=0 IDX_CNT_INT_ROVR=0 IDX_CNT_JULIAN_D=67901 IDX_CNT_INT_TDLY=0 IDX_CNT_INT_TDTO=0 skb_tx_send=698 skb_tx_free=698 rx_duration_max=374 rx_packet_cnt=67967 tx_delay_pack_cnt=0 data_done=42 data_duration=41152 data_average=0 tx_pkt (duration)=1 tx_int (duration)=0 tx_int_dly (duration)=0 tx_int_to (duration)=0 rx_int_dly (duration)=976 rx_pkt (duration)=977 Hal_EMAC_TXQ_Mode=0 maxSG=2
6.2. phyStatusWR phy读写 debug节点¶
-
Usage
/ # cat /sys/devices/virtual/sstar/emac0/phyStatusWR phy read & write: Usage: echo phy_r phyAddress > phyStatusWR echo phy_w phyAddress phyValue> phyStatusWR echo phyE_r phyId phyAddress > phyStatusWR echo phyE_w phyId phyAddress phyValues > phyStatusW
-
eg
/sys/devices/virtual/sstar/emac0 # echo phy_r 0 > phyStatusWR phy_r address[0] value[3100] /sys/devices/virtual/sstar/emac0 # echo phy_w 0 1200 > phyStatusWR phy_w address[0] value[1200] /sys/devices/virtual/sstar/emac0 # echo phyE_r 0 0 > phyStatusWR phyE_r id[0] address[0] value[3100] /sys/devices/virtual/sstar/emac0 # echo phyE_w 0 0 0x1200 > phyStatusWR phyE_w id[0] address[0] value[1200]
6.3. turndrv 驱动调试节点¶
- Usage
/sys/devices/virtual/sstar/emac0 # cat turndrv Usage: echo f10t > turndrv => set max_speed to 10M echo an > turndrv => set link mode to autonegotiatingn echo dir_on > turndrv => enable Dynamic Rx Interrupt echo dir_off > turndrv => disable Dynamic Rx Interrupt echo swing_100 [gear] > turndrv => swing 100M tx gear echo swing_10 [gear] > turndrv => swing 10M tx gear echo rx_imp [level] > turndrv => adjust rx impedance, range:-4 ~ 7 echo timing [is_rise] [delay_time] [duty_cycle] [phase] > turndrv
6.3.1. f10t 限制最大速率为 10Mbits/sec¶
需要进行一次自协商才能切换成10M
/ # echo f10t > /sys/devices/virtual/sstar/emac0/turndrv SPEED_10 / # echo an > /sys/devices/virtual/sstar/emac0/turndrv phy_start_aneg
6.3.2. an 进行自协商¶
/ # echo an > /sys/devices/virtual/sstar/emac0/turndrv phy_start_aneg
6.3.3. dir_on 开启RX DELAY动态调整阈值¶
/ # echo dir_on > /sys/devices/virtual/sstar/emac0/turndrv rx_stats_enable: 1
6.3.4. dir_off 关闭RX DELAY动态调整阈值¶
/ # echo dir_off > /sys/devices/virtual/sstar/emac0/turndrv rx_stats_enable: 0
6.3.5. swing_100 调整100M速率下的TX驱动能力¶
-
Ephy共有32个挡位可调整,0x1F递减至0x10代表第0档到第15档,0x00递增至0x0f代表第16档到第31档
-
档位调整方式为相对当前档位调高或调低,同时会打印出调整后的档位值
-
档位越高驱动能力越强
-
以下示例分别表示:查看当前档位、调高两档、调低四档
/ # echo swing_100 0 > /sys/devices/virtual/sstar/emac0/turndrv swing : 0x00 / # echo swing_100 2 > /sys/devices/virtual/sstar/emac0/turndrv swing : 0x02 / # echo swing_100 -4 > /sys/devices/virtual/sstar/emac0/turndrv swing : 0x11
6.3.6. swing_10 调整10M速率下的TX驱动能力¶
- 调整方式与swing_100 相同
/ # echo swing_10 0 > /sys/devices/virtual/sstar/emac0/turndrv swing : 0x00 / # echo swing_10 2 > /sys/devices/virtual/sstar/emac0/turndrv swing : 0x02 / # echo swing_10 -5 > /sys/devices/virtual/sstar/emac0/turndrv swing : 0x12
6.3.7. rx_imp 调整RX阻抗¶
- rx阻抗共有12个档位可调整,value从-4 ~ 7,值越大阻抗越高,配置方式为直接设置档位值
/ # echo rx_imp 0 > /sys/devices/virtual/sstar/emac0/turndrv rx impedance level: 0 / # echo rx_imp -2 > /sys/devices/virtual/sstar/emac0/turndrv rx impedance level: -2 / # echo rx_imp 4 > /sys/devices/virtual/sstar/emac0/turndrv rx impedance level: 4
7. ethernet 术语与缩略语¶
-
MII: 介质独立接口(Medium Independent Interface), 一般应用于以太网硬件平台的MAC层和PHY层之间。
-
RMII: 简化媒体独立接口(Reduced Media Independent Interface)。
-
RX: 接收器(Receiver)或接收(Reception)。
-
TX: 发射器(Transmitter)或传输(Transmission)。