基于嵌入式Linux蓝牙HCI协议的研究与实现

2013-09-25 14:12王孟柳陈和平祝俊峰
电子设计工程 2013年4期
关键词:传输层驱动程序蓝牙

王孟柳,陈和平,祝俊峰,刘 夏

(武汉科技大学 信息科学与工程学院,湖北 武汉 430081)

蓝牙是专为满足人们在个人操作空间范围的无线互联而设计的,它采用调频技术使处于个人操作空间的设备形成一个无线个人区域网络,真正实现设备之间可移动的,自动的互联。以“无线替代电缆”正是蓝牙技术开发的初衷,同时也是蓝牙最基本的用途。当然,短距离无线通信有很多种,还包括IrDA、IEEE802.11系列无线局域网、HomeRF、UWB等,但是蓝牙技术以其低成本、低功耗、高速率以及标准的全球通用性成为发展最快,市场推广最成功的短距离无线通信技术[1]。

蓝牙技术是一种低功耗的短距离无线通信技术,它作为无线数据与语音通信的开放标准,旨在取代现有的PC机,打印机,移动电话等相关设备上的连线。目前包括大多数著名IT企业和通信公司在内的蓝牙SIG,已经推出了很多蓝牙产品,实现了蓝牙技术的产品化。

1 蓝牙协议栈

实现各个蓝牙设备间的通信,仅有底层的蓝牙硬件是不够的,还必须有蓝牙协议栈的支持。蓝牙协议栈运行在中央处理器之上,主要管理和分配系统资源,控制相关硬件,对通过HCI层的命令进行处理,完成蓝牙功能[2]。由于协议找中底层的一些协议比如LMP等已经固化在硬件中,高层的协议如PPP、TCP/IP也已经存在。可以直接应用,所以需要实现的是给主机提供HCI的接口、驱动程序、L2CAP层、RFCOMM、SDP功能等协议栈的中间层部分。

整个蓝牙协议的体系结构分为蓝牙底层协议、中间层协议和高端应用层3部分[3],具体结构如图1所示。

图1 蓝牙协议栈体系结构Fig.1 System structure of Bluetooth protocol stack

射频层(RF),基带层(BB)和链路管理层(LM)属于蓝牙底层的硬件模块,它是蓝牙技术的核心,是任何蓝牙设备都不可少的部分。

中间协议层主要包括逻辑链路控制和适配协议(L2CAP),服务发现协议(SDP),串口仿真协议(RFCOMM)和电话控制规范(TCS)。

在蓝牙协议栈的顶层是高端应用层,它相当于各种应用的模型的profile,是profile的一部分。我们可根据具体应用的模型的不同,选择需要的现有高层协议。目前可以选用的高端应用层协议主要包含:TCP/UDP/IP协议,点对点协议(PPP),无线应用协议(WAP),对象交换协议(OBEX)等。

2 HCI协议剖析

2.1 主机控制器接口(HCI)简介

为了使不同厂商的非集成蓝牙模块之间能够互通,SIG定义了一个标准接口与蓝牙模块中的主机控制器进行通信,同时还定义了一个事务性通信协议,用于在主机和主机控制器之间消息的传送。这种主机和主机控制器间的标准接口和它们之间相应的通信协议一起被称为主机控制器接口(HCI)。

主机控制器接口(HCI)为上层协议提供了一个独立于硬件实现的标准接口[4]。它主要包括两个部分,在主机中运行的驱动程序和在硬件中运行的固件,二者之间通过传输层进行通信。目前,蓝牙支持的传输层主要包括HCI USB传输层,HCI RS232传输层,HCI UART传输层,HCI SD传输层。

图2对软件层底层进行了概述。HCI固件通过对链路管理器,硬件状态注册器,控制注册器,事件注册器等的访问来执行蓝牙硬件的基带命令。在主机中的HCI驱动程序和蓝牙硬件中的HCI固件间存在许多层次。这些中间层提供了在不需要了解数据信息的情况下传输数据的能力。

从图2可以看出,HCI驱动程序并不能直接对底层硬件进行操作,而只能利用相应硬件的驱动程序所提供的服务来的操纵硬件。

图2 蓝牙协议栈底层概述Fig.2 Bottom overview of Bluetooth protocol stack

2.2 HCI分组类型

蓝牙标准定义了3种不同的HCI分组类型:命令分组(Command packer)、事件分组(Event packet)和数据分组(Data packet)[5-6]。HCI分组通过HCI传输层进行传输。如图3所示,HCI命令分组用于主机向主机控制器发送控制和管理信息,包括设置蓝牙模块的操作状态以及寄存器的读写。HCI事件分组是主机控制器向主机发送的信息,用于通知蓝牙模块底层状态的变化。HCI数据分组用于在主机和主控制器之间传输语音(SCO分组)和数据(ACL分组)信息。

图3 HCI分组的三种类型Fig.3 Three types of HCI subgroups

2.3 HCI USB传输层

USB是由“通用串行总线实施论坛”组织公开发表、推广的一种串行接口标准。USB主要用于连接中低档外设,其传输速率最高可达12 Mbit/s。最高可连接127个设备。图4所示是USB作为蓝牙无线模块与主机传输层接口时,主机栈与蓝牙栈的配置情况。

图4 主机和蓝牙无线模块之间的关系Fig.4 Relationship between the host and Bluetooth wireless module

USB设备可看作高速设备。其固件配置由两个接口组成。第一个接口为固定设置,并包含BULK和中断终端。第二个接口提供可扩展的同步带宽占用方式。该接口方式提供四种设置,以提供基于同步带宽需求的占用方式。其缺省接口为空,以使设备能够支持非同步带宽。

一个HCI帧,包含一个HCI头和HCI数据,应包含于一USB事物中。此USB事物中为一个或多个包含I/O请求数据的USB帧。例如,包含256字节的ACL数据分组将在I/O请求中通过BULK终端发送。该I/O请求将需要4个64字节的USB帧,并组成一个事务。

3 硬件实现

大多数蓝牙芯片主要实现了如下3层:无线层、基带层和链路管理层。无线层主要完成频率的合成、bit到符号的转换和过滤,以及符号的收发操作;基带层主要完成编码/解码、加密/解密、分组处理和调频频率的生成和选择;链路管理层主要完成链接的建立和链路的管理。实现结构如图5所示。

本方案使用的是英国CSR (Cambridge Silicon Radio)提供的单芯片蓝牙模块BlueCore2-Extern。BlueCore2-Extern主要由 MCU、DSP、RAM、ROM、I/O 和一个 2.4 GHz的无线收发器组成。

图5 蓝牙核心HCI栈Fig.5 Bluetooth core HCI stack

BlueCore2-Extern总共提供了4种硬件接口,UART接口、SPI接口、USB接口和PCM话音接口。本方案使用的是USB接口和PCM话音接口,BlueCore2-Extern通过USB接口与主机控制器的USB接口相连,传输HCI命令、HCI事件和ACL数据传输[7-8]。

对于天线,考虑到结构简单和制作成本的问题,在目前已有的偶级天线、倒F型天线、折线天线以及微小型陶瓷天线等类型中,本方案选用了折线天线。折线天线的长度很难预测,由折线天线确切的几何形状和对地的距离决定,一般比四分之一波长略长。在本方案中我们选用的PCB折线天线印制在顶层,地平面也在顶层,并且位于贴近天线的位置。

无论是以上哪种天线,均采用50 Ω的输入阻抗与BlueCore2-Extern的ANT端相连。理想状态下,微带线的特征阻抗Z0闭合算式为:

W表示线宽,h表示高度,εre表示介电常数,η表示该天线的发射效率。硬件实物图如图6所示。

图6 硬件实物图Fig.6 Hardware diagram

4 HCI驱动程序设计

Linux的一个特点就是把所有的东西都看作是文件。而设备驱动程序在Linux中扮演一个非常重要的角色,几乎所有系统可用的设备都需要各自的驱动程序来协助访问。驱动程序运行于内核空间,用户空间的应用程序通过文件系统中/dev/目录下的一个相对应的文件来和它交互。

本课题采用的是基于USB端口的蓝牙适配器。对于一个USB的设备驱动来说,它必须实现若干个系统已经定义好的数据结构。这些数据通常用于向内核进行某种注册。

首先第一个是usb_driver结构体,它的定义如下:

这个结构体将用于向系统注册新的USB驱动程序和该驱动所支持的设备的ID。当设备接入系统后,内核通过注册的id_table确定对应的驱动程序,并调用该驱动的probe函数。而当设备与主机断开连接时,相应的disconnect函数就会被调用。

因为文中要完成的驱动需要在文件系统中创建相应节点,所有还需要用到另外两个数据结构,sub_class_driver和file_operations,定义如下:

usb_class_driver结构用于向系统注册映射到/dev/目录下的文件节点,所以它需要一个次设备号的起始值。对于USB设备来说,usb_class_driver结构体为我们提供了注册节点和文件操作函数。所以,它还包括了一个文件操作结构指针和一个名字。

HCI驱动的具体流程图如图7所示。HCI接口采用事件驱动的工作方式,主机发送命令,蓝牙主控芯片以事件方式返回结果,主机分析所返回事件以确定下一个命令[9-10]。HCI接口采用数据包的方式,主要使用了其中3种:命令包,事件包和ACL数据包。

5 测试结果

将编译好的HCI驱动模块移植到arm开发板并加载,和一般的模块一样,可以选择使用自动加载或手工加载,这里采用手工加载。成功加载好HCI驱动后,将USB蓝牙模块接入arm开发板,启动蓝牙设备。具体信息如图8所示。

由图 8 可知,该蓝牙设备的地址为 00:1F:81:00:01:1C,error为0,所以蓝牙设备启动成功。

6 结束语

图7 HCI驱动流程Fig.7 HCI driving process

图8 测试结果Fig.8 Test result

文中选择以主机控制器接口为突破口对蓝牙协议进行了较为深入的分析,在此基础上针对HCI协议进行了流程分析和接口设计。HCI是实现蓝牙协议栈时必须实现的一个部分,它的实现对于在具体硬件基础上自主灵活地构建蓝牙协议栈、开发蓝牙应用起着决定性的作用。从测试结果看,本文设计的HCI驱动程序在arm开发板平台上成功的驱动了蓝牙模块,通过所设计的HCI协议,使得PC主机与arm开发板之间能够通过蓝牙设备建立无线连接,查看对方设备信息和传输ACL数据,达到了预期的效果。

[1]SIG.Specification of the Bluetooth System(for Bluetooth core)v1.2[S].EuropeanTelecommunicationsStandardsInstitute,1999.

[2]Hartsen J C.The Bluetooth Radio System[J].IEEE Personal Communications Magazine,2000,7(1):28-36.

[3]李静,耿卫东.HCI协议在嵌入式蓝牙系统中的应用[J].半导体技术,2002(8):10-13.

LI Jing,GENG Wei-dong.The HCI protocol in the embedded Bluetooth system application[J].Semiconductor Technology,2002(8):10-13.

[4]Bluetooth Special Interest Group.Bluetooth Network Encapsulation Protocol Specification[C].Version1,2003.

[5]陆佳炜.蓝牙主控制器接口简析[J].半导体技术,2003,28(3):54-57.

LU Jia-wei.The brief analysis of bluetooth host controller interface[J].Semiconductor technology,2003,28(3):54-57.

[6]杨帆.基于BlueCore02-External芯片的蓝牙鼠标的设计与实现[J].微机与应用,2005(5):20-22.

YANG Fan.Design and Implementation based BlueCore02-Externalchip Bluetooth mouse[J].Microcomputerand Application,2005(5):20-22.

[7]Cambridge Silicon Radio.BlueCore Serial Protocol(BCSP)[S], Cambridge,2004:7-26.

[8]ZHOU Peng,LING Xiang.HCI-based bluetooth master-slave monitoring system design[C].2010 International Conference on Computational Problem-Solving,2010:406-409.

[9] Cambridge Silicon Radio. HCI Implementation[S],Cambridge,2005:6-8.

[10]SairamK,GunasekaranN.Bluetoothinwirelesscommunication[J].IEEE Personal Communications Magazine,2002,6(40):90-96.

猜你喜欢
传输层驱动程序蓝牙
蓝牙音箱的直线之美
基于Python语言的网络传输层UDP协议攻击性行为研究
ZnO电子传输层在有机无机杂化钙钛矿太阳能电池中的应用
简单、易用,可玩性强Q AcousticsBT3蓝牙音箱
计算机硬件设备驱动程序分析
物联网无线通信传输层动态通道保障机制
适合自己的才是最好的 德生(TECSUN) BT-50蓝牙耳机放大器
基于物联网GIS的消防智能巡检系统设计与实现
紧急:蓝牙指尖陀螺自燃!安全隐患频出
基于MPC8280的CPU单元与内部总线驱动程序设计