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