Vxworks嵌入式操作系统下网络设备驱动程序设计_嵌入式系统论文
作者email: cai_yang@etang.com 摘 要:本文主要介绍在vxworks操作系统下网络设备驱动程序设计、调试方法以及将其加入系统内核的配置方法。 关键词:vxworks 嵌入式操作系统 网络设备 引 言 1 嵌入式系统 嵌入式系统主要由嵌入式处理器、外围硬件设备、嵌入式操作系统以及特定的应用程序等四部分组成,是集软硬件于一体的可独立工作的“器件”;用于实现对其它设备的控制、监视或管理等功能。 嵌入式系统应具有的特点是:要求高可靠性;在恶劣的环境或突然断电的情况下,要求系统仍然能够正常工作;许多嵌入式应用要求实时处理能力,这就要求嵌入式操作系统(eos)具有实时处理能力;嵌入式系统中的软件代码要求高质量、高可靠性,一般都固化在只读存储器中或闪存中,也就是说软件要求固态化存储,而不是存储在磁盘等载体中。 2 设备驱动程序 vxworks5.4中驱动程序主要分为三种:字符、块以及网络驱动程序。本文所介绍的网卡驱动程序则属于网络设备驱动程序。 2.1 网络设备驱动程序设计 网络的各功能部件图1所示,网络设备驱动程序实际上是处理硬件和上层协议之间的接口程序。网络传输协议层分发数据在应用程序接口和网络接口之间。网络化网络协议(如ip协议)发送数据在网络主机之间。连接/接口层使能主机隶属于硬件到相同媒质的通信。 在vxworks5.4中,网卡驱动程序又分为end(enhanced network driver)和bsd两种。它们分别处于如图2所示结构中。 2.1.1 bsd驱动程序设计 在vxworks5.4中,网络驱动程序都是基于bsd unix版本4.3基础上的,这些驱动程序都定义在一个全局例程中,那就是attach子程序,xxattach( )子程序中包含5个函数指针,它们都被映射到ifnet结构中,这5个函数可见表1,它们在ip协议层任何地方被调用。 表1 网络接口处理
驱动程序入口xxattach( )调用ether_attach( )来把上述5个函数映射到ifnet结构中,ether_attach( )调用如下: ether_attach( 接着下面那一句代码表示添加数据传输例程到idr,ether_output( )例程被调用后,传输开始例程就被tcp/ip协议堆栈调用。 在这个入口驱动程序中还包括设备的初始化、发送和接收描述符的初始化等。 2.1.2 end驱动程序设计 end驱动程序是基于mux模式,网络驱动程序被划分为协议组件和硬件组件。mux数据链路层和网络层之间的接口,它管理网络协议接口和低层硬件接口之间的交互;将硬件从网络协议的细节中隔离出来;删除使用输入钩例程来过滤接收从协议来的数据包,和删除了使用输出钩例程来过滤协议包的发送;并且链路层上的驱动程序需要访问网络层(ip或其他协议)时,也会调用相关的mux例程。值得注意的是,网络层协议和数据链路层驱动程序不能直接通讯,它们必须通过mux。如图3所示:
2.3将驱动程序加载到vxworks系统中 要对所设计的驱动程序进行测试,首先就必须把驱动程序加载到vxworks image中,并且给设备分配一个ip,这样才能有利于网间测试。 首先,修改confignet.h文件,添加如下代码: #ifdef include_dm_9102_end #define dm_9102_buff_loan_0 1 #define dm_9102_load_func sysdm9102endload #define dm_9102_load_str_0 "" import end_obj * dm_9102_load_func (char *, void *); 和end_tbl_entry enddevtbl [] 中添加 #ifdef include_dm_9102_end {0, dm_9102_load_func, dm_9102_load_str_0, true, null, false}, #endif /* include_dm_9102_end */ 其次,编辑config.h文件,添加如下代码: #define include_dm_9102_end /* davicom 9102 fast ethernet controller */ 最后,编辑syslib.c文件,添加如下代码: /* include dm9102 end driver support routines */ #ifdef include_dm_9102_end import status sysdm9102pciinit (void); #endif /* include_dm_9102_end */
/* include dm9102end driver support routines */ #ifdef include_dm_9102_end #include "sysdm9102end.c" #endif /* include_dm_9102_end */ #ifdef include_dm_9102_end sysdm9102pciinit (); #endif /* include_dm_9102_end */ 通过上述过程相应的添加程序,然后重新编译vxworks,这样就将所设计的网卡驱动程序添加到vxworks内核中了。 2.4 pci设备检测 如果所设计的网卡是基于pci总线的,那么在程序开始就需要对pci设备进行检测,在vxworks5.4中有专门的pci函数来检测设备的总线号、设备号和功能号。首先利用pcifinddevice( )函数对给定vendorid和deviceid的设备进行检测,检测完后同时给出了设备的总线号、设备号和功能号;接下来就是获得该设备的中断号、基地址(包括io和内存)。vxworks中pciconfiglib.h文件中定义pci总线的常量。如中断号:pci_cfg_brg_int_line,io基地址:pci_cfg_base_address_0,内存基地址:pci_cfg_base_address_1等等。所以利用函数pciconfiginbyte和pciconfiginlong就可以很容易地获得设备的中断号和基地址。 2.5 调试方法 为了方便调试网卡驱动程序,推荐利用串口对程序进行下载并将vxworks image拷贝到软盘中以从软盘来加载它。调试的时候首先应该给网卡分配一个ip(利用usrnetifconfig函数),然后利用ping来对网卡进行测试。 3 结语 利用上述方法所设计的网卡后,不久可以利用它来进行程序下载,而且能满足网卡所有的功能,包括对tcp/ip和udp/ip(组播、广播和单播)进行了测试。 |