0.引言
随着智能终端设备的不断增多,用来连接各种笔记本、PDA、台式电脑等设备的电缆布线会越来越复杂,它不仅影响了美观性,还增加了安装、维护的费用和难度,蓝牙技术是解决上述问题的有效途径之一[1],家庭或办公室中的笔记本、PC机等只要安装上蓝牙适配器就成为具有了蓝牙连接功能的数据终端(DT),彼此之间可以方便地实现互连互通。目前,具有蓝牙功能的笔记本、PDA、手机等终端设备越来越多,而蓝牙终端设备与互联网之间的互连互通则成了制约其应用的一大瓶颈[2]。蓝牙网关正是为这些蓝牙终端设备(包括蓝牙PDA、蓝牙笔记本电脑、蓝牙PC等)创建一个到本地网络的无线连接通讯链路,使之能够访问本地网络及Internet。目前,蓝牙网关大多是基于PC机上的windows或linux平台开发的,体积、成本、易用性等因素在一定程度上制约了蓝牙网关的推广[3]。考虑以上各因素,笔者研制了一种嵌入式蓝牙网关,与基于PC的蓝牙网关相比在成本、易用性、体积等方面都具有一定的优势。本文主要针对嵌入式蓝牙网关中蓝牙硬件模块驱动层框架设计及具体实现给予详细阐述,并提出一种管理蓝牙虚拟串口设备的方案,在此基础上实现了一个以MIPS内核嵌入式微处理器Au1000为硬件平台的嵌入式蓝牙网关[4]。
1.嵌入式蓝牙网关的硬件结构
蓝牙是一种开放性的、短距离无线数据和语音通信的全球规范。蓝牙规范的动机是通过合理地选择链路的传输速度、通讯距离和传输功率来实现一种成本低、效率高、单芯片方式的通信收发设备,而嵌入式蓝牙网关正是一种蓝牙应用规范中LAP(局域网接入应用模型)的典型应用[5] [6]。
一般来说,嵌入式蓝牙网关硬件主要由微处理器、内嵌式蓝牙硬件模块及其他接口电路、存储器件等组成。考虑到系统的性价比等诸多因素,在本文中,笔者采用AMD的MIPS内核的嵌入式微处理器Au1000作为微处理器平台,同时在处理器丰富资源的基础上,还进行了相关的配置和扩展,平台配置了Intel 16Mbyte的E28F128J3 FLASH芯片和Hynix 32Mbyte 的HY57V561620 SDRAM芯片。通过SMSC公司的LAN91C11 10/100M型以太网控制芯片扩展了一个网络接口。蓝牙模块采用CSR BlueCore02芯片的增强型蓝牙模块,兼容蓝牙1.2规范,最大发射距离达到100米,最大数据传输率可达到1.384Mbps,支持低功耗工作模式/高速工作模式,支持安全认证、数据加密,该模块通过UART口与Au1000微处理器通信。
2.嵌入式蓝牙网关的软件体系架构
在嵌入式系统的开发过程中,嵌入式操作系统平台的选择是关键点之一。目前,常见的嵌入式操作系统有Vxworks、Win CE、pPOS、palm OS、Nucleus、QNX,嵌入式linux等,针对不同的应用需求,它们各有特点。在嵌入式蓝牙网关的开发中,我们选用MIZI公司的嵌入式Linux操作系统来构建嵌入式蓝牙网关的软件平台,其原因主要有三:一方面,它是一种开放源码的操作系统,并且MIZI-Linux已经成为嵌入式领域很受欢迎的操作系统之一[7];另一方面,Linux下的软件几乎都遵循GPL版权协议,可以利用Linux操作系统上的mgetty+AutoPPP快速搭建嵌入式蓝牙网关端的拨号服务器应用程序,从而不必自己开发拨号服务器应用程序;据此,笔者设计的嵌入式蓝牙网关中的软件体系架构如图1所示。
本文主要是对该软件体系架构中的蓝牙驱动层框架及实现给予阐述,并提出一种管理蓝牙虚拟串口设备的方案,在此基础上实现了一个以Au1000为硬件平台的嵌入式蓝牙网关。
3.蓝牙硬件模块驱动层框架的设计与实现
在开发嵌入式蓝牙网关过程中,为了缩短开发周期,减少开发成本,笔者利用了Linux下现有的拨号服务器程序来实现与蓝牙设备的互连,为此,笔者实现了蓝牙虚拟串口设备ttyBT。对于用户使用来说,该虚拟串口和系统真实串口tty没有任何区别。同时,为了更好地管理虚拟串口以及实现与蓝牙协议模块进行交互,笔者对于以往的tty驱动模型进行了改进,即在蓝牙协议模块和ttyBT设备之间设计了一个ttyBTmgr模块。下面将详细描述蓝牙驱动硬件模块的驱动层框架和驱动层框架中的各函数的实现过程。
3.1蓝牙硬件模块驱动层框架
tty设备是一种字符设备, 在MIZI-Linux操作系统中,串行通信端口设备被实现为tty设备,即ttySx[8]。笔者在设计嵌入式蓝牙网关时,将其中的蓝牙硬件模块设计成一种tty类型设备,即通过蓝牙虚拟串口设备ttyBT实现与MIZI-Linux操作系统的互连。遵循tty设备驱动规范,蓝牙虚拟串口设备ttyBT驱动层框架如图2所示:
从图2可以看出, ttyBT设备驱动程序由三部分构成,第一部分是tty核心,负责与嵌入式Linux操作系的接口,这对所有的tty设备都是一样的;第二部分是ttyBT链路规程,它的作用是使用特殊的方法,把从用户或硬件那里传递来的数据格式化,这种格式化通常使用一些协议来完成转化,比如PPP协议或者蓝牙协议;第三部分是ttyBT驱动程序,完成蓝牙硬件模块输入/输出队列的读写操作。
整个ttyBT设备驱动程序的数据流向为:tty核心从用户那里得到将要发往蓝牙硬件模块的数据,然后把数据发送给ttyBT链路规程,该链路规程把数据在传递给ttyBT驱动程序;ttyBT驱动程序对数据进行格式化后,然后发送给蓝牙硬件模块;从蓝牙硬件模块那里接收到的数据将回溯至ttyBT驱动程序,然后流入ttyBT链路规程,接着是流入tty核心,最后,用户从tty核心那里得到数据。此外,tty设备可以很方便地和PPP模块链接起来,是因为能通过将tty设备的行为注册为PPP来实现。这个特性对于快速构建嵌入式蓝牙网关的应用程序来说是非常必要的。这也是笔者将这种设备实现为一种tty设备,即ttyBT的原因之一。
3.2蓝牙硬件模块驱动程序实现
如图3所示,蓝牙硬件模块驱动层主要包括tty核心层、ttyBT链路规程层和ttyBT驱动程序层构成,下面分别将其实现过程介绍如下。
(1)tty核心层其负责与嵌入式Linux操作系的接口,实现的关键是如何定义一个tty_driver结构,该结构用来向tty核心注册一个ttyBT驱动程序。蓝牙驱动层框架中的tty核心层使用终端设备数据结构tty_struct保存ttyBT端口的状态,同时赋予链路规程识别并向串行接口发送和接收4种蓝牙HCI数据包: HCI Command Packet,HCI Event Packet,HCI ACL Data Packet和HCI SCO Data Packet,同时完成向高层协议提供标准发送接收过程[9]。
(2)蓝牙硬件模块链路规程 链路规程对于TTY驱动程序来说是不透明的,驱动程序不能直接与链路规程通信,在Linux系统中使用终端链路规程把具体的终端设备和输入/输出队列相关联,使得操作系统对所有的终端都视为标准的流操作[10]。
(3)ttyBT设备驱动函数 实现把蓝牙硬件模块接收到的字符递送给ttyBT链路规程的输入队列和输出队列,发送到蓝牙硬件的同时完成对输入队列和输出队列的监测功能以及硬件中断过程。
4.蓝牙虚拟串口设备的管理
在实现蓝牙驱动层框架的过程中,为了便于管理ttyBT设备驱动层中的虚拟串口设备并使之和ttyBT链路规程层中的蓝牙协议模块进行交互,笔者提出了一种基于tty驱动模型的改进方案,即ttyBT设备不是和蓝牙协议模块直接通信的,而是在蓝牙协议模块和ttyBT设备之间增加了一个ttyBTmgr的字符设备。这个字符设备在蓝牙协议模块启动时,由协议模块打开。ttyBTmgr和蓝牙协议模块、ttyBT设备的消息通信机制如图3所示。
(1)ttyBT设备发送消息当一个ttyBT设备被打开、关闭、写数据等的时候,它要向蓝牙协议模块发送消息。在笔者的设计中,ttyBT设备不是和蓝牙协议模块直接通信的,而是通过ttyBTmgr设备和蓝牙协议模块通信的。在ttyBT设备的数据结构中,维护了一个消息链表,所有的ttyBT设备要向协议模块发送的消息都要先插入到这个消息链表中。
(2)ttyBT设备接收消息当蓝牙协议模块给ttyBTmgr设备发送了消息,则ttyBTmgr设备需要将这些消息转发给ttyBT设备。由于ttyBTmgr设备和ttyBT设备的驱动程序都是编译成内核模块,运行在内核空间,它们可以共享那些全局变量,这样ttyBTmgr直接修改ttyBT的全局变量就实现了消息的转发。
(3)蓝牙协议模块发送消息 如果蓝牙协议模块要向虚拟串口设备发消息,它使用ioctl( )系统调用发送消息。这个ioctl命令是自定义的,其类型是W32IF_FROM_RFCOMM,在这里面有三种消息:DRV2UI_OPEN_RESULT_IND 指示串口设备打开结果
DRV2UI_SEND_DATA_COMPLETE 指示数据发送完毕
DRV2UI_REMOTE_DATA_IND 指示收到远程数据
(4)蓝牙协议模块接收消息 在蓝牙协议模块中,专门有一个线程来接收来自驱动程序的消息。前面讲过,这些消息不是直接来自ttyBT设备而是来自ttyBTmgr。协议模块用select( )系统调用来等待消息,如果当前消息队列里有消息,或一旦有消息被添加到消息队列,则select( )系统调用会成功返回。然后协议模块调用read( )系统调用将消息从ttyBTmgr设备中读出,然后根据消息类型进行相应的处理。
5.测试实验
为了验证本文的蓝牙驱动层框架是有效的,鲁棒的,笔者搭建了嵌入式蓝牙网关的测试系统,由笔者研发出的嵌入式蓝牙网关和蓝牙数据终端组成。蓝牙数据终端是由PC机、USB蓝牙适配器、BlueSoleil组成的蓝牙PC。依据本文提出的蓝牙驱动层框架所编写的嵌入式蓝牙网关端的蓝牙驱动程序,实现了蓝牙硬件模块和蓝牙主机(Au1000硬件平台)之间HCI传送功能,使该嵌入式蓝牙网关实现了局域网接入访问服务。试验结果表明,蓝牙PC能成功连接到嵌入式蓝牙网关,并能搜索到嵌入式蓝牙网关提供的蓝牙网络接入服务,从而使蓝牙PC能通过该嵌入式蓝牙网关访问Internet和局域网。