嵌入式学习-驱动开发-lesson7.2-DM9000驱动流程分析

dm9000网卡驱动深度分析

下面的dm9000的分析只是简单的分析,并不全面,可能会有一些遗漏和错误的地方,更加详细的dm9000分析,请参考下面这两位大牛的博客:
zhongli_i大牛:
dm9000网卡驱动分析1
http://blog.chinaunix.net/uid-26442066-id-3184195.html
dm9000网卡驱动分析2
http://blog.chinaunix.net/uid-26442066-id-3184329.html
dm9000网卡驱动分析3
http://blog.chinaunix.net/uid-26442066-id-3184410.html
dm9000网卡驱动分析4
http://blog.chinaunix.net/uid-26442066-id-3184444.html

闫明大牛的博客:
ARM-Linux驱动–DM9000网卡驱动分析(一)
http://blog.csdn.net/geekcome/article/details/6609742
ARM-Linux驱动–DM9000网卡驱动分析(二)
http://blog.csdn.net/geekcome/article/details/6612623
ARM-Linux驱动–DM9000网卡驱动分析(三)
http://blog.csdn.net/geekcome/article/details/6615027
ARM-Linux驱动–DM9000网卡驱动分析(四)
http://blog.csdn.net/geekcome/article/details/6628624

1)初始化

这里写图片描述
注册平台驱动程序,我们知道,平台设备驱动程序,当匹配上时,会调用匹配函数,因此我们主要分析匹配函数。

1注册平台驱动

platform_driver_register(&dm9000_driver);

2.分配net_device结构

这里写图片描述

3.获取资源

这里写图片描述
获取到了中断号和地址和数据资源,关于平台总线,我们,我们知道设备和驱动是通过id或者设备名字来匹配的,因此可以在网卡驱动对应的平台设备上找到相应的设备名,如下:

这里写图片描述

这里写图片描述
通过上面两幅图可以看到设备的名字 .name = “dm9000”和驱动的三个资源的描述。

4. 映射,把获取到的两个资源地址映射为虚拟地址

这里写图片描述

5.读取芯片类型

这里写图片描述

6设置操作函数集

这里写图片描述

7.读MAC地址

这里写图片描述

8.注册网卡驱动

这里写图片描述
使用register_netdev函数注册网卡驱动,

总结:当网卡驱动和网卡设备匹配上之后,调用probe函数,进行一系列的初始化,包括:net_device结构的初始化,设备的初始化(包括设备硬件资源,mac地址等)和网卡驱动的注册。

硬件的初始化在open函数中,当使用ifconfig命令时,就调用open函数,打开网络设备,获取相应的资源。
这里写图片描述

这里写图片描述
在open函数的说明中强调了这一点

9.硬件初始化,初始化dm9000中net_device结构中的成员

这里写图片描述

这里写图片描述
在dm9000_init_dm9000函数中,主要是对dm9000的硬件寄存器进行初始化。

10.注册中断

这里写图片描述

11.启动发送队列,协议栈向网卡发送

这里写图片描述

2)发送

发送函数是在dm9000_start_xmit,主要做的工作就是将上层即设备无关接口传输过来的数据写入寄存器然后发送走,这一点和cs89000.c中的发送流程略有不同。
这里写图片描述

1.将skb中的数据写入dm9000网卡寄存器

这里写图片描述

2.如果是第一次发送,直接发送走,使用dm9000_send_packet函数

3.如果不是第一次发送,通知协议栈,暂停向驱动传送数据,netif_stop_queue

这里写图片描述

4.在dm9000_send_packet函数中启动发送

这里写图片描述

5 释放skb结构

这里写图片描述

发送完成之后会释放skb

6.唤醒等待队列

发送完一个数据包之后,会产生一个中断,在中断处理函数中,会通知协议栈发送数据,启动发送队列—netif_wake_queue

这里写图片描述

这里写图片描述

3)接收

dm9000在收到一个包的时候,会产生一个中断。因此,其接收过程是在中断处理函数中被调用。
这里写图片描述

1.调用中断接收处理函数dm9000_rx

2 空读
在空读的过程中,等待包被完整的接收
这里写图片描述

3 读取状态和数据包的长度

这里写图片描述

4 读取数据
从dm9000的寄存器中读取数据,并将其放入skb中
这里写图片描述

5.将收到的skb交给协议栈处理
这里写图片描述

具体流程图如下所示:
这里写图片描述

到此,dm9000的几个主要的部分粗略的分析了一下,只是简单的分析其流程,并没有对其中的函数进行具体分析,驱动涉及到了很多东西,现在只是有个大致的了解,然后接下来自己对整个驱动进行更深入的学习。驱动之路,继续走起。。。。。。

菜鸟一枚,如有错误,多多指教。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值