加载中…
个人资料
铁钩银划
铁钩银划
  • 博客等级:
  • 博客积分:0
  • 博客访问:161,409
  • 关注人气:29
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
谁看过这篇博文
加载中…
正文 字体大小:

蓝牙--主机接口控制器(HCI)

(2014-05-09 17:41:44)
标签:

杂谈

分类: 蓝牙

HCI提供对基带控制器和链路管理器的命令以及访问蓝牙硬件的统一接口,它是我们实现自己的蓝牙设备索要接触的第一个蓝牙协议,起着承上启下的作用。

1.概述

如下图所示,HCI通过对链路管理器、硬件状态注册器、控制注册器、事件注册器等的访问来执行蓝牙硬件的基带命令.

image

主机HCI驱动程序与主机控制器(硬件蓝牙芯片)上的HCI交换数据和命令,主机控制传输层的驱动程序为两个蓝牙设备(主机和主机控制器)的HCI之间提供互相交换信息的能力.主机将收到HCI事件的异步通知,而不管传输层是什么。HCI事件用于在事件发生时通知主机,主机发现某事件发生就会分析接收的事件以确定发生的是哪个事件。

image

2.物理传输层

主机和主机控制器之间共有四种连接方式(USB,RS232,UART,SD)

2.1 USB传输层

image

USB硬件可以两种方式嵌入:作为一个USB专用模块或集成到笔记本主板如下图所示:

image

2.1.1 USB终端(EndPoint)要求

<1>描述符

USB设备可看做高速设备,其固件配置由两个接口组成,第一个接口(接口0)为固定设置,并包含BULK和中断终端,第二个接口(接口1)提供可扩展的同步带宽占用方式.

一个HCI帧包含一个HCI头和HCI数据,应包含于一个USB事物中,此USB事务为一个或多个包含I/O请求数据的USB帧.端点分布在两个接口,因此当调整占用的带宽时,所有挂起的bulk和/或中断的交易不需要终止或重发.配置要求参见下表:

image

<2>控制终端要求:

终端0用于控制和配置USB设备,还可用于允许主机向主机控制器发送特定HCI指令,当USB固件在具有蓝牙类别码的终端上收到一个分组时,它应将该分组视为一个HCI指令分组.

<3>BULK终端要求

数据完整性是ACL数据的一个关键方面.它与带宽请求一起成为使用BULK终端的原因,BULK能够进行检错和纠错。通过该管道的数据流可流向多个从设备。为了避免阻塞,推荐主机控制器采用类似于共享终端模型的流控制模型.

<4>中断终端要求

中断终端能够保证事件以可预测并及时的方式传递。事件分组可以在一定允许延时条件下通过USB发送。中断终端应有1ms的时间间隔.

<5>同步终端要求

同步终端传输和接收主机控制器通过射频传输的SCO数据,时间是该数据类型的重要因素.USB固件应该将数据内容传递到主机控制器的SCO先进先出队列(FIFO).

3.类别码

用于所有USB蓝牙设备。还可以通过控制终端区分HCI指令和USB指令.

类别码(bDeviceClass)为0xE0--无线控制器

子类码(bDeviceSubClass)0x01--射频控制器

协议码(bDeviceProtocol)0x01--蓝牙编程

2.2 RS232传输层

主机和主机控制器之间通过RS232传输层进行连接,传输HCI命令事件和数据.通过RS232传输层可发出四种HCI分组:指令分组,事件分组,ACL数据分组和SCO数据分组.其中HCI指令分组仅能用于蓝牙主机发送到蓝牙主机控制器,HCI事件分组仅能由蓝牙主机控制器发送到蓝牙主机,ACL/SCO数据分组可自由发送和接收.主机控制器不能区分四种HCI类型,因此如果通过同一物理接口发出一个HCI分组,则HCI分组必须添加指示器.

image

除了这四种HCI分组外,还有两种用于支持动态协商和错误报告.接收端使用错误信息分组(0x05)将错误报告发到发送端,协商分组(0x06)则用于协商通信设置和协议.每次发送一个以上HCI分组时,HCI分组指示器将在一个8bit序列号上每次加1,除非抓发分组作为纠错的一部分,HCI分组紧跟在该序列号域后,所有四种HCI分组都有一个长度域,该域用于确定HCI分组长度为多少字节.(错误信息和协商分组都是基于扩展域的定长分组).

}($`[3W4U(CGOQ]K6Z{6_1S

 

2.3 UART传输层

在同一PCB上两UART之间的串行接口上使用蓝牙HCI,HCI UART传输层假定UART通信不存在线路故障.

image

可通过UART传输层发送的HCI分组共有四种:HCI指令分组,HCI事件分组,HCI ACL数据分组和HCI SCO数据分组.HCI指令分组仅能由主机发送到主机控制器,HCI事件分组技能从主机控制器发送到主机.ACL和SCO数据分组则可自由发送接收.

HCI不能够区分四种HCI分组类型,如果通过同一物理接口发出,则HCI分组必须增加分组指示器.

image

HCI分组指示器在HCI分组前立即发出,所有四种HCI分组都有一个长度域,用于确定HCI分组有多少字节。当收到整个HCI分组时,将要求下一HCI的分组指示器,在UART传输层上,只有后面跟HCI分组的HCI分组指示器可以允许使用.

HCI UART传输层使用下列RS232设置:

含RTS/CTS的流控制用于阻止临时UART缓冲区溢出。由于HCI有用于HCI指令、事件和数据的流控制机制,因此它不用用作HCI的流控制.

CTS=1:允许主机/主机控制器发送

CTS=0:禁止主机/主机控制器发送

流完成响应时间定义了从设置RTS=0到字节流真正结束的最大时间.

当处于空MODEM模式时,RS232信号应处于连接状态,即本地TXD应连接到远端RXD,本地RTS连接到远端CTS.

2.4 SD传输层

(to do)

3. HCI 流控制

流控制用于在主机和主机控制器之间避免传送到主机控制器的未应答远程设备的ACL数据溢出主机控制器数据缓冲区.主机负责管理主机控制器的数据缓冲区.在初始化时,主机通过发送指令获取主机控制器的HCI ACL和SCO数据分组的最大长度.另有两返回参数表示主机控制器可以缓存等待传输的HCI ACL和SCO数据分组数.在至少有一个连接或处于本地发送的情况下,主机控制器利用NumberOFCompletedPackets事件控制从主机发来的数据流.

4. HCI数据格式

HCI提供一个访问蓝牙硬件的统一指令方式,HCI链路指令使主机能够控制到其他蓝牙设备的链路层连接.这些指令通过链路控制器(LM)与远程蓝牙设备交换LMP指令,执行HCI指令将耗费不同时间,因此指令结果将以事件的方式返回给主机.

基带数据分组:数据的最小单元,它在各个设备之间进行传输,基带规范中有定义.

数据分组:是比基带包更高层次的协议报文,目前只定义了L2CAP。

连接句柄:用于唯一标识蓝牙设备之间数据或语音连接的12bit标识符,连接句柄可以通过唯一标识两蓝牙设备间的数据管道进行访问.连接句柄值在主机和主机控制器间取本地址,在两个蓝牙设备间可以拥有多个连接句柄,但只能保持一个ACL连接.

事件:HCI用于通知主机命令完成和链路层状态变动等信息的一种机制.

4.1 数据和参数格式

<1>如无特别说明,所有值都采用二进制或十六进制的little endian.

<2>定义值的时候,所有负值都用2的补码形式表示.

<3>参数数组采用以下概念进行定义: ParameterA[i]

<4>所有参数值都按照little endian 格式发送和接收

<5>所有非数组的命令和指令参数,以及所有参数数组元素都具有固定格式.

<6>字符串中,低位bit 在右边

4.2 HCI信息交换

HCI规范对主机和主机控制器间交换的指令、事件、数据的格式进行定义.

4.2.1 HCI分组

4.2.1.1 HCI指令分组

用于从主机向主机控制器发送指令,HCI指令分组的格式如下,对于大部分命令,当主机控制器完成命令时将发送Command Complete事件给主机.

image

每条指令都指定了一个2B的操作码,用于唯一标识指令类型.操作码参数分为两段,操作码组段(OGF)和操作码指令段(OCF),OGF占用操作码的前6bit,OCF占用剩余的10bit,OGF的0x3F保留用于厂商测试,0x3E保留用于蓝牙标志测试.

image

image

 

4.2.1.2 HCI数据分组

用于主机和主机控制器之间交换数据,数据分组根据ACL和SCO数据分组类型进行定义.

4.2.1.2.1 HCI ACL数据分组

ACL数据分组用来交换主机与主机控制器之间的数据

image

image

4.2.1.2.2 HCI SCO数据分组

用于交换主机和主机控制器之间的同步数据.

image

image

image

4.2.1.3 HCI数据分组

主机控制器利用HCI事件分组在事件发生时通知主机.主机必须能够接收分组长度小于255B的所有HCI事件分组,而且分组长度不包括分组头.

image

4.2.2 HCI命令和事件

4.2.2.1 链路控制指令

该指令允许主机控制器控制到其他蓝牙设备的连接,使用链路控制指令时,链路管理器(LM)负责控制如何建立和保持蓝牙匹克网和散网.这些指令只是LM创建和调整与蓝牙远程设备的链路层管理,在有效范围内执行对其他蓝牙设备和LM指令的查询.对于链路管理之灵,OGF的值为0x01.

image

image

4.2.2.2 链路策略命令

该层命令为主机提供了影响链路管理器管理蓝牙网络的方法,链接策略命令使用时,LM将继续控制蓝牙网络的建立和维护,但要依赖可以调节的策略参数.这些命令可以改变链路管理器的行为,因而也将导致与远程链路连接的改变.(两个蓝牙节点之间只能存在一个ACL连接),对于该命令,OGF为0x02.

image

4.2.2.3 主机控制器与基带命令

主机控制器和基带命令提供对蓝牙硬件的各种能力的访问和控制,提供对蓝牙设备控制和对自己控制器、链路管理器和基带的能力的控制.主机设备可以使用这些命令改变本地设备的运行状态.对于HCI控制和基带命令,OGF值为0x03.

image

image

image

4.2.2.4 信息参数

信息参数由蓝牙硬件制造商给定,这些参数提供有关蓝牙设备以及主机控制器、蓝牙管理器和基带能力信息.主机不能改动这些信息,对于信息参数命令,OGF值为0x04.

image

4.2.2.5 状态参数

主机控制器改变全部的状态参数,这些状态参数提供有关主机控制器、链路管理器和基带的当前状态信息。主机不能改变任何参数,但是可以对特别指定的参数复位.OGF定义为0x05.

image

4.2.2.5 测试指令

用于提供测试蓝牙硬件各种功能的能力,OGF为0x06

image

4.3 事件

事件码占用一个字节,其中0xFF预留给设备制造商专用的调试事件,事件0xFE预留给蓝牙Logo测试

image

image

0

阅读 评论 收藏 转载 喜欢 打印举报/Report
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 电话:4000520066 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有