努力成为linux kernel hacker的人李万鹏原创作品,为梦而战。转载请标明出处
http://blog.csdn.net/woshixingaaa/archive/2011/06/18/6552911.aspx
这里主要讨论中断处理和数据的发送和接收,这个也是网卡驱动最重要的部分了。
中断处理函数:
发生中断的情况有3中:1)接收到数据2)发送完数据3)链路状态改变
下面说一下DM9000A中的存储部分,DM9000A内部有一个4K Dword SRAM,其中3KB是作为发送,16KB作为接收,如下图所示。其中0x0000~0x0BFF是传说中的TX buffer(TX buffer中只能存放两个包),0x0C00~0x3FFF是RX buffer。因此在写内存操作时,当IMR的第7位被设置,如果到达了地址的结尾比如到了3KB,则回卷到0。相似的方式,在读操作中,当IMR的第7位被设置如果到达了地址的结尾比如16K,则回卷到0x0C00。
那么传说中的发送函数又是哪个呢,在probe函数里进行了初始化函数指针操作。
可以看到当上层调用hard_start_xmit时,在我们的驱动程序中实际调用的是dm9000_start_xmit,下面来分析一dm9000_start_xmit的源码。
发送函数:
下面来看一下刚才提到的那个超时函数,发送超时函数:
这个函数首先停止了发送队列,然后复位dm9000,初始化dm9000,重新设置了时间戳,然后唤醒发送队列,通知网络子系统可再次传输数据包。
发送完成后的中断处理函数:
接收函数:
每接受到一个包,DM9000都会在包的前面加上4个字节,"01H",status与RSR(RX Status Register)的内容相同,"LENL"(数据包长度低位位),"LENH"(数据包长度高8位)。所以首先要读取这4个字节来确定数据包的状态,第一个字节"01H"表示接下来的是有效的数据包,"00H"表示没有数据包,若为其他值则表示网卡没有正确初始化,需要从新初始化。这4个字节封装在一起:
清晰一些如下图:
接收函数如下:
如下图链路层包的传输过程:
在netif_rx中会调用napi_schedule,然后该函数又会去调用__napi_schedule()。在函数__napi_schedule()中会去调用设备的poll函数,它是设备自己注册的。在设备的poll函数中,会去调用netif_receive_skb函数,在该函数中有下面一条语句pt_prev->func,此处的func为一个函数指针,在之前的注册中设置为ip_rcv。因此,就完成了从链路层上传到网络层的这一个过程了。
分享到:
相关推荐
Linux驱动修炼之道-DM9000A网卡驱动框架源码分析(下).pdf Linux驱动修炼之道-DM9000A网卡驱动框架源码分析(上).pdf Linux驱动修炼之道-clock框架.pdf Linux驱动修炼之道-ADC驱动.pdf Linux内核访问外设I...
成功移植U-BOOT之----DM9000网卡驱动.pdf
dm9000网卡驱动分析 dm9000网卡驱动分析 dm9000网卡驱动分析 dm9000网卡驱动分析 dm9000网卡驱动分析
网卡开发必须要熟悉的驱动流程 dm9000网卡驱动分析
Web_uIP--DM9000
网卡dm9000a的数据手册,适用于进行dm9000a网卡驱动开发的软件工程师使用
包括linux wince 单片机的DM9000A的官方驱动 包括linux wince 单片机的DM9000A的官方驱动
嵌入式linux上的dm9000网卡驱动源代码和Makefile编译驱动文件源代码
ok6410 u-boot dm9000 驱动补丁 patch
smdk2440-T35B-DM9000-20090309,
arm9开发板上 dm9000网卡驱动程序分析
linux内核的DM9000网卡驱动,注意:对于linux源码中已经存在的驱动文件,网络驱动内容只需要修改一下几点:网卡基地址,中断号,网卡工作模式,中断触发方式.
本u-boot由本人调通,cpu为s3c2440,开发板pw2440,支持nand启动、读、写,支持yaffs2文件系统下载,支持DM9000A网卡,TFTP下载,引导linux内核,最大特色是支持USB下载内核和文件系统,使你的调试变得快捷方便,复杂...
dm9000 for 2410--dm9000 for 2410--dm9000 for 2410
linux设备驱动中的网卡驱动(DM9000),源代码分析,通俗易懂
从英文DM9000A网卡芯片资料翻译而成,中文手册,很完全
使用FPGA驱动DM9000A网络芯片,实现网络包的首发
单片机驱动DM9000网卡芯片(详细调试过程).pdf
基于西安百特BSP,添加了DM9000A的网络驱动,驱动能跑,但未完善。
基于嵌入式Linux的DM9000A驱动的实现.pdf