当前位置: 首页 > news >正文

基于嵌入式Linux的千兆以太网卡驱动程序设计及测试

基于嵌入式Linux的千兆以太网卡驱动程序设计及测试

一. 引言

千兆以太网是一种具有高带宽和高响应的新网络技术,相关协议遵循IEEE 802.3规范标准。采用和10M以太网相似的帧格式、网络协议和布线系统,基于光纤和短距离同轴电缆的物理层介质,更适用于交换机、服务器等数据吞吐率大的设备。本文设计实现一种基于嵌入式Linux千兆以太网卡的驱动程序,并完成后续的测试工作和代码移植。

千兆以太网网卡工作在OSI网络架构的物理层和数据链路层,其中物理层由PHY芯片管理,数据链路层由千兆以太网控制器(GMAC)管理。硬件构架上,GMAC控制器由核心层、MTL(MAC Transaction Layer)层、DMA层和总线接口层构成,如下图1-1所示。核心层连接PHY芯片,管理和PHY芯片之间的通信;MTL层建立物理层和内存之间的数据通道,调整帧传输结构,控制数据流,转换时钟域;DMA层完成数据的传输任务。GMAC配置寄存器CSR(Control and Status register)通过系统总线和CPU交互,CPU通过总线slave端配置DMA MAC区的CSR,其中MAC区的CSR可以设置PHY的芯片寄存器,通过对CSR的设置可以控制网卡切换工作状态。

基于嵌入式Linux的千兆以太网卡驱动程序设计及测试
 

千兆以太网卡的数据传输任务由DMA完成,DMA传输操作通过预先在内存中建立描述符的方式完成。描述符的作用是指定MAC帧数据所在的缓存地址,每个描述符可以最多指定两个缓存地址,缓存大小有严格控制,一个描述符不能指定全部一个帧的缓存数据,需要多个描述符构成描述符链来完成。

基于嵌入式Linux的千兆以太网卡驱动程序设计及测试

有两种描述符链结构:环状描述符和链状描述符。链状描述符中的第二个buffer指定了下一个描述符所在的物理地址,而第一个buffer指定帧数据缓存的位置,环状结构描述符的位置是有序排放的,两个buffer都指向帧数据的缓存地址,最后一个描述符指向第一个描述符所在物理地址形成桶状描述符链。环状和链状结构如图1-2所示,一个描述符链只能用来存储一个MAC帧的数据,DMA每个通道一次最多完成两个MAC帧的传输,多MAC帧的传输需要重新使能DMA通道。

描述符的具体结构如图1-3所示:基于嵌入式Linux的千兆以太网卡驱动程序设计及测试

OWN位控制描述符是由DMA控制还是由host端控制,后面31位是描述符状态信息,DES1为控制描述符并标明两个buffer大小,DES2DES3描述两个buffer所在地址。

二. 千兆以太网卡驱动程序设计

GMAC驱动程序需要完成的内容有:PHY芯片初始化,GMAC初始化,GMAC/写数据,GMAC数据流控制和各种模式设置。

GMAC初始化流程图如图2-1所示:基于嵌入式Linux的千兆以太网卡驱动程序设计及测试

 

GMAC初始化过程首先检查PHY芯片工作是否正常并配置PHY芯片模式,创建发送和接收描述符,初始化DMA,然后配置MAC工作模式,使能DMA后进入工作状态。

初始化完成后,数据等待发送或接收,DMA根据描述符状态自动完成数据发送或接收的任务。buffer中的帧结构不包含preamble , PAD byteFCS段,只包含源地址,目的地址和类型/长度域。如果MAC禁止CRC校验和PAD插入,那么buffer就必须包含完整的帧结构,其中必须包含CRC校验位。DMA一次搬运最多两帧数据,所以初始化后如果需要完成多帧数据搬运需要重新使能DMA

  GMAC发送和接收过程如左图2-2所示:

基于嵌入式Linux的千兆以太网卡驱动程序设计及测试

初始化后,第一次帧传输不需要等待中断,DMA自动完成发送接收任务,当有多次帧传输时,DMA在完成一次发送接收任务后会给CPU发送中断,CPU响应中断处理下一次读写任务。如果读写过程中发生帧错误等导致操作未完成,则会产生相应异常中断直到CPU清除中断位标志,此时GMAC停止工作。

驱动程序设计完成寄存器到功能函数的转换,给上层操作系统提供应用接口,Linux嵌入式操作系统有一套标准的接口规范,根据该规范设计驱动需要预先定义两种重要的结构体:

描述符程序结构体设计:

    typedef struct DmaDescStruct    

{         

  __u32   status;         //DMA状态

  __u32   length;         //buffer1buffer2长度

  __u32   buffer1;        //buffer1地址

  __u32   buffer2;        //buffer2地址

  //下面数据仅为驱动使用

  __u32   extstatus;      //接收描述符的扩展位状态

  __u32   reserved1;      //保留部分

  __u32   timestamplow;   //时间戳

  __u32   timestamphigh;  

  __u32   data1;          //buffer1虚拟地址(驱动备用)

  __u32   data2;          //buffer2虚拟地址(驱动备用)

} DmaDesc;

    GMAC控制器设备程序结构体设计:

typedef struct GMACDeviceStruct      

{

  __u32 MacBase;  //MAC基地址     

  __u32 DmaBase;    //DMA基地址     

  __u32 PhyBase;     //PHY基地址     

  __u32 Version;         

 

  DmaDesc *TxDesc;       //发送描述符链开始地址

  DmaDesc *RxDesc;       //接收描述符链开始地址

 

  __u32 BusyTxDesc;     //当前DMA所拥有发送描述符链数量 

  __u32 BusyRxDesc; //当前DMA所拥有接搜描述符链数量

  

  __u32  RxDescCount;    //当前描述符链中接收描述符数量

  __u32  TxDescCount;    //当前描述符链中发送描述符数量

 

  __u32  TxBusy;      //指明当前发送描述符是否由DMA控制,即OWN位是否为1       

  __u32  TxNext;      //指明下一个描述符链是否有效         

  __u32  RxBusy;                

  __u32  RxNext;                

 

  DmaDesc * TxBusyDesc;      //TxBusy对应的当前描述符地址

  DmaDesc * TxNextDesc;      //TxNext对应的下一个描述符链地址

  DmaDesc * RxBusyDesc;      

  DmaDesc * RxNextDesc;      

 

  __u32 ClockDivMdc;       //时钟分频数

  __u32 LinkState;        //网卡链接状态

  __u32 DuplexMode;        //半双工,全双工等工作模式选择

  __u32 Speed;   //连接速度。10M/100M/1000M

  __u32 LoopBackMode;    //LoopBack模式

}GMACdevice;

三. 测试实现

测试程序对GMAC进行了相应的黑盒测试和压力测试,黑盒测试用来测试GMAC千兆网卡的各个模块输入相应信号是否得到正确的输出信号,压力测试用来测试网卡的系统稳定性。

测试程序通过GMACLoopBack模式将数据写入内存并让GMAC发送,再从接收描述符指定的内存中读出,判断写入写出数据是否一致,完成数据读写测试。对于功能点测试,主要测试的GMAC功能有:PHY芯片自协商完成验证,GMAC LoopBack模式,哈希值和MAC帧过滤,CRC校验和,AV模式和时间戳支持模式。

一次读写测试完成后,测试程序改变GMAC模式和状态,再进行一次数据读写测试,同时加大数据量和功能点以完成压力测试,再次判断写入写出数据是否一致。不断循环进行直到测试程序测试结束,测试过程要完成判定覆盖和条件覆盖的100%代码覆盖率,需要不断改变输入信号和功能以满足测试意图,使用LoopBack模式的测试信号发送和接收结果如图所示: 基于嵌入式Linux的千兆以太网卡驱动程序设计及测试

PHYMAC使用GMII接口连接,全双工模式下发送的同时进行接收操作,实验结果发现在帧传输速度提升到1.3GMbps时,有明显的丢帧现象,MAC层的帧数据FIFO原数据被冲刷,丢帧现象明显。在使能中断的情况下,发生丢帧后会立刻进入异常中断,DMA停止工作等待CPU响应中断。

四. 结束语

该驱动程序已经在Linux嵌入式系统下调试通过,所有代码下Linux嵌入式系统下移植完成,驱动程序在MaPU定制指令SOC系统上调试通过,使用该驱动完成后续上层软件开发。验证平台基于ARM Cortex A8,测试仿真使用RealViewDebugger完成指令仿真,使用VCS进行时序精确仿真,测试程序代码覆盖率达到90%以上。

转载于:https://www.cnblogs.com/Ph-one/p/6394104.html

相关文章:

  • 数据结构基础知识(1)
  • 数据结构之队列
  • 数据结构基础知识(2)
  • 软考之操作系统(1)
  • 高效编程之互斥锁和自旋锁的一些知识
  • 信号量,互斥锁,自旋锁
  • 全双工和半双工
  • spi和I2c的速率
  • 以太网接口
  • 变量分类
  • C语言8大经典排序算法(1)
  • C语言8大经典排序算法(2)
  • O(n²)、O(n)、O(1)、O(nlogn)
  • tcp与socket关系
  • linux怎么区别文本文件和二进制文件
  • [原]深入对比数据科学工具箱:Python和R 非结构化数据的结构化
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • 2019.2.20 c++ 知识梳理
  • Flannel解读
  • java8 Stream Pipelines 浅析
  • node-glob通配符
  • scrapy学习之路4(itemloder的使用)
  • Vue UI框架库开发介绍
  • Web Storage相关
  • 初识 beanstalkd
  • 检测对象或数组
  • 老板让我十分钟上手nx-admin
  • 力扣(LeetCode)21
  • 前端性能优化——回流与重绘
  • 使用API自动生成工具优化前端工作流
  • No resource identifier found for attribute,RxJava之zip操作符
  • ionic入门之数据绑定显示-1
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • $.ajax中的eval及dataType
  • $var=htmlencode(“‘);alert(‘2“); 的个人理解
  • (4)STL算法之比较
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (二)Eureka服务搭建,服务注册,服务发现
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • (切换多语言)vantUI+vue-i18n进行国际化配置及新增没有的语言包
  • (四)c52学习之旅-流水LED灯
  • (一) springboot详细介绍
  • (转)详解PHP处理密码的几种方式
  • .NET开发不可不知、不可不用的辅助类(三)(报表导出---终结版)
  • @ 代码随想录算法训练营第8周(C语言)|Day57(动态规划)
  • [16/N]论得趣
  • [2024最新教程]地表最强AGI:Claude 3注册账号/登录账号/访问方法,小白教程包教包会
  • [Electron]ipcMain.on和ipcMain.handle的区别
  • [Jquery] 实现鼠标移到某个对象,在旁边显示层。
  • [nlp] 损失缩放(Loss Scaling)loss sacle
  • [No000016]为什么假期计划总是做不到?