0 Preface/Foreword
1 HCI介绍
1.1 HCI的位置
++HCI的作用++ :把蓝牙上层软件(Host) 和蓝牙底层无线与链路(Controller)解耦 开来,提供一套标准、统一的++控制和数据++接口。
++工程总结++:
HCI = Host和Controller之间的标准接口协议。
1.2 HCI的本质
1.2.1 HCI全称
++HCI++ : ++H++ ost ++C++ ontroller ++I++nterface
1.2.2 HCI处于蓝牙协议栈的位置
应用 / Profile / L2CAP / RFCOMM <------------Host
HCI (接口层)
Link Layer / Baseband / RF <-------------Controller
++需要注意++:
- ❌️HCI不是无线协议
- ❌️HCI不经过蓝牙空口
- ❌️HCI是本地接口,不是空中接口
1.2.3 HCI解决的问题
++上层软件++ 如何++控制和使用++ 一个++蓝牙控制器++。
1.3 HCI的核心作用
1.3.1 控制蓝牙Controller
通过HCI,++Host可以++:
- 打开/关闭蓝牙
- 开始/停止扫描
- 发起连接/断开连接
- 切换PHY(BLE: PHY 1M, PHY 2M;BR: 1M; EDR:2M,3M)
- 设置发射功率(RF PA)
- 管理链路(ACL、SCO/eSCO)
例如,以下为概念:
HCI Command:LE Create Connection
HCI Command:Disconnection
++没有HCI,上层根本动不了蓝牙射频和链路++。
1.3.2 承载数据(ACL/ SCO)
HCI不仅是控制接口,也能转发数据:
|--------------|--------------------|
| 数据类型 | 用途 |
| HCI ACL Data | L2CAP/RFCOMM/AVDTP |
| HCI SCO Data | HFP speech audio |
NOTE:
L2CAP数据不是直接送到Controller,而是先经过了HCI。
1.3.3 事件通知(Controller -> Host)
Controller通过HCI向Host报告事件:
- 扫描到设备
- 连接成功 / 断开
- 参数更新
- 错误/状态变化
例如,以下为概念:
HCI Event:LE Connection Complete
HCI Event:Disconnection Complete
1.4 HCI的通讯形式
1.4.1 HCI是逻辑接口协议
HCI是一种逻辑接口协议,可以映射到多种物理通道。
|-------------|----------|
| HCI物理承载 | 常见场景 |
| UART | 模块化蓝牙 |
| USB | PC/手机 |
| SDIO | 高速控制 |
| SPI | SoC内部 |
[物理接口映射]
HCI != UART,但经常跑在UART上。
++一个典型的工程结构++:
MCU / CPU (Host)
|
| HCI (UART/USB)
|
Bluetooth Chip(Controller)
2 HCI使用场景
2.1 Host和Controller分离
例如:
- MCU + 外置蓝牙模块
- Linux / Android + 蓝牙芯片
结构如下:
Linux Bluetooth Stack (Host)
|
v
HCI
|
v
Bluetooth Controller(芯片)
在该场景下,会接触HCI的内容:
- HCI Log
- HCI Command/Event
- 调UART波特率
- 抓HCI日志
2.2 系统级蓝牙
例如:
- Android手机
- iPhone
- Windows / macOS
实际结构:
系统蓝牙框架(Host)
|
v
HCI (USB / 内部总线)
|
v
蓝牙控制器
++区别++:
- HCI被系统封装
- 应用层感觉不到它
2.3 底层调试或协议分析
例如:
- 蓝牙连接不上
- 参数异常
- PHY切换失败
- 功耗异常
- 听歌没有声音/通话无声
抓的HCI LOG一般为:
HCI CMD
HCI EVT
HCI ACL
HCI SCO
HCI是蓝牙调试的++第一现场++。
2.4 HCI在HFP中的位置
2.4.1 HFP控制链路
AT信令
|
RFCOMM
|
L2CAP
|
HCI ACL Data
|
ACL channel
|
Baseband / PHY
|
RF
2.4.2 HFP语音链路
CVSD/mSBC
|
HCI SCO Data
|
SCO/eSCO
|
Baseband
|
RF
HCI是Host->Controller的++唯一门口++。
3 不需要关心HCI场景
3.1 SoC一体化实现
Application、Host、Controller、RF都在一个芯片里面。
此时:
- HCI逻辑上存在
- 但只是函数调用/内存队列
- 看不到UART/USB
HCI被内部化了。
3.2 只做上层应用
比如制作Android App、iOS App,面对的只是Bluetooth API。系统已经处理好了HCI、Controller、RF。