原创 NE2000网卡驱动程序的编写(转载)

2009-5-12 15:34 3942 10 10 分类: 通信
NE2000网卡芯片驱动程序
                               NE2000网卡芯片驱动程序
                              asdjf@163.com  2002/10/20


    我的SNMP网管板使用了RTL8019AS 10M ISA网卡芯片接入以太网。选它的好处是:
NE2000兼容,软件移植性好;接口简单不用转换芯片如PCI-ISA桥;价格便宜2.1$/片(我的
购入价为22元RMB/片);带宽充裕(针对51);较长一段时间内不会停产。8019有3种配置模
式:跳线方式、即插即用P&P方式、串行Flash配置方式。为了节省成本,我去掉了9346而使
用X5045作为闪盘存储MAC地址和其他可配置信息。P&P模式用在PC机中,这里用不上。只剩
下跳线配置模式可用,它的电路设计参考REALTEK提供的DEMO板图纸。一天时间就可以完
成,相对来说硬件设计比较简单。
    与这部分硬件相对应的软件是网卡驱动。所谓驱动程序是指一组子程序,它们屏蔽了底
层硬件处理细节,同时向上层软件提供硬件无关接口。驱动程序可以写成子程序嵌入到应用
程序里(如DOS下的I/O端口操作和ISR),也可以放在动态链接库里,用到的时候再动态调入
以便节省内存。在WIN98中,为了使V86、WIN16、WIN32三种模式的应用程序共存,提出了虚
拟机的概念,在CPU的配合下,系统工作在保护模式,OS接管了I/O、中断、内存访问,应用
程序不能直接访问硬件。这样提高了系统可靠性和兼容性,也带来了软件编程复杂的问题。
任何网卡驱动都要按VXD或WDM模式编写,对于硬件一侧要处理虚拟机操作、总线协议(如
ISA、PCI)、即插即用、电源管理;上层软件一侧要实现NDIS规范。因此在WIN98下实现网卡
驱动是一件相当复杂的事情。
    我这里说的驱动程序特指实模式下的一组硬件芯片驱动子程序。从程序员的角度看,
8019工作流程非常简单,驱动程序将要发送的数据包按指定格式写入芯片并启动发送命令,
8019会自动把数据包转换成物理帧格式在物理信道上传输。反之,8019收到物理信号后将其
还原成数据,按指定格式存放在芯片RAM中以便主机程序取用。简言之就是8019完成数据包
和电信号之间的相互转换:数据包<===>电信号。以太网协议由芯片硬件自动完成,对程序
员透明。驱动程序有3种功能:芯片初始化、收包、发包。
    以太网协议不止一种,我用的是802.3。它的帧结构如图1所示。物理信道上的收发操作
均使用这个帧格式。其中,前导序列、帧起始位、CRC校验由硬件自动添加/删除,与上层软
件无关。值得注意的是,收到的数据包格式并不是802.3帧的真子集,而是如图2所示。明显
地,8019自动添加了“接收状态、下一页指针、以太网帧长度(以字节为单位)”三个数据成
员(共4字节)。这些数据成员的引入方便了驱动程序的设计,体现了软硬件互相配合协同工
作的设计思路。当然,发送数据包的格式是802.3帧的真子集,如图3所示。
    
 -------------------------------------------------------------------------------
--------------------
 |前导位PR|帧起始位SD|目的IP地址DA|源IP地址SA|类型TYPE/长度LEN|数据域DATA|     
填充PAD     |校验FCS|
 -------------------------------------------------------------------------------
--------------------
   62bit     2bit       48bit        48bit          16bit      <=1500字节 DATA小
于46字节补0   32bit
    TYPE说明:0800 IP包;0806 ARP包;814C SNMP包;8137:IPX/SPX
    小于0600H值用于IEEE802帧,表示数据包长度。
    DATA说明:DA+SA+TYPE=14字节+DATA=1514字节,即最大传输包长度<=1514
    PAD说明:最小包长度不小于60字节,最小DATA长度46字节,不够的补0。
                              图1 802.3帧结构
                              
 -------------------------------------------------------------------------------
-----------------------
 |接收状态|下一页指针|以太网帧长度|目的IP地址DA|源IP地址SA|类型TYPE/长度LEN|数据
域DATA|填充PAD|校验FCS|
 -------------------------------------------------------------------------------
-----------------------
    8bit      8bit        16bit       48bit        48bit        16bit        
<=1500字节  可选    32bit
                              图2 RTL8019AS接收包帧结构
                              
 -------------------------------------------------------------
 |目的IP地址DA|源IP地址SA|类型TYPE/长度LEN|数据域DATA|填充PAD|
 -------------------------------------------------------------
      48bit      48bit          16bit      <=1500字节   可选    
                              图3 RTL8019AS发送包帧结构
    
    有了收发包的格式,如何发送和接收数据包呢?如图4所示,先将待发送的数据包存入
芯片RAM,给出发送缓冲区首地址和数据包长度(写入TPSR、TBCR0,1),启动发送命令
(CR=0x3E)即可实现8019发送功能。8019会自动按以太网协议完成发送并将结果写入状态寄
存器。如图5所示,接收缓冲区构成一个循环FIFO队列,PSTART、PSTOP两个寄存器限定了循
环队列的开始和结束页,CURR为写入指针,受芯片控制,BNRY为读出指针,由主机程序控
制。根据CURR==BNRY+1?可以判断是否收到新的数据包,新收到的数据包按图2格式存于以
CURR指出的地址为首址的RAM中。当CURR==BNRY时芯片停止接收数据包。如果做过FPGA设
计,用过VHDL,可以想象到硬件芯片的工作原理。此处,设计2个8bit寄存器和一个2输入比
较器,当收到数据包时,接收状态机根据当前状态和比较器结果决定下一个状态,如果
CURR=BNRY,进入停收状态;反之,CURR按模增1。8019数据手册没有给出硬件状态机实现方
法,说明也很简略,往往要通过作实验的方法推理出工作过程。比如,ISR寄存器不只和中
断有关,当接收缓冲溢出时,如果不清ISR(写入FFH),芯片将一直停止接收。在流量较大时
溢出经常发生,此时不清ISR,就会导致网卡芯片死机。
    
                                                               双口RAM
            ----------          ---------- -                  ---------- -
  PSTART--->|        |  TPSR--->|        | |       RSAR0,1--->|        | |
  FIFO开始页----------  发首址  ---------- |       远端DMA    ---------- |
            |  ...   |          |        | |       首地址     |        | |
            ----------          ---------- |                  ---------- |
    CURR--->|        |          |  ...   | TBCR0,1            |  ...   | RBCR0,1
   写页指针 ----------          ---------- |  发送数目        ---------- |  远端
DMA
            |  ...   |          |        | |                  |        | |  数据
字节数
            ----------          ---------- |                  ---------- |
    BNRY--->|        |          |        | |                  |        | |
   读页指针 ----------          ---------- -                  ---------- -
            |  ...   |         图4 发送缓冲区                图6 远端DMA操作
            ----------
   PSTOP--->| 不关心 |
  FIFO停止页----------
       图5 接收FIFO缓冲队列
    
    明白了发送和接收数据包的原理,那么数据包又是怎样被主机写入芯片RAM和从芯片RAM
读出的呢?如图6所示,主机设置好远端DMA开始地址(RSAR0,1)和远端DMA数据字节数
(RBCR0,1),并在CR中设置读/写,就可以从远端DMA口寄存器里读出芯片RAM里的数据/把数
据写入芯片RAM。
    何谓本地/远端DMA呢?如图7所示,“远端”指CPU接口侧;“本地”指8019的硬件收发
电路侧。没有更深的意思,与远近无关,仅仅为了区分主机和芯片硬件两个接口端。这里的
DMA与平时所说的DMA有点不同。RTL8019AS的local DMA操作是由控制器本身完成的,而其
remote DMA并不是在无主处理器的参与下,数据能自动移到主处理器的内存中。remote DMA
指主机CPU给出起址和长度就可以读写芯片RAM,每操作一次RAM地址自动加1。而普通RAM操
作每次要先发地址再处理数据,速度较慢。
    在一些高档通信控制器上自带有MAC控制器,工作原理与8019的差不多,比如:
Motorola 68360/MPC860T内部的CPM带有以太网处理器,通过设置BD表,使软件和硬件协同
工作,它的缓冲区更大且可灵活配置。这些通信控制器的设计,体现了软硬件互相融合协同
工作的趋势:软件硬化(VHDL),硬件软化(DSP),希望大家关注!
    
    TPSR       ----------                   ----------
    TBCR0,1    |        |     ---------     |        |
               |        |     |       |     |        |
    PSTART     | 本地   |     |  16K  |     | 远端   |    RSAR0,1
    PSTOP      | DMA    |     |双口RAM|     | DMA    |    RBCR0,1
    CURR       |        |     |       |     |        |
    BNRY       |        |     |       |     |        |    CRDA0,1
               |        |     ---------     |        |  指示当前远端DMA地址
    CLDA0,1    ----------                   ----------
  指示当前本地DMA地址
             硬件收发电路侧                  主机CPU侧
                       图7 与DMA有关的寄存器
    
    如图7所示,8019以太网控制器以存储器(16K双口RAM)为核心,本地和远端控制器并发
操作。这种体系结构满足了数据带宽的需要。8019拥有控制、状态、数据寄存器,通过它
们,51单片机可以与8019通信。由于51资源紧张,在实现TCPIP协议栈时不要进行内存块拷
贝,建议(1)使用全局结构体变量,在内存中只保存一个数据包拷贝,其他没有来得及处理
的包保存在8019的16K RAM里;(2)使用查询方式而不用中断;(3)客户服务器模型中服务器
工作于串行方式,并发模式不适合51单片机。

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户379911 2009-10-26 00:25

大哥:你好厉害哦!
相关推荐阅读
用户540930 2011-07-13 09:36
压在手头的三件事情
1, APEX integration 2, Image mosaic.. 3, Gaianvwa...  ...
用户540930 2011-07-11 12:44
学习新雨师弟,一个月更新一次简历
某师弟一个月更新一次简历,每次我想到这一点就敬佩从心底里升起···· 认识这些人真是幸运的事...
用户540930 2011-06-10 01:00
以后继续皈依这里
以后继续皈依这里了··· 我在QQ空间里写了一段时间,所写所说都是感性之文,为的也是某个人能看到, 可是从来没有见过那样的足迹,我失望且绝望了。   我的心生疼生疼的,可是我必须忍受这种疼痛, 观察自...
用户540930 2009-08-18 17:58
比找配偶更重要的是找工作----第一天
最近好多XDJM都在找工作,虽然偶是撮人一个,正二八经的也只是在准备出国而已。但是对于这档子事儿还是有那么点点小经验。分享下攒人品,有好想法的欢迎拍砖哈。。去年这个时候,我混迹在无数04级找工作的大军...
用户540930 2009-08-13 11:39
自我管理
很难想象一个没有严肃的精神世界的人会有多大的成就我的严肃的精神世界正在慢慢的消融这一点让我有点恐惧 当你在做坏事的时候,心里的道德感不再去责问你,你还有什么来约束自己呢?好的习惯的养成是一个逆水行舟的...
用户540930 2009-07-29 01:08
核电资料小结
压水堆  压水堆  (pressurized water reactor)  使用加压轻水(即普通水)作冷却剂和慢化剂,且水在堆内不沸腾的核反应堆。燃料为加浓铀。20世纪80年代,被公认为是技术最成熟...
EE直播间
更多
我要评论
1
10
关闭 站长推荐上一条 /3 下一条