Linux下网卡驱动程序

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Linux下8019网卡驱动程序

福建鑫诺通信有限公司陈光平(chenggp_fj@)

本文以S3C44B0的CPU为例,详细解析了linux下RTL8019网卡驱动程序工作原理,其间知识大多来源互联网络,特别是浙大潘纲的论文,在此不一一列出,此文目的只是让嵌入式linux爱好者得到更多网卡驱动的资料,并获得交流机会,不足之处请指正

(一)、硬件相关部份

1、CPU与网卡的连接方式

(s3c44B0 CPU) (RTL 8019网卡)

CPU与网卡接线图

上图为S3c44b0CPU和网卡的接线图,此接法并非固定,如接法不同,则牵涉到很多相应的改动,下面会详细分析不同之处

从硬件部门得到:网卡在CPU的存储空间上接BANK4,即0x08000000(看44B0手册)外部中断号为:EXTINT3 (irqs.h文件获得值为22)

上面两个值可以查CPU手册,或询问硬件设计人员

由上图可以知道以下数据:

(1)、网卡与CPU地址线连接错开8位(A0接A8)

(2)、总共连线,其实4根就足够用了,因为每根线可以译码4个地址空间,总共是16个地址空间,每个地址空间对应一个寄存器地址,而8019总共就是16个寄存器(3)、一般是跳线模式,不使用9346芯片

1-1 基地址算法

首先8019的基地址是300H(见RTL8019芯片资料:选择IO总线地址),但是有些硬件已在芯片中做过了偏移,比如我们的网卡已做了处理,基址已偏移到0x08000000,

那么因为网卡A0接CPU的A8,表示基地址左移8位,下一个寄存器reg0的地址就是:0x08000100(0000,0000,0001 0001,0000,0000)

还不理解的话我们看另一种接法:

(S3C44B0 CPU ) (RTL8019芯片) 这种接法地址线只错开一位,我们来看(假如仍使用BANK4):

A1 A0,为何A0不能接A0,因为8019是共用数据线和地址线的,如果A0接A0的话,无法配置8位和16位方式

现在可以看到,基地址为300H 的话,左移一位(A0->A1),就是600H,于是算出基地址为: 0x08000600,下一个寄存器的地址就是

0x08000602,因为都左移一位,相当于x2了

2、8019网卡的工作原理

本节主要讨论一下

8019是怎么工作的,如下图:

(本地DMA ) (远端DMA )

(图2 与DMA 有关的寄存器 )

2-1 远端DMA 和本地DMA

首先解释一下远端DMA 和本地DMA 的区别,以发送为例,网络发送数据是下面这样一个流程:

CPU 将数据先发送到网卡上的16KRAM 中,这之间必须要有一个数据通道,我们称为远端DMA ,而数据从网卡的RAM 中发出给链路,RTL8019控制器与RAM 之间的通道称为本地DMA

2-2 CPU 读写数据到网络芯片

先解释一下上面提到的几个重要的寄存器,我们从上面分阶段说明:

RBCR0,RBCR1:存放要读写数据的长度

RSAR0,RSAR1:存放数据到网络芯片(RAM)中存放的起始地址(而不是页号,但通常还是以某页的00为开始,如0x4000)

CR:向命令寄存器发出Remote DMA开始指令

上面的流程后面会详细解说

2-3 网络芯片发数据到以太网

CPU把数据用Remote DMA发到网络芯片之后,就可以用让网络芯片用Local DMA向

外数据了,需要设置如下的控制器:

TPSR:网络芯片要发送的数据在网络芯片RAM中的起始页号,所以发送的数据只能从某页的开头存放。

TBCR0,TBCR1:要发送的数据总长度

CR:向命令寄存器发出发送数据包的指令CMD_XMIT

然后程序就可以返回了,网络芯片会自动用Local DMA发数据包

2-4 网络芯片从以太网读数据

网络芯片在从以太网读数据过程中,会用到的寄存器如下:

PSTART,PSTOP:网络芯片接收数据缓冲区的起始和终止页号。形成一个接收缓冲环,每页256字节

CURR:接收缓冲环写页指针,初始化=PSTART

BNRY:接收缓冲环读页指针,初始化=PSTART

这四个寄存器在init函数里初始化,以后有数据包来到时,网络芯片会自动判断是否发给本机,是则用Local DMA存入数据,并自动修改读写指针

RTL8019接收包帧结构:

具体流程如下:

有了上面的收发包的格式,如何发送和接收数据包呢?看下图:

图3 发送缓冲区

先将待发送的数据包存入芯片RAM,给出发送缓冲区首地址和数据包长度(写入TPSR,TBCR0,1),启动发送命令(CR=3E),即可实现8019发送功能.8019会自动按以太网协议完成发送并将结果写入状态寄存器。

那么8019是怎样接收数据的呢?请看下图:

接收缓冲区构成一个循环FIFO队列,PSTART、PSTOP两个寄存器限定了循环队列的开始和结束页,CURR为写入指针,受芯片控制,BNRY为读出指针,由主机程序控制,根据CURR=BNRY+1?可以判断是否收到新的包,新收到的数据包按下图的格式存于以CURR 指出的地址为首址的RAM中

当CURR=BNRY时芯片停止接收数据包

总的说来,数据包是这样被主机写入芯片和从芯片RAM读出来的:主机设置好远端DMA 开始地址(RSAR0,1)和远端DMA数据字节数(RBCR0,1),并在CR中设置读写,就可以从远端DMA口寄存器读出芯片RAM里的数据或把数据写入RAM芯片,用个示例来说明一下(以发送为例):

首先了解RBCR0,1中的远端DMA字节数在寄存器高低位上是怎么存储的?比如长度为

相关文档
最新文档