《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 模擬設(shè)計(jì) > 業(yè)界動(dòng)態(tài) > 基于USB接口的無(wú)線網(wǎng)卡驅(qū)動(dòng)研究與實(shí)現(xiàn)

基于USB接口的無(wú)線網(wǎng)卡驅(qū)動(dòng)研究與實(shí)現(xiàn)

2016-02-22
作者:孫文華1,2,何榮高1,2
來(lái)源:2015年微型機(jī)與應(yīng)用第21期

  摘  要: 針對(duì)無(wú)線網(wǎng)卡驅(qū)動(dòng)結(jié)構(gòu)復(fù)雜、編寫(xiě)困難的問(wèn)題,提出了一種結(jié)構(gòu)清晰、簡(jiǎn)單易行的無(wú)線網(wǎng)卡驅(qū)動(dòng)模型和設(shè)計(jì)實(shí)現(xiàn)方法;重點(diǎn)研究了USB設(shè)備驅(qū)動(dòng)結(jié)構(gòu)以及無(wú)線網(wǎng)卡數(shù)據(jù)包的接收和發(fā)送流程。在嵌入式Linux平臺(tái)下,設(shè)計(jì)了基于USB接口的無(wú)線網(wǎng)卡驅(qū)動(dòng),實(shí)現(xiàn)了對(duì)無(wú)線網(wǎng)卡芯片Realtek RTL8188的支持。同時(shí),結(jié)合嵌入式軟硬件開(kāi)發(fā)平臺(tái),成功組建了無(wú)線局域網(wǎng),對(duì)驅(qū)動(dòng)程序進(jìn)行了測(cè)試。測(cè)試結(jié)果表明,無(wú)線網(wǎng)卡驅(qū)動(dòng)運(yùn)行平穩(wěn),實(shí)現(xiàn)了預(yù)期的目標(biāo)。

  關(guān)鍵詞: 無(wú)線網(wǎng)卡;設(shè)備驅(qū)動(dòng);USB接口;嵌入式Linux

0 引言

  隨著無(wú)線通信技術(shù)的不斷發(fā)展,無(wú)線局域網(wǎng)(WLAN)的使用日漸廣泛。與傳統(tǒng)有線網(wǎng)絡(luò)相比,其優(yōu)勢(shì)主要體現(xiàn)在高度可移動(dòng)性、布線簡(jiǎn)單、組網(wǎng)便利和成本低廉等方面[1]。而在嵌入式系統(tǒng)開(kāi)發(fā)中,無(wú)線局域網(wǎng)的接入不僅彌補(bǔ)了以往開(kāi)發(fā)靈活性差和布線復(fù)雜等缺陷使開(kāi)發(fā)更加方便,同時(shí)可以實(shí)現(xiàn)系統(tǒng)的無(wú)線傳輸以滿足特定場(chǎng)合的應(yīng)用。

  本文結(jié)合項(xiàng)目開(kāi)發(fā),提出了一種基于Realtek公司RTL8188無(wú)線網(wǎng)卡芯片的無(wú)線傳輸系統(tǒng)方案,通過(guò)對(duì)USB無(wú)線網(wǎng)卡驅(qū)動(dòng)深入研究和分析,成功開(kāi)發(fā)了其在嵌入式DM3730平臺(tái)下的驅(qū)動(dòng),實(shí)現(xiàn)了無(wú)線網(wǎng)絡(luò)的接入。

1 系統(tǒng)硬件平臺(tái)

  遠(yuǎn)程視頻監(jiān)控系統(tǒng)中,智能無(wú)線網(wǎng)絡(luò)攝像機(jī)主要承擔(dān)著圖像采集、數(shù)據(jù)編碼、網(wǎng)絡(luò)傳送等功能。硬件部分主要由核心處理模塊、網(wǎng)絡(luò)傳輸模塊、采集模塊、存儲(chǔ)模塊以及電源模塊等組成,系統(tǒng)硬件開(kāi)發(fā)平臺(tái)如圖1所示。

001.jpg

  核心處理模塊采用TI公司的TMS320DM3730片上系統(tǒng),DM3730是針對(duì)高清視頻產(chǎn)品市場(chǎng)推出的ARM+DSP雙核架構(gòu)處理器;采集模塊中,CMOS傳感器采用OmniVision公司的OV2715圖像傳感器,其為專門(mén)為高清視頻監(jiān)控而設(shè)計(jì)的支持1 080 P視頻采集的圖像傳感器。該系統(tǒng)網(wǎng)絡(luò)傳輸模塊采用Realtek公司生產(chǎn)的一款基于802.11g的無(wú)線網(wǎng)卡,采用RTL8188無(wú)線網(wǎng)絡(luò)芯片,采用簡(jiǎn)單靈活、即插即用的USB接口方式接入系統(tǒng)。

2 無(wú)線網(wǎng)卡驅(qū)動(dòng)模型

  基于USB接口的無(wú)線網(wǎng)卡通過(guò)USB總線接入主機(jī)系統(tǒng),USB無(wú)線網(wǎng)卡驅(qū)動(dòng)分為USB設(shè)備端驅(qū)動(dòng)和網(wǎng)絡(luò)設(shè)備端驅(qū)動(dòng)兩部分[2],USB無(wú)線網(wǎng)卡驅(qū)動(dòng)結(jié)構(gòu)如圖2所示。

002.jpg

  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所示。

003.jpg

  USB核心驅(qū)動(dòng)主要負(fù)責(zé)對(duì)USB設(shè)備的整體控制,包括實(shí)現(xiàn)USB設(shè)備和主機(jī)控制器之間的通信,其內(nèi)部封裝了一系列API,用以屏蔽來(lái)自不同設(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]。

  編寫(xiě)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)存釋放和資源回收等工作。

  (4)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ú)線網(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ú)線網(wǎng)卡驅(qū)動(dòng)

  無(wú)線網(wǎng)卡驅(qū)動(dòng)主要負(fù)責(zé)屏蔽底層硬件設(shè)備具體細(xì)節(jié),向上層協(xié)議棧提供一致的數(shù)據(jù)發(fā)送和接收接口,驅(qū)動(dòng)硬件設(shè)備完成數(shù)據(jù)包收發(fā)等功能;無(wú)線網(wǎng)卡數(shù)據(jù)包發(fā)送與接收過(guò)程主要用到struct sk_buff結(jié)構(gòu)體[5],其實(shí)際用于描述套接字緩沖區(qū)結(jié)構(gòu),被用來(lái)在Linux系統(tǒng)網(wǎng)絡(luò)各層之間傳遞數(shù)據(jù)。

  無(wú)線網(wǎng)卡發(fā)送數(shù)據(jù)時(shí),Linux在內(nèi)核申請(qǐng)數(shù)據(jù)包sk_buff緩沖區(qū),然后遞交給下層,下層添加相關(guān)協(xié)議頭后直接交給硬件將數(shù)據(jù)包發(fā)送出去。無(wú)線網(wǎng)卡接收數(shù)據(jù)時(shí),將收到的數(shù)據(jù)包按照sk_buff格式提交給上層,上層剝離協(xié)議頭后,交給上層應(yīng)用程序調(diào)用[6]。

  無(wú)線網(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ú)線網(wǎng)卡驅(qū)動(dòng)主要遵循三個(gè)步驟:首先,通過(guò)模塊加載后分配得到一個(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ú)線網(wǎng)卡驅(qū)動(dòng)設(shè)計(jì)與實(shí)現(xiàn)

  無(wú)線網(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ú)線網(wǎng)卡驅(qū)動(dòng)設(shè)計(jì)流程圖如圖4所示。

004.jpg

  3.1 網(wǎng)卡初始化模塊驅(qū)動(dòng)設(shè)計(jì)

  系統(tǒng)上電,Linux內(nèi)核啟動(dòng)后會(huì)加載驅(qū)動(dòng)模塊,USB無(wú)線網(wǎng)卡驅(qū)動(dòng)向USB系統(tǒng)注冊(cè);當(dāng)無(wú)線網(wǎng)卡插入U(xiǎn)SB總線時(shí),USB core調(diào)用probe()方法來(lái)檢測(cè)Vendor id和Product id信息[8],以確定無(wú)線網(wǎng)卡設(shè)備是否與驅(qū)動(dòng)程序匹配;匹配成功則進(jìn)行網(wǎng)卡初始化,網(wǎng)卡初始化模塊設(shè)計(jì)流程如圖5所示。

005.jpg

  在該初始化模塊中,系統(tǒng)為網(wǎng)卡分配了無(wú)線設(shè)備硬件設(shè)備struct ieee80211_hw數(shù)據(jù),用相關(guān)自定義函數(shù)對(duì)該數(shù)據(jù)結(jié)構(gòu)進(jìn)行了填充;同時(shí)填充了描述無(wú)線網(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ú)線網(wǎng)卡具備IO/MEM映射、中斷和DMA等硬件資源,故可以通過(guò)中斷來(lái)實(shí)現(xiàn)數(shù)據(jù)的接收[9];而USB無(wú)線網(wǎng)卡不具備這類資源,只能通過(guò)主機(jī)輪詢是否有數(shù)據(jù)需要讀取或者接收。因此,首先向USB核心申請(qǐng)一個(gè)讀請(qǐng)求URB,用以數(shù)據(jù)到來(lái)時(shí)的存放。網(wǎng)卡數(shù)據(jù)接收模塊設(shè)計(jì)流程如圖6所示。

006.jpg

  3.3 網(wǎng)卡數(shù)據(jù)發(fā)送模塊驅(qū)動(dòng)設(shè)計(jì)

  無(wú)線網(wǎng)卡發(fā)送數(shù)據(jù)通過(guò)對(duì)硬件設(shè)備的讀寫(xiě)來(lái)完成。當(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所示。

007.jpg

  3.4 其他關(guān)鍵驅(qū)動(dòng)模塊設(shè)計(jì)

  在定義設(shè)備文件操作struct ieee80211_ops rtl8188_ops結(jié)構(gòu)體中,start指針指向打開(kāi)函數(shù)rtl8188_start(),當(dāng)使用命令ifconfig配置無(wú)線網(wǎng)卡時(shí),調(diào)用該函數(shù),主要完成分配資源,初始化接收和發(fā)送隊(duì)列等功能;stop指針指向rtl8188_stop()函數(shù),其工作與start函數(shù)相反,當(dāng)網(wǎng)卡由開(kāi)啟變?yōu)殛P(guān)閉時(shí)調(diào)用;add_interface指針指向添加接口函數(shù),其在設(shè)備可用之前調(diào)用,用來(lái)配置接口,可將接口配置成ad-hoc點(diǎn)對(duì)點(diǎn)模式、主機(jī)模式或者monitor模式等;刪除接口函數(shù)在stop之前調(diào)用,主要功能是清除保存MAC地址,使設(shè)備不能接收數(shù)據(jù)包。編寫(xiě)無(wú)線網(wǎng)卡驅(qū)動(dòng),以上幾個(gè)數(shù)據(jù)結(jié)構(gòu)必須要實(shí)現(xiàn)。

4 無(wú)線網(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),通過(guò)make menuconfig添加對(duì)WLAN的支持;最后,編寫(xiě)相應(yīng)的makefile文件,使用make命令在系統(tǒng)中編譯生成rtl8188.ko驅(qū)動(dòng)模塊。在硬件平臺(tái)系統(tǒng)中安裝有關(guān)無(wú)線管理程序,采用iwconfig、iwapy等命令,配置網(wǎng)絡(luò)的KEY、ESSID、接入模式等。

  4.2 程序測(cè)試及結(jié)果分析

  結(jié)合特定硬件平臺(tái)和相關(guān)開(kāi)發(fā)環(huán)境的搭建,組建典型的網(wǎng)絡(luò)完成對(duì)無(wú)線網(wǎng)卡驅(qū)動(dòng)的測(cè)試,網(wǎng)絡(luò)拓?fù)淙缦聢D8所示。

008.jpg

  在調(diào)試窗口中,通過(guò)動(dòng)態(tài)加載命令“insmod rtl8188.ko”將無(wú)線網(wǎng)卡驅(qū)動(dòng)模塊下載到內(nèi)核中,無(wú)線網(wǎng)卡接入系統(tǒng)后,自動(dòng)掃描并初始化網(wǎng)卡,通過(guò)lsmod命令查看加載模塊,網(wǎng)卡驅(qū)動(dòng)加載成功后如圖9所示。

009.jpg

  4.2.1 Ping連通性測(cè)試

  利用ifconfig命令配置無(wú)線網(wǎng)卡IP地址、無(wú)線熱點(diǎn)ESSID和KEY,設(shè)置無(wú)線網(wǎng)卡接入無(wú)線路由,測(cè)試網(wǎng)卡和路由器之間的連通性。USB無(wú)線網(wǎng)卡和路由器連通測(cè)試結(jié)果如圖10所示。

010.jpg

  將主機(jī)IP地址和無(wú)線網(wǎng)卡設(shè)置在同一網(wǎng)段,測(cè)試無(wú)線網(wǎng)卡和主機(jī)之間的互通性。主機(jī)IP地址為192.168.0.88,通過(guò)命令ping之后的結(jié)果如圖11所示。

011.jpg

  通過(guò)以上結(jié)果可以得出,USB無(wú)線網(wǎng)卡、無(wú)線路由器、主機(jī)之間是互通的,網(wǎng)卡和主機(jī)成功建立了網(wǎng)絡(luò)連接,無(wú)線網(wǎng)卡驅(qū)動(dòng)工作正常,還需對(duì)其速率進(jìn)行測(cè)試。

  4.2.2 網(wǎng)卡速率測(cè)試

  編寫(xiě)網(wǎng)卡速率測(cè)試程序,該程序采用C/S模式,客戶端運(yùn)行在開(kāi)發(fā)板上,服務(wù)端運(yùn)行在Linux PC上。測(cè)試程序的主要工作流程如下:客戶端分別發(fā)送大小不同的數(shù)據(jù)包,服務(wù)端接收后計(jì)算出對(duì)應(yīng)的帶寬速率,測(cè)試結(jié)果如下表1所示。

012.jpg

  經(jīng)過(guò)多組數(shù)據(jù)發(fā)送接收試驗(yàn),該無(wú)線網(wǎng)卡工作正常,在距離無(wú)線節(jié)點(diǎn)10 m半徑范圍內(nèi)帶寬速率為10.45 Mb/s。

  由以上結(jié)果得出,USB無(wú)線網(wǎng)卡收發(fā)數(shù)據(jù)功能已經(jīng)實(shí)現(xiàn)且工作穩(wěn)定,驅(qū)動(dòng)讀寫(xiě)相關(guān)寄存器等配置正確,真正實(shí)現(xiàn)了“驅(qū)動(dòng)”硬件的功能,從而直接地驗(yàn)證了驅(qū)動(dòng)編寫(xiě)方案的合理性,同時(shí)間接地確認(rèn)了模型的可行性。

5 結(jié)束語(yǔ)

  本文介紹了一種USB無(wú)線網(wǎng)卡驅(qū)動(dòng)模型,并對(duì)USB設(shè)備驅(qū)動(dòng)和網(wǎng)卡功能驅(qū)動(dòng)進(jìn)行了深入研究;在嵌入式硬件平臺(tái)上開(kāi)發(fā)了USB無(wú)線網(wǎng)卡驅(qū)動(dòng),最后在搭建的網(wǎng)絡(luò)平臺(tái)上完成了實(shí)驗(yàn)測(cè)試,驗(yàn)證了模型和程序的正確性。文中提出的無(wú)線網(wǎng)卡驅(qū)動(dòng)模型和實(shí)現(xiàn)方法,對(duì)相關(guān)開(kāi)發(fā)人員有一定的參考和指導(dǎo)價(jià)值。

參考文獻(xiàn)

  [1] 沈韜,李紹榮.無(wú)線網(wǎng)卡驅(qū)動(dòng)分析與WLAN性能測(cè)試[J].通信技術(shù),2009,42(10):105-110.

  [2] 陳立朋.基于Linux的USB無(wú)線網(wǎng)卡通用驅(qū)動(dòng)框架設(shè)計(jì)[D].長(zhǎng)春:吉林大學(xué),2012.

  [3] 郭昊.嵌入式Linux上USB無(wú)線網(wǎng)卡驅(qū)動(dòng)的研究與實(shí)現(xiàn)[D].廣州:暨南大學(xué),2012.

  [4] VENKATESWARAN S.精通Linux設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā)[M].宋寶華,何照然,史海濱,等譯.北京:人民郵電出版社,2010.

  [5] 錢(qián)曉華,郭繼紅.基于嵌入式linux的無(wú)線網(wǎng)卡驅(qū)動(dòng)程序[J].遼寧大學(xué)學(xué)報(bào)(自然科學(xué)版),2008,6(2):55-57.

  [6] 葉學(xué)程,鄭霖.嵌入式Linux的USB-Chirp無(wú)線網(wǎng)卡驅(qū)動(dòng)設(shè)計(jì)[J].單片機(jī)與嵌入式系統(tǒng)應(yīng)用,2014(7):53-56.

  [7] 王標(biāo),郭敏,單保慈.基于ARM的無(wú)線網(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ú)線網(wǎng)卡設(shè)備驅(qū)動(dòng)研究[J].核電子學(xué)與探測(cè)技術(shù),2010,30(4):519-523.


本站內(nèi)容除特別聲明的原創(chuàng)文章之外,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點(diǎn)。轉(zhuǎn)載的所有的文章、圖片、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無(wú)法一一聯(lián)系確認(rèn)版權(quán)者。如涉及作品內(nèi)容、版權(quán)和其它問(wèn)題,請(qǐng)及時(shí)通過(guò)電子郵件或電話通知我們,以便迅速采取適當(dāng)措施,避免給雙方造成不必要的經(jīng)濟(jì)損失。聯(lián)系電話:010-82306118;郵箱:aet@chinaaet.com。