蓝牙里面的HCI是啥?
如上图,HCI就是HOST和Controller之间的通道。用来桥接Host和Controller Devices。
HCI是一个标准的蓝牙用的接口,用来Host发给Controller命令,HOST从controller接收events,和HOST发给Controller数据,和从HOST从Controller接收数据。
HOST就是指我们的主控芯片,Microcontroller/ MCU / μCON / MPU等,比如我正在使用的是iMX6ULL芯片。
Controller就是蓝牙芯片了,比如我比较熟悉的TI的CC2564芯片。
那这两个芯片之间用什么方式通信呢?
用的是串行通讯,主要有两种,一种是UART,另一种是USB。
这个是根据厂商实现的蓝牙芯片和所使用的协议栈共同决定的。
我们一般以UART为主要使用方式,更方便我们通过外部UART串口工具来抓取HCI通信数据或发送HCI命令给蓝牙芯片。
蓝牙5.0规范里HCI的介绍
我们网上搜索蓝牙5.0协议,下载bluetooth-Core_v5.0.pdf,以5.0为例,还有比5.0更高版本的蓝牙spec。
蓝牙协议内容很多,打开后发现里面分了8卷,从Volume 0 ~ Volume 7。
有关HCI的主要部分在Vol 2: Core System package [BR/EDR Controller volume],Part E: Host Controller Interface Functional Specificaton。
这里面介绍了HCI Flow Control,HCI Data Formats和HCI Commands and Events。
HCI上的信息交互:
Host Controller Transport Layer实现了透明的信息交换。
包含以下类型的信息:
Host -> BR/EDR Controller: HCI commands / ACL data / synchronous data.
Host -> LE Controller: HCI commands / ACL data
Host -> AMP Controller: HCI commands / ACL data
BR/EDR Controller -> Host : HCI events, ACL data and synchronous data
LE Controller -> Host : HCI events, ACL data
AMP Controller -> Host : HCI events, ACL data
HCI规范上描述了Host和Controller之间传输的数据的格式,包括commands,events和其他数据。
所以HCI上的数据类型分为四种:
HCI Command Packet
HCI ACL Data Packets
HCI Synchronous Data Packets
HCI Event Packet
HCI数据传输控制
HCI提供了一个统一的命令方法来访问控制器的各种功能。
HCI命令的执行可能需要一些时间。因此命令的结果将以事件event的形式报告给主机。
例如,对于大多数HCI命令,控制器将在命令完成时产生命令完成事件。
这个事件包含完成HCI命令的返回参数。
Host Controller Interface driver层,是底层通讯功能的具体实现,在这一层上还有个transport layer,叫做HCI传输层,属于Host driver stack一部分。
这个层的主要作用是数据透传,这样传输层和底层的具体传输技术是UART还是USB就无关了。
为了使主机检测HCI-传输层上的错误,需要设定一个超时,在主机发送命令后和接收到控制器的回应之前,比如等待控制器发出的Command Complete和Command Status事件。
由于最大的响应超时在很大程度上取决于所使用的HCI传输层,建议使用该计时器的默认值为一秒钟。
这个时间量也取决于命令队列中未处理的命令数量。
其他说明:
除非另有说明,所有数值都是二进制和十六进制的小端格式。
除非另有说明,所有的参数值都以小端格式发送和接收,即对于多字节的参数,最右边的(低有效位字节)先被传送。
在指定的位串中,低阶位是右手边的位,例如,0是10b中的低阶位。
不知道如何解释的参数值或操作码应被忽略,尝试执行相应操作并返回正确信号。
主机或控制器收到一些保留值时不应停止操作。