×

基于USB接口的无线网卡驱动研究与实现资料下载

消耗积分:2 | 格式:pdf | 大小:585.62KB | 2021-04-07

郑成枝

分享资料个

摘 要: 针对无线网卡驱动结构复杂、编写困难的问题,提出了一种结构清晰、简单易行的无线网卡驱动模型和设计实现方法;重点研究了USB设备驱动结构以及无线网卡数据包的接收和发送流程。在嵌入式Linux平台下,设计了基于USB接口的无线网卡驱动,实现了对无线网卡芯片Realtek RTL8188的支持。同时,结合嵌入式软硬件开发平台,成功组建了无线局域网,对驱动程序进行了测试。测试结果表明,无线网卡驱动运行平稳,实现了预期的目标。0 引言随着无线通信技术的不断发展,无线局域网(WLAN)的使用日渐广泛。与传统有线网络相比,其优势主要体现在高度可移动性、布线简单、组网便利和成本低廉等方面[1]。而在嵌入式系统开发中,无线局域网的接入不仅弥补了以往开发灵活性差和布线复杂等缺陷使开发更加方便,同时可以实现系统的无线传输以满足特定场合的应用。本文结合项目开发,提出了一种基于Realtek公司RTL8188无线网卡芯片的无线传输系统方案,通过对USB无线网卡驱动深入研究和分析,成功开发了其在嵌入式DM3730平台下的驱动,实现了无线网络的接入。1 系统硬件平台远程视频监控系统中,智能无线网络摄像机主要承担着图像采集、数据编码、网络传送等功能。硬件部分主要由核心处理模块、网络传输模块、采集模块、存储模块以及电源模块等组成,系统硬件开发平台如图1所示。核心处理模块采用TI公司的TMS320DM3730片上系统,DM3730是针对高清视频产品市场推出的ARM+DSP双核架构处理器;采集模块中,CMOS传感器采用OmniVision公司的OV2715图像传感器,其为专门为高清视频监控而设计的支持1 080 P视频采集的图像传感器。该系统网络传输模块采用Realtek公司生产的一款基于802.11g的无线网卡,采用RTL8188无线网络芯片,采用简单灵活、即插即用的USB接口方式接入系统。2 无线网卡驱动模型基于USB接口的无线网卡通过USB总线接入主机系统,USB无线网卡驱动分为USB设备端驱动和网络设备端驱动两部分[2],USB无线网卡驱动结构如图2所示。2.1 USB设备驱动Linux操作系统中,USB子系统驱动程序主要由USB核心驱动(USBD)、USB主机控制器驱动(HCD)和具体的USB设备驱动三部分组成[3]。Linux下USB设备驱动结构图如图3所示。USB核心驱动主要负责对USB设备的整体控制,包括实现USB设备和主机控制器之间的通信,其内部封装了一系列API,用以屏蔽来自不同设备的差异;USB主机控制器驱动直接与硬件进行交互,主要负责对主机控制器硬件设备初始化,向USB核心提供对应的接口,配置和控制根Hub设备等功能;USB客户端设备驱动程序负责与上层应用软件模块交互并为其提供相应的接口,驱动具体的硬件设备,将设备挂载到USB核心中使其正常运转[4]。编写USB客户端设备驱动时,内核提供了相应的接口,只需实现基本的函数即可,最常用的结构体是struct usb_driver,创建客户端程序需初始化其五个字段:(1)id_table字段:是一个指向struct usb_device_table结构体的指针,该结构指定了驱动程序能支持的所有USB设备类型,主要由Vendor id和Product id对组成。(2)probe字段:探测指针,USB设备接入系统上电后,会主动匹配相应的驱动程序,调用自定义探测函数,完成主要的初始化工作。(3)disconnect字段:分离函数指针,总线设备被移除或者驱动模块从系统中卸载时,将调用自定义分离函数,主要完成内存释放和资源回收等工作。(4)owner和name字段:owner指定该模块拥有者;name指定该驱动程序名称。usb_driver结构体中的字段均被正确设置以后,调用注册函数usb_register(),函数将USB接口驱动程序注册到USB核心。注册成功后,USB系统可以对无线网卡的接入和移除操作作出相应的反应。若要网卡成功收发数据,需实现其网卡网络设备驱动。2.2 无线网卡驱动无线网卡驱动主要负责屏蔽底层硬件设备具体细节,向上层协议栈提供一致的数据发送和接收接口,驱动硬件设备完成数据包收发等功能;无线网卡数据包发送与接收过程主要用到struct sk_buff结构体[5],其实际用于描述套接字缓冲区结构,被用来在Linux系统网络各层之间传递数据。无线网卡发送数据时,Linux在内核申请数据包sk_buff缓冲区,然后递交给下层,下层添加相关协议头后直接交给硬件将数据包发送出去。无线网卡接收数据时,将收到的数据包按照sk_buff格式提交给上层,上层剥离协议头后,交给上层应用程序调用[6]。无线网卡设计与实现依赖于Linux系统提供的接口,主要为struct ieee80211_hw结构体,该结构体定义了硬件设备发送、接收、初始化接口。实现无线网卡驱动主要遵循三个步骤:首先,通过模块加载后分配得到一个struct ieee80211_hw结构体;其次,对这个结构体的各个字段进行设置和填充,完成硬件的相关配置;最后,利用相应的注册函数向内核注册驱动。3 无线网卡驱动设计与实现无线网卡驱动工作原理如下:模块加载时,系统首先完成对USB设备的扫描和初始化[7],其次初始化网卡硬件和状态,轮询是否有数据需要发送和接收;模块卸载时,分别先后注销网络设备和USB设备,完成相关资源的释放工作。无线网卡驱动设计流程图如图4所示。3.1 网卡初始化模块驱动设计系统上电,Linux内核启动后会加载驱动模块,USB无线网卡驱动向USB系统注册;当无线网卡插入USB总线时,USB core调用probe()方法来检测Vendor id和Product id信息[8],以确定无线网卡设备是否与驱动程序匹配;匹配成功则进行网卡初始化,网卡初始化模块设计流程如图5所示。在该初始化模块中,系统为网卡分配了无线设备硬件设备struct ieee80211_hw数据,用相关自定义函数对该数据结构进行了填充;同时填充了描述无线网卡操作的struct ieee80211_ops rtl8188_ops结构体,该操作函数主要包括网卡发送、接收、配置、移除接口等操作。3.2 网卡数据接收模块驱动设计PCI、ISA等类型无线网卡具备IO/MEM映射、中断和DMA等硬件资源,故可以通过中断来实现数据的接收[9];而USB无线网卡不具备这类资源,只能通过主机轮询是否有数据需要读取或者接收。因此,首先向USB核心申请一个读请求URB,用以数据到来时的存放。网卡数据接收模块设计流程如图6所示。3.3 网卡数据发送模块驱动设计无线网卡发送数据通过对硬件设备的读写来完成。当应用程序的数据被封装好传递到驱动层时,会调用ieee80211_ops中的int(*tx)(struct ieee80211_hw*hw,struct sk_buff*skb)函数指针指向的自定义发送函数进行协议头相关处理,完成数据包的发送任务,最后更新网络接口统计数据。数据发送模块驱动设计流程如图7所示。3.4 其他关键驱动模块设计在定义设备文件操作struct ieee80211_ops rtl8188_ops结构体中,start指针指向打开函数rtl8188_start(),当使用命令ifconfig配置无线网卡时,调用该函数,主要完成分配资源,初始化接收和发送队列等功能;stop指针指向rtl8188_stop()函数,其工作与start函数相反,当网卡由开启变为关闭时调用;add_interface指针指向添加接口函数,其在设备可用之前调用,用来配置接口,可将接口配置成ad-hoc点对点模式、主机模式或者monitor模式等;删除接口函数在stop之前调用,主要功能是清除保存MAC地址,使设备不能接收数据包。编写无线网卡驱动,以上几个数据结构必须要实现。4 无线网卡驱动编译与测试4.1 驱动程序编译首先,在主机上建立/driver/net/wireless/rtl8188目录,将相关源码和文件放到该目录中;其次,在宿主机上配置内核相关选项,通过make menuconfig添加对WLAN的支持;最后,编写相应的makefile文件,使用make命令在系统中编译生成rtl8188.ko驱动模块。在硬件平台系统中安装有关无线管理程序,采用iwconfig、iwapy等命令,配置网络的KEY、ESSID、接入模式等。4.2 程序测试及结果分析结合特定硬件平台和相关开发环境的搭建,组建典型的网络完成对无线网卡驱动的测试,网络拓扑如下图8所示。在调试窗口中,通过动态加载命令“insmod rtl8188.ko”将无线网卡驱动模块下载到内核中,无线网卡接入系统后,自动扫描并初始化网卡,通过lsmod命令查看加载模块,网卡驱动加载成功后如图9所示。4.2.1 Ping连通性测试利用ifconfig命令配置无线网卡IP地址、无线热点ESSID和KEY,设置无线网卡接入无线路由,测试网卡和路由器之间的连通性。USB无线网卡和路由器连通测试结果如图10所示。将主机IP地址和无线网卡设置在同一网段,测试无线网卡和主机之间的互通性。主机IP地址为192.168.0.88,通过命令ping之后的结果如图11所示。通过以上结果可以得出,USB无线网卡、无线路由器、主机之间是互通的,网卡和主机成功建立了网络连接,无线网卡驱动工作正常,还需对其速率进行测试。4.2.2 网卡速率测试编写网卡速率测试程序,该程序采用C/S模式,客户端运行在开发板上,服务端运行在Linux PC上。测试程序的主要工作流程如下:客户端分别发送大小不同的数据包,服务端接收后计算出对应的带宽速率,测试结果如下表1所示。经过多组数据发送接收试验,该无线网卡工作正常,在距离无线节点10 m半径范围内带宽速率为10.45 Mb/s。由以上结果得出,USB无线网卡收发数据功能已经实现且工作稳定,驱动读写相关寄存器等配置正确,真正实现了“驱动”硬件的功能,从而直接地验证了驱动编写方案的合理性,同时间接地确认了模型的可行性。5 结束语本文介绍了一种USB无线网卡驱动模型,并对USB设备驱动和网卡功能驱动进行了深入研究;在嵌入式硬件平台上开发了USB无线网卡驱动,最后在搭建的网络平台上完成了实验测试,验证了模型和程序的正确性。文中提出的无线网卡驱动模型和实现方法,对相关开发人员有一定的参考和指导价值。参考文献[1] 沈韬,李绍荣.无线网卡驱动分析与WLAN性能测试[J].通信技术,2009,42(10):105-110.[2] 陈立朋.基于Linux的USB无线网卡通用驱动框架设计[D].长春:吉林大学,2012.[3] 郭昊.嵌入式Linux上USB无线网卡驱动的研究与实现[D].广州:暨南大学,2012.[4] VENKATESWARAN S.精通Linux设备驱动程序开发[M].宋宝华,何照然,史海滨,等译.北京:人民邮电出版社,2010.[5] 钱晓华,郭继红.基于嵌入式linux的无线网卡驱动程序[J].辽宁大学学报(自然科学版),2008,6(2):55-57.[6] 叶学程,郑霖.嵌入式Linux的USB-Chirp无线网卡驱动设计[J].单片机与嵌入式系统应用,2014(7):53-56.[7] 王标,郭敏,单保慈.基于ARM的无线网卡设备驱动设计[J].现代电子技术,2009(7):101-103.[8] Zhang Xiaoming, Song Xiaoying. Net devise drive program′s research and implement in embedded Linux operating system[C]. Computer Science-Technology and Applications, 2009, IFCSTA 039; 09. International Forum on. IEEE, 2009:172-174.[9] 杨勇,叶梅,张秦艳,等.基于ARM的嵌入式Linux无线网卡设备驱动研究[J].核电子学与探测技术,2010,30(4):519-523.(mbbeetchina)

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !

'+ '

'+ '

'+ ''+ '
'+ ''+ ''+ '
'+ ''+ '' ); $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code ==5){ $(pop_this).attr('href',"/login/index.html"); return false } if(data.code == 2){ //跳转到VIP升级页面 window.location.href="//m.lene-v.com/vip/index?aid=" + webid return false } //是会员 if (data.code > 0) { $('body').append(htmlSetNormalDownload); var getWidth=$("#poplayer").width(); $("#poplayer").css("margin-left","-"+getWidth/2+"px"); $('#tips').html(data.msg) $('.download_confirm').click(function(){ $('#dialog').remove(); }) } else { var down_url = $('#vipdownload').attr('data-url'); isBindAnalysisForm(pop_this, down_url, 1) } }); }); //是否开通VIP $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code == 2 || data.code ==5){ //跳转到VIP升级页面 $('#vipdownload>span').text("开通VIP 免费下载") return false }else{ // 待续费 if(data.code == 3) { vipExpiredInfo.ifVipExpired = true vipExpiredInfo.vipExpiredDate = data.data.endoftime } $('#vipdownload .icon-vip-tips').remove() $('#vipdownload>span').text("VIP免积分下载") } }); }).on("click",".download_cancel",function(){ $('#dialog').remove(); }) var setWeixinShare={};//定义默认的微信分享信息,页面如果要自定义分享,直接更改此变量即可 if(window.navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == 'micromessenger'){ var d={ title:'基于USB接口的无线网卡驱动研究与实现资料下载',//标题 desc:$('[name=description]').attr("content"), //描述 imgUrl:'https://'+location.host+'/static/images/ele-logo.png',// 分享图标,默认是logo link:'',//链接 type:'',// 分享类型,music、video或link,不填默认为link dataUrl:'',//如果type是music或video,则要提供数据链接,默认为空 success:'', // 用户确认分享后执行的回调函数 cancel:''// 用户取消分享后执行的回调函数 } setWeixinShare=$.extend(d,setWeixinShare); $.ajax({ url:"//www.lene-v.com/app/wechat/index.php?s=Home/ShareConfig/index", data:"share_url="+encodeURIComponent(location.href)+"&format=jsonp&domain=m", type:'get', dataType:'jsonp', success:function(res){ if(res.status!="successed"){ return false; } $.getScript('https://res.wx.qq.com/open/js/jweixin-1.0.0.js',function(result,status){ if(status!="success"){ return false; } var getWxCfg=res.data; wx.config({ //debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId:getWxCfg.appId, // 必填,公众号的唯一标识 timestamp:getWxCfg.timestamp, // 必填,生成签名的时间戳 nonceStr:getWxCfg.nonceStr, // 必填,生成签名的随机串 signature:getWxCfg.signature,// 必填,签名,见附录1 jsApiList:['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); wx.ready(function(){ //获取“分享到朋友圈”按钮点击状态及自定义分享内容接口 wx.onMenuShareTimeline({ title: setWeixinShare.title, // 分享标题 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享给朋友”按钮点击状态及自定义分享内容接口 wx.onMenuShareAppMessage({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 type: setWeixinShare.type, // 分享类型,music、video或link,不填默认为link dataUrl: setWeixinShare.dataUrl, // 如果type是music或video,则要提供数据链接,默认为空 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ”按钮点击状态及自定义分享内容接口 wx.onMenuShareQQ({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口 wx.onMenuShareWeibo({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ空间”按钮点击状态及自定义分享内容接口 wx.onMenuShareQZone({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); }); }); } }); } function openX_ad(posterid, htmlid, width, height) { if ($(htmlid).length > 0) { var randomnumber = Math.random(); var now_url = encodeURIComponent(window.location.href); var ga = document.createElement('iframe'); ga.src = 'https://www1.elecfans.com/www/delivery/myafr.php?target=_blank&cb=' + randomnumber + '&zoneid=' + posterid+'&prefer='+now_url; ga.width = width; ga.height = height; ga.frameBorder = 0; ga.scrolling = 'no'; var s = $(htmlid).append(ga); } } openX_ad(828, '#berry-300', 300, 250);