嵌入式系统网络接口优秀PPT.ppt

上传人:1398****507 文档编号:56418594 上传时间:2022-11-01 格式:PPT 页数:80 大小:418.50KB
返回 下载 相关 举报
嵌入式系统网络接口优秀PPT.ppt_第1页
第1页 / 共80页
嵌入式系统网络接口优秀PPT.ppt_第2页
第2页 / 共80页
点击查看更多>>
资源描述

《嵌入式系统网络接口优秀PPT.ppt》由会员分享,可在线阅读,更多相关《嵌入式系统网络接口优秀PPT.ppt(80页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、第第7章章 嵌入式系统网络接口嵌入式系统网络接口7.1 以太网接口以太网接口n嵌入式系统通常运用的以太网协议是IEEE802.3标准。从硬件的角度看,802.3模型层间结构如图7.1.1所示,以太网接口电路主要由媒质接入限制MAC限制器和物理层接口(Physical Layer,PHY)两大部分构成。图7.1.1 802.3模型层间结构n1传输编码传输编码n在在802.3版本的标准中,没有接受干脆的二进制编码(即用版本的标准中,没有接受干脆的二进制编码(即用0V表表示示“0”,用,用5V表示表示“1”),而是接受曼彻斯特编码),而是接受曼彻斯特编码(Manchester Encoding)或者

2、差分曼彻斯特编码)或者差分曼彻斯特编码(Differential Manchester Encoding),不同编码形式如图),不同编码形式如图7.1.2所示。所示。图7.1.2 不同编码形式n其中:曼彻斯特编码的规律是:每位中间有一个电平跳变,从高到低的跳变表示为“0”,从低到高的跳变表示为“1”。n差分曼彻斯特编码的规律是:每位的中间也有一个电平跳变,但不用这个跳变来表示数据,而是利用每个码元起先时有无跳变来表示“0”或“1”,有跳变表示“0”,无跳变表示“1”。n曼彻斯特编码和差分曼彻斯特编码相比,前者编码简洁,后者能供应更好的噪声抑制性能。在802.3系统中,接受曼彻斯特编码,其高电平

3、为+0.85V,低电平信号为-0.85V,这样指令信号电压仍旧是0V。n2802.3Mac层的帧层的帧n802.3 Mac层的以太网的物理传输帧如表7.1.1所示。n表7.1.1 802.3帧的格式n TYPE:类型字段,表明该帧的数据是什么类型的数据,不同协议的类型字段不同。如:0800H表示数据为IP包,0806H表示数据为ARP包,814CH是SNMP包,8137H为IPX/SPX包。小于0600H的值是用于IEEE802的,表示数据包的长度。n DATA:数据段,该段数据不能超过1500B。因为以太网规定整个传输包的最大长度不能超过1514E(14B为DA,SA,TYPE)。n PAD

4、:填充位。由于以太网帧传输的数据包最小不能小于60B,除去(DA、SA、TYPE的14B),还必需传输46B的数据,当数据段的数据不足46B时,后面通常是补0(也可以补其他值)。n FCS:32位数据校验位。32位的CRC校验,该校验由网卡自动计算,自动生成,自动校验,自动在数据段后面填入。不须要软件管理。n 通常,PR、SD、PAD、FCS这几个数据段都是网卡(包括物理层和Mac层的处理)自动产生的,剩下的DA、SA、TYPE、DATA这4个段的内容是由上层的软件限制的。n3以太网数据传输的特点以太网数据传输的特点n 全部数据位的传输由低位起先,传输的位流是用曼彻斯特编码。全部数据位的传输由

5、低位起先,传输的位流是用曼彻斯特编码。n 以太网是基于冲突检测的总线复用方法,冲突退避算法是由硬以太网是基于冲突检测的总线复用方法,冲突退避算法是由硬件自动执行的。件自动执行的。n 以太网传输的数据段的长度,以太网传输的数据段的长度,DA+SA+TYPE+DATA+PAD最小为最小为60B,最大为,最大为1514B。n 通常的以太网卡可以接收通常的以太网卡可以接收3种地址的数据,一个是广播地址,种地址的数据,一个是广播地址,一个是多播地址(或者叫组播地址,在嵌入式系统中很少用到),一个是多播地址(或者叫组播地址,在嵌入式系统中很少用到),一个是它自己的地址。但有时,用于网络分析和监控,网卡也可

6、一个是它自己的地址。但有时,用于网络分析和监控,网卡也可以设置为接收任何数据包。以设置为接收任何数据包。n 任何两个网卡的物理地址都是不一样的,是世界上唯一的,网任何两个网卡的物理地址都是不一样的,是世界上唯一的,网卡地址由特地机构分卡地址由特地机构分n配。不同厂家运用不同地址段,同一厂家的任何两个网卡的地址配。不同厂家运用不同地址段,同一厂家的任何两个网卡的地址也是唯一的。依据网卡的地址段(网卡地址的前也是唯一的。依据网卡的地址段(网卡地址的前3个字节)可以个字节)可以知道网卡的生产厂家。知道网卡的生产厂家。n7.1.2 嵌入式以太网接口的实现方法n在嵌入式系统中增加以太网接口,通常有如下两

7、种方法实现:n(1)嵌入式处理器网卡芯片n这种方法只要把以太网芯片连接到嵌入式处理器的总线上即可。此方法通用性强,对嵌入式处理器没有特殊要求,不受处理器的限制,但是,嵌入式处理器和网络数据交换通过外部总线(通常是并行总线)交换数据,速度慢,牢靠性不高,电路板走线困难。目前常见的以太网接口芯片,如CS8900、RTL8019/8029/8039、DM9008及DWL650无线网卡等。n(2)带有以太网接口的嵌入式处理器n带有以太网接口的嵌入式处理器通常是面对网络应用而设计的,要求嵌入式处理器有通用的网络接口(比如:MII接口),处理器和网络数据交换通过内部总线,速度快。n7.1.3 在嵌入式系统

8、中主要处理的以太网协议nTCP/IP是一个分层的协议,包含有用于层、传输层、网络层、数据链路层、物理层等。每一层实现一个明确的功能,对应一个或者几个传输协议。每层相对于它的下层都作为一个独立的数据包来实现。典型的分层和每层上的协议如表7.1.2所示。n表7.1.2 TCP/IP协议的典型分层和协议n1ARP(Address Resolation Protocol,地址解析协议),地址解析协议)n网络层用网络层用32位的地址来标识不同的主机(即位的地址来标识不同的主机(即IP地址),而链路层地址),而链路层运用运用48位的物理(位的物理(MAC)地址来标识不同的以太网或令牌环网接)地址来标识不同

9、的以太网或令牌环网接口。只知道目的主机的口。只知道目的主机的IP地址并不能发送数据帧给它,必需知道地址并不能发送数据帧给它,必需知道目的主机网络接口的物理地址才能发送数据帧。目的主机网络接口的物理地址才能发送数据帧。nARP的功能就是实现从的功能就是实现从IP地址到对应物理地址的转换。源主机发地址到对应物理地址的转换。源主机发送一份包含目的主机送一份包含目的主机IP地址的地址的ARP恳求数据帧给网上的每个主机,恳求数据帧给网上的每个主机,称作称作ARP广播,目的主机的广播,目的主机的ARP收到这份广播报文后,识别出这收到这份广播报文后,识别出这是发送端在询问它的是发送端在询问它的IP地址,于是

10、发送一个包含目的主机地址,于是发送一个包含目的主机IP地址地址及对应的物理地址的及对应的物理地址的ARP回答给源主机。回答给源主机。n为了加快为了加快ARP协议解析的数据,每台主机上都有一个协议解析的数据,每台主机上都有一个ARP cache存放最近的存放最近的IP地址到硬件地址之间的映射记录。其中每一项的生地址到硬件地址之间的映射记录。其中每一项的生存时间(一般为存时间(一般为20分钟),这样当在分钟),这样当在ARP的生存时间之内连续进的生存时间之内连续进行行ARP解析的时候,不须要反复发送解析的时候,不须要反复发送ARP恳求了。恳求了。n2ICMP(Internet Control Me

11、ssages Protocol,网络限制,网络限制报文协议)报文协议)nICMP是是IP层的附属协议,层的附属协议,IP层用它来与其他主机或路由器交换层用它来与其他主机或路由器交换错误报文和其他重要限制信息。错误报文和其他重要限制信息。ICMP报文是在报文是在IP数据包内部被数据包内部被传输的。在传输的。在Linux或者或者Windows中,两个常用的网络诊断工具中,两个常用的网络诊断工具ping和和traceroute(Windows下是下是Tracert),其实就是),其实就是ICMP协议。协议。n3IP(Internet Protocol,网际协议),网际协议)nIP工作在网络层,是工作

12、在网络层,是TCP/IP协议族中最为核心的协议。全部的协议族中最为核心的协议。全部的TCP、UDP、ICMP及及IGMP数据都以数据都以IP数据包格式传输(数据包格式传输(IP封装在封装在IP数据包数据包中)。中)。IP数据包最长可达数据包最长可达65535字节,其中报头占字节,其中报头占32位。还包含各位。还包含各32位的源位的源IP地址和地址和32位的目的位的目的IP地址。地址。nTTL(time-to-live,生存时间字段)指定了,生存时间字段)指定了IP数据包的生存时间(数数据包的生存时间(数据包可以经过的最多路由器数)。据包可以经过的最多路由器数)。TTL的初始值由源主机设置,一旦

13、经的初始值由源主机设置,一旦经过一个处理它的路由器,它的值就减去过一个处理它的路由器,它的值就减去1。当该字段的值为。当该字段的值为0时,数据包时,数据包就被丢弃,并发送就被丢弃,并发送ICMP报文通知源主机重发。报文通知源主机重发。nIP供应不行靠、无连接的数据包传送服务,高效、敏捷。供应不行靠、无连接的数据包传送服务,高效、敏捷。n不行靠(不行靠(unreliable)的意思是它不能保证)的意思是它不能保证IP数据包能成功地到达目的数据包能成功地到达目的地。假如发生某种错误,地。假如发生某种错误,IP有一个简洁的错误处理算法:丢弃该数据包,有一个简洁的错误处理算法:丢弃该数据包,然后发送然

14、后发送ICMP消息报给信源端。任何要求的牢靠性必需由上层来供应消息报给信源端。任何要求的牢靠性必需由上层来供应(如(如TCP)。)。n无连接(connectionless)的意思是IP并不维护任何关于后续数据包的状态信息。每个数据包的处理是相互独立的。IP数据包可以不按发送依次接收。假如一信源向相同的信宿发送两个连续的数据包(先是A,然后是B),每个数据包都是独立地进行路由选择,可能选择不同的路途,因此B可能在A到达之前先到达。nIP的路由选择:源主机 IP接收本地TCP、UDP、ICMP、GMP的数据,生成IP数据包,假如目的主机与源主机在同一个共享网络上,那么IP数据包就干脆送到目的主机上

15、。否则就把数据包发往一默认的路由器上,由路由器来转发该数据包。最终经过数次转发到达目的主机。IP路由选择是逐跳(hop-by-hop)进行的。全部的IP路由选择只为数据包传输供应下一站路由器的IP地址。n4TCP(Transfer Control Protocol,传输限制协议),传输限制协议)nTCP协议是一个面对连接的牢靠的传输层协议。协议是一个面对连接的牢靠的传输层协议。TCP为两台主机为两台主机供应高牢靠性的端到端数据通信。它所做的工作包括:供应高牢靠性的端到端数据通信。它所做的工作包括:n 发送方把应用程序交给它的数据分成合适的小块,并添加附加发送方把应用程序交给它的数据分成合适的小

16、块,并添加附加信息(信息(TCP头),包括依次号,源、目的端口,限制、纠错信息头),包括依次号,源、目的端口,限制、纠错信息等字段,称为等字段,称为TCP数据包。并将数据包。并将TCP数据包交给下面的网络层处数据包交给下面的网络层处理。理。n 接受方确认接收到的接受方确认接收到的TCP数据包,重组并将数据送往高层。数据包,重组并将数据送往高层。n5UDP(User Datagram Protocol,用户数据包协议),用户数据包协议)nUDP协议是一种无连接不行靠的传输层协议。它只是把应用程序协议是一种无连接不行靠的传输层协议。它只是把应用程序传来的数据加上传来的数据加上UDP头(包括端口号,

17、段长等字段),作为头(包括端口号,段长等字段),作为UDP数据包发送出去,但是并不保证它们能到达目的地。牢靠性由应数据包发送出去,但是并不保证它们能到达目的地。牢靠性由应用层来供应。用层来供应。n因为协议开销少,和因为协议开销少,和TCP协议相比,协议相比,UDP更适用于应用在低端的更适用于应用在低端的嵌入式领域中。很多场合如网络管理嵌入式领域中。很多场合如网络管理SNMP,域名解析,域名解析DNS,简,简洁文件传输协议洁文件传输协议TFTP,大都运用,大都运用UDP协议。协议。n6.端口端口 nTCP和和UDP接受接受16位的端口号来识别上层的位的端口号来识别上层的TCP用户,即上层应用户,

18、即上层应用协议,如用协议,如FTP和和TELNET等。常见的等。常见的TCP/IP服务都用众所周知服务都用众所周知的的1255之间的端口号。例如之间的端口号。例如FTP服务的服务的TCP端口号都是端口号都是21,Telnet服务的服务的TCP端口号都是端口号都是23。TFTP(简洁文件传输协议)(简洁文件传输协议)服务的服务的UDP端口号都是端口号都是69。2561023之间的端口号通常都是之间的端口号通常都是供应一些特定的供应一些特定的UNIX服务。服务。TCP/IP临时端口安排临时端口安排10245 000之间的端口号。之间的端口号。n7.1.4 网络编程接口nBSD套接字(BSD Soc

19、kets)运用的最广泛的网络程序编程方法,主要用于应用程序的编写,用于网络上主机与主机之间的相互通信。n很多操作系统都支持BSD套接字编程。例如,UNIX、Linux、VxWorks、Windows的Winsock基本上是来自BSD Sockets。n套接字(Sockets)分为Stream Sockets和Data Sockets。Stream Sockets是牢靠性的双向数据传输,对应运用TCP协议传输数据;Data Sockets是不行靠连接,对应运用UDP协议传输数。n下面给出一个运用套接字接口的UDP通信的流程。nUDP服务器端和一个UDP客户端通信的程序过程:n(1)创建一个Soc

20、ket:nsFd=socket(AF_INET,SOCK_DGRAM,0)n(2)把Socket和本机的IP,UDP口绑定:nbind(sFd,(struct sockaddr*)&serverAddr,sockAddrSize)n(3)循环等待,接收(recvfrom)或者发送(sendfrom)信息。n(4)关闭Socket,通信终止:nclose(sFd)n7.1.5 以太网的物理层接口及编程n大多数ARM都内嵌一个以太网限制器,支持媒体独立接口(Media Independent Interface MII)和带缓冲DMA接口(Buffered DMA Interface,BDI),可

21、在半双工或全双工模式下供应10M/100Mbps的以太网接入。在半双工模式下,限制器支持CSMA/CD协议;在全双工模式下,支持IEEE802.3MAC限制层协议。ARM内部虽然包含了以太网MAC限制,但并未供应物理层接口,因此,需外接一片物理层芯片以供应以太网的接入通道。n常用的单口10M/100Mbps高速以太网物理层接口器件均供应MII接口和传统7线制网络接口,可便利地与ARM接口。以太网物理层接口器件主要功能一般包括:物理编码子层、物理媒体附件、双绞线物理媒体子层、10BASE-TX编码解码器和双绞线媒体访问单元等。如CS8900、RTL8019/8029/8039等。nCS8900A

22、是Cirrus Logic公司生产的16位以太网限制器,芯片内嵌片内RAM10BASE-T收发滤波器,干脆ISA总线接口。该芯片的物理层接口、数据传输模式和工作模式等都能依据须要而动态调整,通过内部寄存器的设置来适应不同的应用环境。nCS8900A接受3V供电电压,最大工作电流55mA,具有全双工通信方式,可编程发送功能,数据碰撞自动重发,自动打包及生成CRC校验码,可编程接收功能,自动切换于DMA和片内RAM,提前产生中断便于数据帧预处理,数据流可降低CPU消耗,自动阻断错误包,可跳线限制EEPROM功能,启动编程支持无盘系统,边沿扫描和回环测试,待机和睡眠模式,支持广泛的软件驱动,工业级温

23、度范围,LED指示连接状态和网络活动状况等特点。接受TQFP-100封装。CS8900A内部结构方框图如图7.1.3所示。图7.1.3 CS8900A内部结构方框图n1CS8900A工作原理工作原理nCS8900A有两种工作模式:和有两种工作模式:和I/O模式。当配置成模式。当配置成MEMORY MODE模式操作时,模式操作时,CS8900A的内部寄存器和帧缓冲区映射到的内部寄存器和帧缓冲区映射到主机内存中连续的主机内存中连续的4KB的块中,主机可以通过这个块干脆访问的块中,主机可以通过这个块干脆访问CS8900A的内部寄存器和帧缓冲区。的内部寄存器和帧缓冲区。MEMORY 模式须要硬件上模式

24、须要硬件上多根地址线和网卡相连。而在多根地址线和网卡相连。而在I/O MODE模式,对任何寄存器操模式,对任何寄存器操作均要通过作均要通过I/O端口端口0写入或读出。写入或读出。I/O MODE模式在硬件上实模式在硬件上实现比较便利,而且这也是芯片的默认模式。在现比较便利,而且这也是芯片的默认模式。在I/O模式下,模式下,PacketPage存储器被映射到存储器被映射到CPU的的8个个16位的位的I/O端口上。在端口上。在芯片被加电后,芯片被加电后,I/O基地址的默认值被置为基地址的默认值被置为300H。n运用CS8900A作为以太网的物理层接口,在收到由主机发来的数据报后(从目的地址域到数据

25、域),侦听网络线路。假如线路忙,它就等到线路空闲为止,否则,马上发送该数据帧。在发送过程中,首先它添加以太网帧头(包括前导字段和帧起先标记),然后生成CRC校验码,最终将此数据帧发送到以太网上。n在接收过程中,它将从以太网收到的数据帧在经过解码、去帧头和地址检验等步骤后缓存在片内。在CRC校验通过后,它会依据初始化配置状况,通知主机CS8900A收到了数据帧,最终,用某种传输模式(FO模式、Memory模式、DMA模式)传到主机的存储区中。n2CS 8900A引脚端和功能引脚端和功能nCS 8900A的ISA总线接口引脚端和功能如表7.1.3所示,EEPROM和引导编程接口引脚端和功能如表7.

26、1.4所示,IOBASE-T接口引脚端和功能如表7.1.5所示,附加单元接口AUD引脚端和功能如表7.1.6所示,通用引脚端和功能如表7.1.7所示。引脚类型功能SA0:19I地址总线SD0:15I/O双向数据总线,三态输出RESETI复位输入端,高电平有效(至少保持400ns)AEN I地址使能,高电平有效MEMRI存储器读信号,低电平有效MEMWI存储器写信号,低电平有效MEMCS 16O存储器16位选择信号,OC(集电极开路)输出REFRESHI刷新信号,低电平有效。当REFRESH为低电平时,MEMR,MEMW,IOR,IOW,DMACK0,DMACKl和DMACK2都被忽略表7.1.

27、3 ISA总线接口引脚端和功能IORII/O读信号,低电平有效IOWII/O写信号,低电平有效IOCS 16I16位I/O片选信号,低电平有效IOCHRDYOI/O通道就绪信号,OC(集电极开路)输出SBHEI系统总线高位使能信号,低电平有效INTRQ0:2O中断请求信号,三态输出DMARQ0:2ODMA请求信号,三态输出DMACK0:2IDMA应答信号,低电平有效CHIPSELI片选信号,低电平有效表7.1.4 EEPROM和引导编程接口引脚端和功能引脚类型功能EESKIEEPROM时钟输入信号EECSIEEPROM片选输入信号,低电平有效EEDataINIEEPROM数据输入,内部上拉EL

28、CSI外部逻辑片选信号,内部上拉EEDataOUTOEEPROM数据输出CSOUTO外部引导编程选择信号输出,低电平有效表7.1.5 IOBASE-T接口引脚端引脚类型功能TXD+/TXDO数据发送,差分对管输出RXD/RXDI数据接收,差分对管输入表7.1.6 附加单元接口引脚端和功能引脚类型功能DO/DOOAUI数据输出,差分对管输出DI/DIIAUI数据输入,差分对管输入CI/CIIAUI振动输入,差分对管输入表7.1.7 通用引脚端和功能引脚类型功能XTAL 1:2I/O晶体振荡器输入输出SLEEPI硬件睡眠控制输入信号,低电平有效,内部上拉LINKLED/HCOO线路正常输出信号或主

29、控制器输出0信号,低电平有效,OC(集电极开路)输出BSTAUTS/HC1O总线状态输出信号或主控制器输出1信号,低电平有效,OC(集电极开路)输出LANLEDO网络状态指示输出信号,OC(集电极开路)输出TESTI测试输入使能信号,低电平有效,内部上拉RESI基准电阻输入端 DVDD 1:4I数字电路电源DVSS1:4I数字电路地AVDD 1:4I模拟电路电源AVSS1:4I模拟电路地3电路连接电路连接接受接受CS 8900A与与S3C2410A连接构成的以太网接口电路如图连接构成的以太网接口电路如图7.1.4所示。所示。n4CS8900A的以太网接口驱动程序的以太网接口驱动程序于明于明n(

30、1)初始化函数)初始化函数n初始化函数完成设备的初始化功能,由数据结构初始化函数完成设备的初始化功能,由数据结构device中的中的init函数指针来调用。加载网络驱动模块后,就会调用初始化过程。函数指针来调用。加载网络驱动模块后,就会调用初始化过程。首先通过检测物理设备的硬件特征来检测网络物理设备是否存在,首先通过检测物理设备的硬件特征来检测网络物理设备是否存在,之后配置设备所须要的资源。比如,中断。这些配置完成之后就之后配置设备所须要的资源。比如,中断。这些配置完成之后就要构造设备的数据结构要构造设备的数据结构device,用检测到的数据初始化,用检测到的数据初始化device中中的相关变

31、量,最终向的相关变量,最终向Linux内核中注册该设备并申请内存空间。内核中注册该设备并申请内存空间。函数定义为:函数定义为:nstatic int _init init_cs8900a_s3c2410(void)n n struct net_local*lp;n int ret=0;n dev_cs89x0.irq=irq;n dev_cs89x0.base_addr=io;n dev_cs89x0.init=cs89x0_probe;n dev_cs89x0.priv=kmalloc(sizeof(struct net_local),GFP_KERNEL);nif(dev_cs89x0.p

32、riv=0)nn printk(KERN_ERR cs89x0.c:Out of memory.n);n return-ENOMEM;n n memset(dev_cs89x0.priv,0,sizeof(struct net_local);n nlp=(struct net_local*)dev_cs89x0.priv;n request_region(dev_cs89x0.base_addr,NETCARD_IO_EXTENT,cs8900a);nspin_lock_init(&lp-lock);n/*boy,theyd better get these right*/n if(!strc

33、mp(media,rj45)n lp-adapter_cnf=A_CNF_MEDIA_10B_T|A_CNF_10B_T;n else if(!strcmp(media,aui)n lp-adapter_cnf=A_CNF_MEDIA_AUI|A_CNF_AUI;n else if(!strcmp(media,bnc)n lp-adapter_cnf=A_CNF_MEDIA_10B_2|A_CNF_10B_2;n elsen lp-adapter_cnf=A_CNF_MEDIA_10B_T|A_CNF_10B_T;nif(duplex=1)n lp-auto_neg_cnf=AUTO_NEG_

34、ENABLE;n if(io=0)n printk(KERN_ERR cs89x0.c:Module autoprobing not allowed.n);n printk(KERN_ERR cs89x0.c:Append io=0 xNNNn);n ret=-EPERM;n goto out;n n if(register_netdev(&dev_cs89x0)!=0)n printk(KERN_ERR cs89x0.c:No card found at 0 x%xn,io);n ret=-ENXIO;n goto out;n nout:n if(ret)n kfree(dev_cs89x0

35、.priv);n return ret;nn在这个网络设备驱动程序中,设备的数据结构device就是dev_cs89x0。探测网络物理设备是否存在,利用cs89x0_probe函数实现,通过调用register_netdrv(struct net_device*dev)函数进行注册。n与init函数相对应的cleanup函数在模块卸载时运行,主要完成资源的释放工作,如取消设备注册、释放内存、释放端口等。函数定义为:nstatic void _exit cleanup_cs8900a_s3c2410(void)n if(dev_cs89x0.priv!=NULL)n /*Free up the

36、private structure,or leak memory:-)*/n unregister_netdev(&dev_cs89x0);n outw(PP_ChipID,dev_cs89x0.base_addr+ADD_PORT);n kfree(dev_cs89x0.priv);n dev_cs89x0.priv=NULL;/*gets re-allocated by cs89x0_probe1*/n /*If we dont do this,we cant re-insmod it later.*/n release_region(dev_cs89x0.base_addr,NETCAR

37、D_IO_EXTENT);n nn(2)打开函数n打开函数在网络设备驱动程序中是在网络设备被激活时调用,即设备状态由down至up。函数定义为:nstatic int net_open(struct net_device*dev)nn struct net_local*lp=(struct net_local*)dev-priv;nint ret;n writereg(dev,PP_BusCTL,readreg(dev,PP_BusCTL)&ENABLE_IRQ);n ret=request_irq(dev-irq,&net_interrupt,SA_SHIRQ,cs89x0,dev);n i

38、f(ret)n printk(%s:request_irq(%d)failedn,dev-name,dev-irq);n goto bad_out;nnif(lp-chip_type=CS8900)nwritereg(dev,PP_CS8900_ISAINT,0);nelse nwritereg(dev,PP_CS8920_ISAINT,0);nwritereg(dev,PP_BusCTL,MEMORY_ON);nlp-linectl=0;n writereg(dev,PP_LineCTL,n readreg(dev,PP_LineCTL)|SERIAL_RX_ON|SERIAL_TX_ON)

39、;nlp-rx_mode=0;n writereg(dev,PP_RxCTL,DEF_RX_ACCEPT);n lp-curr_rx_cfg=RX_OK_ENBL|RX_CRC_ERROR_ENBL;nif(lp-isa_config&STREAM_TRANSFER)nlp-curr_rx_cfg|=RX_STREAM_ENBL;nwritereg(dev,PP_RxCFG,lp-curr_rx_cfg);n writereg(dev,PP_TxCFG,n TX_LOST_CRS_ENBL|TX_SQE_ERROR_ENBL|TX_OK_ENBL|n TX_LATE_COL_ENBL|TX_J

40、BR_ENBL|n TX_ANY_COL_ENBL|TX_16_COL_ENBL);n writereg(dev,PP_BufCFG,n READY_FOR_TX_ENBL|RX_MISS_COUNT_OVRFLOW_ENBL|n TX_COL_COUNT_OVRFLOW_ENBL|TX_UNDERRUN_ENBL);nwritereg(dev,PP_BusCTL,readreg(dev,PP_BusCTL)|ENABLE_IRQ);n enable_irq(dev-irq);n netif_start_queue(dev);n DPRINTK(1,cs89x0:net_open()succe

41、ededn);n return 0;nbad_out:n return ret;n n打开函数中对寄存器操作运用了两个函数:readreg和writereg。readreg函数用来读取寄存器内容,writereg函数用来写寄存器。函数定义为:ninline int readreg(struct net_device*dev,int portno)nnoutw(portno,dev-base_addr+ADD_PORT);nreturn inw(dev-base_addr+DATA_PORT);nninline void writereg(struct net_device*dev,int po

42、rtno,int value)nnoutw(portno,dev-base_addr+ADD_PORT);noutw(value,dev-base_addr+DATA_PORT);nn(3)关闭函数n关闭函数释放资源削减系统负担,设备状态有up转为down时被调用。函数定义为:nstatic int net_close(struct net_device*dev)nnnetif_stop_queue(dev);nwritereg(dev,PP_RxCFG,0);nwritereg(dev,PP_TxCFG,0);nwritereg(dev,PP_BufCFG,0);nwritereg(dev,

43、PP_BusCTL,0);nfree_irq(dev-irq,dev);n/*Update the statistics here.*/nreturn 0;nn(4)发送函数n首先,在网络设备驱动加载时,通过device域中的init函数指针调用网络设备的初始化函数对设备进行初始化,假如操作成功,就可以通过device域中的open函数指针调用网络设备的打开函数打开设备,再通过device域中的包头函数指针hard_header来建立硬件包头信息。最终,通过协议接口层函数dev_queue_xmit调用device域中的hard_start_xmit函数指针来完成数据包的发送。n假如发送成功,

44、hard_start_xmit释放sk_buff,返回0。假如设备短暂无法处理,比如,硬件忙,则返回l。此时假如dev-tbusy置为非0,则系统认为硬件忙,要等到dev-tbusy置0以后才会再次发送。tbusy的置0任务一般由中断完成。硬件在发送结束会产生中断,这时可以把tbusy置0,然后用mark_bh()调用通知系统可以再次发送。n在CS8900A驱动程序中,网络设备的传输函数dev-hard_start_xmit定义为net_send_ packet:nstatic int net_send_packet(struct sk_buff*skb,struct net_device*d

45、ev)nn struct net_local*lp=(struct net_local*)dev-priv;n writereg(dev,PP_BusCTL,0 x0);n writereg(dev,PP_BusCTL,readreg(dev,PP_BusCTL)|ENABLE_IRQ);n DPRINTK(3,%s:sent%d byte packet of type%xn,n dev-name,skb-len,n (skb-dataETH_ALEN+ETH_ALEN dataETH_ALEN+ETH_ALEN+1);n spin_lock_irq(&lp-lock);n netif_sto

46、p_queue(dev);n /*initiate a transmit sequence*/n writeword(dev,TX_CMD_PORT,lp-send_cmd);n writeword(dev,TX_LEN_PORT,skb-len);n /*Test to see if the chip has allocated memory for the packet*/nif(readreg(dev,PP_BusST)&READY_FOR_TX_NOW)=0)nn spin_unlock_irq(&lp-lock);n DPRINTK(1,cs89x0:Tx buffer not fr

47、ee!n);n return 1;n n /*Write the contents of the packet*/n writeblock(dev,skb-data,skb-len);n spin_unlock_irq(&lp-lock);n dev-trans_start=jiffies;n dev_kfree_skb(skb);n return 0;n n(5)中断处理和接收函数n网络设备接收数据通过中断实现,当数据收到后,产生中断,在中断处理程序中驱动程序申请一块sk_buff(skb),从硬件读出数据放置到申请好的缓冲区里。接下来,填充sk_buff中的一些信息。处理完后,假如是获得数

48、据包,则执行数据接收子程序,该函数被中断服务程序调用。函数定义:nstatic void net_rx(struct net_device*dev)nn struct net_local*lp=(struct net_local*)dev-priv;n struct sk_buff*skb;n int status,length;n int ioaddr=dev-base_addr;n status=inw(ioaddr+RX_FRAME_PORT);nif(status&RX_OK)=0)nn count_rx_errors(status,lp);n return;n n length=in

49、w(ioaddr+RX_FRAME_PORT);n /*Malloc up new buffer.*/n skb=dev_alloc_skb(length+2);nif(skb=NULL)nn lp-stats.rx_dropped+;n return;n n skb_reserve(skb,2),/*longword align L3 header*/n skb-len=length;n skb-dev=dev;n readblock(dev,skb-data,skb-len);n DPRINTK(3,%s:received%d byte packet of type%xn,n dev-na

50、me,length,n (skb-dataETH_ALEN+ETH_ALENdataETH_ALEN+ETH_ALEN+1);n skb-protocol=eth_type_trans(skb,dev);n netif_rx(skb);n dev-last_rx=jiffies;n lp-stats.rx_packets+;n lp-stats.rx_bytes+=length;n n在net_rx()函数中调用netif_rx()把数据传送到协议层。netif_rx()函数把数据放入处理队列,然后返回,真正的处理是在中断返回以后,这样可以削减中断时间。调用netif_rx()后,驱动程序不能

展开阅读全文
相关资源
相关搜索

当前位置:首页 > pptx模板 > 商业计划书

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com