chapter17 网络设备驱动
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2013-11-5
DM9000简介
1.主要功能模块和特点 DM9000是一款完全集成的和符合成本效益单芯片快速以太网 MAC控制器与一般处理接口,一个10/100M自适应的PHY和4K DWORD值的SRAM 。它的目的是在低功耗和高性能进程的3.3V 与5V的支持宽容。 DM9000还提供了介质无关的接口,来连接所有提供支持介质无 关接口功能的家用电话线网络设备或其他收发器。该DM9000支 持8位,16位和32位接口访问内部存储器,以支持不同的处理器 。DM9000物理协议层接口完全支持使用10MBps下3类、4类、5 类非屏蔽双绞线和100MBps下5类非屏蔽双绞线。这是完全符合 IEEE 802.3u规格。它的自动协调功能将自动完成配置以最大限 度地适合其线路带宽。还支持IEEE 802.3x全双工流量控制。 DM9000工作原理简单,用户可以容易的移植任何系统下的端口 驱动程序。
Page 21 机械工业出版社 2013-11-5
打开网络设备
网络设备的打开(open)方法的作用就是激活网络接口,使它能 接收来自网络的数据并且传递到网络协议栈的上层,也可以将数 据发送到网络上。 代码分析:
Page 22
机械工业出版社
2013-11-5
关闭网络设备
网络设备的关闭(stop)方法用于停止网络设备,它的作用与 open方法相反,DM9000网卡设备的关闭方法由dm9000_stop函数 实现。 代码分析:
Page 10
机械工业出版社
2013-11-5
5.接收(reception) 一般设备收到数据后都会产生一个中断,在中断处理程序中驱动 程序申请一块sk_buff(skb),从硬件读出数据放置到申请好的 缓冲区里,接下来填充sk_buff中的一些信息。skb->dev=dev,判 断收到帧的协议类型,填入skb->protocol(多协议的支持)。把 指针skb->mac.raw指向硬件数据然后丢弃硬件帧头(skb_pull) 。还要设置skb->pkt_type,标明第二层(链路层)数据类型。
Page 20 机械工业出版社 2013-11-5
关于注册的网络设备驱动结构dm9000_driver的定义如下: static struct platform_driver dm9000_driver = { .driver = { .name = "dm9000", /*用这个名字完成驱动和设备的match*/ .owner = THIS_MODULE, }, .probe = dm9000_probe, .remove = __devexit_p(dm9000_drv_remove), .suspend = dm9000_drv_suspend, .resume = dm9000_drv_resume, };
Page 7 机械工业出版社 2013-11-5
2.打开(ndo_open) open函数在网络设备驱动程序中用于网络设备的激活,即设备状 态由down转变为up。在实际的驱动程序开发中,很多在初始化 中的工作可以在这里做。比如资源的申请、硬件的激活。如果 dev->open返回非0(error),则硬件的状态还是down。open方 法的另一个作用是,如果驱动程序作为一个模块被装入,则要防 止模块卸载时设备处于打开状态。在open方法里要调用 MOD_INC_USE_COUNT宏。
Page 17
机械工业出版社
2013-11-5
DM9000网卡接口电路
图17-3 DM9000接口路
Page 18 机械工业出版社 2013-11-5
17.3实例进阶:DM9000设备驱动程序
网络驱动程序主要完成系统的初始化、数据包的发送和接收。在 以前的内核版本中,网络设备的初始化主要由net_device数据结 构中的init函数指针所指向的初始化函数来完成。在现在较新的 2.6内核中,网络设备的初始化主要由device_driver数据结构中的 probe函数指针所指向的函数来完成。数据包的发送和接收是实 现Linux网络驱动程序中两个关键的过程,对这两个过程处理的 好坏将直接影响到驱动程序的整体运行质量。
Page 9
机械工业出版社
2013-11-5
4.发送(ndo_start_xmit) 所有的网络设备驱动程序都必须有这个发送方法。在系统调用驱 动程序的xmit时,发送的数据放在一个sk_buff结构中。一般的驱 动程序把数据传给硬件发出去,也有一些特殊的设备,比如, loopback把数据组成一个接收数据再回送给系统,或者dummy设 备直接丢弃数据。
Page 4
dev_queue_xmit()
netif_rx()
网络协议接口层
struct device
网络设备接口层
数据发送包
中断处理 (数据包接收)
设备驱动功能层
网络物理设备媒介
设备媒介层
图17-1 网络设备驱动程序体系结构
机械工业出版社
2013-11-5
主要数据结构
1.net_device结构 网络设备数据结构net_device是整个网络体系的中枢,定义了很 多供系统访问和协议层调用的设备标准的方法,包括设备初始化 和向系统注册用的init函数,打开和关闭网络设备的open函数和 stop函数,处理数据包发送的hard_start_xmit函数,以及中断处 理函数,接口状态统计函数等,它的定义在 /include/linux/netdevice.h中。数据结构device操作的数据对象— —数据包是通过数据结构sk_buff来封装的。
Page 16 机械工业出版社 2013-11-5
Байду номын сангаас 工作原理简介
DM9000基本工作原理是:在收到由主机发来的数据报后,侦听 网络线路。如果线路忙,它就等到线路空闲为止,否则,立即发 送该数据帧。发送过程中,首先,它添加以太网帧头(包括先导 字段和帧开始标志),然后,生成CRC校验码,最后,将此数据 帧发送到以太网上。接收时,它将从以太网收到的数据帧在经过 解码、去掉帧头和地址检验等步骤后缓存在片内。在CRC校验通 过后,它会根据初始化配置情况,通知主机DM9000收到了数据 帧,最后,用某种传输模式传到主机的存储区中。
Page 2
机械工业出版社
2013-11-5
17.1网络设备驱动简介
Linux网络设备与字符设备和块设备主要区别是,字符设备和块 设备有一个特殊的文件作为其设备节点,网络设备是通过套接字 (Socket)接口用于实现了事务处理。网络接口主要是内核网络 子程序负责驱动,它负责发送和接收数据包,而无需了解每次事 务是如何映射到实际被发送的数据包。
Page 6
机械工业出版社
2013-11-5
基本函数
1.初始化(ndo_init) 驱动程序初始化主要是把驱动程序载入系统的时候会调用它,可 以完成以下几方面的工作: 检测设备,在初始化程序里可以根据硬件的特征检查硬件是否存 在,然后决定是否启动这个驱动程序。 配置和初始化硬件,在初始化程序里可以完成对硬件资源的配置 ,比如,即插即用的硬件就可以在这个时候进行配置。 申请这些资源,配置或协商好硬件占用的资源以后,可以向系统 申请这些资源。 有些资源是可以和别的设备共享的,如中断。有些是不能共享的 ,如IO、DMA。接下来要初始化device结构中的变量。最后,可 以让硬件正式开始工作。
Page 5
机械工业出版社
2013-11-5
2.sk_buff结构 sk_buff结构主要用来完成TCP/IP中不同协议层间,以及与网络 驱动程序之间数据包的传递,这个结构体主要包括传输层、网络 层、连接层需要的变量,决定数据区位置和大小的指针,以及发 送接收数据包所用到的具体设备信息等。根据网络应用的特点, 对链表的操作主要是删除链表头的元素或添加元素到链表尾。
Page 11
机械工业出版社
2013-11-5
6.硬件帧头(header_ops->creater) 硬件一般都会在上层数据发送之前加上其硬件帧头,比如,以太 网就有14字节的帧头。这个帧头是加在上层ip、ipx等数据包的前 面的。
Page 12
机械工业出版社
2013-11-5
7.地址解析(xarp) 有些网络有硬件地址,并且在发送硬件帧时需要知道目的硬件地 址。这样就需要上层协议地址(ip、ipx)和硬件地址的对应,这 个对应是通过地址解析完成的。需要处理arp的设备在发送之前 会调用驱动程序的rebuild。调用的主要参数包括指向硬件帧头的 指针和协议层地址。如果驱动程序能够解析硬件地址,就返回1 ,如果不能,返回0。
第1章嵌入式系统的定制及配置使用
【学习目标】 •介绍了网络设备驱动模型 •介绍了DM9000网卡的接口电路 •详细分析了DM9000网络驱动代码
Page 1
机械工业出版社
2013-11-5
第17章 网络设备驱动
17.1
网络设备驱动简介 DM9000网卡设备
17.2
17.3
实例进阶:DM9000设备驱动程序
Page 19
机械工业出版社
2013-11-5
初始化网络设备
DM9000网卡设备驱动的初始化主要由device_driver数据结构中 的probe函数指针所指向的初始化函数来完成,当内核启动或加 载网络驱动模块的时候,就会调用这个初始化函数。该模块加载 函数实现如下:
static int __init dm9000_init(void) { printk(KERN_INFO "%s Ethernet Driver, V%s/n", CARDNAME, DRV_VERSION); return platform_driver_register(&dm9000_driver); }
Page 13
机械工业出版社
2013-11-5
8.参数设置和统计数据 在驱动程序里还提供一些方法供系统对设备的参数进行设置和读 取信息。一般只有超级用户(root)权限才能对设备参数进行设 置。设置方法有: dev->ndo_set_mac_address(),当用户调用ioctl类型为 SIOCSIFHWADDR时是要设置这个设备的mac地址。一般对mac 地址的设置没有太大意义的。 dev->ndo_set_config(),当用户调用ioctl时类型为SIOCSIFMAP 时,系统会调用驱动程序的set_config方法。用户会传递一个 ifmap结构,其包含需要的I/O、中断等参数。 dev->ndo_do_ioctl(),如果用户调用ioctl时类型在 SIOCDEVPRIVATE和SIOCDEVPRIVATE +15之间,系统会调 用驱动程序的这个方法。一般是设置设备的专用数据。
Page 14 机械工业出版社 2013-11-5
17.2 DM9000网卡设备
随着以太网在不同领域的广泛应用和发展,各种以太网控制芯片 层出不穷,DM9000就是其中性能十分优良的一款。它主要为嵌 入式应用系统、便携式产品和某些适配卡等提供一种切实可行的 以太网解决方案。
Page 15
机械工业出版社
Page 3
机械工业出版社
2013-11-5
驱动程序体系结构
Linux网络系统大体分为硬件层、 设备驱动层、网络协议层和应用 层。其中,网络协议层将收到的 数据包通过设备驱动的发送函数 被发送到具体的通信设备上,通 信设备将传来的数据也在设备驱 动程序的接收函数中被解析,并 组成相应的数据包传给网络协议 层。要实现一个网络设备驱动程 序的主要工作只是根据具体的硬 件设备向它的高层提供服务而已 ,这与字符设备、块设备的思路 都是一样的。整个网络设备驱动 程序体系结构如图17-1所示。
Page 8
机械工业出版社
2013-11-5
3.关闭(ndo_stop) close是释放某些资源以减少系统负担,与open动作刚好相反。 close是在设备状态由up转为down时被调用的。另外,如果是作 为模块装入的驱动程序,close里应该调用 MOD_DEC_USE_COUNT,减少设备被引用的次数,以使驱动 程序可以被卸载。除此之外,close方法必须返回成功( 0==success)。