1 Bluetooth Core System Protocol(蓝牙核心协议)
蓝牙技术规范(specification)包括核心协议(protocol)和应用规范(profile)两个部分。
核心协议包含蓝牙协议栈中最低的4个Layer,和一个基本的服务协议SDP(Service Discover Protocol),以及所有应用profile的基础Profile GAP(General Acess Profile)。核心协议是蓝牙协议栈中必不可少的。
除了核心协议外,蓝牙规范必须包含一些其他的应用层的服务和协议--应用层profile。
蓝牙协议栈通常有如下内容:
而蓝牙的核心系统协议为最低的4个Layer,再加上应用层profile SDP,包括:RF,LC(link control),LM(Link Manager),L2CAP(Logical Link Control and Adaptation Protocol),SDP。核心系统的架构图如下,为简明起见,没有画出SDP。
最低的3个Layer经常也看作一个子系统,叫Bluetooth Controler。Bluetooth Controler和包括L2CAP在内上层Profile之间的通信,是通过HCI(Host to Controler Interface)进行。HCI以下的内容Bluetooth Controler由蓝牙芯片实现,以上的内容由Bluetooth Host(比如手机Baseband)实现。
蓝牙核心系统通过一系列Service Access Point(如上图的椭圆部分所示)提供服务,这些服务包含了对蓝牙核心系统的最基本和原始的控制。可以分为3种类型:Device Control Service,修改蓝牙Device的行为,状态和模式;Tansport Control Sevice,创建修改和释放traffic bearers(信道和链接);Data Service,在Traffic bearers上进行数据传输。
由于蓝牙架构通过HCI将Controler和Host独立开来,所以对Controler做了一些基本假设。假定与Host相比,蓝牙Controler的数据buffer能力有限。所以L2CAP会对host传输给Controler的数据做预处理,数据包大小适合蓝牙Controler的buffer能力;L2CAP还会对数据进行质量控制和纠错。
对蓝牙核心系统协议的测试通过TCI(Test Control Interface)进行。
2 蓝牙芯片(Bluetooth Controler)结构
蓝牙芯片,即上一节所说的Controler,实现的是蓝牙协议栈中最底3层的协议,RF,LC,LMP。用在Feature Phone上时,蓝牙芯片作为Slave挂在BB上(不知Smart Phone是不是挂在AP上)。他是一个相对独立完整的子系统,拥有自己的RF,基带,CPU,数据总线和存储设备。通过USB或UART(通常是UART)与Host通信,上一节架构图的HCI,物理上所依赖的便是UART或USB。如下图所示:
其中蓝牙基带控制器是蓝牙硬件模块的关键模块。其主要功能是在微处理器控制下,实现蓝牙基带部分的所有实时处理功能,包括负责对接收的bit流进行符号定时提取和恢复;分组头及净荷的循环冗余度校验(CRC),分组头及净荷的前向纠错码FEC处理,加密和解密处理等,且能提供从基带控制器到其它芯片的接口等。CPU一般采用RISC结构的嵌入式微处理器,如ARM7TDMI微处理器,才能满足对蓝牙核心协议的高速处理和大量数据bit流的处理。Flash 存储器用于存放基带和链路管理层中的所有协议软件。SRAM作为CPU 的运行空间,在工作时把Flash中的软件调入SRAM中处理。射频收发器负责接收或发送高频的通信信号。UART和USB接口提供到HCI的主机控制器接口传输层的物理连接,是上层协议与蓝牙硬件模块进行通信的通道。蓝牙测试模块主要提供无线层和基带层的认证和一致性规范,同时还管理产品的生产和售后的测试,为可选模块。
3 蓝牙源码和移植
由上2节的内容可知,蓝牙芯片(Bluetooth Controler)实现的是协议栈最底下的3层,即HCI以下的部分;而Host实现HCI以上的内容,其中属于蓝牙核心协议的L2CAP和SDP是必须实现的,其他的Profile是可选的。
因此,除了蓝牙芯片厂商(如博通,CSR)外,其他使用蓝牙芯片的厂商不需要关注Bluetooth Controler(Slave端)的内容,而只是实现Host端的内容。当蓝牙芯片挂到不同的软硬件平台上时,软硬件只需要处理HCI相关的部分。
现在用得很广的Bluetooth源码是Linux下的BlueZ,源码包可以在BlueZ的官网http://www.bluez.org/download/下载到。将BlueZ移植到具体的硬件平台时,只需要关注HCI部分,HCI所依赖的硬件是UART或USB,大多数情况下是UART,所以移植蓝牙源码仅需要需要关注UART 驱动;另外加上电源开关。以Android为例:
(1)UART 驱动
BlueZ内核子系统通过守护进程hciattach 与特定硬件的UART驱动进行绑定。
以MSM7201A为例,参考drivers/serial/msm_serial.c。你可能还需要编辑init.rc 中hciattach 的命令行选项。
(2)蓝牙电源开关
Android V1.0与之前的版本采用不同的方式控制蓝牙芯片的电源开关。
1.0:Android 框架向/sys/modules/board_[PLATFORM]/parameters/bluetooth_power_on 写0或1.
Post1.0: Android 框架使用 linux中 rfkill 的API。
可以参考 arch/arm/mach-msm/board-trout-rfkill.c。
4 Reference
https://www.bluetooth.org/apps/content/
http://www.avrw.com/article/art_104_1071.htm
http://blog.csdn.net/dinuliang/archive/2010/07/07/5717382.aspx
http://www.bluez.org/download/