Windows CE中實現藍芽串口驅動程式

來源:互聯網
上載者:User

Windows CE作為一種典型的嵌入式作業系統,通過將藍芽應用移植到Widows CE中,對於如pSOS+、Nucleus等其它嵌入式系統,具有典型意義。由於OBEX上的檔案傳輸應用建立在RFCOMM實現的藍芽模擬串口上,本文介紹OBEX檔案傳輸的藍芽虛擬串口驅動程式的實現。
  
  1 Windows CE裝置驅動程式概述
  
  Windows CE支援廣泛的基於各種CE平台的裝置驅動程式。目前,它提供了四種裝置模型,其中兩種是專用於Windows CE的模型,另外兩種外部模型來自其它作業系統。基於Windows CE的兩種模型是原生裝置驅動程式和流介面驅動程式。兩種外部模型用於通用序列匯流排(USB)和網路磁碟機介面標準(NDIS)的驅動程式。
  
  由於藍芽協議是在無線技術下的模擬串口,藍芽中OBEX的許多應用正是基於藍芽模擬串口。而流介面驅動程式通過一組流介面函數使得應用程式可以通過檔案系統中的特殊檔案而與裝置介面,因此藍芽模擬串口的功能性更適合流介面驅動程式的結構。
   
  
  2 Windows CE下藍芽串口驅動程式的實現
  
  雖然藍牙裝置驅動程式的實現採用流介面驅動程式設計,但由於兩種驅動程式的基本結構與原理相似,所以下文從本機裝置驅動程式結構開始,可以更清楚地認識藍牙裝置驅動程式的實現原理。
  
  2.1 本機裝置驅動程式結構
  
  Windows CE中包含的樣本裝置驅動程式分為兩種類型:整合型驅動程式(Monolithic device driver)和分層的驅動程式(Layered Devicedriver)。整合型驅動程式基於單個碼片,該碼片直接把硬體裝置的功能性通過裝置驅動程式介面傳遞給作業系統。與整合型驅動程式相比,分層的驅動程式由兩個設定好的層組成:上層是模型裝置驅動程式(MDD),下層是依賴平台的驅動程式(PDD)。本文採用分層的驅動程式來串連藍芽硬體和上面的檔案傳輸應用。圖1說明了兩種驅動程式是如何在Windows CE作業系統中整合的。
  
  裝置驅動程式介面(DDI)是在MDD中實現的函數集,GWES模組通過這個介面調用裝置驅動程式;裝置驅動程式伺服器提供介面(DDSI)是在PDD中實現的函數集並由MDD調用。由於微軟提供了所有與MDD模組相關的原始碼,所以對這部分不用做任何改動,只需將自己的PDD模組與MDD模組鏈結成一個公用庫。
  
  理解了本機裝置驅動程式的結構後,從圖1右邊不難看出,流介面驅動程式只是把流介面作為它們的DDI使用。在這種情況下,不必要把這些驅動程式與GWES模組邏接起來。它們以普通的DLL方式存在並根據需要被調用。
  
  2.2 藍芽模擬串口驅動程式實現
  
  藍芽模擬串口是用藍芽RFCOMM協議實現無電纜的無線串口通訊,與本機裝置驅動程式一樣,實現流介面的串口驅動程式同樣只需實現藍芽的PDD模組。
  
  PDD模組包括四部分:第一部分是必須自己實現的所有DDSI介面;第二部分是藍芽協議棧包括FRCOMM、SDP、L2CAP以及HCI實體;第三部分是HCI傳輸層通過UART或者USB介面串連到藍芽硬體;最後一部分是為藍芽應用提供的圖形介面介面和控制連接埠模組,用來對整個協議棧初始化、藍芽硬體初始化、搜尋附近的藍牙裝置以及發現指定裝置上的服務。2所示。
  
  在圖2所示的藍芽模擬串口驅動程式的系統結構中,裝置管理程式是使用者層的程式,在基於Windows CE的平台上不停地運行著。裝置管理程式不是核心的一部分,但它是與核心、註冊表和注介面驅動程式DLL有相互影響的單獨部分。它主要執行以下任務:
  
  HWOBJ BluetoothObj={ /*描述藍芽模擬串口特徵*/
  
  (PDEVICE_LIST)&SerDL,
  
  THREAD_IN_PDD,/*中斷處理全部由PDD層處理*/
  
  0,
  
  NULL,
  
  (PHW_VTBL)&BluetoothVTbl/*包含需要實現的所有標準串口DDSI函數的列表*/
  
  };
  
  HWOBJ BluetoothCTRLObj={/*描述藍芽控制連接埠特徵*/
  
  (PDEVICE_LIST)&SerDL,
  
  THREAD_IN_PDD,
  
  0,
  
  NULL,
  
  (PHW_VTBL)&CTRLVTb1
  
  };
  
  PHWOBJ rgpHWObjects[]={/*包含兩個PDD執行個體的數組*/
  
  &BluetoothObj,
  
  &BluetoothCTRLObj
  
  };
  
  DEVICE_LIST SerDL={/*存放裝置驅動程式中所有串口裝置*/
  
  “CESerial.dll”,/*串口驅動程式的名字*/
  
  sizeof(rgpHWObjects)/sizeof(PHWOBJ),/*串口裝置的數目*/
  
  regHWObjects
  
  };
  
  PDEVICE_LIST GetSerialObject(VOID)
  
  {
  
  return (&SerDL);
  
  }
  
  
  在串口驅動程式中註冊了兩個串口裝置後,就要實現這兩個PDD執行個體對應的流介面函數。微軟為要實現的串口PDD模組提供了一個HWOBJ(Haredware Object)類型的串列對象表,這個結構列出了實現串口驅動的所有介面函數指標。見下面的描述:
  
  typedef struct _HW_VTBL{
  
  PVOID(*HWInit)(ULONG Identifier,PVOID pMDDCon-text,PHWOBJ pHWObj);
  
  …,
  
  …,
  
  BOOL(*HWIoct1)(PVOID pHead,DWORD dwCode,
  
  PBYTE pBufIn,DWORD dwLenIn,PBYTE pBufOut,DWORD
  
  DwLenOut,PDWORDpdwActualOut);
  
  } HW_VTBL,*PHW_VTBL;
  
  使用者通過修改串列口PDD的串列對象表改變函數集或函數名。下面的結構BluetoothVTbl的定義了藍芽模擬串口DDSI函數的名稱。
  
  Const HW_VTBL BluetoothVTbl={
  
  BluetoothInitSerial,
  
  …,
  
  …,
  
  BluetoothIoctl
  
  };
  
  同樣用結構變數CTRLVTbl定義了控制連接埠的DDSI函數名列表。由於這個串口裝置用作內部實現特殊的功能,下面只列出了需要關心的主要函數名。
  
  Const HW_VTBL CTRLVTbl={
  
  CTRLInitSerial,
  
  CTRLDeinit,
  
  CTRLOpen,
  
  CTRLClose,
  
  …,
  
  …,
  
  CTRLIoctl
  
  };
  
  藍芽作為一個驅動新經濟的引擎,將會 對以嵌入式系統為主的“後PC機”時代的到來產生巨大的推動作用,同時它還將面臨來自象IrDA、802.11、HomeRF等無線通訊技術的挑戰。而將OBEX成功引入藍芽,使得在嵌入式系統下工作的藍芽通訊裝置上傳輸檔案、同步、列印等應用成為可能,因此在藍芽中起著舉足輕重的作用。

轉自:http://motion.chinaitlab.com/WINCE/30567.html

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.