《电子技术应用》
您所在的位置:首页 > 嵌入式技术 > 业界动态 > Windows CE中实现蓝牙串口驱动程序

Windows CE中实现蓝牙串口驱动程序

2008-08-04
作者:张 敬 高 强

    摘  要: 蓝牙通信平台在嵌入式系统" title="嵌入式系统">嵌入式系统的实现过程中,OBEX(对象交换)始终是很重要的一部分,基于OBEX的蓝牙文件传输得到广泛应用。而OBEX的实现是基于蓝牙仿真串口" title="串口">串口,所以蓝牙串口驱动程序的实现就有了很重要的意义。介绍了Windows CE下串口驱动程序的结构和一种具体的实现方法。
    关键词: 蓝牙  OBEX  嵌入式系统  驱动程序

 

    Windows CE作为一种典型的嵌入式操作系统,通过将蓝牙应用移植到Windows CE中,对于如pSOS+、Nucleus等其它嵌入式系统,具有典型意义。由于OBEX上的文件传输应用建立在RFCOMM实现的蓝牙仿真串口上,本文介绍OBEX文件传输的蓝牙虚拟串口驱动程序的实现。
1 Windows CE 设备驱动程序" title="设备驱动程序">设备驱动程序概述
    Windows CE 支持广泛的基于各种CE平台的设备驱动程序。目前,它提供了四种设备模型,其中两种是专用于Windows CE的模型,另外两种外部模型来自其它操作系统。基于Windows CE的两种模型是本机的设备驱动程序和流接口驱动程序。两种外部模型用于通用串行总线(USB)和网络驱动器接口标准(NDIS)的驱动程序。
    由于蓝牙协议是在无线技术下的仿真串口,蓝牙中OBEX的许多应用正是基于蓝牙仿真串口。而流接口驱动程序通过一组流接口函数" title="接口函数">接口函数使得应用程序" title="应用程序">应用程序可以通过文件系统中的特殊文件而与设备接口,因此蓝牙仿真串口的功能性更适合流接口驱动程序的结构。
2 Windows CE下蓝牙串口驱动程序的实现
    虽然蓝牙设备驱动程序的实现采用流接口驱动程序设计,但由于两种驱动程序的基本结构与原理相似,所以下文从本机设备驱动程序结构开始,可以更清楚地认识蓝牙设备驱动程序的实现原理。
2.1 本机设备驱动程序结构
    Windows CE 中包含的样本设备驱动程序分为两种类型:单片驱动程序(Monolithic device driver)和分层的驱动程序(Layered Device driver)。单片驱动程序基于单个码片,该码片直接把硬件设备的功能性通过设备驱动程序接口传递给操作系统。与单片驱动程序相比,分层的驱动程序由两个设置好的层组成:上层是模型设备驱动程序(MDD),下层是依赖平台的驱动程序(PDD)。本文采用分层的驱动程序来连接蓝牙硬件和上面的文件传输应用。图1说明了两种驱动程序是如何在Windows CE操作系统中集成的。

 


    设备驱动程序接口(DDI)是在MDD中实现的函数集,GWES模块通过这个接口调用设备驱动程序;设备驱动程序服务器提供接口(DDSI)是在PDD中实现的函数集并由MDD调用。由于微软提供了所有与MDD模块相关的源代码,所以对这部分不用做任何改动,只需将自己的PDD模块与MDD模块链结成一个公用库。
    理解了本机设备驱动程序的结构后,从图1右边不难看出,流接口驱动程序只是把流接口作为它们的DDI使用。在这种情况下,不必要把这些驱动程序与GWES模块链接起来。它们以普通的DLL方式存在并根据需要被调用。
2.2 蓝牙仿真串口驱动程序实现
    蓝牙仿真串口是用蓝牙RFCOMM协议实现无电缆的无线串口通信,与本机设备驱动程序一样,实现流接口的串口驱动程序同样只需实现蓝牙的PDD模块。
    PDD模块包括四部分:第一部分是必须自己实现的所有DDSI接口;第二部分是蓝牙协议栈包括RFCOMM、SDP、L2CAP以及HCI实体;第三部分是HCI传输层通过UART或者USB接口连接到蓝牙硬件;最后一部分是为蓝牙应用提供的图形界面接口和控制端口模块,用来对整个协议栈初始化、蓝牙硬件初始化、搜索附近的蓝牙设备以及发现指定设备上的服务。如图2所示。

 


    在图2所示的蓝牙仿真串口驱动程序的系统结构中,设备管理程序是用户层的程序,在基于Windows CE的平台上不停地运行着。设备管理程序不是内核的一部分,但它是与内核、注册表和流接口驱动程序DLL有相互影响的单独部分。它主要执行以下任务:
    ·在系统启动时或收到用户在基于Windows CE的平台上增加了外围设备的信息时,初始化驱动程序的加载;
    ·向内核注册特定文件名,该文件名把应用程序使用的流I/O函数映射到流接口驱动程序的那些函数的实现;
    ·通过从外围设备获得即插即用标识符或激活一个检查子程序来发现可以处理该设备的驱动程序,为外围设备找到合适的设备驱动程序;
    ·通过读写注册值加载和跟踪驱动程序;
    ·当不再需要设备时,卸载驱动程序。
    流接口驱动程序是用户一级的动态链接库,用来实现一组固定的流接口函数,这些流接口函数使得应用程序可以通过文件系统中的特殊文件而与设备进行接口,因此对上面的OBEX应用程序来说,使用非常方便。 
    从图2可以看出, 蓝牙流接口驱动程序中一个MDD模块对应着两个PDD模块,即实现了两个仿真串口设备:一个是控制端口,用来完成蓝牙协议和硬件的初始化,给OBEX 应用程序提供一个发现设备和服务的接口,这个串口只供具体应用内部使用;另一个才是真正的为其它蓝牙应用使用的蓝牙仿真串口,它通过实现一组系统提供的标准串口DDSI接口函数,实现蓝牙RFCOMM协议的串口仿真。
    加载驱动程序是由设备管理程序通过查找注册表中HKEY_LOCAL_MACHINEDrivers目录,注册的串口驱动程序的相关信息完成,因此必须至少注册两个蓝牙串口设备。Windows CE中,一个串口被初始化前MDD层会先调用GetSerialObject()函数得到串口驱动程序中实现的串口设备数目。因此在蓝牙串口驱动程序的初始化时,由如下代码实现:
    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) &CTRLVTbl
    };
    PHWOBJ  rgpHWObjects[] = { /*包含两个PDD实例的数组*/
       &BluetoothObj,
       &BluetoothCTRLObj
       };
    DEVICE_LIST SerDL = { /*存储设备驱动程序中所有串口设备*/
      “CESerial.dll”,   /* 串口驱动程序的名字*/
       sizeof(rgpHWObjects)/sizeof(PHWOBJ),/*串口设备的数目*/
       rgpHWObjects
    };
     
    PDEVICE_LIST GetSerialObject(VOID)
    {   
       return (&SerDL);
    }
    在串口驱动程序中注册了两个串口设备后,就要实现这两个PDD实例对应的流接口函数。微软为要实现的串口PDD模块提供了一个HWOBJ(Haredware Object)类型的串行对象表,这个结构列出了实现串口驱动的所有接口函数指针。见下面的描述:
    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;
    用户通过修改串行口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成功引入蓝牙,使得在嵌入式系统下工作的蓝牙通信设备上传输文件、同步、打印等应用成为可能,因此在蓝牙中起着举足轻重的作用。
参考文献
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 金 纯,许光辰,孙 睿. 蓝牙技术. 北京:电子工业出版社

本站内容除特别声明的原创文章之外,转载内容只为传递更多信息,并不代表本网站赞同其观点。转载的所有的文章、图片、音/视频文件等资料的版权归版权所有权人所有。本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如涉及作品内容、版权和其它问题,请及时通过电子邮件或电话通知我们,以便迅速采取适当措施,避免给双方造成不必要的经济损失。联系电话:010-82306118;邮箱:aet@chinaaet.com。