Software and Algorithms 基于USB接口的无线网卡驱动研究与实现 孙文华 一.何荣高 , (1.重庆邮电大学通信新技术应用研究所,重庆400065; 2.重庆信科设计有限公司,重庆401121) 摘 要:针对无线网卡驱动结构复杂、编写困难的问题,提出了一种结构清晰、简单易行的无线 网卡驱动模型和设计实现方法:重点研究了USB设备驱动结构以及无线网卡数据包的接收和发送流 程。在嵌入式Linux平台下.设计了基于USB接口的无线网卡驱动,实现了对无线网卡芯片Reahek RTL8188的支持 同时,结合嵌入式软硬件开发平台,成功组建了无线局域网,对驱动程序进行了测 试。测试结果表明.无线网卡驱动运行平稳,实现了预期的目标 关键词:无线网卡;设备驱动:USB接口;嵌入式LiFItlX 中图分类号:TP391 文献标识码:A 文章编号:1674—7720(2015)21—0009—04 引用格式:孙文华,何荣高.基于USB接口的无线网卡驱动研究与实现fJ1.微型机与应用,2015,34(21):9—12. Research and implementation of wireless network card driver based on USB Sun Wenhua 一.He Ronggao ・ (1.Institute of Applied Communication Technology,Chongqing University of Posts and Telecommunications,Chongqing 400065,China 2.Chongqing Information Technology Co.,Ltd,Chongqing 401 121,China) Abstract:Aiming at the problem that complex structure of network card driver iS dimcult to implement.a new driver model and method to design it in Linux are introduced.The structure of USB device driver.data packet reception and transmission process of wireless network card are also deeply studied.Meanwhile,a wireless network card driver based Oil USB iS designed and the support for chip Reahek RTL8 1 88 by our system is achieved.What is more,combined with embedded hardware development platform,wireless loca1 area network iS successfully established and the validity of driver iS alSO tested.Finally.a result of expected and stable transmission speed,which meets the requirements.iS produced. Key words:wireless network card;device driver;USB;embedded Linux 0引言 随着无线通信技术的不断发展,无线局域网(WLAN) USB无线网卡驱动深入研究和分析.成功开发了其在嵌 入式DM3730平台下的驱动.实现了无线网络的接入 的使用日渐广泛。与传统有线网络相比,其优势主要体 现在高度可移动性、布线简单、组网便利和成本低廉等 方面…。而在嵌入式系统开发中,无线局域网的接入不 1系统硬件平台 远程视频监控系统中.智能无线网络摄像机主要承 担着图像采集、数据编码、网络传送等功能。硬件部分主 要由核心处理模块、网络传输模块、采集模块、存储模块 以及电源模块等组成,系统硬件开发平台如图1所示 核心处理模块采用TI公司的TMS320DM3730片上 系统,DM3730是针对高清视频产品市场推出的ARM+ 仅弥补了以往开发灵活性差和布线复杂等缺陷使开发 更加方便.同时可以实现系统的无线传输以满足特定场 合的应用 本文结合项目开发.提出了一种基于Reahek公司 RTL8188无线网卡芯片的无线传输系统方案.通过对 DSP双核架构处理器:采集模块中.CMOS传感器采用 《微型机与应用》2015年第34卷第21期 欢迎网上投稿WWW.pcachina.com 9 Software and Algorithms 采集模块 ;核心处理模块 0V27图像传感器厂15 CMOSL 堡里J 电源模块 调试模块 l 堡里 l电源管理芯片 TI TPS65950 一 DM3730 处理开发平台 网络传输模块 4GB存储模块 +4GB MCP IUSB接口 器 图1系统硬件结构图 OmniVision公司的0V2715图像传感器,其为专门为高 清视频监控而设计的支持1 080 P视频采集的图像传感 器。该系统网络传输模块采用Reahek公司生产的一款 基于802.1lg的无线网卡.采用RTL8188无线网络芯片. 采用简单灵活、即插即用的USB接口方式接人系统。 2无线网卡驱动模型 基于USB接口的无线网卡通过USB总线接入主机 系统.USB无线网卡驱动分为USB设备端驱动和网络设 备端驱动两部分 ,USB无线网卡驱动结构如图2所示。 操作系统协议栈 ^ ^ USB无线网卡驱动 l802.1 t MAC协议处理l 千 无线网卡驱动 I 接收和发送队列 j 十 塑堡垒堡些l l塑塑鱼垄垄J USB设备驱动 无线网卡硬件 图2 USB无线网卡驱动结构 2.1 USB设备驱动 Linux操作系统中.USB子系统驱动程序主要由USB 核心驱动(USBD)、USB主机控制器驱动(HCD)和具体 的USB设备驱动三部分组成[31。Linux下USB设备驱动 结构图如图3所示。 lUSB客户端设备驱动I USB子系统 0 lUSB核心驱动1 USB协议栈 USB主控制器驱动I 图3 Linux USB设备驱动结构图 USB核心驱动主要负责对USB设备的整体控制.包 括实现USB设备和主机控制器之间的通信,其内部封装 了一系列API.用以屏蔽来自不同设备的差异;USB主机控 制器驱动直接与硬件进行交互。主要负责对主机控制器硬 件设备初始化.向USB核心提供对应的接口,配置和控制 根H b设备等功能:USB客户端设备驱动程序负责与上层 应用软件模块交互并为其提供相应的接口,驱动具体的硬 件设备.将设备挂载到USB核心中使其正常运转『41。 10 编写USB客户端设备驱动时.内核提供了相应的接 口.只需实现基本的函数即可.最常用的结构体是starct usb driver,创建客户端程序需初始化其五个字段: (1)id table字段:是一个指向struct usb device table 结构体的指针.该结构指定了驱动程序能支持的所有 USB设备类型.主要由Vend0r id和Produet id对组成 (2)probe字段:探测指针,USB设备接入系统上电 后,会主动匹配相应的驱动程序.调用自定义探测函数. 完成主要的初始化工作 (3)disconnect字段:分离函数指针,总线设备被移除 或者驱动模块从系统中卸载时.将调用白定义分离函 数.主要完成内存释放和资源回收等工作 (4)OWDer和name字段:0wner指定该模块拥有者; name指定该驱动程序名称 usb driver结构体中的字段均被正确设置以后.调用 注册函数usb register(),函数将USB接口驱动程序注册 到USB核心 注册成功后.USB系统可以对无线网卡的 接入和移除操作作出相应的反应 若要网卡成功收发数 据.需实现其网卡网络设备驱动 2.2无线网卡驱动 无线网卡驱动主要负责屏蔽底层硬件设备具体细 节.向上层协议栈提供一致的数据发送和接收接口.驱 动硬件设备完成数据包收发等功能:无线网卡数据包发 送与接收过程主要用到stmct sk buff结构体[5_,其实际 用于描述套接字缓冲区结构.被用来在Linux系统网络 各层之间传递数据 无线网卡发送数据时.Linux在内核申请数据包 sk buff缓冲区.然后递交给下层.下层添加相关协议头 后直接交给硬件将数据包发送出去 无线网卡接收数据 时.将收到的数据包按照sk buff格式提交给上层.上层 剥离协议头后.交给上层应用程序调用_6_ 无线网卡设计与实现依赖于Linux系统提供的接 口.主要为struct ieee802l1 hw结构体.该结构体定义了 硬件设备发送、接收、初始化接口。实现无线网卡驱动主 要遵循三个步骤:首先,通过模块加载后分配得到一个 struct ieee80211 hw结构体:其次,对这个结构体的各个 字段进行设置和填充.完成硬件的相关配置:最后,利用 相应的注册函数向内核注册驱动 3无线网卡驱动设计与实现 无线网卡驱动_T作原理如下:模块加载时,系统首 先完成对USB设备的扫描和初始化t71.其次初始化网卡 硬件和状态.轮询是否有数据需要发送和接收:模块卸 载时.分别先后注销网络设备和USB设备,完成相关资 源的释放工作。无线网卡驱动设计流程图如图4所示。 3.1网卡初始化模块驱动设计 系统上电.Linux内核启动后会加载驱动模块。USB 无线网卡驱动向USB系统注册:当无线网卡插入USB 《微型机与应用》2015年第34卷第21期 Software and Algorithms 模块加载 注册USB驱动I —=二二 二 l探测设备l —— r 蚕受 l网卡初始化l II ———— ———一——网卡设备打开l——— r——一 发送处理函数1享襄>茎 =二二二 二=二二 注销USB驱动l l 塑塾l 图4无线网卡驱动设计流程图 总线时,USB c0re调用probe()方法来检测Vendor id和 Product id信息【8J.以确定无线网卡设备是否与驱动程 序匹配:匹配成功则进行网卡初始化,网卡初始化模块 设计流程如图5所示。 填充struct ieee8021 l_ops结构体 分配并创建网络设备 堕 分配DMA bufferl 关联接口和驱动用到的数据结构 初始化接收队列 设置网卡比特率.信道等参数 随机分配MAC地址 回收分配资源 初始化发送队列 【堡堡笙壅J 图5 网卡驱动初始化模块设计流程图 在该初始化模块中.系统为网卡分配了无线设备硬 件设备struct ieee80211 hw数据.用相关自定义函数对 该数据结构进行了填充:同时填充了描述无线网卡操作 的struct ieee80211 ops rt18188 ops结构体.该操作函数 主要包括网卡发送、接收、配置、移除接口等操作。 3.2网卡数据接收模块驱动设计 PCI、ISA等类型无线网卡具备IO/MEM映射、中断 和DMA等硬件资源.故可以通过中断来实现数据的接 收【9】:而USB无线网卡不具备这类资源.只能通过主机 轮询是否有数据需要读取或者接收。因此,首先向USB 核心申请一个读请求URB.用以数据到来时的存放。网 卡数据接收模块设计流程如图6所示 3.3网卡数据发送模块驱动设计 无线网卡发送数据通过对硬件设备的读写来完成。 《微型机与应用》2015年第34卷第21期 始接收数据 —— 有数壅 构造读请求URBl 校验URB长度和状态 将数据放人接收队列 去掉硬件帧头.将URB数据发送给上层函数处理 收过程结束 图6网卡数据接收模块设计流程图 当应用程序的数据被封装好传递到驱动层时.会调用 ieee8021 1一ops中的int( tx)(struct ieee8021 1一hw hw,struct sk buff*skb)函数指针指向的自定义发送函数进行协议头 相关处理.完成数据包的发送任务.最后更新网络接IZl 统计数据。数据发送模块驱动设计流程如图7所示。 图7 网卡数据发送模块驱动设计流程图 3.4其他关键驱动模块设计 在定义设备文件操作struct ieee80211 ops rtl8188 .ops 结构体中. start 指针指向打开函数tr18188 start(),当使用命令ifconfig配置无线网卡时,调 用该函数.主要完成分配资源.初始化接收和发送队列 等功能;stop指针指向rt18188 stop()函数,其工作与start 函数相反.当网卡由开启变为关闭时调用:add interface 指针指向添加接口函数.其在设备可用之前调用.用来 配置接1:3,可将接1:3配置成ad—h0c点对点模式、主机模 式或者monitor模式等;删除接口函数在stop之前调用, 主要功能是清除保存MAC地址.使设备不能接收数据 包。编写无线网卡驱动。以上几个数据结构必须要实现 4无线网卡驱动编译与测试 4.1驱动程序编译 首先,在主机上建立/driver/Bet/wireless/rt18188目录. 将相关源码和文件放到该目录中:其次.在宿主机上配 置内核相关选项,通过make menuconfig添加对WLAN 的支持:最后,编写相应的makefile文件。使用make命令 在系统中编译生成rt18188.ko驱动模块 在硬件平台系 统中安装有关无线管理程序,采用iwconfig、iwapv等命 令,配置网络的KEY、ESSID、接人模式等。 欢迎网上投稿www.pcachina.corn 11 4.2程序测试及结果分析 数据包,服务端接收后计算出对应的带宽速率.测试结 果如下表1所示。 经过多组数据发送接收试验.该无线网卡丁作正常. 结合特定硬件平台和相关开发环境的搭建.组建典型的 网络完成对无线网卡驱动的测试,网络拓扑如下图8所示。 l92.168.0.1 表1 网络速率测试结果图 在距离无线节点10 in半径范围内带宽速率为10.45 Mb/ 、 图8测试网络拓扑图 由以上结果得出.USB无线网卡收发数据功能已经 在调试窗口中.通过动态加载命令“insmod rtl8188. un札nnu实现且工作稳定.驱动读写相关寄存器等配置正确.真 缭嚣嚣老正实现了“驱动”硬件的功能.从而直接地验证了驱动编 ko”将无线网卡驱动模块下载到内核中.无线网卡接入 系统后,自动扫描并初始化网卡.通过lsmod命令查看 加载模块,网卡驱动加载成功后如图9所示 usB drtver regi5ter successfully sp353o¨53 0一L vei ;xbufs1e6doo。boy 酬 !m 州emk 20k1614 { }3285∞30o,Live oxbfl34OOO gpto 147920-LiveOXbfl2as1x4so2imeoxbf121黜o rootOSBC8530:{#m 图9无线网卡设备驱动加载成功后的状态 4.2.1 Ping连通性测试 利用ifconfig命令配置无线网卡IP地址、无线热点 ESSID和KEY.设置无线网卡接入无线路由.测试网卡 和路由器之问的连通性 USB无线网卡和路由器连通测 试结果如图10所示 root唾SBC8530: Pinq I92.168.0.1 PING 192.168.0 1 c1g2.168 0.1):56 data bytes 64 bytes from 192.168 0.1:5eq=O tt1=64 t ̄me=2.777 ms 64 bytes from 192.168.0.I:seq=l tt1=64 tim=4。517 ms 64 bytes frora 192.168.0.I:seq-2 tt1.64 t'me-1.648 ms 64 bytes from 192.168.0.1:seq=3 tt1=64 ttme-2.62 5 s 64 bytes fr∞192.168.0.i:seq- ̄4 tt1.64 t1me=6.562 ms 64 bytes from 192 168。0.1:seq=5 tt1=64 time=2.838 ms 64 bytes from 192.168.0.1:seq=6 tt1=64 time=1.892 ms 64 byte5 from i92.168.0.1:seq-7 tt1=64 ttme=2.197 IlI5 64 b es from 192 168.0.1:seq-8 ttI=64 time=1.770 m5 64 bytes fr饷i92.168 0.1:seq-g tt1.64 time=4.394 ms 192.168.0.1 pi r staristics… 10 packets-crartsmitted。10 packets rece ved。0 packet loss round—triP mjn/avg/max-1.¨S/3.122 /6.562 m5 图10无线网卡和路由器互通性测试结果 将主机IP地址和无线网卡设置在同一网段.测试 无线网卡和主机之间的互通性。主机IP地址为192.168. 0.88,通过命令ping之后的结果如图l1所示。 rOOt SBC8530:, pinq i92.I68.0.24 pING I92.168.0.24(i92.i68.0.24): 64 bytes from 192.168.0.24:sea-O 64 bytes from 192.168.o.24:seq=l 64 bytes from 192.168.0.24:seq-2 64 bytes fr伽i92.168.0.24:sea一3 64 bytes frora 192.168.0.24:sea—4 54 bytes fr伽●192.168.0.24:seq-5 64 bvtes fr 0|,I 192.168.0.24:seq=6 64 bvtes fr oIll 192.168.0.24:seq=7 64 hvtes froIn 192.168.0.24:seq-8 54 bytes fr锄192.168.o.24:seq=9 Z0一pa1[9ke2,1st6。m.0. 24 pit1t叼ed; 1aot s口tiaceske St…Fece{v ed| packet loss round—triP m{n/avg/max一2.2SS/S.511/as.024 ms 图11无线网卡和主机连通测试结果 通过以上结果可以得出.USB无线网卡、无线路由 器、主机之间是互通的.网卡和主机成功建立了网络连 接,无线网卡驱动工作正常,还需对其速率进行测试。 4.2.2网卡速率测试 编写网卡速率测试程序.该程序采用C/S模式.客 户端运行在开发板上.服务端运行在Linux PC上。测试 程序的主要工作流程如下:客户端分别发送大小不同的 12 写方案的合理性.同时间接地确认了模型的可行性 5结束语 本文介绍了一种USB无线网卡驱动模型.并对USB 设备驱动和网卡功能驱动进行了深入研究:在嵌入式硬 件平台上开发了USB无线网卡驱动.最后在搭建的网 络平台上完成了实验测试.验证了模型和程序的正确 性。文中提出的无线网卡驱动模型和实现方法.对相关 开发人员有一定的参考和指导价值 参考文献 【1]沈韬,李绍荣.无线网卡驱动分析与WLAN性能测试fJ】. 通信技术,2009,42(1O):105一i10. 『21陈立朋.基于Linux的USB无线网卡通用驱动框架设计 『D1.长春:吉林大学,2012. 『31郭吴.嵌入式“nux上USB无线网卡驱动的研究与实现 『D1.广州:暨南大学,2012. f41 VENKATESWARAN S.精通¨nuX设备驱动程序开发fM1. 宋宝华,何照然.史海滨,等译.北京:人民邮电出版社, 2010. 『51钱晓华,郭继红.基于嵌入式linux的无线网卡驱动程序 [J].辽宁大学学报(自然科学版),2008,6(2):55—57. 『61叶学程,郑霖.嵌入式Linux的USB—Chirp无线网卡驱动 设计【J].单片机与嵌入式系统应用,2014(7):53—56. f71王标。郭敏,单保慈.基于ARM的无线网卡设备驱动设 计【J].现代电子技术,2009(7):101—103. [8】Zhang Xiaoming,Song Xiaoying.Net devise drive program s research and implement in embedded Linux operating sys— tem[C].Computer Science—Technology and Applications. 2009,IFCSTA 039;09.International Forum on.IEEE, 2009:172—174. 『91杨勇,叶梅,张秦艳,等.基于ARM的嵌入式Linux无线 网卡设备驱动研究[J】.核电子学与探测技术,2010,30 (4):519—523. (收稿日期:2015—07—09) 作者简介: 孙文华(1990一),男,在读研究生,主要研究方向:嵌入式 系统驱动、视频监控。 何荣高(1987一),男,在读研究生,主要研究方向:无线网 络优化、基站勘察设计等。 《微型机与应用》2015年第34卷第21期