本篇主要用于解决客户基于J5芯片的ETH开发相关问题,指导客户如何修改Uboot、Kernel代码调试、适配外部PHY芯片,并提供ETH开发过程中的常见问题索引及相关解决方法。
地平线J5芯片支持双千兆网口,支持RGMII/MII/GMII,详细硬件说明如下:
双网卡ETH0:0×59110000,ETH1:0×59120000
支持RGMII.MII.ETH0还支持GMII
ETH0支持唤醒系统,以及提供PPS给其他模块(LPWM)使用
支持TSO功能
支持PTP同步
ETH0支持PPS out/extern PPS in
支持多队列功能
支持AVB/TSN
支持C22及C45协议PHY
驱动适配
Uboot ETH开发--Phy配置
根据原理图确定复位的GPIO及PHY的mdio地址(hobot-j5-dvb.dtsi、hobot-j5-pinctrl.dtsi)。
如下图所示:


Uboot ETH开发--PinCtrl配置

其中:
名称 | 定义 |
|---|---|
function | pin脚的功能选择 |
low-power-enable/ low-power-disable | PAD电压选择,使能后工作电压为1.8V,与其对应的low-power-disable代表该组引脚配置为3.3V |
drive-strength | 驱动能力,单位mA,当信号有衰减时可以增加信号驱动能力。代表的为该组引脚的驱动能力调整为等级1 |
1. J5与PHY/Switch的电压配置要匹配上
2. 驱动能力配置修改后需要有高低温兼容性测试
Uboot ETH开发--Fix-link配置

其中:
名称 | 定义 |
|---|---|
speed = <1000> | 表示工作在千兆模式下 |
full-duplex | 表示工作状态为全双工模式 |
J5不支持tx_clk、rx_clk的delay功能,需要phy或switch支持clk delay配置
Kernel ETH开发--代码路径
代码路径 | 文件说明 |
|---|---|
drivers/net/ethernet/hobot/hobot_eth_jplus.c | Ethernet驱动代码 |
drivers/net/ethernet/hobot/hobot_eth_jplus.h | Ethernet驱动头文件,包含驱动结构体定义 |
drivers/net/ethernet/hobot/hobot_reg.h | Ethernet驱动头文件,包含驱动寄存器宏定义等 |
drivers/net/ethernet/hobot/hobot_eth_jplus_tc.c | Ethernet中关于TSN相关配置的文件 |
drivers/net/ethernet/hobot/hobot_eth_mmc.c | Ethernet中获取mmc计数相关配置的文件 |
drivers/net/ethernet/hobot/hobot_eth_mmc.h | Ethernet驱动头文件,包含mmc寄存器宏定义等 |
Kernel ETH开发--DTS配置
PINCTRL配置:参见Uboot章节说明
PHY复位:当前kernel流程未做Phy复位操作uboot下做一次即可。若有启动时间优化、可以将PHY复位挪到Kemel里配置
PHY其它配置:CLK delay、C22/C45协议、fx-link等
TSO功能开关:注释掉snps.tso关闭TSO功能。TSO开启后,GSO(Generic Segmentation Offload)会自动开启
Queue CBS配置
实现方法
基于kernel的platform driver模型,实现网络节点、phy的注册,实现了net_device_ops、ethtool_ops等接口以及资源分配等功能。
- net device operations
网络设备接口包含网口节点的打开、关闭、发送(tso)功能,以及tsn的配置功能。
static const struct net_device_ops netdev_ops = {
.ndo_open = eth_netdev_open,
.ndo_stop = eth_netdev_stop,
.ndo_start_xmit = eth_netdev_do_start_xmit,
.ndo_do_ioctl = eth_netdev_do_ioctl,
.ndo_setup_tc = eth_netdev_setup_tc,
.ndo_set_rx_mode = eth_netdev_set_rx_mode,
.ndo_set_mac_address = eth_mac_addr,
.ndo_select_queue = eth_netdev_tsn_select_queue,
};序号
操作符
功能
1
eth_netdev_tsn_select_queue
用于选择不同的queue从而选择不同的优先级及带宽
2
eth_netdev_do_ioctl
包含phy设置、ptp初始化以及tsn设置(cbs、est、fp)等功能
3
eth_netdev_open
初始化phy\mac\DMA及申请中断
4
eth_netdev_stop
关闭网口释放资源
5
eth_netdev_do_start_xmit
sk_buff发送
- ethtool operations
ethtool包含通用eth工具操作接口,读取eth连接状态,统计计数、打开唤醒功能等。
static const struct ethtool_ops ethtool_ops = {
.get_drvinfo = ethtool_get_drv_info,
.get_link = ethtool_op_get_link,
.get_link_ksettings = ethtool_get_link_ksettings,
.set_link_ksettings = ethtool_set_link_ksettings,
.get_strings = get_strings,
.get_sset_count = ethtool_get_sset_count,
.get_ethtool_stats = get_ethtool_stats,
.get_regs_len = ethtool_get_regs_len,
.get_regs = ethtool_get_regs,
.get_ts_info = ethtool_get_ts_info,
.get_wol = ethtool_get_wol,
.set_wol = ethtool_set_wol,
};序号
操作符
功能
1
ethtool_get_sset_count
获取网卡统计计数
2
ethtool_get_regs
获取寄存器值
3
ethtool_get_ts_info
获取PHC能力信息
4
ethtool_set_wol
设置网卡唤醒功能
ptp_clock_info
序号
操作符
功能
1
eth_ptp_adjust_freq
调整PHC频率
2
eth_ptp_adjust_time
根据delta值调整PHC时间
3
eth_ptp_get_time
获取PHC绝对时间
4
eth_ptp_set_time
设置PHC绝对时间
5
eth_ptp_enable
设置PPS输出及外部trigger网卡。pps0/pp1输出保留用于RTC时间同步extern pps0-rtc; extern pps1-gps; extern pps2-lidar; extern pps3-ap;
调试方法
Uboot环境变量配置
环境变量
配置方法
MAC地址
setenv eth1addr 64:00 F1:44:55:66 //eth1 mac;
setenv ethaddr 64:00:F1:11:22:33 //eth0 macIP地址
setenv ipaddr 10.106.35.50 //本机IP;
setenv gatewayip 10.106.321 //网关IP;
setenv netmask 255.255. 255.0 //掩码;
setenv serverip 10.106.34.76 //服务器IP其他
setenv ethact ethernet@59120000 //默认使用网口;
setenv tftpboot_cmd XXX //网络启动Uboot调试命令
Phy读写命令:mii/mdio
J5寄存器读写命令:md/mw
Kernel调试常用工具
名称
功能
示例
phytool
Phy读写命令
ethtool
查看统计计数,设置PHY等
ethtool –S eth1 --查看统计计数。
note: irq_rgmii_n -- Link中断统计可以用于判断网络稳定性vconfig
配置vlan,也可以用ip配置
vconfig add eth0 3 或ip link add link eth0 name eth0.3 type vlan id 3
iperf3
带宽测试
server: iperf3 –s
client tcp: iperf3 –c serverip –t 60
client udp: iperf3 –c serverip –u –b 1G –l 32K –t 60tcpdump
抓包
tcpdump –i eth1 –e --过滤报文并输出到终端
tcpdump –i eth1 –w eth1.pcap -- 过滤报文保存到文档,可以用winshark分析
开发常见问题
序号 | 问题 | 调试方向 |
|---|---|---|
1 | 复位失败 | switch或phy未提供接收时钟给J5,检查phy/switch软/硬件配置 |
2 | MAC2MAC Ping不通 | 1. J5与Switch电压不匹配,调整J5与Switch电压 2. 未收到数据,配置Switch的TX/RX clk delay 3. 信号质量问题,修改J5/Switch的驱动能力 |
3 | PHY link不上 | 1. 使用mdio/mii/phytool命令能否正常读写phy寄存器 2. 检查PHY时钟、phy 复位、PHY供电等 3. 检查变压器等 |
4 | 发送失败 | 1. 检查phy link是否UP 2. 检查工作模式(速率,双工等) 3. 确认transmit接口是否被调用 4. 确认发送统计计数 5. 对端查看是否错包等 6. 使用环回定位故障点 |
5 | 接收失败 | 1. 测量phy tx时钟 2. mac环回,若正常收包。可判定phy tx时钟 与 MAC rx接收配合问题 3. 查看是否有错包,如果有ECC错包可推断是信号质量问题 |
6 | 千兆不通,百兆通 | 1. 检查TX/RX时钟是否为125M 2. 检查phy/switch寄存器clk是否加了clk delay 3. 检查AC_HW_Feature0(0x11c). ACTPHYSEL phy接口是否为期望的rgmii |
7 | 大量错包 | 1. 检查clk是否符合要求 2. 条件允许的话,测下信号的眼图 3. 降速测试(100M或10M) |
8 | Kernel环境如何读取PHY | 1. C22协议(EVM ETH1): /app/scripts/phytool read eth1/0xe/1 /app/scripts/phytool write eth1/0xe/0 0xff 2. C45协议(EVM ETH0): /app/scripts/phytool read eth0/0x7:1/2 /app/scripts/phytool write eth0/0x7:1/0 0xff Note:有多次读写PHY命令时可能会与Kernel定时读取PHY冲突,可以一次粘贴多条命令来执行,减少相互影响 |
9 | MAC内环回 | 可以验证mac是否正常。包括mac时钟,pin配置,mac数据收发等。设置MAC:speed、全双工,loopback使能位 |
10 | PHY内环 | 可以验证MAC与PHY接口是否匹配。以MV88EA1512举例:通过phytool 设置phy 0_0.14=1 |
11 | PHY外环 | 用于验证phy与变压器及对端的连接问题。以MV88EA1512举例:通过phytool设置21_2.14=1 |
12 | IP/MAC如何保存不丢失 | 1. hrut_ipfull s <eth0/eth1> IP(x.x.x.x) MASK(y.y.y.y) GATEWAY(z.z.z.z) 2. hrut_ipfull c <eth0/eth1> Note: 如果命令执行失败,请确认软件版本是否太旧。如果不设置IP,默认不UP端口 |
13 | MAC设置 | 1. hrut_mac s <eth0 / eth1> XX:XX:XX:XX:XX:XX //保存MAC地址到EMMC中,下次启动生效 2. hrut_machrut_mac c <eth0 / eth1> //清除后下次启动会再次随机生成并保存在EMMC中 3. 系统软件版本第一次启动会生成一个随机MAC地址并固定下来。 Note:老版本如果不使用hrup_ipfull设置 IP,MAC不生效。新版本已修复 |
14 | IP/MAC的设置逻辑 | 基于/usr/bin/defaultip.sh实现,可以修改重新烧写生效 |
