蓝牙--主机接口控制器(HCI)
I提供对基带控制器和链路管理器的命令以及访问蓝牙硬件的统一接口,它是我们实现自己的蓝牙设备索要接触的第一个蓝牙协议,起着承上启下的作用。
1.概述
如下图所示,HCI通过对链路管理器、硬件状态注册器、控制注册器、事件注册器等的访问来执行蓝牙硬件的基带命令.
主机HCI驱动程序与主机控制器(硬件蓝牙芯片)上的HCI交换数据和命令,主机控制传输层的驱动程序为两个蓝牙设备(主机和主机控制器)的HCI之间提供互相交换信息的能力.主机将收到HCI事件的异步通知,而不管传输层是什么。HCI事件用于在事件发生时通知主机,主机发现某事件发生就会分析接收的事件以确定发生的是哪个事件。
2.物理传输层
主机和主机控制器之间共有四种连接方式(USB,RS232,UART,SD)
2.1 USB传输层
USB硬件可以两种方式嵌入:作为一个USB专用模块或集成到笔记本主板如下图所示:
2.1.1 USB终端(EndPoint)要求
<1>描述符
USB设备可看做高速设备,其固件配置由两个接口组成,第一个接口(接口0)为固定设置,并包含BULK和中断终端,第二个接口(接口1)提供可扩展的同步带宽占用方式.
一个HCI帧包含一个HCI头和HCI数据,应包含于一个USB事物中,此USB事务为一个或多个包含I/O请求数据的USB帧.端点分布在两个接口,因此当调整占用的带宽时,所有挂起的bulk和/或中断的交易不需要终止或重发.配置要求参见下表:
<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分组必须添加指示器.
除了这四种HCI分组外,还有两种用于支持动态协商和错误报告.接收端使用错误信息分组(0x05)将错误报告发到发送端,协商分组(0x06)则用于协商通信设置和协议.每次发送一个以上HCI分组时,HCI分组指示器将在一个8bit序列号上每次加1,除非抓发分组作为纠错的一部分,HCI分组紧跟在该序列号域后,所有四种HCI分组都有一个长度域,该域用于确定HCI分组长度为多少字节.(错误信息和协商分组都是基于扩展域的定长分组).
2.3 UART传输层
在同一PCB上两UART之间的串行接口上使用蓝牙HCI,HCI UART传输层假定UART通信不存在线路故障.
可通过UART传输层发送的HCI分组共有四种:HCI指令分组,HCI事件分组,HCI ACL数据分组和HCI SCO数据分组.HCI指令分组仅能由主机发送到主机控制器,HCI事件分组技能从主机控制器发送到主机.ACL和SCO数据分组则可自由发送接收.
HCI不能够区分四种HCI分组类型,如果通过同一物理接口发出,则HCI分组必须增加分组指示器.
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事件给主机.
每条指令都指定了一个2B的操作码,用于唯一标识指令类型.操作码参数分为两段,操作码组段(OGF)和操作码指令段(OCF),OGF占用操作码的前6bit,OCF占用剩余的10bit,OGF的0x3F保留用于厂商测试,0x3E保留用于蓝牙标志测试.
4.2.1.2 HCI数据分组
用于主机和主机控制器之间交换数据,数据分组根据ACL和SCO数据分组类型进行定义.
4.2.1.2.1 HCI ACL数据分组
ACL数据分组用来交换主机与主机控制器之间的数据
4.2.1.2.2 HCI SCO数据分组
用于交换主机和主机控制器之间的同步数据.
4.2.1.3 HCI数据分组
主机控制器利用HCI事件分组在事件发生时通知主机.主机必须能够接收分组长度小于255B的所有HCI事件分组,而且分组长度不包括分组头.
4.2.2 HCI命令和事件
4.2.2.1 链路控制指令
该指令允许主机控制器控制到其他蓝牙设备的连接,使用链路控制指令时,链路管理器(LM)负责控制如何建立和保持蓝牙匹克网和散网.这些指令只是LM创建和调整与蓝牙远程设备的链路层管理,在有效范围内执行对其他蓝牙设备和LM指令的查询.对于链路管理之灵,OGF的值为0x01.
4.2.2.2 链路策略命令
该层命令为主机提供了影响链路管理器管理蓝牙网络的方法,链接策略命令使用时,LM将继续控制蓝牙网络的建立和维护,但要依赖可以调节的策略参数.这些命令可以改变链路管理器的行为,因而也将导致与远程链路连接的改变.(两个蓝牙节点之间只能存在一个ACL连接),对于该命令,OGF为0x02.
4.2.2.3 主机控制器与基带命令
主机控制器和基带命令提供对蓝牙硬件的各种能力的访问和控制,提供对蓝牙设备控制和对自己控制器、链路管理器和基带的能力的控制.主机设备可以使用这些命令改变本地设备的运行状态.对于HCI控制和基带命令,OGF值为0x03.
4.2.2.4 信息参数
信息参数由蓝牙硬件制造商给定,这些参数提供有关蓝牙设备以及主机控制器、蓝牙管理器和基带能力信息.主机不能改动这些信息,对于信息参数命令,OGF值为0x04.
4.2.2.5 状态参数
主机控制器改变全部的状态参数,这些状态参数提供有关主机控制器、链路管理器和基带的当前状态信息。主机不能改变任何参数,但是可以对特别指定的参数复位.OGF定义为0x05.
4.2.2.5 测试指令
用于提供测试蓝牙硬件各种功能的能力,OGF为0x06
4.3 事件
事件码占用一个字节,其中0xFF预留给设备制造商专用的调试事件,事件0xFE预留给蓝牙Logo测试
蓝牙--主机接口控制器(HCI)的更多相关文章
- 蓝牙核心技术概述(四):蓝牙协议规范(HCI、L2CAP、SDP、RFOCMM)(转载)
一.主机控制接口协议 HCI 蓝牙主机-主机控模型 蓝牙软件协议栈堆的数据传输过程: 1.蓝牙控制器接口数据分组:指令分组.事件分组.数据分组(1).指令分组 如:Accpet Connection ...
- Bluedroid: 蓝牙协议栈源码剖析
一. 基础知识介绍 1.缩略语 BTIF: Bluetooth Interface BTU : Bluetooth Upper Layer BTM: Bluetooth Manager BTE: Bl ...
- Android蓝牙学习笔记
一 Bluetooth基本概念 蓝牙是无线数据和语音传输的开放式标准,它将各种通信设备.计算机及其终端设备.各种数字数据系统.甚至家用电器采用无线方式联接起来.它的传输距离为10cm-10m,如果增加 ...
- iOS开发系列--通讯录、蓝牙、内购、GameCenter、iCloud、Passbook系统服务开发汇总
--系统应用与系统服务 iOS开发过程中有时候难免会使用iOS内置的一些应用软件和服务,例如QQ通讯录.微信电话本会使用iOS的通讯录,一些第三方软件会在应用内发送短信等.今天将和大家一起学习如何使用 ...
- iOS--通讯录、蓝牙、内购、GameCenter、iCloud、Passbook等系统服务开发汇总
iOS开发过程中有时候难免会使用iOS内置的一些应用软件和服务,例如QQ通讯录.微信电话本会使用iOS的通讯录,一些第三方软件会在应用内发送短信等.今天将和大家一起学习如何使用系统应用.使用系统服务: ...
- 2.OC蓝牙功能
一. 最早的蓝牙框架是GameKit,iOS7之前用的比较多,它有只能支持iOS设备间的传输,但是使用步骤简单,我们只需要搞清楚两个类就可以了. GKPeerPickerController:熟称浏 ...
- iOS开发——高级技术&蓝牙服务
蓝牙服务 蓝牙 随着蓝牙低功耗技术BLE(Bluetooth Low Energy)的发展,蓝牙技术正在一步步成熟,如今的大部分移动设备都配备有蓝牙4.0,相比之前的蓝牙技术耗电量大大降低.从iOS的 ...
- iOS开发系列通讯录、蓝牙、内购、GameCenter、iCloud、Passbook系统服务开
--系统应用与系统服务 iOS开发过程中有时候难免会使用iOS内置的一些应用软件和服务,例如QQ通讯录.微信电话本会使用iOS的通讯录,一些第三方软件会在应用内发送短信等.今天将和大家一起学习如何使用 ...
- 主机控制器接口(HCI)
主机控制器接口(HCI)提供了一种访问蓝牙硬件能力的通用接口. HCI固件通过访问基带命令.链路管理器命令.硬件状态寄存器.控制寄存器以及事件寄存器实现对蓝牙硬件的HCI命令. HCI是通过包的方式来 ...
随机推荐
- javascript操作cookies
1.读取cookies getCookie: function(c_name){ if (document.cookie.length > 0) { var c_start = document ...
- javascript的window.onload()方法和jQuery的$(document).ready()的对比
jQuery中$(document).ready()的作用类似于传统JavaScript中的window.onload方法,不过与window.onload方法还是有区别的. 1.执行时间 windo ...
- BZOJ3289 Mato的文件管理(莫队算法+树状数组)
题目是区间逆序数查询. 莫队算法..左或右区间向左或右延伸时加或减这个区间小于或大于新数的数的个数,这个个数用树状数组来统计,我用线段树超时了.询问个数和数字个数都记为n,数字范围不确定所以离散化,这 ...
- ZOJ 3908 Number Game ZOJ Monthly, October 2015 - F
Number Game Time Limit: 2 Seconds Memory Limit: 65536 KB The bored Bob is playing a number game ...
- 不容易系列之(4)——考新郎[HDU2049]
不容易系列之(4)——考新郎 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)To ...
- 匈牙利命名法——命名规范(知道这些再看Windows程序就轻松多了)
匈牙利命名法著名的命名规则当推Microsoft公司的"匈牙利"法,该命名规则的主要思想是"在变量和函数名中加入前缀以增进人们对程序的理解".例如所有的字符变量 ...
- codevs 1060
题目大意: 有2n张票,分别有A,B两类,求最后两个人拿到同种票的概率.n<=1250; 想想这题应该是组合啊..但是到底是组合还是排列..如果是组合, 概率为:1-两种票都取了n-1张的情况, ...
- Linux Mint 没有 language support 语言支持解决方案
打开新立得软件管理器在右边找到有关语言的安装后,language support就会出现
- Odoo 二次开发教程【一】 Odoo 的安装
一,安装的两种方式: 1) deb包安装: 此安装方式适用于简单不需要太多的人工干预,大多数插件都在deb中涵盖了.具体的步骤如下: 1.编辑 /etc/apt/source.list 文件,在末尾添 ...
- C#输入的字符串只包含汉字
public bool IsAllChineseCh(string input) { Regex regex = new Regex("^[\u4e00 ...