LAN8670 是 Microchip 推出的 10BASE-T1S 以太网 PHY,符合 IEEE 802.3cg 标准,支持多点总线拓扑。要在 Linux 上启用 10BASE-T1S,需要正确配置 设备树(Device Tree)、驱动程序,并使用工具验证通信。
1. 了解 10BASE-T1S (IEEE 802.3cg) 规范
10BASE-T1S 是 IEEE 802.3cg 规范的一部分,专为 工业自动化、汽车、物联网 设计,主要特点:
单对非屏蔽双绞线(Single-Pair Ethernet, SPE) 传输 10 Mbps
支持总线拓扑,多个设备可共享 MDIO 总线
PLCA(PHY-Level Collision Avoidance) 机制,确保低时延和高可靠性
最大 25 米传输距离(取决于线缆质量)
2. 确保 Linux 支持 10BASE-T1S
首先,检查 Linux 内核是否已启用 LAN8670 及 10BASE-T1S 相关功能:
bash
复制
编辑
zgrep LAN867X /proc/config.gz
如果输出:
ini
复制
编辑
CONFIG_MICROCHIP_LAN867X_PHY=y
说明 LAN8670 PHY 驱动已启用,否则需要重新编译内核。
如果未启用,可以手动打开以下选项并重新编译内核:
bash
复制
编辑
Device Drivers --->
Network device support --->
PHY Device support and infrastructure --->
Microchip LAN867x PHY support
3. 配置 Linux 设备树 (Device Tree)
为了在 Linux 上启用 10BASE-T1S,需要在 设备树(DTS) 中定义 LAN8670 PHY 及其 PLCA 配置。
3.1 配置 MDIO 设备
dts
复制
编辑
&mdio {
status = "okay"; // 确保 MDIO 启用
lan8670_0: ethernet-phy@0 {
compatible = "microchip,lan8670";
reg = <0x0>; // MDIO 设备地址 0
ethernet-phy-id = <0x1fc0 0x8670>; // LAN8670 的 PHY ID
// 10BASE-T1S 配置
plca-enable = <1>; // 启用 PLCA
plca-local-id = <0>; // 设备 ID(0-7)
plca-node-count = <3>; // 总线上设备数量
};
lan8670_1: ethernet-phy@1 {
compatible = "microchip,lan8670";
reg = <0x1>; // MDIO 设备地址 1
ethernet-phy-id = <0x1fc0 0x8670>;
plca-enable = <1>;
plca-local-id = <1>;
plca-node-count = <3>;
};
};
解释:
compatible = "microchip,lan8670" 指定设备兼容 LAN8670 PHY。
plca-enable = <1> 开启 PLCA 机制,提高 10BASE-T1S 总线效率。
plca-local-id = <0> / <1> 指定设备在 PLCA 网络中的 ID(通常 0 是协调设备)。
plca-node-count = <3> 表示总线上 3 个设备(根据网络拓扑调整)。
4. 重新编译并应用设备树
编译新的 DTB(设备树二进制):
bash
复制
编辑
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- dtbs
然后将新的 dtb 文件 复制到 /boot 目录,例如:
bash
复制
编辑
cp arch/arm64/boot/dts/<your_board>.dtb /boot/
重启设备:
bash
复制
编辑
reboot
5. 验证 10BASE-T1S 配置
5.1 检查 LAN8670 是否正确加载
bash
复制
编辑
dmesg | grep -i lan8670
如果设备正常工作,应该看到:
less
复制
编辑
[ 2.123456] mdio_bus: LAN8670 PHY found at address 0
[ 2.234567] mdio_bus: LAN8670 PHY found at address 1
[ 2.345678] LAN8670 PHY initialized with PLCA enabled
5.2 使用 ethtool 查看 10BASE-T1S 配置
bash
复制
编辑
ethtool eth0
应该显示:
vbnet
复制
编辑
Supported link modes: 10base-T1S/Full
Speed: 10Mb/s
Duplex: Full
Auto-negotiation: on
PLCA: enabled
5.3 读取 PLCA 状态
bash
复制
编辑
mdio-tool read 0 0x1F
应返回:
复制
编辑
0x0203
其中:
0x02 表示 PLCA 已启用
0x03 表示 总线上有 3 个设备
6. 进行 10BASE-T1S 通信测试
6.1 使用 ping 测试
如果多个 EVB-LAN8670-USB 设备连接在同一 10BASE-T1S 总线,可以使用 ping 进行基本连通性测试:
bash
复制
编辑
ping 192.168.1.2
如果设备正确连接,应该返回:
python
复制
编辑
64 bytes from 192.168.1.2: icmp_seq=1 ttl=64 time=0.3 ms
6.2 监测网络流量
bash
复制
编辑
tcpdump -i eth0
可以实时查看 10BASE-T1S 设备的数据包。
6.3 使用 iperf 测试吞吐量
在 LAN8670 设备 1(服务器)上运行:
bash
复制
编辑
iperf -s
在 LAN8670 设备 2(客户端)上运行:
bash
复制
编辑
iperf -c 192.168.1.2 -u -b 10M
应该显示:
matlab
复制
编辑
[ 4] 0.0-10.0 sec 10.0 MBytes 8.3 Mbits/sec
表示 10BASE-T1S 工作正常。
7. 可能的故障排查
问题 可能原因 解决方案
dmesg 无 LAN8670 相关日志 设备未连接 重新插拔设备,检查 USB 连接
ethtool eth0 无 10base-T1S 设备未正确识别 确保 Device Tree 已正确配置
mdio-tool read 返回 0xFFFF MDIO 设备未响应 确保 PLCA 配置正确,检查设备地址
ping 不通 设备未分配 IP 使用 ifconfig eth0 192.168.1.1 up 设定 IP
总结
启用内核支持 LAN8670 及 10BASE-T1S(CONFIG_MICROCHIP_LAN867X_PHY=y)。
在设备树中正确配置 LAN8670 及 PLCA 参数。
编译并加载设备树,确保 dmesg 识别 LAN8670 设备。
使用 ethtool 和 mdio-tool 验证 10BASE-T1S 工作状态。
使用 ping 和 iperf 进行实际网络测试。
这样就能在 Linux 上成功启用 IEEE 802.3cg 10BASE-T1S 并进行数据通信。
|