首页 基于CS8900A网卡驱动的实现

基于CS8900A网卡驱动的实现

举报
开通vip

基于CS8900A网卡驱动的实现基于CS8900A网卡驱动的实现 基于CS8900A网卡驱动的实现 信』息l科』学 基于CS8900A网卡驱动的实现 周厚才林海波 (重庆邮电大学自动化学院,重庆400065) 摘要:CS8900A是CIRRUSLOGIC公司生产的以太网控制芯片,本文介绍了 CS890OA的主要特性,阐述了其在Linux平台下驱动程序的架 构及其设计方法,着重描述了数据包的发送与接收环节并给出了相关代码驱动程 序做好后,通过启动初始化方式加栽到内核运行,证明了其可行 性. 关键词:CS8900A;Linux平台;驱动;...

基于CS8900A网卡驱动的实现
基于CS8900A网卡驱动的实现 基于CS8900A网卡驱动的实现 信』息l科』学 基于CS8900A网卡驱动的实现 周厚才林海波 (重庆邮电大学自动化学院,重庆400065) 摘要:CS8900A是CIRRUSLOGIC公司生产的以太网控制芯片,本文介绍了 CS890OA的主要特性,阐述了其在Linux平台下驱动程序的架 构及其设计方法,着重描述了数据包的发送与接收环节并给出了相关代码驱动程 序做好后,通过启动初始化方式加栽到内核运行,证明了其可行 性. 关键词:CS8900A;Linux平台;驱动;发送;接收 1CS8900A芯片简介 CS8900A是CirrusLogic公司生产的l0 M以太网PHY器件.CS8900A集成了片上 RAM,曼彻斯特编码/解码器,lOBase—T传输接 收滤波器,带24mA驱动的直接ISA总线接口, 数据链路控制器MAC,片上存储管理器等.它 独特的PacketPage结构可自动适应网络通信量 模式的改变和现有系统资源,从而提高系统效 率.CS8900A采用100引脚TOFP封装,适用于 细小板型,对成本敏感的以太网应用产品. CS8900A有2种工作模式:MEMORY MODE和I/OMODE.其中MEMORYMODE在 编程操作上较为简单,对任何寄存器都是直接 操作,不过这需要硬件上多根地址线和网卡相 连.I/OMODE则较为麻烦,因为这种模式下对 任何寄存器操作均要通过I/OPORTOX300写 入或读出,但这种模式在硬件上实现比较方便, 而且这也是芯片的默认模式,它的传输效率是 MEMORYMODE的96%左右,两者几乎一样, 下面主要介绍I,0MODE下CS8900A芯片驱 动程序的实现. 在I/O模式下,PacketPagememory被映射 到CPU的l6个连续I/O端口上,.芯片上电后, I/O基地址的默认值被置为0300h,不过这在程 序中是可以改变的.这8个l6位的I/0端口详 细功能和偏移地址如 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 1所示. 要访问CS8900A内部寄存器中的任何一 个,必须首先设置PaeketPagePiont.该端口的 低12位表示要访问的内部寄存器的地址,接着 的3位(c,D和E)是不能改变的,只要把它们 置为Ollb即可.它的最高为表示要访问的是一 个寄存器还是一组连续地址的块寄存器,详细 情况如图1所示. 如果正确设置了PaeketPagePiont的值, 目标寄存器的内容然后被映射到PacketPage数 据端口(I/Obase+00OCh)上.如果访问的是一 组连续地址的块寄存器.PacketPagePiont会在 本次访问结束后自动地移到下一个内部寄存器 的位置. 2网络驱动架构 Linux网络驱动程序的体系结构可以划分 为四层,从上到下分别为网络 协议 离婚协议模板下载合伙人协议 下载渠道分销协议免费下载敬业协议下载授课协议下载 接口层,网络 设备接口层,设备驱动功能层,以及设备媒介 层,如图2所示.我们在设计网络驱动程序时, 最主要的工作就是完成设备驱动功能层,使其 满足我们所需的功能.在Linux中所有网络设 备都抽象为一个接口,这个接口提供了对所有 网络设备的操作集合.由数据结构structde— vice来表示网络设备在内核中的运行情况,即 网络设备接口.它既包括纯软件网络设备接口, 表2中断分配表 如环路(Loopback),也包括硬件网络设备 接口,如以太网卡.而由以dev—base为头 指针的设备链表来集体管理所有网络设 备,该设备链表中的每个元素代表一个网 络设备接【1.数据结构device中有很多供 系统访问和协议层调用的设备方法,包括 供设备初始化和系统注册用的init函数, 打开和关闭网络设备的open和stop函数, 处理数据包发送的hard—start—xmit函数, 以及中断处理函数等.有关device数据结 构的详细内容,可以参看/linux/include/lin— ux/netdevicBh.数据结构sk_buff主要完成 TCP/IP中不同协议层间以及和网络驱动 程序之『日J数据包的传递,包括传输层,网络 层,连接层需要的变量,决定数据区位置和 大小的指针,以及发送和接收包所用到的 具体设备信息等,详细定义可以参阅内核 源代码,l'nux/include/1inux/skbuff.h. 3软件设计 3.1初始化函数 网络设备的探测是在初始化函数里完 成的.该函数唯一的参数是一个指向设备 的指针,其返回值是0或者一个负的错误 代码.在采用"启动初始化方式"加载驱动 程序时,该函数在driver'/net/Space.c中被注 册进内核,在init进程启动时被 net—dev— init()调用.初始化时首先检测物 理设备是否存在,然后检测中断号和I/O 地址,接下来填充device结构属性字段并 且调用ether_setup(dev),最后调用kmalloc 申请需要的内存空间.CS8900A紊?始化函 数是通过cs8900_probe0和cs8900.probel ()函数实现的,代码在htriver/net/cs8900.e 中. 表1I/O模式端口分配袁 1-字增指向下字 图1PacketPage指针寄存器示意图 dev— queuexmit()Netif—rx0 jljl structdevice Jl』l 中断处理数据包发送 (数据包接收) JlJl 网络物理设备媒介 3.2设备打开与关闭函数 设备驱动程序在函数open中请求它 需要的系统资源,并激活网络设备接口使它能 接收来自网络的数据并且传递到网络协议栈的 上层,也可以将数据发送到网络上.而stop函 数则先关闭接口,然后释放系统资源.设备打开 函数net—openO首先要注册中断号和I/0地址, 然后将该设备挂到irq2dev—map中,如果使用 基于中断的数据接收方式,以后就口J以通过中 断号和irq2dev—map数组直接查找相应设备, 图2Linux网络驱动程序体系结构 网络协议 接口层 网络设备 接口层 设备驱动 功能层 设备媒介 层 接下来初始化物理设备的奇存器,再设置接口 相应的dev的私有数据结构(dev一>priv)中的一 些字段,最后设置dev中的tbusy,interrupt和 start字段.设备关闭函数net—close()则与打开 函数动作相反.CS8900A是通过cs8900_start() 和cs8900_stop0来实现打开与关闭的. 3.3数据包的发送与接收 在驱动程序层次发送和接收数据都是通过 系统低层对硬件的读写来完成的.当网络上的 一 S2一 ?? F ===二==,一 信I息l科l学 数据到来时,将触发硬件中断,并根据注册的中 断向量表确定处理函数,进入中断向量处理程 序,将数据送到上层协议进行处理.cs8900a有 4个中断信号管脚直接与ISA总线相连,对应 如表2所示.中断处理函数为cs8900interrupt (),首先确定发生中断的具体网络接口,然后读 取中断状态寄存器,判断中断发生的原因,如果 有新数据包到达,则调用数据包接收子函数 net_rx(),如果中断是由上次传输引起的,则通 知协议上一层,修改接口统计信息,关闭标志位 tbusy,为下次传输做准备,最后关闭标志位. 当系统需要发送数据时,它首先把数据打 包成一个完整的sk_buff结构体,这个结构从 Unix用来表示一个网络连接的抽象,即套接字 得名,即使接口与套接字无关,每个网络包在较 高的网络层中一定属于某个套接字,任何套接 字的输入输出缓冲区都是sk_buff结构的列表, 同样的sk_buff结构在整个Linux网络子系统 中都被用来承载网络数据,但在考虑接口时,一 个套接字缓冲区就是一个包,然后调用 cs8900_ send_start()函数把它发送到网络设备 接口上.数据包发送函数具体代码实现: staticintes8900_ send_start(strnetsk_buff skb,structnet_device*dev) {cs8900_tprlv=(cs8900_t)dev->priv; u16status; spin._ lock_irq(&Tpriv->leck); netif_ stop_queue(dev); es8900_ write(dev,PP_TxCMD,TxStart(M- ter5)); es8900_write(dev,PPTxLength,skb->len); status=cs8900_ readev,PPl_BusST); if((status&TxBidE) {spin_unlock_(&priv一>lock); printk(KERN_WARNING"%s:In- validframesize%d!\【l",dev一>name,skb一>len); priv一>stats.tx_ errors++; priv->stats.Ix_ aborted_ errors++; priv一>Lxlen=O: return(1); l if(!(status&Rdy4TxNOW)) (spin_unlock—irq(&priv一>lock); printkfKERN_ WARNING"%s: TransmitbuffernotfreeSn",dev->name); priv一>stats.tx_ errors++; priv->trden:O: nXME:storeskbandsendit ininterrupthandier| return(1); } cs8900_ frame_write(dev,skb); spin_ unlockjrq(&priv->lock); #irdefDEBUG dump_ packet(dev,skb,"send"); 散jndif#ifdefDEBUG/ dev一>lrans, start=jiflies; dev— kfrec— skb(skb); priv一>l~en=skb一>len: relurn(O); } 网络上有新数据包到达时,中断处理函数 调用数据包接收子函数cs8900_receive(),它首 先申请skb缓存区存储新的数据包,然后从硬 件读取新到达的数据,将新的数据包向网络协 议的上层传送,最后修改接口统计醋数,实现代 码如下: staticvoidcs8900receive(strnctnet_device dev) {cs8900_tpriv=es8900t)dev->priv; structsk_buff*skb; u16statusjength; status=es8900_ read(dev,P王'_RxStatus); length:cs8900_read(dev,PP_RxI~ngth); if(!(status&RxOK)) (priv一>stats.rxerrors++; if((status&(RuntIExtradata))) priv一>stats.rxlength_ errors++; if((stams&CRCerror), priv一>slats.rx_ ere._ en'ors++; return4 ) if((skb=dev_alloc_skb0eng~+4"== NULU {priv->stats.rx_dropped++; return; } skb->dev=dev; skb_reserve(skb,2); es8900_ frame_ read(dev,skb,length); #耐efFULL_DUPLEX dump_packet(dev,skb,"reev"); #endff/#ifdefFULLDUPLEX skb->protoeol:eth_type_trans(skb,dev); netif_ rx(skb); dev->lastrx=jifi~es; priv->stats.rx_ paeke~++; priv一>stats.rx_ bytes+=length; 】 4系统测试 在带CS8900A芯片驱动的内核启动起来 后就可以对它进行测试了.测试可以根据启动 init进程运行到cs89x0_probe()函数时显示的 初始化信息判断网卡是否已经成功被检测到. 如果一切正常,相关信息如下: ??' ?_-?????? cs89xO:es89x0probe(OxO) cs89xO:SettingUpcs8900ChipSelect&IRQ ioaddr=0x1o()0030o cs89x0.c:v2.4.3-prelRussellNelsonnel— son@erynwr.(mm.AndrewMorton <andrewm@uow.edu.au> eth0:es8900revJfoundatOx10000300 cs89xOmediaR3—45,IRQ20,programmedI/O, MACoo:5O:56:c0:00:01 cs89xOprobel0suceessful 5结论 本文论述了Linux平台下以太网络器件 CS8900A驱动的架构及设计方法,并通过测试 验证了其正确性.CS8900A在嵌入式系统领域 具有广.泛应用,系统成本低,实现硬件少,体积 科——黑龙江——技信息 小,传输速度快,使用方便,应用前景广泛,适用 于网络传输系统,尤其适用于数据采集和数据 传输 参考文献 f1F,J,琼.嵌入式Linux应用程序开发详解f.北 京:人民邮电出版社.2006. 【2]马仲梅.ARM嵌入式处理器结构与应用基础 【M】.北京:北京航空航天出版社,2002. 【3】林晓飞等.基ARM嵌入式Linux应用开发与 实例教程【M1.北京:清华大学出版社,2006. 【4】CS8900AProductDataSheet[K1. [5]CHRISTOPHERHALLINAN.Embedded LinuxPrimer【M】.2007byPearsonEducation, Inc. 一 53—
本文档为【基于CS8900A网卡驱动的实现】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_044822
暂无简介~
格式:doc
大小:26KB
软件:Word
页数:0
分类:企业经营
上传时间:2017-10-06
浏览量:34