ethernet
前言
S100芯片提供多个标准千兆/万兆以太网控制器, 支持传统的以太网报文收发, PTP/TSN 时间敏感性网络, 以及 EtherCAT 主站等特性。
S600芯片提供多个标准千兆/万兆以太网控制器, 支持传统的以太网报文收发, PTP/TSN 时间敏感性网络, 以及 EtherCAT 主站等特性。
控制器内置硬件多队列, MTL 二层传输层, DMA 引擎等。以实现上述各种场景的报文收发。 本文主要包括网卡使用指南, 开发板 Bringup, 关键特性描述等。
名词解释
| 缩略语 | 英文全名 | 中文解释 |
|---|---|---|
| PTP | Precision Time Protocol | 精确时钟协议 |
| PHC | PTP Hardware Clock | PTP 时钟 |
| TSN | Time-Sensitive Networking | 时间敏感网络 |
| CBS | Credit-Based Shaper | 基于信用的整形器机制 |
| EST | Enhancements to Scheduled Traffic | 增强型整形机制 |
| FPE | Frame Preemption | 帧抢占 |
| tc | traffic control | 流量控制 |
网卡特性介绍
| 特性 | 解释 | S100 |
|---|---|---|
| 配置 | 网口数量配置 | 双网口 |
| 接口 | mac--phy 接口 | 支持 SGMII |
| PPS | 秒脉冲, pps out/in | ✅ |
| TSO | TCP 分段卸载 | ✅ |
| 多队列 | 网卡多队列功能 | ✅ |
| AVB/TSN | 时间敏感性网络 | ✅ |
| C22/C45 | MDIO PHY 数据协议 | ✅ |
| 特性 | 解释 | S600 |
|---|---|---|
| 配置 | 网口数量配置 | 3x gmac + 3x xgmac 其中前2个 gmac 和 pcie 复用 phy |
| 接口 | mac--phy 接口 | 支持 SGMII/USXGMII |
| PPS | 秒脉冲, pps out/in | ✅ |
| TSO | TCP 分段卸载 | ✅ |
| 多队列 | 网卡多队列功能 | ✅ |
| AVB/TSN | 时间敏感性网络 | ✅ |
| C22/C45 | MDIO PHY 数据协议 | ✅ |
网络配置
U-Boot
- 配置 IP
setenv ipaddr x.x.x.x
setenv gatewayip x.x.x.x
setenv netmask x.x.x.x
- 配置 VLAN
setenv vlan xx
- 配置 MAC 地址
setenv ethaddr xx:xx:xx:xx:xx:xx //设置eth mac地址
env del -f ethaddr //删除mac地址
- 切换当前使用的 eth
setenv ethact eth0
setenv ethact eth1
# 如果U-Boot支持双网卡可以切换成功。单网卡切换无效。
Linux/Ubuntu
注意
- 建议使用 Network Management, 即 Ubuntu 桌面进行网卡配置。
- 下述手动通过 ip, ethtool 等命令配置为次选方案。可自行结合 Ubuntu 版本以及网络资料判断是否生效。
- 配置 IP
ip addr add 192.168.1.10/24 dev eth0.10 //推荐
或者
ifconfig eth0.10 192.168.1.10 netmask 255.255.255.0
- 配置 VLAN
ip link add link eth0 name eth0.10 type vlan id 10 //添加vlan id 10
ip link set eth0.10 type vlan egress 0:5 1:5 2:5 3:5 4:5 5:5 6:5 7:5 //配置vlan priority 5
软件介绍
代码位置
- U-Boot ETH 代码位置
drivers/net/hobot_super_gmac.c
drivers/net/hobot_super_xpcs.c
drivers/net/hobot_super_xgmac.c
drivers/net/hobot_s600_xpcs.c
- Kernel ETH 代码位置
hobot-drivers/ethernet/hobot/hobot_eth_super_main.c
hobot-drivers/ethernet/hobot/hobot_eth_super_mdio.c
hobot-drivers/ethernet/hobot/hobot_eth_super_ptp.c
hobot-drivers/ethernet/hobot/hobot_eth_super_tc.c
hobot-drivers/ethernet/hobot/core/...
hobot-drivers/ethernet/hobot/dma/...
网络驱动开发
U-Boot ETH 开发
硬件连接
- 参考 S100设计原理图
- 参考 S600设计原理图
设备树配置
// 配置hsis mode以及参考时钟选择, 如combo phy的复用情况, 参考时钟的来源等。
hsis0: hsis0 {
status = "okay";
compatible = "hobot,super-hsis";
hsi-mode = <4>; /* 4:pcie x2 + gmac0/1; 8:pcie0 x1 + pcie1 x1 + GMAC0/1; */
refclk-mode = <0>; /* 0:internal ref clock; 1:external ref clock; */
#address-cells = <2>;
#size-cells = <2>;
ranges;
/*hsis reg, XPCS0, XPCS1, ETH phy, PCIE phy*/
reg = <0x0 0x33000000 0x0 0x10000>,
<0x0 0x33200000 0x0 0x80000>,
<0x0 0x33280000 0x0 0x80000>,
<0x0 0x330e0000 0x0 0x10000>,
<0x0 0x330d0000 0x0 0x10000>;
};
// 配置hsis mode以及参考时钟选择, 如combo phy的复用情况, 参考时钟的来源, 以及phy眼图信号相关参数。
hsis0: hsis0 {
status = "okay";
compatible = "hobot,super-hsis";
hsi-mode = <4>;
refclk-mode = <0>;/* 0:internal; 1:external; */
xpcs-speed = <0 0 0 5000 10000 10000>; /*gmac0, gmac1, gmac2, xgmac0, xgmac1, xgmac2*/
hobot-txeq = <0 0 0 1 2 4>; /* gmac0/1/2 xgmac0/1/2 tx equalization control*/
hobot-vboost = <5 5 5 5 5 5>; /*gmac0/1/2 xgmac0/1/2*/
#address-cells = <2>;
#size-cells = <2>;
ranges;
/*hsis reg, XPCS0, XPCS1, ETH phy, PCIE phy, XPCS2, XPCS3,XPCS4, XPCS5*/
reg = <0x0 0x33000000 0x0 0x10000>,
<0x0 0x33200000 0x0 0x80000>,
<0x0 0x33280000 0x0 0x80000>,
<0x0 0x330e0000 0x0 0x10000>,
<0x0 0x330d0000 0x0 0x10000>,
<0x0 0x33300000 0x0 0x80000>,
<0x0 0x33380000 0x0 0x80000>,
<0x0 0x33400000 0x0 0x80000>,
<0x0 0x33480000 0x0 0x80000>;
};
- xpcs-speed: 根据不同的 speed 设置 xpcs。
- hobot-txeq: 设置不同档位的眼图参数,取值范围[0, 10],默认是4档,sgmii 不需要调整。
- hobot-vboost: 眼图幅值系数,0不使能。
mdio phy 配置
- phy 连接情况参考原理图和硬件说明
- 软件主要需要关注其中的 reset 管脚以及 phy addr 地址
// drobot-s100-soc.dtsi, 芯片默认的eth配置; 可以被具体board的dts覆盖
eth0: eth0 {
status = "disabled";
compatible = "hobot,super-gmac";
/*MAC, XPCS, ETH PHY, PCIE PHY, hsis reg*/
reg = <0x0 0x330f0000 0x0 0x10000>,
<0x0 0x33200000 0x0 0x80000>;
phy-handle = <&phy1>;
phy-mode = "sgmii";
managed = "in-band-status";
pinctrl-names = "default";
pinctrl-0 = <&peri_emac>;
#address-cells = <1>;
#size-cells = <0>;
};
// drobot-s100-rdk.dts, 根据实际板子情况, 配置属性。 主要phy节点, reset管脚, phy addr等。
// 以及mdio pinmux, function配置等。
ð0 {
status = "okay";
hobot,managed = "sgmii-autoneg";
phy-handle = <&phy0>;
phy-reset-gpios = <&hsi_port0 10 0>;
#address-cells = <1>;
#size-cells = <0>;
phy0: phy@0 {
compatible = "ethernet-phy-ieee802.3-c22";
reg = <0xe>;
};
};
// hobot-s600-soc.dtsi, 芯片默认的eth配置。可以被具体board的dts覆盖
eth2: gmac2 {
status = "disabled";
compatible = "hobot,super-gmac";
/*MAC, XPCS*/
reg = <0x0 0x33110000 0x0 0x10000>,
<0x0 0x33380000 0x0 0x80000>;
phy-mode = "sgmii";
#address-cells = <1>;
#size-cells = <0>;
fixed-link {
speed = <1000>;
full-duplex;
};
};
// drobot-s600-rdk.dts, 根据实际板子情况, 配置属性。 主要phy节点, reset管脚, phy addr等。
// 以及mdio pinmux, function配置等。
ð2 {
status = "okay";
hobot,managed = "sgmii-autoneg";
phy-handle = <&phy2>;
pinctrl-names = "default";
pinctrl-0 = <&hsi_emac_mdc_hsi2_emac_mdc_hsi2 &hsi_emac_mdio_hsi2_emac_mdio_hsi2>;
phy2: phy@2 {
#address-cells = <1>;
#size-cells = <0>;
reset-gpios = <&gpio_exp_24 8 GPIO_ACTIVE_LOW>;
reset-delay-us = <10000>;
reset-post-delay-us = <150000>;
compatible = "ethernet-phy-ieee802.3-c22";
reg = <0x2>;
};
};
MAC2MAC
- 在 MAC TO MAC 直连情况下, 需要配置为 fixed-link
- 例如
// eth0默认节点配置可参考drobot-s100-soc.dts
// 实际板级配置可在对应dts中描述, 例如可参考drobot-s100-rdk.dts。
// MAC2MAC场景, 主要就是配置成fixed-link模式。即固定好速率, 双工模式等。
ð0 {
status = "okay";
fixed-link {
speed = <1000>;
full-duplex;
};
};
// S600开发板也类 似, 在板级dts中重写成fixed-link模式即可。
ð3 {
status = "okay";
fixed-link {
speed = <10000>;
full-duplex;
};
};
U-Boot 下命令介绍
- mii: phy 读写命令(C22协议) 执行网络命令(如 ping)后初始化网络接口,否则 mdio 命令会执行异常。
mii info <addr> //display MII phy info
mii read <addr> <reg> //read MII phy <addr> register <reg>
- mdio: phy 读写命令(C45)
mdio list //List MDIO buses
mdio read <phydev> [<devad>.]<reg> //read phy register at <devad>.<reg>
- md: 查看统计计数 通过 md 命令读写寄存器查看报文统计计数用于调试。
md[.b, .w, .l, .q] address
Linux ETH 开发
- 驱动代码在 hobot-drivers/ethernet 目录, 可参考软件介绍的描述。
- 控制器驱动部分大部分不需要进行修改, 主要任务还是结合开发板硬件, 配置相关设备树。