您的位置:首页 > 其它

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

2016-08-10 21:44 676 查看
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的几个主要的部分粗略的分析了一下,只是简单的分析其流程,并没有对其中的函数进行具体分析,驱动涉及到了很多东西,现在只是有个大致的了解,然后接下来自己对整个驱动进行更深入的学习。驱动之路,继续走起。。。。。。

菜鸟一枚,如有错误,多多指教。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: