《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 嵌入式技術(shù) > 業(yè)界動(dòng)態(tài) > Windows CE中實(shí)現(xiàn)藍(lán)牙串口驅(qū)動(dòng)程序

Windows CE中實(shí)現(xiàn)藍(lán)牙串口驅(qū)動(dòng)程序

2008-08-04
作者:張 敬 高 強(qiáng)

??? 摘??要: 藍(lán)牙通信平臺(tái)在嵌入式系統(tǒng)" title="嵌入式系統(tǒng)">嵌入式系統(tǒng)的實(shí)現(xiàn)過(guò)程中,OBEX(對(duì)象交換)始終是很重要的一部分,,基于OBEX的藍(lán)牙文件傳輸?shù)玫綇V泛應(yīng)用,。而OBEX的實(shí)現(xiàn)是基于藍(lán)牙仿真串口" title="串口">串口,所以藍(lán)牙串口驅(qū)動(dòng)程序的實(shí)現(xiàn)就有了很重要的意義,。介紹了Windows CE下串口驅(qū)動(dòng)程序的結(jié)構(gòu)和一種具體的實(shí)現(xiàn)方法,。
??? 關(guān)鍵詞: 藍(lán)牙? OBEX? 嵌入式系統(tǒng)? 驅(qū)動(dòng)程序

?

??? Windows CE作為一種典型的嵌入式操作系統(tǒng),,通過(guò)將藍(lán)牙應(yīng)用移植到Windows CE中,,對(duì)于如pSOS+,、Nucleus等其它嵌入式系統(tǒng),具有典型意義,。由于OBEX上的文件傳輸應(yīng)用建立在RFCOMM實(shí)現(xiàn)的藍(lán)牙仿真串口上,,本文介紹OBEX文件傳輸?shù)乃{(lán)牙虛擬串口驅(qū)動(dòng)程序的實(shí)現(xiàn)。
1 Windows CE 設(shè)備驅(qū)動(dòng)程序" title="設(shè)備驅(qū)動(dòng)程序">設(shè)備驅(qū)動(dòng)程序概述
??? Windows CE 支持廣泛的基于各種CE平臺(tái)的設(shè)備驅(qū)動(dòng)程序,。目前,,它提供了四種設(shè)備模型,其中兩種是專用于Windows CE的模型,,另外兩種外部模型來(lái)自其它操作系統(tǒng),。基于Windows CE的兩種模型是本機(jī)的設(shè)備驅(qū)動(dòng)程序和流接口驅(qū)動(dòng)程序,。兩種外部模型用于通用串行總線(USB)和網(wǎng)絡(luò)驅(qū)動(dòng)器接口標(biāo)準(zhǔn)(NDIS)的驅(qū)動(dòng)程序,。
??? 由于藍(lán)牙協(xié)議是在無(wú)線技術(shù)下的仿真串口,藍(lán)牙中OBEX的許多應(yīng)用正是基于藍(lán)牙仿真串口,。而流接口驅(qū)動(dòng)程序通過(guò)一組流接口函數(shù)" title="接口函數(shù)">接口函數(shù)使得應(yīng)用程序" title="應(yīng)用程序">應(yīng)用程序可以通過(guò)文件系統(tǒng)中的特殊文件而與設(shè)備接口,,因此藍(lán)牙仿真串口的功能性更適合流接口驅(qū)動(dòng)程序的結(jié)構(gòu)。
2 Windows CE下藍(lán)牙串口驅(qū)動(dòng)程序的實(shí)現(xiàn)
??? 雖然藍(lán)牙設(shè)備驅(qū)動(dòng)程序的實(shí)現(xiàn)采用流接口驅(qū)動(dòng)程序設(shè)計(jì),,但由于兩種驅(qū)動(dòng)程序的基本結(jié)構(gòu)與原理相似,,所以下文從本機(jī)設(shè)備驅(qū)動(dòng)程序結(jié)構(gòu)開始,可以更清楚地認(rèn)識(shí)藍(lán)牙設(shè)備驅(qū)動(dòng)程序的實(shí)現(xiàn)原理,。
2.1?本機(jī)設(shè)備驅(qū)動(dòng)程序結(jié)構(gòu)
??? Windows CE 中包含的樣本設(shè)備驅(qū)動(dòng)程序分為兩種類型:?jiǎn)纹?qū)動(dòng)程序(Monolithic device driver)和分層的驅(qū)動(dòng)程序(Layered Device driver),。單片驅(qū)動(dòng)程序基于單個(gè)碼片,該碼片直接把硬件設(shè)備的功能性通過(guò)設(shè)備驅(qū)動(dòng)程序接口傳遞給操作系統(tǒng),。與單片驅(qū)動(dòng)程序相比,,分層的驅(qū)動(dòng)程序由兩個(gè)設(shè)置好的層組成:上層是模型設(shè)備驅(qū)動(dòng)程序(MDD),下層是依賴平臺(tái)的驅(qū)動(dòng)程序(PDD),。本文采用分層的驅(qū)動(dòng)程序來(lái)連接藍(lán)牙硬件和上面的文件傳輸應(yīng)用,。圖1說(shuō)明了兩種驅(qū)動(dòng)程序是如何在Windows CE操作系統(tǒng)中集成的。

?


??? 設(shè)備驅(qū)動(dòng)程序接口(DDI)是在MDD中實(shí)現(xiàn)的函數(shù)集,,GWES模塊通過(guò)這個(gè)接口調(diào)用設(shè)備驅(qū)動(dòng)程序,;設(shè)備驅(qū)動(dòng)程序服務(wù)器提供接口(DDSI)是在PDD中實(shí)現(xiàn)的函數(shù)集并由MDD調(diào)用。由于微軟提供了所有與MDD模塊相關(guān)的源代碼,,所以對(duì)這部分不用做任何改動(dòng),,只需將自己的PDD模塊與MDD模塊鏈結(jié)成一個(gè)公用庫(kù)。
??? 理解了本機(jī)設(shè)備驅(qū)動(dòng)程序的結(jié)構(gòu)后,,從圖1右邊不難看出,,流接口驅(qū)動(dòng)程序只是把流接口作為它們的DDI使用,。在這種情況下,不必要把這些驅(qū)動(dòng)程序與GWES模塊鏈接起來(lái),。它們以普通的DLL方式存在并根據(jù)需要被調(diào)用,。
2.2 藍(lán)牙仿真串口驅(qū)動(dòng)程序?qū)崿F(xiàn)
??? 藍(lán)牙仿真串口是用藍(lán)牙RFCOMM協(xié)議實(shí)現(xiàn)無(wú)電纜的無(wú)線串口通信,與本機(jī)設(shè)備驅(qū)動(dòng)程序一樣,,實(shí)現(xiàn)流接口的串口驅(qū)動(dòng)程序同樣只需實(shí)現(xiàn)藍(lán)牙的PDD模塊,。
??? PDD模塊包括四部分:第一部分是必須自己實(shí)現(xiàn)的所有DDSI接口;第二部分是藍(lán)牙協(xié)議棧包括RFCOMM,、SDP,、L2CAP以及HCI實(shí)體;第三部分是HCI傳輸層通過(guò)UART或者USB接口連接到藍(lán)牙硬件,;最后一部分是為藍(lán)牙應(yīng)用提供的圖形界面接口和控制端口模塊,,用來(lái)對(duì)整個(gè)協(xié)議棧初始化、藍(lán)牙硬件初始化,、搜索附近的藍(lán)牙設(shè)備以及發(fā)現(xiàn)指定設(shè)備上的服務(wù),。如圖2所示,。

?


??? 在圖2所示的藍(lán)牙仿真串口驅(qū)動(dòng)程序的系統(tǒng)結(jié)構(gòu)中,,設(shè)備管理程序是用戶層的程序,在基于Windows CE的平臺(tái)上不停地運(yùn)行著,。設(shè)備管理程序不是內(nèi)核的一部分,,但它是與內(nèi)核、注冊(cè)表和流接口驅(qū)動(dòng)程序DLL有相互影響的單獨(dú)部分,。它主要執(zhí)行以下任務(wù):
??? ·在系統(tǒng)啟動(dòng)時(shí)或收到用戶在基于Windows CE的平臺(tái)上增加了外圍設(shè)備的信息時(shí),,初始化驅(qū)動(dòng)程序的加載;
??? ·向內(nèi)核注冊(cè)特定文件名,,該文件名把應(yīng)用程序使用的流I/O函數(shù)映射到流接口驅(qū)動(dòng)程序的那些函數(shù)的實(shí)現(xiàn),;
??? ·通過(guò)從外圍設(shè)備獲得即插即用標(biāo)識(shí)符或激活一個(gè)檢查子程序來(lái)發(fā)現(xiàn)可以處理該設(shè)備的驅(qū)動(dòng)程序,為外圍設(shè)備找到合適的設(shè)備驅(qū)動(dòng)程序,;
??? ·通過(guò)讀寫注冊(cè)值加載和跟蹤驅(qū)動(dòng)程序,;
??? ·當(dāng)不再需要設(shè)備時(shí),卸載驅(qū)動(dòng)程序,。
??? 流接口驅(qū)動(dòng)程序是用戶一級(jí)的動(dòng)態(tài)鏈接庫(kù),,用來(lái)實(shí)現(xiàn)一組固定的流接口函數(shù),這些流接口函數(shù)使得應(yīng)用程序可以通過(guò)文件系統(tǒng)中的特殊文件而與設(shè)備進(jìn)行接口,,因此對(duì)上面的OBEX應(yīng)用程序來(lái)說(shuō),,使用非常方便。?
??? 從圖2可以看出, 藍(lán)牙流接口驅(qū)動(dòng)程序中一個(gè)MDD模塊對(duì)應(yīng)著兩個(gè)PDD模塊,,即實(shí)現(xiàn)了兩個(gè)仿真串口設(shè)備:一個(gè)是控制端口,,用來(lái)完成藍(lán)牙協(xié)議和硬件的初始化,,給OBEX 應(yīng)用程序提供一個(gè)發(fā)現(xiàn)設(shè)備和服務(wù)的接口,這個(gè)串口只供具體應(yīng)用內(nèi)部使用,;另一個(gè)才是真正的為其它藍(lán)牙應(yīng)用使用的藍(lán)牙仿真串口,,它通過(guò)實(shí)現(xiàn)一組系統(tǒng)提供的標(biāo)準(zhǔn)串口DDSI接口函數(shù),實(shí)現(xiàn)藍(lán)牙RFCOMM協(xié)議的串口仿真,。
??? 加載驅(qū)動(dòng)程序是由設(shè)備管理程序通過(guò)查找注冊(cè)表中HKEY_LOCAL_MACHINEDrivers目錄,,注冊(cè)的串口驅(qū)動(dòng)程序的相關(guān)信息完成,因此必須至少注冊(cè)兩個(gè)藍(lán)牙串口設(shè)備,。Windows CE中,,一個(gè)串口被初始化前MDD層會(huì)先調(diào)用GetSerialObject()函數(shù)得到串口驅(qū)動(dòng)程序中實(shí)現(xiàn)的串口設(shè)備數(shù)目。因此在藍(lán)牙串口驅(qū)動(dòng)程序的初始化時(shí),,由如下代碼實(shí)現(xiàn):
??? HWOBJ BluetoothObj = {?? ?/*描述藍(lán)牙仿真串口特征*/
?? ??? (PDEVICE_LIST) &SerDL,
?? ??? THREAD_IN_PDD,?/*中斷處理全部由PDD層 處理*/
?? ??? 0,
?? ??? NULL,
????? (PHW_VTBL) &BluetoothVTbl?/*包含需要實(shí)現(xiàn)的所有標(biāo)準(zhǔn)串口DDSI函數(shù)的列表*/
??? };
??? HWOBJ BluetoothCTRLObj = {?/*描述藍(lán)牙控制端口特征*/?
????? (PDEVICE_LIST) &SerDL,
????? THREAD_IN_PDD,
????? 0,
????? NULL,
? ??? (PHW_VTBL) &CTRLVTbl
??? };
??? PHWOBJ? rgpHWObjects[] = {?/*包含兩個(gè)PDD實(shí)例的數(shù)組*/
?? ??? &BluetoothObj,
?????? &BluetoothCTRLObj
?? ??? };
??? DEVICE_LIST SerDL = {?/*存儲(chǔ)設(shè)備驅(qū)動(dòng)程序中所有串口設(shè)備*/
????? “CESerial.dll”,???/* 串口驅(qū)動(dòng)程序的名字*/
?????? sizeof(rgpHWObjects)/sizeof(PHWOBJ),/*串口設(shè)備的數(shù)目*/
?????? rgpHWObjects
??? };
??? ?
??? PDEVICE_LIST GetSerialObject(VOID)
??? {???
?? ??? return (&SerDL);
??? }
??? 在串口驅(qū)動(dòng)程序中注冊(cè)了兩個(gè)串口設(shè)備后,,就要實(shí)現(xiàn)這兩個(gè)PDD實(shí)例對(duì)應(yīng)的流接口函數(shù)。微軟為要實(shí)現(xiàn)的串口PDD模塊提供了一個(gè)HWOBJ(Haredware Object)類型的串行對(duì)象表,,這個(gè)結(jié)構(gòu)列出了實(shí)現(xiàn)串口驅(qū)動(dòng)的所有接口函數(shù)指針,。見(jiàn)下面的描述:
??? typedef struct __HW_VTBL {
??? PVOID (*HWInit)(ULONG Identifier, PVOID pMDDContext, PHWOBJ pHWObj);
??? …,
??? …,
??? BOOL (*HWIoctl)(PVOID pHead, DWORD dwCode,
??? PBYTE pBufIn,DWORD dwLenIn,PBYTE pBufOut,DWORD dwLenOut,PDWORD pdwActualOut);
??? } HW_VTBL, *PHW_VTBL;
??? 用戶通過(guò)修改串行口PDD的串行對(duì)象表改變函數(shù)集或函數(shù)名。下面的結(jié)構(gòu)BluetoothVTbl定義了藍(lán)牙仿真串口DDSI函數(shù)的名稱,。
??? const HW_VTBL BluetoothVTbl = {
????? ??BluetoothInitSerial,
????? ??…,
????? ??…,
????? ??BluetoothIoctl
??? };
??? 同樣用結(jié)構(gòu)變量CTRLVTbl定義了控制端口的DDSI函數(shù)名列表,。由于這個(gè)串口設(shè)備用作內(nèi)部實(shí)現(xiàn)特殊的功能,下面只列出了需要關(guān)心的主要函數(shù)名,。
??? const HW_VTBL CTRLVTbl = {
??????? CTRLInitSerial,
??????? CTRLDeinit,
??? ??? CTRLOpen,
??? ??? CTRLClose,
??? ???? …,
??? ???? …,
??? ??? CTRLIoctl
??? };
??? 藍(lán)牙作為一個(gè)驅(qū)動(dòng)新經(jīng)濟(jì)的引擎,,將會(huì)對(duì)以嵌入式系統(tǒng)為主的“后PC機(jī)”時(shí)代的到來(lái)產(chǎn)生巨大的推動(dòng)作用,同時(shí)它還將面臨來(lái)自象IrDA,、802.11,、HomeRF等無(wú)線通信技術(shù)的挑戰(zhàn)。而將OBEX成功引入藍(lán)牙,,使得在嵌入式系統(tǒng)下工作的藍(lán)牙通信設(shè)備上傳輸文件,、同步、打印等應(yīng)用成為可能,,因此在藍(lán)牙中起著舉足輕重的作用,。
參考文獻(xiàn)
1 Draft Founation. Specification of the Bluetooth System. v1.0’July,1999
2 ATI.Nucleus Plus Internals. 1999
3 isi. PSOS+ V2.3 User's Reference Manual.1999
4 金 純,,許光辰,,孫 睿. 藍(lán)牙技術(shù). 北京:電子工業(yè)出版社

本站內(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,;郵箱:[email protected]