基于嵌入式Linux的千兆以太网卡驱动程序设计及测试
一. 引言
千兆以太网是一种具有高带宽和高响应的新网络技术,相关协议遵循IEEE
千兆以太网网卡工作在OSI网络架构的物理层和数据链路层,其中物理层由PHY芯片管理,数据链路层由千兆以太网控制器(GMAC)管理。硬件构架上,GMAC控制器由核心层、MTL(MAC
千兆以太网卡的数据传输任务由DMA完成,DMA传输操作通过预先在内存中建立描述符的方式完成。描述符的作用是指定MAC帧数据所在的缓存地址,每个描述符可以最多指定两个缓存地址,缓存大小有严格控制,一个描述符不能指定全部一个帧的缓存数据,需要多个描述符构成描述符链来完成。
有两种描述符链结构:环状描述符和链状描述符。链状描述符中的第二个buffer指定了下一个描述符所在的物理地址,而第一个buffer指定帧数据缓存的位置,环状结构描述符的位置是有序排放的,两个buffer都指向帧数据的缓存地址,最后一个描述符指向第一个描述符所在物理地址形成桶状描述符链。环状和链状结构如图1-2所示,一个描述符链只能用来存储一个MAC帧的数据,DMA每个通道一次最多完成两个MAC帧的传输,多MAC帧的传输需要重新使能DMA通道。
OWN位控制描述符是由DMA控制还是由host端控制,后面31位是描述符状态信息,DES1为控制描述符并标明两个buffer大小,DES2和DES3描述两个buffer所在地址。
二. 千兆以太网卡驱动程序设计
GMAC驱动程序需要完成的内容有:PHY芯片初始化,GMAC初始化,GMAC读/写数据,GMAC数据流控制和各种模式设置。
GMAC初始化过程首先检查PHY芯片工作是否正常并配置PHY芯片模式,创建发送和接收描述符,初始化DMA,然后配置MAC工作模式,使能DMA后进入工作状态。
初始化完成后,数据等待发送或接收,DMA根据描述符状态自动完成数据发送或接收的任务。buffer中的帧结构不包含preamble
初始化后,第一次帧传输不需要等待中断,DMA自动完成发送接收任务,当有多次帧传输时,DMA在完成一次发送接收任务后会给CPU发送中断,CPU响应中断处理下一次读写任务。如果读写过程中发生帧错误等导致操作未完成,则会产生相应异常中断直到CPU清除中断位标志,此时GMAC停止工作。
驱动程序设计完成寄存器到功能函数的转换,给上层操作系统提供应用接口,Linux嵌入式操作系统有一套标准的接口规范,根据该规范设计驱动需要预先定义两种重要的结构体:
描述符程序结构体设计:
{
}
typedef
{
}GMACdevice;
三. 测试实现
测试程序对GMAC进行了相应的黑盒测试和压力测试,黑盒测试用来测试GMAC千兆网卡的各个模块输入相应信号是否得到正确的输出信号,压力测试用来测试网卡的系统稳定性。
测试程序通过GMAC的LoopBack模式将数据写入内存并让GMAC发送,再从接收描述符指定的内存中读出,判断写入写出数据是否一致,完成数据读写测试。对于功能点测试,主要测试的GMAC功能有:PHY芯片自协商完成验证,GMAC
一次读写测试完成后,测试程序改变GMAC模式和状态,再进行一次数据读写测试,同时加大数据量和功能点以完成压力测试,再次判断写入写出数据是否一致。不断循环进行直到测试程序测试结束,测试过程要完成判定覆盖和条件覆盖的100%代码覆盖率,需要不断改变输入信号和功能以满足测试意图,使用LoopBack模式的测试信号发送和接收结果如图所示:
PHY和MAC使用GMII接口连接,全双工模式下发送的同时进行接收操作,实验结果发现在帧传输速度提升到1.3GMbps时,有明显的丢帧现象,MAC层的帧数据FIFO原数据被冲刷,丢帧现象明显。在使能中断的情况下,发生丢帧后会立刻进入异常中断,DMA停止工作等待CPU响应中断。
四. 结束语
该驱动程序已经在Linux嵌入式系统下调试通过,所有代码下Linux嵌入式系统下移植完成,驱动程序在MaPU定制指令SOC系统上调试通过,使用该驱动完成后续上层软件开发。验证平台基于ARM