潘澤鍇,覃貴禮,羅云芳(廣西職業(yè)技術(shù)學(xué)院 計算機與電子信息工程系,南寧 530226)
?
基于流式接口驅(qū)動的USB無線網(wǎng)卡①
潘澤鍇,覃貴禮,羅云芳
(廣西職業(yè)技術(shù)學(xué)院 計算機與電子信息工程系,南寧 530226)
摘 要:對比Windows CE系統(tǒng)驅(qū)動開發(fā)方式,提出以流式接口驅(qū)動模式的USB無線網(wǎng)卡的設(shè)計與開發(fā),詳細闡述了流式接口驅(qū)動的體系結(jié)構(gòu)與實現(xiàn)流程,面向ARM11處理器的嵌入式平臺以流式結(jié)構(gòu)為框架實現(xiàn)USB無線網(wǎng)卡驅(qū)動開發(fā),通過現(xiàn)場測試結(jié)果表明系統(tǒng)驅(qū)動實現(xiàn)方式切實可行,系統(tǒng)運行穩(wěn)定、可靠,基本滿足系統(tǒng)設(shè)計的目標(biāo)要求.
關(guān)鍵詞:流式接口; 嵌入式系統(tǒng); USB; 無線網(wǎng)卡
設(shè)備驅(qū)動程序時操作系統(tǒng)與硬件交互的方式,是連接硬件和操作系統(tǒng)的橋梁.它的功能主要是初始化并驅(qū)動內(nèi)部和外圍的硬件設(shè)備,或者為它們提供接口,以將操作系統(tǒng)和硬件設(shè)備連接起來,使其能夠識別指定的設(shè)備并為相應(yīng)的應(yīng)用程序提供設(shè)備服務(wù),與操作系統(tǒng)實現(xiàn)無縫連接[1].
Windows CE是微軟推出功能強大、高效、可裁剪32位嵌入式開發(fā)系統(tǒng),其運行機制與應(yīng)用于普通PC機的操作系統(tǒng)類似,但是其驅(qū)動程序開發(fā)工具和開發(fā)方法存在較大區(qū)別.所以,一般熟悉Windows環(huán)境的程序員在Windows CE環(huán)境下進行程序開發(fā)時,往往難以很快適應(yīng)[2,3].相對于同樣是流行的Linux嵌入式系統(tǒng),USB設(shè)備在邏輯上分為設(shè)備、配置、接口和端口4個層次,層次多勢必造成開發(fā)和調(diào)試的難度增大,這就對初學(xué)者提出較高的要求; 而Windows CE平臺流式接口驅(qū)動可以簡化成模式設(shè)備和平臺相關(guān)驅(qū)動兩個層次,模式設(shè)備驅(qū)動相對固定,可以和別的驅(qū)動開發(fā)共用,對比兩個開發(fā)模式,流式接口驅(qū)動開發(fā)相對簡單易行[4].從硬件上考慮,相對其他開發(fā)模式,USB無線網(wǎng)卡流接口驅(qū)動開發(fā)的硬件可以要求硬件的復(fù)雜度較低,外圍電路相對較少,硬件亦可以整體的方式給出,從而降低開發(fā)難度[5].
為此,本文就Windows CE 下的驅(qū)動工作原理與程序運行機制進行了分析,設(shè)計了一個以三星ARM11處理器S3C6410嵌入式平臺為核心的USB無線網(wǎng)卡驅(qū)動系統(tǒng),詳細闡述平臺流接口驅(qū)動設(shè)計以及USB無線網(wǎng)卡驅(qū)動的實現(xiàn)方法,其他類型更為復(fù)雜的接口程序亦可按此方式進行設(shè)計和開發(fā)[6].
2.1Windows CE驅(qū)動對比分析
在Windows CE系統(tǒng)中,驅(qū)動程序分為流接口驅(qū)動程序和本機設(shè)備驅(qū)動程序.本機設(shè)備驅(qū)動程序主要是和系統(tǒng)本身自帶的設(shè)備相關(guān),而流接口驅(qū)動程序則針對系統(tǒng)中所有外接的設(shè)備.而在本系統(tǒng)開發(fā)中,USB無線網(wǎng)卡作為一個系統(tǒng)外設(shè)加入整個系統(tǒng),有鑒于此,采用流式接口驅(qū)動開發(fā)切實易行.
流接口驅(qū)動程序的主要任務(wù)是把對外設(shè)相應(yīng)的操作傳遞給設(shè)備管理器應(yīng)用程序,這是通過把設(shè)備表示成文件系統(tǒng)的一個特殊的文件來完成的.在此結(jié)構(gòu)下,把所有的硬件設(shè)備都看成文件,和設(shè)備的交互其實就是讀寫文件,也就是數(shù)據(jù)流動.這樣開發(fā)驅(qū)動不僅簡單實用,并且用戶也用一致的接口訪問硬件,大大降低了開發(fā)的難度.與流驅(qū)動相反,本地驅(qū)動主要是人機界面相關(guān)的驅(qū)動,它們由GWES管理,在系統(tǒng)啟動時加載.本地驅(qū)動由操作系統(tǒng)調(diào)用; 本地驅(qū)動提供給操作系統(tǒng)的不是標(biāo)準(zhǔn)的流接口,而是事先約定好的特定接口,不同的設(shè)備,接口也不一樣,應(yīng)用程序不能訪問,對于這類驅(qū)動,驅(qū)動調(diào)試助手是無能為力的,對于開發(fā)者來說編譯、下載、驗證都較為困難.對比兩者的特點,在進行USB無線網(wǎng)卡驅(qū)動開發(fā)中,選用流式接口驅(qū)動簡單易行,同時增加驅(qū)動可移植性和可靠性.
2.2流接口驅(qū)動程序工作體系結(jié)構(gòu)
流接口驅(qū)動程序表現(xiàn)為一個動態(tài)鏈接庫,由設(shè)備管理器統(tǒng)一加載、管理和卸載,達到應(yīng)用程序訪問驅(qū)動程序、操作硬件的目的.流接口驅(qū)動程序通過編譯后,生成DLL 文件,即動態(tài)鏈接庫文件.操作系統(tǒng)可在運行時動態(tài)地加載需要的DLL文件,這樣可以輕松實現(xiàn)外設(shè)的即插即用[1,7].
流接口驅(qū)動程序具有固定的入口點函數(shù),它把設(shè)備抽象為文件進行操作,Windows CE 的文件系統(tǒng)通過這些入口點函數(shù)與流接口驅(qū)動進行通信,而應(yīng)用程序則使用操作系統(tǒng)提供的文件API對外設(shè)進行訪問.為此,設(shè)計流式驅(qū)動程序的體系結(jié)構(gòu)如圖1所示.
其中,應(yīng)用層模塊和流式就扣驅(qū)動模塊由用戶自己設(shè)計,文件管理模塊FileSys.exe和設(shè)備管理器模塊Device.exe模塊由Windows CE操作系統(tǒng)提供,用戶不能修改.
圖1 流式驅(qū)動程序體系結(jié)構(gòu)
首先,應(yīng)用層接收到操作界面發(fā)來的執(zhí)行命令,調(diào)用API文件向操作系統(tǒng)的文件管理器FileSys.exe加入進程,然后文件管理器模塊把執(zhí)行權(quán)交給設(shè)備管理器,由它根據(jù)具體的請求,調(diào)用不同流式接口函數(shù)與硬件之間進行交互,最終完成硬件的具體操作.在整個流接口驅(qū)動結(jié)構(gòu)中,每個流接口驅(qū)動必須實現(xiàn)一組標(biāo)準(zhǔn)的函數(shù),用來完成標(biāo)準(zhǔn)的文件I/O函數(shù)和電源管理函數(shù),這些函數(shù)提供給Windows CE操作系統(tǒng)的內(nèi)核使用.不管流接口驅(qū)動控制什么樣的設(shè)備,它都向其它模塊提供同樣的流接口DLL函數(shù),任何一個邏輯上可以看作數(shù)據(jù)源的設(shè)備都可以為其實現(xiàn)一個流接口驅(qū)動程序[7].
2.3流式接口驅(qū)動實現(xiàn)流程
流接口驅(qū)動程序是以動態(tài)鏈接庫形式存在的,由設(shè)備管理器統(tǒng)一加載、管理和卸載,它接受來自設(shè)備管理器和應(yīng)用程序(通過操作系統(tǒng)的文件系統(tǒng))的命令.在這個過程中匯涉及很多實體,這里僅保留硬件、流式接口程序、系統(tǒng)注冊表、設(shè)備管理器與應(yīng)用程序五個實體管理模塊.整體流式接口驅(qū)動工作原理流程圖如圖2所示.
由圖可以清晰的看出流式驅(qū)動程序工作整個過程.在流程之初,設(shè)備管理器Device.exe從注冊表DLL鍵值中獲取所在DLL文件名加載驅(qū)動程序,調(diào)用LoadDriver()函數(shù)把DLL文件進程加載到虛擬內(nèi)存空間中; 然后設(shè)備管理器調(diào)用程序中xxx_Init函數(shù)對硬件進行一些最基本初始化操作; 至此,流式接口驅(qū)動已成功被加載[1,7].
圖2 流式驅(qū)動工作原理流程圖
接下來是應(yīng)用程序使用設(shè)備文件管理器FileSys.exe調(diào)用CreatFile()打開設(shè)備,使用xxx_Open函數(shù)對硬件進行一些額外初始化工作,使硬件進入工作狀態(tài),并且返回結(jié)果給設(shè)備管理器進行下一步操作.最后,文件管理器根據(jù)CreatFile()返回的句柄,通過Device.exe調(diào)用ReadFile()函數(shù)讀取設(shè)備數(shù)據(jù)信息,調(diào)用xxx_Read函數(shù)與硬件交互,從硬件中讀取操作信息.當(dāng)應(yīng)用程序不再使用該設(shè)備時,系統(tǒng)調(diào)用CloseHandl()將設(shè)備關(guān)閉,流式接口驅(qū)動程序的完整生命周期至此結(jié)束.
驅(qū)動本身會把這些接受到的命令轉(zhuǎn)化為外部設(shè)備相應(yīng)動作.此外,該系統(tǒng)設(shè)計的流式接口驅(qū)動程序時放在用戶態(tài)而不是核心態(tài)來實現(xiàn),也增強了系統(tǒng)穩(wěn)定性,為驅(qū)動人員提供了便利.而在嵌入式系統(tǒng)中,以流驅(qū)動模式為策略的框架下USB無線網(wǎng)卡的設(shè)計與開發(fā)靈活并且簡單易行,下面以USB無線網(wǎng)卡驅(qū)動實現(xiàn)方法說明流接口優(yōu)點.
流接口驅(qū)動程序調(diào)用設(shè)備管理器與系統(tǒng)內(nèi)核或外圍設(shè)備打交道,給操作系統(tǒng)和驅(qū)動程序帶來很大靈活性.根據(jù)流式驅(qū)動工作原理,設(shè)計的USB無線網(wǎng)卡驅(qū)動程序是以支持S3C6410處理器的Windows CE驅(qū)動程序框架為基礎(chǔ),根據(jù)S3C6410處理器的USB接口單元以及USB無線網(wǎng)卡的特性和原理而設(shè)計的.與上述的流式程序體系結(jié)構(gòu)相對應(yīng),整個系統(tǒng)的核心控制簡化三個層面: 設(shè)備驅(qū)動層、實時操作系統(tǒng)、應(yīng)用層[8].
3.1驅(qū)動整體構(gòu)架設(shè)計
本系統(tǒng)的USB無線網(wǎng)卡驅(qū)動采用Windows CE的流接口驅(qū)動方式,系統(tǒng)驅(qū)動整體框架結(jié)構(gòu)如圖3所示.
圖3 系統(tǒng)驅(qū)動整體框架結(jié)構(gòu)圖
設(shè)計的整個系統(tǒng)通過Windows CE內(nèi)核操作系統(tǒng)進行控制,USB網(wǎng)卡驅(qū)動包括實現(xiàn) USB總線協(xié)議棧調(diào)用三個入口函數(shù)和實現(xiàn)設(shè)備控制的流接口函數(shù)[9].USB無線網(wǎng)卡的驅(qū)動首先調(diào)用USBDeviceAttach()、USBInstallDriver()、USBUninstallDriver()這三個入口,再在內(nèi)核總編譯其他流接口函數(shù),在內(nèi)核系統(tǒng)中成功被編譯USB.dll動態(tài)連接庫的形式,通過設(shè)備管理器Device.exe識別枚舉程序中以USB前綴的函數(shù)并加載,流接口函數(shù)可以實現(xiàn)電源控制、I/O管理、中斷控制,應(yīng)用程序通過文件系統(tǒng)API命令調(diào)用驅(qū)動程序流接口函數(shù)發(fā)送控制命令[10].
3.2系統(tǒng)驅(qū)動入口函數(shù)實現(xiàn)
在Windows CE下,USB設(shè)備驅(qū)動編寫使用USBD提供的函數(shù)操作USB設(shè)備,以動態(tài)鏈接庫DLL提供的入口點與USBD模塊進行交互,函數(shù)調(diào)用流程如圖4.
圖4 USBD模塊函數(shù)調(diào)用流程圖
從USBD模塊函數(shù)調(diào)用流程圖可以看出,USBD模塊函數(shù)調(diào)用過程主要由USBDeviceAttach()、USBInstallDriver()、USBUninstallDriver()三個函數(shù)串連起來,USB驅(qū)動傳輸通道基本配置也主要由三個基本函數(shù)完成[11].
(1)USBDeviceAttach()函數(shù).當(dāng)USB無線網(wǎng)卡連接到計算機上時,它是驅(qū)動程序的入口函數(shù),USBD模塊調(diào)用此函數(shù),這個函數(shù)主要用于初始化無線網(wǎng)卡模塊,取得無線網(wǎng)卡設(shè)備信息,配置無線網(wǎng)卡設(shè)備,并且申請必需的資源.它依次調(diào)用下面三個函數(shù): RegisterClientDriverID、RegisterClientSetings、和GetSetKeyValue和完成注冊表的配置.
(2)USBInstallDriver()函數(shù).首先實現(xiàn)主控制器相關(guān)寄存器的初始化,在獲取網(wǎng)卡信息的情況下,指定網(wǎng)卡總線的類型和設(shè)備中斷ID號,然后為片內(nèi)存儲器分配內(nèi)存,綁定虛擬地址.另外,主要用于創(chuàng)建一個驅(qū)動程序加載所需的注冊表信息,例如網(wǎng)卡讀寫超時,設(shè)備名稱等,同時為包括網(wǎng)卡控制流程信息提供進程.
(3)USBUninstallDriver()函數(shù).主要用于釋放驅(qū)動程序所占用的資源,釋放其他進程所占用的內(nèi)存空間,以及刪除USBInstallDriver()函數(shù)創(chuàng)建的注冊表等.這個過程與USBInstallDriver()函數(shù)操作順序相反.解除注冊信息,可以使空函數(shù).
3.2系統(tǒng)流接口驅(qū)動函數(shù)實現(xiàn)
USB無線網(wǎng)卡驅(qū)動程序?qū)崿F(xiàn)流接口形式驅(qū)動以后,文件系統(tǒng)的API接口通過訪問特殊文件來實現(xiàn)與設(shè)備信息的交換,流接口函數(shù)直接調(diào)用與硬件設(shè)備相關(guān)的處理函數(shù),省去層與層之間調(diào)用和信息傳遞,有利于提高驅(qū)動實現(xiàn)的實時性.在系統(tǒng)軟件整體框架的基礎(chǔ)上,設(shè)計系統(tǒng)流接口驅(qū)動函數(shù)實現(xiàn)流程如圖5所示[11,12].
在軟件實現(xiàn)前,系統(tǒng)首先檢測USB無線網(wǎng)卡硬件是否連接,如果找到相應(yīng)的硬件設(shè)備,打開設(shè)備管理器Device.exe,連接I/O控制,查詢到設(shè)備后加載驅(qū)動配置傳輸模式,根據(jù)獲取的加載流驅(qū)動程序是否成功調(diào)用API命令決定是否再加載,直至成功加載,關(guān)閉設(shè)備.USB無線網(wǎng)卡流接口驅(qū)動是通過初始化函數(shù)USB_Init、打開設(shè)備管理函數(shù)USB_Open、I/O控制函數(shù)USB_ IOControl、從系統(tǒng)總線讀取圖像信息函數(shù)USB_ Read、向系統(tǒng)總線寫入控制命令函數(shù)USB_Write、設(shè)備卸載函數(shù)USB_Deinit等9個基本功能函數(shù)來實現(xiàn)[13].
圖5 軟件實現(xiàn)流程圖
系統(tǒng)通過驅(qū)動程序提供的入口函數(shù)和上述接口函數(shù)實現(xiàn),在USB無線網(wǎng)卡實現(xiàn)過程中完成了硬件的初始化、時序同步、信息流控制等功能,起到設(shè)備的控制中樞作用.在流式驅(qū)動開發(fā)完成后,通過編寫應(yīng)用程序在嵌入式終端的觸摸屏上顯示出來.流接口函數(shù)直接調(diào)用與硬件設(shè)備相關(guān)的處理函數(shù),省去層與層之間調(diào)用和信息傳遞,有利于提高系統(tǒng)工作過程控制的實時性.
完成基于流式接口驅(qū)動的USB無線網(wǎng)卡驅(qū)動開發(fā)以后,需要對系統(tǒng)的性能和一些參數(shù)進行現(xiàn)場調(diào)試.和其他接口不一樣,USB無線網(wǎng)卡模塊可以輕松實現(xiàn)熱插拔,嵌入式系統(tǒng)會自動識別到接口有硬件載入,并調(diào)用內(nèi)核無線網(wǎng)卡驅(qū)動程序?qū)崿F(xiàn)它們之間數(shù)據(jù)的交互,USB無線網(wǎng)卡模塊驅(qū)動程序初始化包括注冊表的寫入,函數(shù)的加載啟動信息反饋到調(diào)試軟件上,無線模塊在加載驅(qū)動時的啟動信息如圖6所示.
圖6 USB無線網(wǎng)卡驅(qū)動加載信息
調(diào)試中已經(jīng)配好無線通信網(wǎng)絡(luò),從系統(tǒng)的無線網(wǎng)卡窗口會搜索到相關(guān)的無線信息,如圖7所示.在調(diào)試中使用無線寬帶路由器,系統(tǒng)會自動搜索到,設(shè)置好安全選項之后連接即可.
圖7 USB無線網(wǎng)卡連接
從USB無線網(wǎng)卡現(xiàn)場測試環(huán)境和結(jié)果看來,設(shè)計基于流式接口驅(qū)動的USB無線系統(tǒng)具有體積小、功耗低、運行速度快、連接方便等特點,設(shè)計具有友好的人機交互界面,具有很好的實用推廣價值.
Windows CE系統(tǒng)流接口設(shè)備驅(qū)動程序是一種結(jié)構(gòu)比較簡潔的驅(qū)動程序,在Windows CE驅(qū)動中占有重要的位置.本文在透徹了解了驅(qū)動開發(fā)的機理后,以USB無線網(wǎng)卡驅(qū)動開發(fā)為例詳細闡述平臺流接口驅(qū)動整體流程設(shè)計與驅(qū)動函數(shù)實現(xiàn)方式,表明系統(tǒng)運行穩(wěn)定、可靠,基本滿足系統(tǒng)設(shè)計的目標(biāo)要求.在此基礎(chǔ)上,還可以向驅(qū)動程序中添加自己需要實現(xiàn)的其它功能,甚至應(yīng)用程序的一部份功能也可以在加載驅(qū)動時實現(xiàn),為其他類似驅(qū)動開發(fā)提供參考,同時也為后期有特殊需要的應(yīng)用程序開發(fā)奠定基礎(chǔ).
參考文獻
1張冬泉,譚南林,王雪梅等.Windows CE 實用開發(fā)技術(shù).北京: 電子工業(yè)出版社,2006.
2陳凱,鄧明,張啟東等.大地電磁儀的Windows CE啟動程序設(shè)計.計算機工程,2008,34(13):277–279.
3賈銀潔,許鵬飛.USB無線網(wǎng)卡驅(qū)動程序的設(shè)計.廣東電腦與電訊,2007(10):13–14.
4葉學(xué)程,鄭霖.嵌入式Linux的USB—Chirp無線網(wǎng)卡驅(qū)動設(shè)計.單片機與嵌入式系統(tǒng)應(yīng)用,2014(7):53–56.
5侯戰(zhàn)勝,姚放吾.基于i.MX21的AdHoc網(wǎng)絡(luò)終端的設(shè)計與實現(xiàn).微機發(fā)展,2010(1).5–8.
6鄭秀杰.基于嵌入式WinCE 6.0的脈沖/數(shù)據(jù)發(fā)生器軟件設(shè)計.現(xiàn)代電子技術(shù),2013,12:83–85.
7何宗鍵.Windows CE嵌入式系統(tǒng).北京:北京航空航天大學(xué)出版社,2006.
8龔小林,段建紅.基于Windows CE.Net嵌入式系統(tǒng)的數(shù)據(jù)庫設(shè)計與應(yīng)用.現(xiàn)代電子技術(shù),2013,32(20):71–74.
9辛華峰,于楓,譚健,王文麗.嵌入式 USB 主從機應(yīng)用模塊.吉林大學(xué)學(xué)報(工學(xué)版),2005,35(2):18–21.
10劉全利,宋健軍,王偉.基于USB總線的多功能車輛總線網(wǎng)卡設(shè)計與實現(xiàn).上海交通大學(xué)學(xué)報,2011,45(8):1207–1210.
11胡彬彬,郭淑琴.支持WPA加密的無線網(wǎng)卡驅(qū)動分析與功能實現(xiàn).電聲技術(shù),2014,38:82–85.
12Purcell,A.Quickly and easily automate test systems with USB.Electronic Design,2002,50 (23):67–70.
13汪兵.Windows CE嵌入式高級編程及其實例詳解.北京:中國水利水電出版社,2008.
USB Wireless Network Card Based on Stream Interface-driven
PAN Ze-Kai,QIN Gui-Li,LUO Yun-Fang
(Department of Computer and Electronic Information Engineering,Guangxi Polytechnic,Nanning 530226,China)
Abstract:Aimed at Windows CE system-driven development,the development and design of USB wireless network adapter under the frame of streaming interface drive mode strategy is proposed.The overall process design of the platform streaming interface drive and the function implementation mode of USB wireless network adapter are elaborated.Field testing results show that the system is stable and reliable in operation and can basically satisfy the service objects of the system design.
Key words:stream interface; embedded systems; USB; wireless network card
基金項目:① 廣西區(qū)教育廳自然科學(xué)基金(YB2014488,KY2015YB384);廣西職業(yè)技術(shù)學(xué)院自然科學(xué)資金(121208)
收稿時間:2015-08-14;收到修改稿時間:2015-09-28