从Xilinx到复旦微:PL网口驱动移植实战(以2018.3内核AXI Ethernet为例)
从Xilinx到复旦微:PL网口驱动移植实战(以2018.3内核AXI Ethernet为例)
在国产化替代浪潮中,将成熟生态的驱动迁移到国产平台成为许多工程师的必修课。今天我们要探讨的是如何将Xilinx 2018.3内核中的AXI Ethernet驱动完整移植到复旦微电子Zynq平台。这不是简单的代码拷贝粘贴,而是一场涉及内核架构适配、编译系统改造和设备树调试的系统工程。
1. 驱动移植前的准备工作
1.1 源码获取与版本比对
首先需要明确的是,Xilinx 2018.3内核基于Linux 4.14.0,而复旦微的BSP可能基于不同的小版本。建议先通过以下命令查看内核版本差异:
# 查看Xilinx内核版本 cat /path/to/xilinx-kernel/Makefile | grep VERSION cat /path/to/xilinx-kernel/Makefile | grep PATCHLEVEL cat /path/to/xilinx-kernel/Makefile | grep SUBLEVEL # 查看复旦微内核版本 cat /path/to/fmsh-kernel/Makefile | grep VERSION cat /path/to/fmsh-kernel/Makefile | grep PATCHLEVEL cat /path/to/fmsh-kernel/Makefile | grep SUBLEVEL关键文件差异对比表:
| 文件路径 | Xilinx 2018.3 | 复旦微BSP | 备注 |
|---|---|---|---|
| drivers/net/ethernet/xilinx/ | 完整驱动集 | 可能缺失 | 核心移植目标 |
| include/linux/xilinx_phy.h | 存在 | 可能缺失 | 需要同步移植 |
| arch/arm/configs/ | Xilinx配置 | 复旦微配置 | 需合并关键选项 |
1.2 工作目录建立
建议采用以下目录结构管理移植过程:
~/driver_porting/ ├── xilinx_src/ # Xilinx原始代码 ├── fmsh_src/ # 复旦微原始代码 ├── porting/ # 移植工作区 └── patches/ # 补丁文件提示:在开始前,务必对复旦微的原始代码进行完整备份,可以使用git建立版本控制。
2. 驱动代码迁移与适配
2.1 核心文件移植
从Xilinx 2018.3内核中需要移植的关键文件包括:
drivers/net/ethernet/xilinx/整个目录include/linux/xilinx_phy.h头文件Documentation/devicetree/bindings/net/xilinx_axienet.txt设备树绑定文档
实际操作命令示例:
# 复制Xilinx驱动代码 cp -r /path/to/xilinx-kernel/drivers/net/ethernet/xilinx /path/to/fmsh-kernel/drivers/net/ethernet/ # 复制头文件 cp /path/to/xilinx-kernel/include/linux/xilinx_phy.h /path/to/fmsh-kernel/include/linux/2.2 Kconfig与Makefile适配
复旦微内核可能缺少必要的配置选项。需要修改以下文件:
drivers/net/ethernet/Kconfig- 添加ARCH_FMSH支持drivers/net/ethernet/Makefile- 确保编译链正确
典型修改示例:
# 在Kconfig中的修改 -config XILINX_AXI_EMAC - depends on ARCH_ZYNQ || MICROBLAZE +config XILINX_AXI_EMAC + depends on ARCH_ZYNQ || MICROBLAZE || ARCH_FMSH select PHYLIB select XILINX_AXI_EMAC_HWTSTAMP注意:不同版本的复旦微BSP可能有不同的架构定义,需要根据实际情况调整。
3. 编译系统与设备树调整
3.1 内核配置与编译
完成代码移植后,需要通过menuconfig启用驱动:
make menuconfig导航路径:
Device Drivers → Network device support → Ethernet driver support → Xilinx devices → <*> Xilinx AXI Ethernet support <*> Xilinx AXI Ethernet 1588 support常见编译问题及解决方案:
- 头文件缺失:检查include路径,确保所有移植的头文件到位
- 符号未定义:可能需要补全某些架构特定函数实现
- 类型不匹配:不同内核版本间的API变化可能导致此问题
3.2 设备树配置
正确的设备树配置是驱动工作的关键。以下是一个典型的AXI Ethernet设备树节点示例:
axi_ethernet_0: ethernet@40000000 { compatible = "xlnx,axi-ethernet-1.00.a"; reg = <0x40000000 0x40000>; interrupts = <0 29 4>, <0 30 4>; interrupt-parent = <&intc>; phy-mode = "gmii"; xlnx,phy-type = <0x4>; xlnx,txcsum = <0x2>; xlnx,rxcsum = <0x2>; axi_ethernet_0_mdio: mdio { #address-cells = <1>; #size-cells = <0>; phy0: phy@1 { reg = <1>; device_type = "ethernet-phy"; }; }; };关键参数说明表:
| 参数 | 值示例 | 说明 |
|---|---|---|
| phy-mode | "gmii" | 必须与硬件设计一致 |
| xlnx,phy-type | 0x4 | 0x4表示SGMII,0x5表示1000BASEx |
| interrupts | <0 29 4> | 中断号需与硬件设计匹配 |
| reg | <1> | PHY地址,需根据硬件调整 |
4. 调试与性能优化
4.1 常见问题排查
移植后可能遇到以下典型问题:
网口无法识别:
- 检查PHY地址是否正确
- 验证MDIO总线是否正常工作
- 确认时钟和复位信号
连接不稳定:
- 检查DDR时钟设置
- 验证PCB布线质量
- 调整PHY寄存器配置
性能低下:
- 优化DMA缓冲区大小
- 检查中断处理延迟
- 调整TCP/IP栈参数
4.2 性能调优技巧
通过以下命令可以监控和优化网络性能:
# 查看网络统计信息 ethtool -S eth0 # 调整RX/TX队列长度 ethtool -G eth0 rx 4096 tx 4096 # 启用TSO/GSO等加速功能 ethtool -K eth0 tso on gso on gro on关键性能参数调整建议:
- DMA缓冲区大小:根据实际内存情况调整,通常设置为2048或4096
- 中断合并:适当设置中断合并阈值可以减少CPU负载
- 流量控制:在高负载场景下考虑启用流控
在实际项目中,我们发现复旦微平台对DDR时钟特别敏感。有一次在调试千兆网口时,将DDR时钟从533MHz降到300MHz后,网络稳定性显著提升,而吞吐量仍能维持在900Mbps以上。
