Ethernet使用参考


1. 概述

Ethernet Media Access Controller(以太网媒体访问控制器)简称为EMAC,以太网数据通信中主要负责对物理层和数据链路层之间进行控制和管理。

图1-1 EMAC架构

硬件架构如图, 有两个EMAC控制器:

EMAC0 + EMAC1。

从硬件角度看:

EMAC0: 仅支持RMII外挂Ephy(百兆)

EMAC1: 仅支持RMII外挂Ephy(百兆)

从软件角度看(默认设定):

  • UBOOT

    EMAC0: RMII

    EMAC1: RMII(默认关闭)

    注意:UBOOT下只能同时启用一个EMAC

  • KERNEL

    EMAC0: RMII

    EMAC1:RMII(默认关闭)

    注意:KERNEL下可以同时启用两个EMAC

2. 关键字说明

  • EMAC

    Ethernet Media Access Controller(以太网媒体访问控制器)简称为EMAC

  • Ephy

    Ethernet Physical Layer(以太网物理接口收发器)简称为Ephy

  • MII

    MII(Media Independent Interface)即媒体独立接口,MII接口是MAC与PHY连接的标准接口,MII接口提供了MAC与PHY之间的互联支持

  • RMII

    RMII(Reduced Media Independant Interface)即简化媒体独立接口,是标准的以太网接口之一,比MII有更少的I/O传输引脚

  • RX

    接收器(Receiver)或接收(Reception)。

  • TX

    发射器(Transmitter)或传输(Transmission)。

3. EMAC 功能描述

3.1. FLOW CONTROL

数据在传输过程中容易出现数据丢失的现象,例如:两台计算机通过串口传输数据时,或者台式机与单片机之间进行通信时,可能由于两端计算机的处理速度不同,出现接收端的数据缓冲区已满,而发送端依然继续发送数据,则导致数据丢失。

流控制(FLOW CONTROL)的出现就是为了解决这种数据丢失的问题。在全双工应用情形中,会通过PAUSE帧进行流控。

当接收端数据处理不过来时,就发出“不再接收”的信号(PAUSE帧),发送端就停止发送,直到收到“可以继续发送”的信号再发送数据。因此流控制可以控制数据传输的进程,防止数据的丢失。PAUSE 帧即链路层实现流量控制的一个封包,由链路自动处理。

例如,当100M 网卡通过交换机向 10M 网卡发送数据帧的时候,10M 网卡由于速率的限制,会存在缓冲区爆掉导致的丢帧问题;10M网卡当发现自己缓冲区快爆掉之前可以发出一个PAUSE 帧,请收到PAUSE 的设备暂停一段时间再发包。

3.1.1. PAUSE 帧的格式

PAUSE 帧的格式如下图所示:

图3-1 Pause_Frame

如果是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) 个封包,当收满这么多封包后,之后的收包速率按照上文描述的 (RX_CLK / 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.2.3.2. emac1
  • unicast 单包保护

    /customer/riu_w 1515 50 1A80
    /customer/riu_w 1515 51 0006
    /customer/riu_w 1515 52 09C4
    /customer/riu_w 1515 68 0001   //bit 0 使能
    
  • multicast 多包保护

    /customer/riu_w 1515 58 1A80
    /customer/riu_w 1515 59 0006
    /customer/riu_w 1515 5A 09C4
    /customer/riu_w 1515 68 0002   //bit 1 使能
    
  • broadcast 广播包保护

    /customer/riu_w 1515 60 1A80
    /customer/riu_w 1515 61 0006
    /customer/riu_w 1515 62 09C4
    /customer/riu_w 1515 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. 硬件连接介绍

RMII接线如下图

图4-1 RMII硬件连接

5. Uboot用法介绍

5.1. Uboot CONFIG 配置说明

  • EMAC相关CONFIG配置

    SigmaStar drivers  --->
        SigmaStar EMAC --->
            [*] SigmaStar EMAC
            [*]   EMAC supply to RMII
            [ ]     EMAC supply to IC+ Phy
            [ ]   EMAC fix link to mii/rmii
            [*]   EMAC phy reset reverse
            [*]   EMAC 0
            [*]     EMAC0 PHY RESET
            (17)      EMAC 0 FOR PHY RESET PAD
            (20)      EMAC 0 FOR PHY RESET HOLD MS
            (50)      EMAC 0 FOR PHY WAIT READY MS
            [*]   EMAC 1
            [*]     EMAC1 PHY RESET
            (121)     EMAC 1 FOR PHY RESET PAD
            (20)      EMAC 1 FOR PHY RESET HOLD MS
            (50)      EMAC 1 FOR PHY WAIT READY MS
    
    CONFIG 说明 默认值 备注
    [*] SigmaStar EMAC 使能EMAC 使能
    [*] EMAC supply to RMII 使能RMII模式 使能
    [ ] EMAC supply to IC+ Phy 支持 ICPULS PHY 不使能
    [ ] EMAC fix link to mii/rmii 使能 fix link 不使能
    [*] EMAC phy reset reverse phy reset时反向拉高拉低 使能
    [*] EMAC 0 使能EMAC0 使能
    [*] EMAC0 PHY RESET 使能 EMAC0 软件 phy reset 不使能
    (17) EMAC 0 FOR PHY RESET PAD EMAC0 的 phy reset padmux值 17
    (20) EMAC 0 FOR PHY RESET HOLD MS EMAC0 设置低电平的保持时间 20ms
    (50) EMAC 0 FOR PHY WAIT READY MS EMAC0 设置高电平的等待就绪时间 50ms
    [*] EMAC 1 使能EMAC1 此时uboot改为使用EMAC1 网卡 不使能 需要注意 uboot 下只能使用 emac0 或者 emac1,无法同时使用
    [*] EMAC1 PHY RESET 使能EMAC1软件 phy reset 不使能
    (121) EMAC 1 FOR PHY RESET PAD EMAC1 的 phy reset padmux值 121
    (20) EMAC 1 FOR PHY RESET HOLD MS EMAC1 设置低电平的保持时间 20ms
    (50) EMAC 1 FOR PHY WAIT READY MS EMAC1 设置高电平的等待就绪时间 50ms
  • EMAC0 RMII

    [*] SigmaStar drivers  --->
        SigmaStar EMAC --->
            [*] SigmaStar EMAC
            [*]   EMAC supply to RMII
            [ ]     EMAC supply to IC+ Phy
            [ ]   EMAC fix link to mii/rmii
            [*]   EMAC phy reset reverse
            [*]   EMAC 0
            [ ]     EMAC0 PHY RESET
            [ ]   EMAC 1
    
  • EMAC0 RMII + phy reset

    [*] SigmaStar drivers  --->
        SigmaStar EMAC --->
            [*] SigmaStar EMAC
            [*]   EMAC supply to RMII
            [ ]     EMAC supply to IC+ Phy
            [ ]   EMAC fix link to mii/rmii
            [*]   EMAC phy reset reverse
            [*]   EMAC 0
            [*]     EMAC0 PHY RESET
            (17)      EMAC 0 FOR PHY RESET PAD
            (20)      EMAC 0 FOR PHY RESET HOLD MS
            (50)      EMAC 0 FOR PHY WAIT READY MS
            [ ]   EMAC 1
    
  • EMAC1 RMII

    [*] SigmaStar drivers  --->
        SigmaStar EMAC --->
            [*] SigmaStar EMAC
            [*]   EMAC supply to RMII
            [ ]     EMAC supply to IC+ Phy
            [ ]   EMAC fix link to mii/rmii
            [*]   EMAC phy reset reverse
            [ ]   EMAC 0
            [*]   EMAC 1
            [ ]     EMAC1 PHY RESET
    
  • EMAC1 RMII + phy reset

    [*] SigmaStar drivers  --->
        SigmaStar EMAC --->
            [*] SigmaStar EMAC
            [*]   EMAC supply to RMII
            [ ]     EMAC supply to IC+ Phy
            [ ]   EMAC fix link to mii/rmii
            [*]   EMAC phy reset reverse
            [ ]   EMAC 0
            [*]   EMAC 1
            [*]     EMAC1 PHY RESET
            (121)     EMAC 1 FOR PHY RESET PAD
            (20)      EMAC 1 FOR PHY RESET HOLD MS
            (50)      EMAC 1 FOR PHY WAIT READY MS
    
  • Network commands

    Command line interface --->
        Network commands --->
            [*]   bootp
            [*]     dhcp
            [*]   tftpboot
            [*]   ping
    

5.2. Uboot cmd参数说明

Uboot 下网络主要使用到ping dhcp tftp 命令,在使用这些命令之前需要配置网络使用的环境变量。

5.2.1. ENV配置启机网卡自动初始化

可以通过环境变量 autoestart 配置启机自动初始化网卡。但由于 网卡初始化会等待网卡自协商完成,因此会导致启机速度变慢,需要根据需求决定是否配置。

如果autoestart=0,则启机不会初始化网卡。此时如果需要在uboot下使用网络,需要执行 estart 命令进行网卡初始化,否则会提示:No ethernet found。

estart                               //网卡初始化

如果autoestart=1,则启机自动初始化网卡。

setenv -f autoestart 1               //配置启机自动初始化网卡

5.2.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                                 //保存配置

5.2.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

5.2.4. tftp 命令

tftp 0x20000000 kernel               //表示将server 端名字为kernel 的文件通过tftp copy 到地址 0x20000000

5.3. Uboot cmd使用实例

5.3.1. 配置静态IP + ping cmd演示

图5-1 uboot_ping_cmd

5.3.2. dhcp cmd演示

图5-2 uboot_dhcp_cmd

5.3.3. tftp cmd演示

图5-3 uboot_tftp_cmd

6. Kernel用法介绍

6.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
    

6.2. Kernel DTS配置

图6-1 Kernel DTS

节点如上图展示,释义分别为:

参数 释义 备注
compatible 属性信息 与驱动属性值对应
interrupts 中断脚 中断的触发引脚驱动获取
clocks EMAC时钟 驱动获取时钟节点
reg 寄存器映射的物理地址 第一个为emac 寄存器base, 第二个为x32寄存器base, 第三个为内部phy寄存器base
pad-rmii padmux 当CONFIG_PADMUX未启用时,此处生效。
bus-mode mac 选择的mode与phy一致 1:MII 2:RMII
phy-handle phy节点
max-speed 限制自协商下的最大速率,两个档位 <10>/<100>
status Driver 开关 "ok"/"disabled"
emac-id 当前使用的emac id,不等同eth id <0>/<1>
reset_reverse reset外接反向电路时使用,配置后reset会 先拉高再拉低 配置生效,去掉则不生效
cpu-affinity cpu亲和性,开启后允许中断在多个CPU上处理 0:single cpu 1:multi cpu
phy-mode phy 接口选择 "mii"/"rmii"

6.2.1 DTS节点启用 EMAC1 示例

DTS配置:修改“emac1” dts node,将status 设置为“ok”

图6-2 EMAC1_DTS

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

图6-3 EMAC1_DTSI

6.3. Padmux配置

EMAC配置RMII的padmux方法,在Uboot与kernel下均一致,只需要根据选择的引脚在对应的padmux.dtsi中加入如下所示的代码:

EMAC0的RMII PADMUX配置:

//emac0 rmii
<PAD_GPIOE_20            PINMUX_FOR_ETH_MODE_3            MDRV_PUSE_ETH0_COL>,
<PAD_GPIOE_21            PINMUX_FOR_ETH_MODE_3            MDRV_PUSE_ETH0_RXD0>,
<PAD_GPIOE_22            PINMUX_FOR_ETH_MODE_3            MDRV_PUSE_ETH0_RXD1>,
<PAD_GPIOE_23            PINMUX_FOR_ETH_MODE_3            MDRV_PUSE_ETH0_TX_CLK>,
<PAD_GPIOE_24            PINMUX_FOR_ETH_MODE_3            MDRV_PUSE_ETH0_TXD0>,
<PAD_GPIOE_25            PINMUX_FOR_ETH_MODE_3            MDRV_PUSE_ETH0_TXD1>,
<PAD_GPIOE_26            PINMUX_FOR_ETH_MODE_3            MDRV_PUSE_ETH0_TX_CTL>,
<PAD_GPIOE_27            PINMUX_FOR_ETH_MODE_3            MDRV_PUSE_ETH0_MDIO>,
<PAD_GPIOE_28            PINMUX_FOR_ETH_MODE_3            MDRV_PUSE_ETH0_MDC>,

EMAC1的RMII PADMUX配置:

//emac1 rmii
<PAD_GPIOB_00            PINMUX_FOR_ETH1_MODE_2           MDRV_PUSE_ETH1_COL>,
<PAD_GPIOB_01            PINMUX_FOR_ETH1_MODE_2           MDRV_PUSE_ETH1_RXD0>,
<PAD_GPIOB_02            PINMUX_FOR_ETH1_MODE_2           MDRV_PUSE_ETH1_RXD1>,
<PAD_GPIOB_03            PINMUX_FOR_ETH1_MODE_2           MDRV_PUSE_ETH1_TX_CLK>,
<PAD_GPIOB_04            PINMUX_FOR_ETH1_MODE_2           MDRV_PUSE_ETH1_TXD0>,
<PAD_GPIOB_05            PINMUX_FOR_ETH1_MODE_2           MDRV_PUSE_ETH1_TXD1>,
<PAD_GPIOB_06            PINMUX_FOR_ETH1_MODE_2           MDRV_PUSE_ETH1_TX_CTL>,
<PAD_GPIOB_07            PINMUX_FOR_ETH1_MODE_2           MDRV_PUSE_ETH1_MDIO>,
<PAD_GPIOB_08            PINMUX_FOR_ETH1_MODE_2           MDRV_PUSE_ETH1_MDC>,

6.4. 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的文件名
  • 配置eth0 获取动态IP并挂载nfs

    图6-4 kernel_nfs_cmd

6.5. 常用第三方工具和常用命令

6.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

6.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

6.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
    

6.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.6. 常用DEBUG节点使用方法

6.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.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[1000]
    /sys/devices/virtual/sstar/emac0 # echo phyE_r 1 0 > phyStatusWR
    phyE_r id[1] address[0] value[3100]
    /sys/devices/virtual/sstar/emac0 # echo phyE_w 1 0 0x1200 > phyStatusWR
    phyE_w id[1] address[0] value[1000]
    

6.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.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.6.3.2. an 进行自协商
/ # echo an > /sys/devices/virtual/sstar/emac0/turndrv
phy_start_aneg
6.6.3.3. dir_on 开启RX DELAY动态调整阈值
/ # echo dir_on > /sys/devices/virtual/sstar/emac0/turndrv
rx_stats_enable: 1
6.6.3.4. dir_off 关闭RX DELAY动态调整阈值
/ # echo dir_off > /sys/devices/virtual/sstar/emac0/turndrv
rx_stats_enable: 0

7. API参考

EMAC无对外API

8. FAQ

Q1:启机日志出现"xxx could not connect to PHY",并且网络无法通信

  1. 检查padmux.dtsi中RMII的引脚配置是否打开,并且确认引脚配置是否有冲突。

  2. 确认使用的phy的reset时序。若存在反向电路,则需要在dts emac节点中添加"reset_reverse"属性,反之则需要去掉"reset_reverse"属性。同时需确认保持电平的时间是否符合phy要求

    图8-1 reset_reverse dts

  3. 若使用的phy非sstar提供,则需要找对应phy厂商确认是否需要专用的phy驱动支持

  4. 检查硬件接线是否正确,有无接错、虚焊、短接等等情况

Q2:设备出现丢包多,网络速率上不去现象

  1. 需检查设备和对端的link mode是否一致,可通过"./ethtool eth0"命令查看当前的phy link mode

  2. 需检查网线物理连接是否松动,以及网线本身质量是否合格

  3. 检查网络环境是否正常,如是否开启了防火墙,是否中转设备(路由器, 交换机)有做了影响带宽的qos策略等等。可以改为直连环境验证排查(如DUT直连PC)。

  4. 检查设备的cpu负载是否过大,使得设备无法及时处理网络报文导致丢包。

  5. 检查信号质量,可以通过配置对应的phy寄存器,调整phy端驱动能力。

Q3:在不使用网络的情况下,保留EMAC模块是否会有额外功耗?

不会有额外功耗。只要网口处于down状态,就不会开启EMAC clk,可通过"ifconfig"命令查看当前是否有开启的网口