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

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

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

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

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

0 引言

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

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

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

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

001.jpg

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

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

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

002.jpg

  2.1 USB設(shè)備驅(qū)動

  Linux操作系統(tǒng)中,USB子系統(tǒng)驅(qū)動程序主要由USB核心驅(qū)動(USBD)、USB主機控制器驅(qū)動(HCD)和具體的USB設(shè)備驅(qū)動三部分組成[3]。Linux下USB設(shè)備驅(qū)動結(jié)構(gòu)圖如圖3所示。

003.jpg

  USB核心驅(qū)動主要負(fù)責(zé)對USB設(shè)備的整體控制,包括實現(xiàn)USB設(shè)備和主機控制器之間的通信,其內(nèi)部封裝了一系列API,用以屏蔽來自不同設(shè)備的差異;USB主機控制器驅(qū)動直接與硬件進(jìn)行交互,主要負(fù)責(zé)對主機控制器硬件設(shè)備初始化,向USB核心提供對應(yīng)的接口,配置和控制根Hub設(shè)備等功能;USB客戶端設(shè)備驅(qū)動程序負(fù)責(zé)與上層應(yīng)用軟件模塊交互并為其提供相應(yīng)的接口,驅(qū)動具體的硬件設(shè)備,將設(shè)備掛載到USB核心中使其正常運轉(zhuǎn)[4]。

  編寫USB客戶端設(shè)備驅(qū)動時,內(nèi)核提供了相應(yīng)的接口,只需實現(xiàn)基本的函數(shù)即可,最常用的結(jié)構(gòu)體是struct usb_driver,創(chuàng)建客戶端程序需初始化其五個字段:

  (1)id_table字段:是一個指向struct usb_device_table結(jié)構(gòu)體的指針,該結(jié)構(gòu)指定了驅(qū)動程序能支持的所有USB設(shè)備類型,主要由Vendor id和Product id對組成。

  (2)probe字段:探測指針,USB設(shè)備接入系統(tǒng)上電后,會主動匹配相應(yīng)的驅(qū)動程序,調(diào)用自定義探測函數(shù),完成主要的初始化工作。

  (3)disconnect字段:分離函數(shù)指針,總線設(shè)備被移除或者驅(qū)動模塊從系統(tǒng)中卸載時,將調(diào)用自定義分離函數(shù),主要完成內(nèi)存釋放和資源回收等工作。

  (4)owner和name字段:owner指定該模塊擁有者;name指定該驅(qū)動程序名稱。

  usb_driver結(jié)構(gòu)體中的字段均被正確設(shè)置以后,調(diào)用注冊函數(shù)usb_register(),函數(shù)將USB接口驅(qū)動程序注冊到USB核心。注冊成功后,USB系統(tǒng)可以對無線網(wǎng)卡的接入和移除操作作出相應(yīng)的反應(yīng)。若要網(wǎng)卡成功收發(fā)數(shù)據(jù),需實現(xiàn)其網(wǎng)卡網(wǎng)絡(luò)設(shè)備驅(qū)動。

  2.2 無線網(wǎng)卡驅(qū)動

  無線網(wǎng)卡驅(qū)動主要負(fù)責(zé)屏蔽底層硬件設(shè)備具體細(xì)節(jié),向上層協(xié)議棧提供一致的數(shù)據(jù)發(fā)送和接收接口,驅(qū)動硬件設(shè)備完成數(shù)據(jù)包收發(fā)等功能;無線網(wǎng)卡數(shù)據(jù)包發(fā)送與接收過程主要用到struct sk_buff結(jié)構(gòu)體[5],其實際用于描述套接字緩沖區(qū)結(jié)構(gòu),被用來在Linux系統(tǒng)網(wǎng)絡(luò)各層之間傳遞數(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é)議頭后,交給上層應(yīng)用程序調(diào)用[6]。

  無線網(wǎng)卡設(shè)計與實現(xiàn)依賴于Linux系統(tǒng)提供的接口,主要為struct ieee80211_hw結(jié)構(gòu)體,該結(jié)構(gòu)體定義了硬件設(shè)備發(fā)送、接收、初始化接口。實現(xiàn)無線網(wǎng)卡驅(qū)動主要遵循三個步驟:首先,通過模塊加載后分配得到一個struct ieee80211_hw結(jié)構(gòu)體;其次,對這個結(jié)構(gòu)體的各個字段進(jìn)行設(shè)置和填充,完成硬件的相關(guān)配置;最后,利用相應(yīng)的注冊函數(shù)向內(nèi)核注冊驅(qū)動。

3 無線網(wǎng)卡驅(qū)動設(shè)計與實現(xiàn)

  無線網(wǎng)卡驅(qū)動工作原理如下:模塊加載時,系統(tǒng)首先完成對USB設(shè)備的掃描和初始化[7],其次初始化網(wǎng)卡硬件和狀態(tài),輪詢是否有數(shù)據(jù)需要發(fā)送和接收;模塊卸載時,分別先后注銷網(wǎng)絡(luò)設(shè)備和USB設(shè)備,完成相關(guān)資源的釋放工作。無線網(wǎng)卡驅(qū)動設(shè)計流程圖如圖4所示。

004.jpg

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

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

005.jpg

  在該初始化模塊中,系統(tǒng)為網(wǎng)卡分配了無線設(shè)備硬件設(shè)備struct ieee80211_hw數(shù)據(jù),用相關(guān)自定義函數(shù)對該數(shù)據(jù)結(jié)構(gòu)進(jìn)行了填充;同時填充了描述無線網(wǎng)卡操作的struct ieee80211_ops rtl8188_ops結(jié)構(gòu)體,該操作函數(shù)主要包括網(wǎng)卡發(fā)送、接收、配置、移除接口等操作。

  3.2 網(wǎng)卡數(shù)據(jù)接收模塊驅(qū)動設(shè)計

  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ù)接收模塊設(shè)計流程如圖6所示。

006.jpg

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

  無線網(wǎng)卡發(fā)送數(shù)據(jù)通過對硬件設(shè)備的讀寫來完成。當(dāng)應(yīng)用程序的數(shù)據(jù)被封裝好傳遞到驅(qū)動層時,會調(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)計數(shù)據(jù)。數(shù)據(jù)發(fā)送模塊驅(qū)動設(shè)計流程如圖7所示。

007.jpg

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

  在定義設(shè)備文件操作struct ieee80211_ops rtl8188_ops結(jié)構(gòu)體中,start指針指向打開函數(shù)rtl8188_start(),當(dāng)使用命令ifconfig配置無線網(wǎng)卡時,調(diào)用該函數(shù),主要完成分配資源,初始化接收和發(fā)送隊列等功能;stop指針指向rtl8188_stop()函數(shù),其工作與start函數(shù)相反,當(dāng)網(wǎng)卡由開啟變?yōu)殛P(guān)閉時調(diào)用;add_interface指針指向添加接口函數(shù),其在設(shè)備可用之前調(diào)用,用來配置接口,可將接口配置成ad-hoc點對點模式、主機模式或者monitor模式等;刪除接口函數(shù)在stop之前調(diào)用,主要功能是清除保存MAC地址,使設(shè)備不能接收數(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的支持;最后,編寫相應(yīng)的makefile文件,使用make命令在系統(tǒng)中編譯生成rtl8188.ko驅(qū)動模塊。在硬件平臺系統(tǒng)中安裝有關(guān)無線管理程序,采用iwconfig、iwapy等命令,配置網(wǎng)絡(luò)的KEY、ESSID、接入模式等。

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

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

008.jpg

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

009.jpg

  4.2.1 Ping連通性測試

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

010.jpg

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

011.jpg

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

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

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

012.jpg

  經(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ū)動編寫方案的合理性,同時間接地確認(rèn)了模型的可行性。

5 結(jié)束語

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

參考文獻(xiàn)

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

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

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

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

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

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

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


本站內(nèi)容除特別聲明的原創(chuàng)文章之外,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點。轉(zhuǎn)載的所有的文章、圖片、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無法一一聯(lián)系確認(rèn)版權(quán)者。如涉及作品內(nèi)容、版權(quán)和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當(dāng)措施,避免給雙方造成不必要的經(jīng)濟(jì)損失。聯(lián)系電話:010-82306118;郵箱:aet@chinaaet.com。
主站蜘蛛池模板: 色综合天天综久久久噜噜噜久久〔 | 亚洲五月激情综合图片区 | 亚洲丁香网 | 日韩精品视频在线播放 | 天天插天天透天天狠 | 91导航在线| 交在线观看网站视频 | 星光影院网高清在线观看 | 一级毛片直接看 | 日韩精品欧美激情亚洲综合 | 国产天堂亚洲精品 | tk中国丝袜丨vk| 国产精品视频免费看 | 激情免费视频 | 最刺激黄a大片免费观看 | 欧美一级三级在线观看 | 中国美女一级a毛片录像在线 | 免费成人毛片 | 国产精品91av | 国产婷婷一区二区三区 | 亚洲一区二区三区不卡视频 | 欧美视频在线一区二区三区 | 亚洲欧美日韩在线观看二区 | 亚洲黄色网址在线观看 | 欧美一级片 在线播放 | 日本视频一区二区 | 亚洲欧美日韩精品高清 | 男女真实有遮挡xx00动态图 | 人人做人人澡人人人爽 | 免费国产午夜高清在线视频 | 免费在线日韩 | 成人观看免费大片在线观看 | 永久免费观看午夜视频在线 | 男女啪啪猛烈到合不拢腿小说网 | 18在线观看的 | 麻豆精品国产免费观看 | 欧美日韩视频在线第一区 | 狼人久草 | 天天摸夜夜摸成人免费视频 | 99在线免费观看 | 老妇激情毛片免费 |