跳转至

Ethernet使用参考


REVISION HISTORY

Revision No.
Description
Date
1.0
  • Initial release
  • 11/25/2025

    1. 概述

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

    从硬件角度看:

    硬件架构如图,只有一个EMAC控制器:EMAC0。

    EMAC0: 支持MII内置Ephy(百兆)、RMII外挂Ephy(百兆)

    图1-1 iford-EMAC架构

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

    • UBOOT

      EMAC0: MII

    • KERNEL

      EMAC0: MII

    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)。

    • MDIO

      MDIO(Management Data Input/Output), 管理数据的输入输出双向接口。

    • MDC

      MDC(Management Data Clock), 是管理数据的时钟信号。

    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流量限制就能解决问题。

    • 可以通过 hal_emac.h 中的宏 HW_FLOW_CONTROL 和 NETWORK_STORM_PROTECT_DEBUG 开关NETWORK STORM。默认状态下单播风暴是关闭的。

    3.2.1. 封包的过滤速率

    100M速率下 RX_CLK = 25MHZ , 10M速率下 RX_CLK = 2.5MHZ

    NETWORK STORM的理论限制速率 = RX_CLK / 过滤值(consume), 当前默认过滤值为 2500。

    因此默认值在100M 下的限制速率为 25Mhz / 2500 = 10000 Package/s。当默认值不满足需求时,可以通过修改过滤值即可得到想要的限制速率。

    max 表示一开始可以全速收 (max/ consume) 个封包,当收满这么多封包后,之后的收包速率按照上文描述的 (RX_CLK / consume)。

    3.2.2. 如何设置封包的过滤速率

    当前默认提供五个挡位

    level consume 100M 的限制速率 Packets/s 10M 的限制速率 Package/s
    1 40000 625 62.5
    2 20000 1250 125
    3 10000 2500 250
    4 5000 5000 500
    5 2500 10000 1000

    3.2.3. 使用寄存器启用网络风暴保护

    如果不满足客户使用需求,下面提供一组默认的设定,可以根据方法自由调整。如果要同时启用只要将对应的使能位开启。以下以iford为例:

    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   //最大值  max 低16位
      /customer/riu_w 1511 59 0006   //最大值  max 高16位
      /customer/riu_w 1511 5A 09C4   //过滤值  counsume 低16位
      /customer/riu_w 1511 68 0002   //bit 1 使能
      
    • broadcast 广播包保护

      /customer/riu_w 1511 60 1A80   //最大值  max 低16位
      /customer/riu_w 1511 61 0006   //最大值  max 高16位
      /customer/riu_w 1511 62 09C4   //过滤值  counsume 低16位
      /customer/riu_w 1511 68 0004   //bit 2 使能
      

    3.3 网络接收中断聚合

    EMAC RX 硬件在收到帧后,会触发中断以唤醒 RX 线程进行收包。当网络流量较大时,会产生大量中断,这会消耗大量 CPU 性能,导致 CPU 负载上升。EMAC 硬件提供接收中断聚合功能(有时也称为 RX DELAY),其作用机制为:允许 EMAC 在收到帧后不立即触发中断,而是在满足以下任一条件时才触发:

    • 收到的帧数达到设定数量(delay_num)

    • 未达到设定帧数,但已超过指定时间(cyc_num)

    通过这种机制,可减少接收中断产生的次数,从而节省 CPU 资源。

    此外,RX Delay 内部还具备动态调节功能:

    • 网络空闲时,delay_num和cyc_num会自动设为较小值

    • 网络繁忙时,delay_num和cyc_num会自动设为较大值

    该动态调节功能可通过调整dts中的rx-delay-int属性进行开关控制

    • rx-delay-int设置为1,接收中断聚合功能打开,默认打开

    • rx-delay-int设置为0,接收中断聚合功能关闭

    3.4. 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硬件连接

    MII接线如下图:

    图4-2 MII硬件连接

    5. Uboot用法介绍

    5.1. Uboot CONFIG 配置说明

    • EMAC相关CONFIG配置

      SigmaStar drivers  --->
          [*]   SigmaStar EMAC
          [ ]     EMAC 1
          [ ]   EMAC supply to internel PHY
          [ ]   EMAC supply to RMII
          [ ]   EMAC supply to IC+ Phy 
          [ ]   EMAC fix link to mii/rmii
      
      CONFIG 说明 默认值 备注
      [*] SigmaStar EMAC 使能EMAC0 使能
      [ ] EMAC 1 使能EMAC1 不使能 IFADO无EMAC1网卡,无需配置
      [ ] EMAC supply to internel PHY 使能内部PHY 不使能 默认已经配置使用内部PHY
      [ ] EMAC supply to RMII 使能RMII模式 使能
      [ ] EMAC supply to IC+ Phy 支持 ICPULS PHY 不使能
      [ ] EMAC fix link to mii/rmii 使能 fix link 不使能
    • EMAC0 RMII

      SigmaStar drivers  --->
          [*]   SigmaStar EMAC
          [ ]     EMAC 1
          [ ]   EMAC supply to internel PHY
          [*]   EMAC supply to RMII
          [ ]   EMAC supply to IC+ Phy 
          [ ]   EMAC fix link to mii/rmii
      
    • 网口切换为RMII模式,需要在对应型号板子的 padmux.dtsi 文件中打开RMII padmux pin引脚,如下图所示:

      图5-1 RMII引脚复用

    • 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 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 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.2.5. ping 命令

    ping '<ip-address>'                  //对指定ip进行一次ping操作。ping通会提示"host <ip> is alive"
    

    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 padmux 当 CONFIG_SSTAR_PADMUX 和 EMAC_PADMUX_ENABLE 未启用时,此处生效。
    bus-mode mac 选择的mode与phy一致 1:MII 2:RMII
    phy-handle phy节点
    cpu-affinity cpu亲和性,开启后允许中断在多个CPU上处理 0:single cpu 1:multi cpu
    status Driver 开关 "ok"/"disabled"
    led-invert 用于配置ephy led是否由高电平点亮转变为低电平点亮 0:高电平点亮 1:低电平点亮
    led-reverse 用于翻转ephy led的功能 即对调date led与link led 0:不翻转 1:翻转
    ephy-driving 用于调整ephy的驱动能力 <参数1>:enable/disable <参数2>: ephy driving level ==》参数默认配置为0
    ephy-rise-time 用于调整ephy的上升时间 <参数1>:enable/disable <参数2>: delay_time [0~7] <参数3>: duty_cycle [0~3] <参数4>: phase [0~3] ==》参数默认配置为0
    ephy-fall-time 用于调整ephy的下降时间 <参数1>:enable/disable <参数2>: delay_time [0~7] <参数3>: duty_cycle [0~3] <参数4>: phase [0~3] ==》参数默认配置为0
    phy-mode phy 接口选择 "mii"/"rmii"

    6.2.1 DTS节点启用 EMAC0 示例

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

    • 修改bus-mode为RMII模式

    • 修改phy-mode为RMII模式

    图6-2 EMAC0_DTSI
    • PADMUX DTSI配置:找到EMAC0 padmux.dtsi文件,打开 eth0 对应的 pin 引脚,并屏蔽有冲突的pin引脚
    图6-3 EMAC0_PADMUX_DTSI

    6.3. Padmux配置

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

    • EMAC0的RMII PADMUX配置:
      <PAD_I2C0_SDA            PINMUX_FOR_ETH_MODE_2           MDRV_PUSE_ETH0_MDIO>,
      <PAD_I2C0_SCL            PINMUX_FOR_ETH_MODE_2           MDRV_PUSE_ETH0_MDC>,
      <PAD_FUART_CTS           PINMUX_FOR_ETH_MODE_2           MDRV_PUSE_ETH0_COL>,
      <PAD_FUART_RX            PINMUX_FOR_ETH_MODE_2           MDRV_PUSE_ETH0_RXD0>,
      <PAD_FUART_TX            PINMUX_FOR_ETH_MODE_2           MDRV_PUSE_ETH0_RXD1>,
      <PAD_MSPI_CK             PINMUX_FOR_ETH_MODE_2           MDRV_PUSE_ETH0_TX_CLK>,
      <PAD_MSPI_DO             PINMUX_FOR_ETH_MODE_2           MDRV_PUSE_ETH0_TXD0>,
      <PAD_MSPI_DI             PINMUX_FOR_ETH_MODE_2           MDRV_PUSE_ETH0_TXD1>,
      <PAD_MSPI_CZ             PINMUX_FOR_ETH_MODE_2           MDRV_PUSE_ETH0_TX_CTL>,
      <PAD_FUART_RTS           PINMUX_FOR_GPIO_MODE            MDRV_PUSE_ETH0_PHY_RESET>,
      

    6.4. Kernel cmd 使用实例

    • 查看所有网卡信息

      ifconfig -a
      
    • eth0网卡使能

      ifconfig eth0 up
      
    • 配置网卡eth0的mac地址为 00:00:88:33:00:01

      ifconfig eth0 hw ether 00:00:88:33:00: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=0x7d, u32RBQP_Addr=0x7fca07d
    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=13601
    IDX_CNT_INT_TDLY=0
    IDX_CNT_INT_TDTO=0
    skb_tx_send=7079
    skb_tx_free=7079
    skb_ip_checksum_err=0
    skb_tcp_checksum_err=0
    skb_udp_checksum_err=0
    rx_duration_max=60641
    rx_packet_cnt=13693
    tx_delay_pack_cnt=0
    data_done=391261
    data_duration=6474857
    data_average=0
    tx_pkt (duration)=7079
    tx_int (duration)=0
    tx_int_dly (duration)=0
    tx_int_to (duration)=0
    rx_int_dly (duration)=13601
    rx_pkt (duration)=13693
    Hal_EMAC_TXQ_Mode=0
    maxSG=3
    

    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  0x1200 > 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.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. 外挂phy移植

    7.1. 概述

    在客户支持过程中难免遇到需要适配新的片外phy的问题, 因此以本文来说明适配片外phy的注意点。

    在阅读本章节前,可以先查看 概述,了解下相关规格

    7.2. 硬件电路

    • 确认引脚物理连接正常。可以通过示波器量信号,该步可以找HW CAE咨询。

    • padmux确认配对。可以咨询GPIO owner或HW CAE确认padmux的正确性。

    • phy的外部晶振频率一般是25M,但具体需要根据phy手册确认。芯片这边不提供CLK。

    7.3. 适配前需要获取必要的PHY原厂支持

    7.3.1. phy驱动

    拿到一个新的phy芯片, 需要找原厂提供 配套的phy 芯片手册

    有些phy芯片还需要 配套的phy驱动。若不需要配套的phy驱动, 则使用默认的通用phy驱动即可。

    如果当前已有相关的phy驱动,也需要咨询原厂 是否需要更新对应的驱动

    若需要更新,这部分信息也需要找phy原厂支持,主要是提供: 对应的代码、更新方法、启用驱动的方法以及特殊设定配置等等。

    驱动更新后kernel跑起来后,通过命令: ls /sys/bus/mdio_bus/drivers 来确认是否有将驱动更新成功。

    ls /sys/bus/mdio_bus/drivers
    
    图7-1 show mdio bus

    如图7-1所示,可以看到匹配的是默认的驱动:SStar 10!100 Ethernet Phy。

    7.3.2. reset时序

    询问原厂, 或者翻看phy芯片手册, 找到phy reset的时序要求。

    • reset 生效时间: 即需要拉低多久。当前 EMAC 默认拉低20ms。

    • reset 恢复时间: 即需要保持拉高多久。phy芯片reset之后需要多长时间后phy芯片内部才完成内部电路初始化。当前 EMAC 默认拉高50ms。

    以RTL8211为例:

    图7-2 RTL8211_reset_time

    如图7-2中红线所划, RTL8211要求:reset生效时间至少为 10ms, reset恢复时间至少为 72ms。

    7.4. Uboot下适配介绍

    7.4.1. Uboot下的padmux配置

    • 需要将 padmux.dtsi 与 硬件电路对应起来。
    图7-3 eth hardware
    图7-4 eth0 pin mapping

    以 SSC029A-S01A-S 为例,找到 eth0 对应的pin脚,并将其映射关系写入 iford-padmux.dtsi 文件中。

    • eth0 padmux
      <PAD_I2C0_SDA            PINMUX_FOR_ETH_MODE_2           MDRV_PUSE_ETH0_MDIO>,
      <PAD_I2C0_SCL            PINMUX_FOR_ETH_MODE_2           MDRV_PUSE_ETH0_MDC>,
      <PAD_FUART_CTS           PINMUX_FOR_ETH_MODE_2           MDRV_PUSE_ETH0_COL>,
      <PAD_FUART_RX            PINMUX_FOR_ETH_MODE_2           MDRV_PUSE_ETH0_RXD0>,
      <PAD_FUART_TX            PINMUX_FOR_ETH_MODE_2           MDRV_PUSE_ETH0_RXD1>,
      <PAD_MSPI_CK             PINMUX_FOR_ETH_MODE_2           MDRV_PUSE_ETH0_TX_CLK>,
      <PAD_MSPI_DO             PINMUX_FOR_ETH_MODE_2           MDRV_PUSE_ETH0_TXD0>,
      <PAD_MSPI_DI             PINMUX_FOR_ETH_MODE_2           MDRV_PUSE_ETH0_TXD1>,
      <PAD_MSPI_CZ             PINMUX_FOR_ETH_MODE_2           MDRV_PUSE_ETH0_TX_CTL>,
      <PAD_FUART_RTS           PINMUX_FOR_GPIO_MODE            MDRV_PUSE_ETH0_PHY_RESET>,
      

    7.4.2. Uboot下的EMAC RMII配置

    • 片外phy需要 开启宏SSTAR_ETHERNET_RMII ,切换为 rmii mode。

    • EMAC0 RMII

      [*] SigmaStar drivers  --->
          [*]   SigmaStar EMAC          
          [ ]     EMAC 1      
          [ ]   EMAC supply to internel PHY
          [*]   EMAC supply to RMII
          [ ]   EMAC supply to IC+ Phy
          [ ]   EMAC fix link to mii/rmii
      
    • Need to open EMAC0 RMII padmux pin in the padmux.dtsi file

    更详细的KCONFIG配置内容可以参考Uboot CONFIG 配置说明

    7.4.3. 检查mdio通信是否正常

    如果phy连接正常,mdio可以正常读取phy信息。Uboot下使用命令 estart 初始化时会打印phy寄存器信息,且信息不为全0或全F。

    或使用 phy_r 和 phy_w 命令可以正常读取phy寄存器信息,且信息不为全0或全F。

    • Uboot使用estart命令正常初始化

      SigmaStar # estart
      phy [0]=ffff
      phy [1]=7849
      MAC Address 00:00:88:33:00:01
      Auto-Negotiation...
      Link Status Speed:100 Full-duplex:1
      (Re)start EMAC...
      
    • Uboot下使用phy_r读取phy reg

      SigmaStar # phy_r 0
      phy read address[0] value is 3100
      SigmaStar # phy_r 1
      phy read address[1] value is 786d
      
    • Uboot下使用phy_w 写 phy reg

      SigmaStar # phy_w 0 0x1000
      phy write address[0] value is 1000
      

    7.4.4. 检查网络通信是否正常

    该步骤是验证数据引脚的正确性,可以使用 ping(正常ping通) 或者 tftp(文件传输或升级正常) 验证。

    相关内容可以参考 Uboot cmd参数说明

    7.5. Kernel下适配介绍

    7.5.1. Kernel下的phy reset时间配置

    kernel下的 reset生效时间 和 reset恢复时间 也是通过Kconfig配置。

    EMAC0_PHY_RESET_HOLD_MS 和 EMAC1_PHY_RESET_HOLD_MS是reset生效时间,默认值为 20ms。

    EMAC0_PHY_RESET_WAIT_READY_MS 和 EMAC1_PHY_RESET_WAIT_READY_MS 是reset恢复时间,默认值为 50ms。

    • 配置 kernel下的 reset生效时间 和 reset恢复时间
      Device Drivers --->
          Sstar Soc platform drivers --->
              <*>   SSTAR_EMAC 
              (20)  Set emac0 phy reset padmux low in millisecond
              (50)  Set emac0 phy reset padmux high wait ready in millisecond
              (20)  Set emac1 phy reset padmux low in millisecond
              (50)  Set emac1 phy reset padmux high wait ready in millisecond
      

    7.5.2. Kernel下的dts配置

    参考Kernel DTS配置 配置dts文件。

    7.5.3. Kernel下的padmux配置

    参考Uboot下的padmux配置Kernel Padmux配置 配置padmux文件。

    7.5.4. 检查mdio通信是否正常

    kernel下会通过 emac_phy_connect 函数连接phy芯片。可以通过检查启机log,查看是否正常连接到 phy。

    以 SSC029A-S01A-S 为例,启机会进行phy connect,获取phy的uid并匹配phy驱动。一般phy的uid不为全0或全F,即可正常读取phy reg信息。

    • dmesg查看phy connect状态
      /customer # dmesg | grep emac_phy_connect
      [emac_phy_connect][3004] connected mac emac0 to PHY at mdio-bus@emac0:00 [uid=11112222, driver=SStar 10/100 Ethernet Phy]
      

    另外的,也可以通过phytool或debug节点读取phy reg,只要读取的phy reg不为全0或全F,即为正常。

    phytool的使用,可以参考phytool

    debug节点命令,可以参考phyStatusWR

    7.5.5. 检查网络通信是否正常

    kernel下可使用iperf工具,进行网络通信稳定性的检验。可以参考iperf3

    7.6. 常见的phy适配问题

    7.6.1. mdio读取异常, phy id读取信息是全F或全0

    适配过程中经常会有读不到phy reg的问题, mdc mdio都出去的信号全为FFFF或全0。

    图7-6 mdio波形图

    正常的mdio波形图如图所示,出现该问题时需要结合波形排查,建议HW CAE介入协助排查量测波形,检查电路连接。

    常见的错误有以下几点原因:

    错误原因 排查方法 解决方法
    物理连接异常 HW CAE协助量测波形,或检查电路连接 参考HW CAE意见
    GPIO配置异常 HW CAE检查padmux映射 修改padmux
    GPIO无法拉低拉高 按照gpio问题排查,可以请GPIO owner协助 按照GPIO问题解决
    phy reset异常 使用示波器量测启机时候reset引脚的波形是否符合预期 参考phy手册进行设置,debug阶段可以将 reset生效时间和恢复时间设置到1s或更大,确保reset正常

    7.6.2. 收发包速率未达预期,或存在丢包等问题

    如果速率不达预期,一般是信号质量问题或相位问题,需要由HW CAE主导排查。这里给出几点常见排查项:

    • 确认 phy/switch 提供的CLK是否是 50MHz。MAC端不提供RX_CLK。

    • 确认信号幅值或相位,如果波形异常,需要尝试参考phy手册,通过调整phy端寄存器来调整phy端的driving能力。

    • 检查 phy的外部晶振,一般是25M,但具体根据phy手册确认。如果phy没有任何响应,需要客户排查外部晶振频率是否正常供给。

    7.6.3. phy驱动注册异常

    • kernel下通过命令: ls /sys/bus/mdio_bus/drivers 来确认驱动是否更新成功。该命令会显示当前设备支持的驱动。

    • 确认mdio连接是否正常,参考 mdio读取异常,phy id读取信息是全F或全0 进行排查。

    • mdio连接正常的情况下,参考 检查mdio通信是否正常 排查获取的 phy uid是否正常。

    • phy uid若不为全0或全F,检查驱动是否匹配phy uid。若uid值与 .phy_id 不一致,则无法匹配驱动程序。

    • icpplus driver

      static struct phy_driver icplus_driver[] = {
          .phy_id         = 0x02430c54,
          .name           = "ICPlus IP101A/G",
          .phy_id_mask    = 0x0ffffff0,
          /* PHY_BASIC_FEATURES */
          .probe          = ip101a_g_probe,
          .config_intr    = ip101a_g_config_intr,
          .did_interrupt  = ip101a_g_did_interrupt,
          .ack_interrupt  = ip101a_g_ack_interrupt,
          .config_init    = &ip101a_g_config_init,
          .suspend        = genphy_suspend,
          .resume         = genphy_resume,
      };
      

    8. API参考

    EMAC无对外API

    9. FAQ

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

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

    2. 确认使用的phy的reset时序,同时需确认保持电平的时间是否符合phy要求

    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"命令查看当前是否有开启的网口。