一. 引言

千兆以太网是一种具有高带宽和高响应的新网络技术,相关协议遵循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的设置可以控制网卡切换工作状态。

                                                   图 1-1

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

                                                          图1-2

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

描述符的具体结构如图1-3所示:

                                图1-3

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

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

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

GMAC初始化流程图如图2-1所示:

                  

                               图2-1

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

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

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

              

                                图2-2

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

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

描述符程序结构体设计:


typedef struct DmaDescStruct
{
  __u32 status; //DMA状态
  __u32 length; //buffer1和buffer2长度
  __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千兆网卡的各个模块输入相应信号是否得到正确的输出信号,压力测试用来测试网卡的系统稳定性。

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

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

           

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

四. 结束语

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

原地址:http://blog.sina.com.cn/s/blog_6372441a0101juug.html

基于嵌入式Linux的千兆以太网卡驱动程序设计及测试的更多相关文章

  1. 7、基于嵌入式Linux的视频采集系统---UVC驱动模型介绍

    UVC 即 usb video class.USB协议中,除了通用的软硬件电气接口规范等,还包含了各种各样的Class协议,用来为不同的功能定义各自的标准接口和具体的总线上的数据交互格式和内容.这些C ...

  2. 【miscellaneous】【ARM-Linux开发】ARM平台基于嵌入式Linux Gstreamer 使用

    1). 简介 随着ARM平台性能的日益强大和嵌入式设备的发展,对于多媒体处理如音视频播放,摄像头,流媒体处理等需求也日益增多,本文就通过几个基于嵌入式Linux下多媒体应用的示例来简单展示下使用Gst ...

  3. 手把手带你基于嵌入式Linux移植samba服务

    摘要:Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件,由服务器及客户端程序构成. 本文分享自华为云社区<嵌入式Linux下移植samba服务--<基于北斗和4G ca ...

  4. 基于XC7A100T的PCIe千兆电口以太网收发卡

    一.板卡概述 本板卡采用Xilinx公司的Artix7系列的XC7A100T-2FGG484 芯片作为主处理器.包含双路千兆电口网络,双组DDR,PCIeX1 V1.1接口,板卡设计满足工业级要求. ...

  5. 基于嵌入式linux路由转发功能的实现

    环境 arm7开发板, uclinux系统,kernel version: linux-2.4.x arm芯片的单网卡双网口设备,eth0 WAN口 ipaddr 192.168.9.61 eth0: ...

  6. 3G下的无压缩视频传输(基于嵌入式linux) (转载)

    本课题研究嵌入式系统在数据采集,3G无线通信方面的应用,开发集视频采集.地理信息采集.无线传输.客户机/服务器模式于一体的车载终端,实现终端采集视频与GPS信息的传输,支持服务器端显示视频与GPS信息 ...

  7. 基于GPL329xx linux平台电容屏gsl1680的驱动调试分析

    因客户有用到了gsl1680 7寸电容屏,所以拿了一块过来,便在329xx的平台上面开始调试了. 大概浏览了一下所提供的资料,只有介绍模组的资料跟一份中文版的datasheet,datasheet只是 ...

  8. 237-基于Xilinx Kintex-7 XC7K325T 的FMC/千兆以太网/SATA/四路光纤数据转发卡

    基于Xilinx Kintex-7 XC7K325T 的FMC/千兆以太网/SATA/四路光纤数据转发卡 一. 板卡概述  本板卡基于Xilinx公司的FPGAXC7K325T-2FFG900 芯片, ...

  9. 基于bootsplash的嵌入式linux启动画面定制

    来源: ChinaUnix博客 作者: ChinaUnix博客 发布时间:2007-01-01 16:29:00 摘 要:在基于linux的嵌入式仿真平台研发中,利用开源工具bootsplash能够定 ...

随机推荐

  1. poj 3368 Frequent values -Sparse-Table

    Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 16537   Accepted: 5981 Description You ...

  2. static理解

    static 修饰的变量称为类变量或全局变量或成员变量,在类被加载的时候成员变量即被初始化,与类关联,只要类存在,static变量就存在. 一个static变量单独划分一块存储空间,不与具体的对象绑定 ...

  3. Windows下卸载软件时提示 等待先前的卸载完成? 终止 dllhost.exe 进程

    只要结束进程中的 "dllhost" 进程就好了. 估计原因是, 当卸载某些 "所谓的"较大型的软件的时候, 要去更新, 更改系统对dll链接库的注册, 更新. ...

  4. ThreadPoolExecutor执行过程分析

    ThreadPoolExecutor public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTi ...

  5. HDU 6128 Inverse of sum(同余)

    http://acm.hdu.edu.cn/showproblem.php?pid=6128 题意:有一个a数列,并且每个数都小于p,现在要求有多少对$(i,j)$满足$\frac{1}{a_i+a_ ...

  6. UVa 1663 净化器

    https://vjudge.net/problem/UVA-1663 题意: 给m个长度为n的模板串,每个模板串包含字符0,1和最多一个星号"*",其中星号可以匹配0或1.例如, ...

  7. poj 1523 SPF 无向图求割点

    SPF Description Consider the two networks shown below. Assuming that data moves around these network ...

  8. Java编程语言下 Selenium 驱动各个浏览器代码

    这里采用的是Selenium3.7版本,首先介绍的是在Windows环境下运行的: 总结下注意事项: 1,设置各个浏览器的Driver路径 System.setProperty("" ...

  9. 解决MVC 时间序列化的方法

    1.全局处理 处理代码 publict static void SetSerializationJsonFormat(HttpConfiguration config) { // Web API co ...

  10. Ubuntu 添加,删除ppa

    PPA,英文全称为 Personal Package Archives,即个人软件包档案.是 Ubuntu Launchpad 网站提供的一项源服务,允许个人用户上传软件源代码,通过 Launchpa ...