基于USB接口的無線網(wǎng)卡驅(qū)動(dòng)研究與實(shí)現(xiàn)
2016-02-22
作者:孫文華1,,2,,何榮高1,,2
來源:2015年微型機(jī)與應(yīng)用第21期
摘 要: 針對(duì)無線網(wǎng)卡驅(qū)動(dòng)結(jié)構(gòu)復(fù)雜,、編寫困難的問題,提出了一種結(jié)構(gòu)清晰,、簡(jiǎn)單易行的無線網(wǎng)卡驅(qū)動(dòng)模型和設(shè)計(jì)實(shí)現(xiàn)方法,;重點(diǎn)研究了USB設(shè)備驅(qū)動(dòng)結(jié)構(gòu)以及無線網(wǎng)卡數(shù)據(jù)包的接收和發(fā)送流程。在嵌入式Linux平臺(tái)下,,設(shè)計(jì)了基于USB接口的無線網(wǎng)卡驅(qū)動(dòng),,實(shí)現(xiàn)了對(duì)無線網(wǎng)卡芯片Realtek RTL8188的支持。同時(shí),,結(jié)合嵌入式軟硬件開發(fā)平臺(tái),,成功組建了無線局域網(wǎng),對(duì)驅(qū)動(dòng)程序進(jìn)行了測(cè)試,。測(cè)試結(jié)果表明,,無線網(wǎng)卡驅(qū)動(dòng)運(yùn)行平穩(wěn),實(shí)現(xiàn)了預(yù)期的目標(biāo),。
關(guān)鍵詞: 無線網(wǎng)卡,;設(shè)備驅(qū)動(dòng);USB接口,;嵌入式Linux
0 引言
隨著無線通信技術(shù)的不斷發(fā)展,,無線局域網(wǎng)(WLAN)的使用日漸廣泛。與傳統(tǒng)有線網(wǎng)絡(luò)相比,,其優(yōu)勢(shì)主要體現(xiàn)在高度可移動(dòng)性,、布線簡(jiǎn)單、組網(wǎng)便利和成本低廉等方面[1],。而在嵌入式系統(tǒng)開發(fā)中,,無線局域網(wǎng)的接入不僅彌補(bǔ)了以往開發(fā)靈活性差和布線復(fù)雜等缺陷使開發(fā)更加方便,同時(shí)可以實(shí)現(xiàn)系統(tǒng)的無線傳輸以滿足特定場(chǎng)合的應(yīng)用,。
本文結(jié)合項(xiàng)目開發(fā),,提出了一種基于Realtek公司RTL8188無線網(wǎng)卡芯片的無線傳輸系統(tǒng)方案,通過對(duì)USB無線網(wǎng)卡驅(qū)動(dòng)深入研究和分析,,成功開發(fā)了其在嵌入式DM3730平臺(tái)下的驅(qū)動(dòng),,實(shí)現(xiàn)了無線網(wǎng)絡(luò)的接入。
1 系統(tǒng)硬件平臺(tái)
遠(yuǎn)程視頻監(jiān)控系統(tǒng)中,,智能無線網(wǎng)絡(luò)攝像機(jī)主要承擔(dān)著圖像采集,、數(shù)據(jù)編碼、網(wǎng)絡(luò)傳送等功能,。硬件部分主要由核心處理模塊,、網(wǎng)絡(luò)傳輸模塊、采集模塊,、存儲(chǔ)模塊以及電源模塊等組成,,系統(tǒng)硬件開發(fā)平臺(tái)如圖1所示。
核心處理模塊采用TI公司的TMS320DM3730片上系統(tǒng),,DM3730是針對(duì)高清視頻產(chǎn)品市場(chǎng)推出的ARM+DSP雙核架構(gòu)處理器,;采集模塊中,CMOS傳感器采用OmniVision公司的OV2715圖像傳感器,,其為專門為高清視頻監(jiān)控而設(shè)計(jì)的支持1 080 P視頻采集的圖像傳感器,。該系統(tǒng)網(wǎng)絡(luò)傳輸模塊采用Realtek公司生產(chǎn)的一款基于802.11g的無線網(wǎng)卡,采用RTL8188無線網(wǎng)絡(luò)芯片,,采用簡(jiǎn)單靈活,、即插即用的USB接口方式接入系統(tǒng)。
2 無線網(wǎng)卡驅(qū)動(dòng)模型
基于USB接口的無線網(wǎng)卡通過USB總線接入主機(jī)系統(tǒng),,USB無線網(wǎng)卡驅(qū)動(dòng)分為USB設(shè)備端驅(qū)動(dòng)和網(wǎng)絡(luò)設(shè)備端驅(qū)動(dòng)兩部分[2],,USB無線網(wǎng)卡驅(qū)動(dòng)結(jié)構(gòu)如圖2所示。
2.1 USB設(shè)備驅(qū)動(dòng)
Linux操作系統(tǒng)中,,USB子系統(tǒng)驅(qū)動(dòng)程序主要由USB核心驅(qū)動(dòng)(USBD),、USB主機(jī)控制器驅(qū)動(dòng)(HCD)和具體的USB設(shè)備驅(qū)動(dòng)三部分組成[3]。Linux下USB設(shè)備驅(qū)動(dòng)結(jié)構(gòu)圖如圖3所示,。
USB核心驅(qū)動(dòng)主要負(fù)責(zé)對(duì)USB設(shè)備的整體控制,,包括實(shí)現(xiàn)USB設(shè)備和主機(jī)控制器之間的通信,其內(nèi)部封裝了一系列API,,用以屏蔽來自不同設(shè)備的差異,;USB主機(jī)控制器驅(qū)動(dòng)直接與硬件進(jìn)行交互,主要負(fù)責(zé)對(duì)主機(jī)控制器硬件設(shè)備初始化,向USB核心提供對(duì)應(yīng)的接口,,配置和控制根Hub設(shè)備等功能,;USB客戶端設(shè)備驅(qū)動(dòng)程序負(fù)責(zé)與上層應(yīng)用軟件模塊交互并為其提供相應(yīng)的接口,驅(qū)動(dòng)具體的硬件設(shè)備,,將設(shè)備掛載到USB核心中使其正常運(yùn)轉(zhuǎn)[4],。
編寫USB客戶端設(shè)備驅(qū)動(dòng)時(shí),內(nèi)核提供了相應(yīng)的接口,,只需實(shí)現(xiàn)基本的函數(shù)即可,,最常用的結(jié)構(gòu)體是struct usb_driver,創(chuàng)建客戶端程序需初始化其五個(gè)字段:
?。?)id_table字段:是一個(gè)指向struct usb_device_table結(jié)構(gòu)體的指針,,該結(jié)構(gòu)指定了驅(qū)動(dòng)程序能支持的所有USB設(shè)備類型,主要由Vendor id和Product id對(duì)組成,。
?。?)probe字段:探測(cè)指針,USB設(shè)備接入系統(tǒng)上電后,,會(huì)主動(dòng)匹配相應(yīng)的驅(qū)動(dòng)程序,,調(diào)用自定義探測(cè)函數(shù),完成主要的初始化工作,。
?。?)disconnect字段:分離函數(shù)指針,總線設(shè)備被移除或者驅(qū)動(dòng)模塊從系統(tǒng)中卸載時(shí),,將調(diào)用自定義分離函數(shù),,主要完成內(nèi)存釋放和資源回收等工作。
?。?)owner和name字段:owner指定該模塊擁有者,;name指定該驅(qū)動(dòng)程序名稱。
usb_driver結(jié)構(gòu)體中的字段均被正確設(shè)置以后,,調(diào)用注冊(cè)函數(shù)usb_register(),,函數(shù)將USB接口驅(qū)動(dòng)程序注冊(cè)到USB核心。注冊(cè)成功后,,USB系統(tǒng)可以對(duì)無線網(wǎng)卡的接入和移除操作作出相應(yīng)的反應(yīng),。若要網(wǎng)卡成功收發(fā)數(shù)據(jù),需實(shí)現(xiàn)其網(wǎng)卡網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng),。
2.2 無線網(wǎng)卡驅(qū)動(dòng)
無線網(wǎng)卡驅(qū)動(dòng)主要負(fù)責(zé)屏蔽底層硬件設(shè)備具體細(xì)節(jié),,向上層協(xié)議棧提供一致的數(shù)據(jù)發(fā)送和接收接口,驅(qū)動(dòng)硬件設(shè)備完成數(shù)據(jù)包收發(fā)等功能,;無線網(wǎng)卡數(shù)據(jù)包發(fā)送與接收過程主要用到struct sk_buff結(jié)構(gòu)體[5],,其實(shí)際用于描述套接字緩沖區(qū)結(jié)構(gòu),被用來在Linux系統(tǒng)網(wǎng)絡(luò)各層之間傳遞數(shù)據(jù)。
無線網(wǎng)卡發(fā)送數(shù)據(jù)時(shí),,Linux在內(nèi)核申請(qǐng)數(shù)據(jù)包sk_buff緩沖區(qū),,然后遞交給下層,下層添加相關(guān)協(xié)議頭后直接交給硬件將數(shù)據(jù)包發(fā)送出去,。無線網(wǎng)卡接收數(shù)據(jù)時(shí),,將收到的數(shù)據(jù)包按照sk_buff格式提交給上層,,上層剝離協(xié)議頭后,,交給上層應(yīng)用程序調(diào)用[6]。
無線網(wǎng)卡設(shè)計(jì)與實(shí)現(xiàn)依賴于Linux系統(tǒng)提供的接口,,主要為struct ieee80211_hw結(jié)構(gòu)體,,該結(jié)構(gòu)體定義了硬件設(shè)備發(fā)送、接收,、初始化接口,。實(shí)現(xiàn)無線網(wǎng)卡驅(qū)動(dòng)主要遵循三個(gè)步驟:首先,通過模塊加載后分配得到一個(gè)struct ieee80211_hw結(jié)構(gòu)體,;其次,,對(duì)這個(gè)結(jié)構(gòu)體的各個(gè)字段進(jìn)行設(shè)置和填充,完成硬件的相關(guān)配置,;最后,,利用相應(yīng)的注冊(cè)函數(shù)向內(nèi)核注冊(cè)驅(qū)動(dòng)。
3 無線網(wǎng)卡驅(qū)動(dòng)設(shè)計(jì)與實(shí)現(xiàn)
無線網(wǎng)卡驅(qū)動(dòng)工作原理如下:模塊加載時(shí),,系統(tǒng)首先完成對(duì)USB設(shè)備的掃描和初始化[7],,其次初始化網(wǎng)卡硬件和狀態(tài),輪詢是否有數(shù)據(jù)需要發(fā)送和接收,;模塊卸載時(shí),,分別先后注銷網(wǎng)絡(luò)設(shè)備和USB設(shè)備,完成相關(guān)資源的釋放工作,。無線網(wǎng)卡驅(qū)動(dòng)設(shè)計(jì)流程圖如圖4所示,。
3.1 網(wǎng)卡初始化模塊驅(qū)動(dòng)設(shè)計(jì)
系統(tǒng)上電,Linux內(nèi)核啟動(dòng)后會(huì)加載驅(qū)動(dòng)模塊,,USB無線網(wǎng)卡驅(qū)動(dòng)向USB系統(tǒng)注冊(cè),;當(dāng)無線網(wǎng)卡插入U(xiǎn)SB總線時(shí),USB core調(diào)用probe()方法來檢測(cè)Vendor id和Product id信息[8],,以確定無線網(wǎng)卡設(shè)備是否與驅(qū)動(dòng)程序匹配,;匹配成功則進(jìn)行網(wǎng)卡初始化,網(wǎng)卡初始化模塊設(shè)計(jì)流程如圖5所示,。
在該初始化模塊中,,系統(tǒng)為網(wǎng)卡分配了無線設(shè)備硬件設(shè)備struct ieee80211_hw數(shù)據(jù),用相關(guān)自定義函數(shù)對(duì)該數(shù)據(jù)結(jié)構(gòu)進(jìn)行了填充;同時(shí)填充了描述無線網(wǎng)卡操作的struct ieee80211_ops rtl8188_ops結(jié)構(gòu)體,,該操作函數(shù)主要包括網(wǎng)卡發(fā)送,、接收、配置,、移除接口等操作,。
3.2 網(wǎng)卡數(shù)據(jù)接收模塊驅(qū)動(dòng)設(shè)計(jì)
PCI、ISA等類型無線網(wǎng)卡具備IO/MEM映射,、中斷和DMA等硬件資源,,故可以通過中斷來實(shí)現(xiàn)數(shù)據(jù)的接收[9];而USB無線網(wǎng)卡不具備這類資源,,只能通過主機(jī)輪詢是否有數(shù)據(jù)需要讀取或者接收,。因此,首先向USB核心申請(qǐng)一個(gè)讀請(qǐng)求URB,,用以數(shù)據(jù)到來時(shí)的存放,。網(wǎng)卡數(shù)據(jù)接收模塊設(shè)計(jì)流程如圖6所示。
3.3 網(wǎng)卡數(shù)據(jù)發(fā)送模塊驅(qū)動(dòng)設(shè)計(jì)
無線網(wǎng)卡發(fā)送數(shù)據(jù)通過對(duì)硬件設(shè)備的讀寫來完成,。當(dāng)應(yīng)用程序的數(shù)據(jù)被封裝好傳遞到驅(qū)動(dòng)層時(shí),,會(huì)調(diào)用ieee80211_ops中的int(*tx)(struct ieee80211_hw*hw,struct sk_buff*skb)函數(shù)指針指向的自定義發(fā)送函數(shù)進(jìn)行協(xié)議頭相關(guān)處理,,完成數(shù)據(jù)包的發(fā)送任務(wù),,最后更新網(wǎng)絡(luò)接口統(tǒng)計(jì)數(shù)據(jù)。數(shù)據(jù)發(fā)送模塊驅(qū)動(dòng)設(shè)計(jì)流程如圖7所示,。
3.4 其他關(guān)鍵驅(qū)動(dòng)模塊設(shè)計(jì)
在定義設(shè)備文件操作struct ieee80211_ops rtl8188_ops結(jié)構(gòu)體中,,start指針指向打開函數(shù)rtl8188_start(),當(dāng)使用命令ifconfig配置無線網(wǎng)卡時(shí),,調(diào)用該函數(shù),,主要完成分配資源,初始化接收和發(fā)送隊(duì)列等功能,;stop指針指向rtl8188_stop()函數(shù),,其工作與start函數(shù)相反,當(dāng)網(wǎng)卡由開啟變?yōu)殛P(guān)閉時(shí)調(diào)用,;add_interface指針指向添加接口函數(shù),,其在設(shè)備可用之前調(diào)用,用來配置接口,,可將接口配置成ad-hoc點(diǎn)對(duì)點(diǎn)模式,、主機(jī)模式或者monitor模式等;刪除接口函數(shù)在stop之前調(diào)用,,主要功能是清除保存MAC地址,,使設(shè)備不能接收數(shù)據(jù)包,。編寫無線網(wǎng)卡驅(qū)動(dòng),以上幾個(gè)數(shù)據(jù)結(jié)構(gòu)必須要實(shí)現(xiàn),。
4 無線網(wǎng)卡驅(qū)動(dòng)編譯與測(cè)試
4.1 驅(qū)動(dòng)程序編譯
首先,,在主機(jī)上建立/driver/net/wireless/rtl8188目錄,將相關(guān)源碼和文件放到該目錄中,;其次,,在宿主機(jī)上配置內(nèi)核相關(guān)選項(xiàng),通過make menuconfig添加對(duì)WLAN的支持,;最后,,編寫相應(yīng)的makefile文件,使用make命令在系統(tǒng)中編譯生成rtl8188.ko驅(qū)動(dòng)模塊,。在硬件平臺(tái)系統(tǒng)中安裝有關(guān)無線管理程序,,采用iwconfig、iwapy等命令,,配置網(wǎng)絡(luò)的KEY、ESSID,、接入模式等,。
4.2 程序測(cè)試及結(jié)果分析
結(jié)合特定硬件平臺(tái)和相關(guān)開發(fā)環(huán)境的搭建,組建典型的網(wǎng)絡(luò)完成對(duì)無線網(wǎng)卡驅(qū)動(dòng)的測(cè)試,,網(wǎng)絡(luò)拓?fù)淙缦聢D8所示,。
在調(diào)試窗口中,通過動(dòng)態(tài)加載命令“insmod rtl8188.ko”將無線網(wǎng)卡驅(qū)動(dòng)模塊下載到內(nèi)核中,,無線網(wǎng)卡接入系統(tǒng)后,,自動(dòng)掃描并初始化網(wǎng)卡,通過lsmod命令查看加載模塊,,網(wǎng)卡驅(qū)動(dòng)加載成功后如圖9所示,。
4.2.1 Ping連通性測(cè)試
利用ifconfig命令配置無線網(wǎng)卡IP地址、無線熱點(diǎn)ESSID和KEY,,設(shè)置無線網(wǎng)卡接入無線路由,,測(cè)試網(wǎng)卡和路由器之間的連通性。USB無線網(wǎng)卡和路由器連通測(cè)試結(jié)果如圖10所示,。
將主機(jī)IP地址和無線網(wǎng)卡設(shè)置在同一網(wǎng)段,,測(cè)試無線網(wǎng)卡和主機(jī)之間的互通性。主機(jī)IP地址為192.168.0.88,,通過命令ping之后的結(jié)果如圖11所示,。
通過以上結(jié)果可以得出,USB無線網(wǎng)卡,、無線路由器,、主機(jī)之間是互通的,,網(wǎng)卡和主機(jī)成功建立了網(wǎng)絡(luò)連接,無線網(wǎng)卡驅(qū)動(dòng)工作正常,,還需對(duì)其速率進(jìn)行測(cè)試,。
4.2.2 網(wǎng)卡速率測(cè)試
編寫網(wǎng)卡速率測(cè)試程序,該程序采用C/S模式,,客戶端運(yùn)行在開發(fā)板上,,服務(wù)端運(yùn)行在Linux PC上。測(cè)試程序的主要工作流程如下:客戶端分別發(fā)送大小不同的數(shù)據(jù)包,,服務(wù)端接收后計(jì)算出對(duì)應(yīng)的帶寬速率,,測(cè)試結(jié)果如下表1所示。
經(jīng)過多組數(shù)據(jù)發(fā)送接收試驗(yàn),,該無線網(wǎng)卡工作正常,,在距離無線節(jié)點(diǎn)10 m半徑范圍內(nèi)帶寬速率為10.45 Mb/s。
由以上結(jié)果得出,,USB無線網(wǎng)卡收發(fā)數(shù)據(jù)功能已經(jīng)實(shí)現(xiàn)且工作穩(wěn)定,,驅(qū)動(dòng)讀寫相關(guān)寄存器等配置正確,,真正實(shí)現(xiàn)了“驅(qū)動(dòng)”硬件的功能,,從而直接地驗(yàn)證了驅(qū)動(dòng)編寫方案的合理性,同時(shí)間接地確認(rèn)了模型的可行性,。
5 結(jié)束語(yǔ)
本文介紹了一種USB無線網(wǎng)卡驅(qū)動(dòng)模型,并對(duì)USB設(shè)備驅(qū)動(dòng)和網(wǎng)卡功能驅(qū)動(dòng)進(jìn)行了深入研究,;在嵌入式硬件平臺(tái)上開發(fā)了USB無線網(wǎng)卡驅(qū)動(dòng),,最后在搭建的網(wǎng)絡(luò)平臺(tái)上完成了實(shí)驗(yàn)測(cè)試,驗(yàn)證了模型和程序的正確性,。文中提出的無線網(wǎng)卡驅(qū)動(dòng)模型和實(shí)現(xiàn)方法,,對(duì)相關(guān)開發(fā)人員有一定的參考和指導(dǎo)價(jià)值,。
參考文獻(xiàn)
[1] 沈韜,李紹榮.無線網(wǎng)卡驅(qū)動(dòng)分析與WLAN性能測(cè)試[J].通信技術(shù),,2009,,42(10):105-110.
[2] 陳立朋.基于Linux的USB無線網(wǎng)卡通用驅(qū)動(dòng)框架設(shè)計(jì)[D].長(zhǎng)春:吉林大學(xué),,2012.
[3] 郭昊.嵌入式Linux上USB無線網(wǎng)卡驅(qū)動(dòng)的研究與實(shí)現(xiàn)[D].廣州:暨南大學(xué),2012.
[4] VENKATESWARAN S.精通Linux設(shè)備驅(qū)動(dòng)程序開發(fā)[M].宋寶華,,何照然,,史海濱,等譯.北京:人民郵電出版社,,2010.
[5] 錢曉華,郭繼紅.基于嵌入式linux的無線網(wǎng)卡驅(qū)動(dòng)程序[J].遼寧大學(xué)學(xué)報(bào)(自然科學(xué)版),,2008,,6(2):55-57.
[6] 葉學(xué)程,,鄭霖.嵌入式Linux的USB-Chirp無線網(wǎng)卡驅(qū)動(dòng)設(shè)計(jì)[J].單片機(jī)與嵌入式系統(tǒng)應(yīng)用,,2014(7):53-56.
[7] 王標(biāo),郭敏,,單保慈.基于ARM的無線網(wǎng)卡設(shè)備驅(qū)動(dòng)設(shè)計(jì)[J].現(xiàn)代電子技術(shù),,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無線網(wǎng)卡設(shè)備驅(qū)動(dòng)研究[J].核電子學(xué)與探測(cè)技術(shù),,2010,,30(4):519-523.