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

时间:2021-04-30 17:13:10

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)初始化

嵌入式学习-驱动开发-lesson7.2-DM9000驱动流程分析
注册平台驱动程序,我们知道,平台设备驱动程序,当匹配上时,会调用匹配函数,因此我们主要分析匹配函数。

1注册平台驱动

platform_driver_register(&dm9000_driver);

2.分配net_device结构

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

3.获取资源

嵌入式学习-驱动开发-lesson7.2-DM9000驱动流程分析
获取到了中断号和地址和数据资源,关于平台总线,我们,我们知道设备和驱动是通过id或者设备名字来匹配的,因此可以在网卡驱动对应的平台设备上找到相应的设备名,如下:

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

嵌入式学习-驱动开发-lesson7.2-DM9000驱动流程分析
通过上面两幅图可以看到设备的名字 .name = “dm9000”和驱动的三个资源的描述。

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

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

5.读取芯片类型

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

6设置操作函数集

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

7.读MAC地址

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

8.注册网卡驱动

嵌入式学习-驱动开发-lesson7.2-DM9000驱动流程分析
使用register_netdev函数注册网卡驱动,

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

硬件的初始化在open函数中,当使用ifconfig命令时,就调用open函数,打开网络设备,获取相应的资源。
嵌入式学习-驱动开发-lesson7.2-DM9000驱动流程分析

嵌入式学习-驱动开发-lesson7.2-DM9000驱动流程分析
在open函数的说明中强调了这一点

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

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

嵌入式学习-驱动开发-lesson7.2-DM9000驱动流程分析
在dm9000_init_dm9000函数中,主要是对dm9000的硬件寄存器进行初始化。

10.注册中断

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

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

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

2)发送

发送函数是在dm9000_start_xmit,主要做的工作就是将上层即设备无关接口传输过来的数据写入寄存器然后发送走,这一点和cs89000.c中的发送流程略有不同。
嵌入式学习-驱动开发-lesson7.2-DM9000驱动流程分析

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

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

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

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

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

4.在dm9000_send_packet函数中启动发送

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

5 释放skb结构

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

发送完成之后会释放skb

6.唤醒等待队列

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

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

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

3)接收

dm9000在收到一个包的时候,会产生一个中断。因此,其接收过程是在中断处理函数中被调用。
嵌入式学习-驱动开发-lesson7.2-DM9000驱动流程分析

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

2 空读
在空读的过程中,等待包被完整的接收
嵌入式学习-驱动开发-lesson7.2-DM9000驱动流程分析

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

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

4 读取数据
从dm9000的寄存器中读取数据,并将其放入skb中
嵌入式学习-驱动开发-lesson7.2-DM9000驱动流程分析

5.将收到的skb交给协议栈处理
嵌入式学习-驱动开发-lesson7.2-DM9000驱动流程分析

具体流程图如下所示:
嵌入式学习-驱动开发-lesson7.2-DM9000驱动流程分析

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

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