嵌入式Linux网络驱动
网络驱动是Linux的驱动三巨头之一。Linux下的网络功能非常强大,嵌入式Linux中也常常用到网络功能。
一、两种主流硬件方案对比
1. 无MAC芯片的SOC(外置一体方案)
- 代表芯片:DM9000(MAC+PHY二合一)、W5500(带硬件协议栈)
- 特点:通过SRAM/SPI接口通信,适合老旧平台,但效率低(最高100Mbps)
- 典型应用:三星2440/210开发板
2. 自带MAC芯片的SOC(分离phy方案)
- 连接方式:内部MAC → MII/RMII数据线 + MDIO控制线 → PHY芯片(如LAN8720)
- 优势:支持千兆网速,专用DMA加速,成本更低
- 现代主流:STM32H7/I.MX6ULL/RK3399等
二、驱动开发关键步骤(以自带MAC为例)
1. 设备树配置
```dts
ethernet@0 {
compatible = "fsl,imx6ul-fec";
phy-mode = "rmii"; // 接口模式
phy-handle = <ðphy0>; // PHY设备句柄
};
phy@0 {
compatible = "microchip,lan8720";
reg = <0>; // PHY地址
};
```
2. 核心代码结构
- 初始化:`alloc_etherdev()`创建网卡设备
- 收发函数:`ndo_start_xmit()`处理发包,中断回调处理收包
- PHY操作:通过MDIO总线读写寄存器(如自协商、速度设置)
三、调试必备命令
```bash
# 查看网卡状态
ip link show eth0
ethtool eth0 # 检查速率/双工模式
# 抓包验证
tcpdump -i eth0 host 192.168.1.100
# 驱动日志
dmesg | grep fec
```
四、常见问题解决
1. 无法获取IP? → 检查PHY时钟信号(RMII需50MHz晶振)
2. 频繁丢包? → 增大RX/TX环形缓冲区,启用NAPI中断聚合
3. 百兆变十兆? → 确认双工模式(全双工/半双工)
五、学习建议
- 先用虚拟网卡(tun/tap)练手数据包流程
- 掌握sk_buff结构体生命周期管理
- 进阶学习:DMA映射、流量控制、驱动休眠唤醒机制
实际案例:正点原子I.MX6ULL开发板
- 硬件:SoC内置FEC MAC + 外置LAN8720 PHY
- 调试技巧:用示波器测量MDIO波形,确保时序符合IEEE 802.3标准