HCI 功能规范【2. Overview of Host Controller transport layer】

发布时间:2026/7/3 13:00:29
HCI 功能规范【2. Overview of Host Controller transport layer】
这部分内容是HCI 章节第 2 节Host Controller Transport Layer 概述。它主要想表达的是Host 和 Controller 之间虽然通过 HCI 进行通信但 HCI 数据本身还需要一个“传输层”来负责搬运。这个传输层就是 Host Controller Transport Layer。1. 这部分整体想表达什么蓝牙协议栈中Host 和 Controller 之间通过 HCI 交互。但是 HCI 只是定义了HCI Command HCI Event HCI ACL Data HCI ISO Data HCI Packet 格式 HCI 参数含义 HCI 命令与事件流程可是这些 HCI 数据包要真正从 Host 发送到 Controller还需要经过某种实际传输方式。例如UART USB SDIO SPI 其他物理总线所以这一节讲的就是Host Controller Transport Layer也就是Host 和 Controller 之间的传输层。它的位置可以理解为Host └── HCI Driver / Upper HCI ↓ Host Controller Transport Layer ↓ Controller └── Lower HCI2. Host Controller Transport Layer 的核心目标透明性规范里说The main goal of this transport layer is transparency.意思是这个传输层的主要目标是透明性。这里的“透明性”不是说看得见而是说上层 HCI Driver 不需要关心底层到底是 UART、USB、SDIO 还是其他传输方式。也就是说Host 侧的 HCI Driver 只关心我要发送一个 HCI Command 我要接收一个 HCI Event 我要发送或接收 HCI ACL Data它不应该关心这个 HCI Command 最终是通过 UART 发出去的 还是通过 USB 发出去的 还是通过 SDIO 发出去的这种设计的好处是HCI 逻辑接口可以保持稳定 底层传输方式可以替换 Controller 可以升级 Transport Layer 可以独立实现3. Transport Layer 不应该理解 HCI 数据内容规范里还有一句非常关键the transport should not require any understanding of the data that the Host Controller Interface driver passes to the Controller.意思是传输层不应该需要理解 HCI Driver 传给 Controller 的数据内容。也就是说Transport Layer 只是搬运数据不负责解释数据。可以这样理解HCI Driver知道这是 LE Set Advertising Enable Command Transport Layer不知道也不需要知道只负责把这串字节送过去 Controller收到后再按 HCI 规则解析和执行举个例子Host 要开启 BLE 广播Host HCI Driver ↓ 生成 HCI CommandLE Set Advertising Enable ↓ Transport Layer ↓ 通过 UART / USB / SDIO 搬运这包数据 ↓ Controller Lower HCI ↓ 解析并执行开启广播这里 Transport Layer 不需要知道这是开启广播命令 这是 LE 命令 这是 OGF / OCF / Opcode 这是 Advertising_Enable 参数它只需要知道这是一段要从 Host 送到 Controller 的数据4. 为什么要这样设计这种设计的意义在于解耦。HCI 层和 Transport Layer 分开后可以带来几个好处。4.1 HCI 逻辑不依赖具体总线无论蓝牙芯片通过 UART 接入还是通过 USB 接入Host 侧 HCI 的逻辑都可以保持一致。例如同样是开启广播LE Set Advertising Enable在 UART 蓝牙模块上是这个命令。在 USB 蓝牙适配器上也是这个命令。在 SDIO 蓝牙芯片上还是这个命令。区别只是在于HCI Packet 是通过什么物理通道送过去的4.2 Controller 可以升级不影响传输层规范里说This allows the logical interface (HCI) or the Controller to be upgraded without affecting the transport layer.意思是这样可以让 HCI 逻辑接口或者 Controller 升级时不影响 Transport Layer。例如 Controller 支持了新的 BLE 特性扩展广播 Periodic Advertising LE 2M PHY LE Coded PHY PAwR Channel Sounding这些是 HCI 命令和 Controller 能力层面的变化。但是底层 UART / USB / SDIO 传输层原则上不需要理解这些新功能。它仍然只是搬运 HCI 数据包。4.3 Transport Layer 可以替换不影响 HCI 语义例如同一个蓝牙 Controller有的产品使用 UART 接入主控有的产品使用 USB 接入主控。HCI 命令语义不变设置广播参数 设置扫描参数 建立连接 发送 ACL 数据 接收 HCI Event变化的是底层传输路径UART HCI USB HCI SDIO HCI所以 Transport Layer 的存在让 HCI 成为一个更加稳定的逻辑接口。5. Transport Layer 和 HCI 的关系可以把它们的关系理解成HCI定义 Host 和 Controller 之间说什么 Transport Layer负责把这些话送过去更具体一点HCI CommandHost 要 Controller 做什么 HCI EventController 告诉 Host 发生了什么 HCI ACL DataHost 和 Controller 之间传输连接数据 Transport Layer负责承载这些 HCI Packet所以 Transport Layer 不是 BLE 的业务逻辑层也不是 Link Layer。它只是 Host 和 Controller 之间的数据通道。6. 一个通俗类比可以把 HCI 和 Transport Layer 类比为HCI 语言和命令格式 Transport Layer 快递/运输方式例如你要告诉 Controller开启广播HCI 规定这句话应该怎么说LE Set Advertising Enable Command Opcode 是多少 参数是什么 返回事件是什么Transport Layer 只负责把这句话送过去。至于是通过UART USB SDIO送过去对 HCI 命令本身来说不应该有影响。7. “The specified Host Controller Transport Layers are described in the other parts of Volume 4”是什么意思这句话的意思是具体的 Host Controller Transport Layer 规范不在这一节详细展开而是在 Volume 4 的其他部分中描述。也就是说当前 HCI 章节只是告诉你Host 和 Controller 之间存在 Transport Layer Transport Layer 的目标是透明性 Transport Layer 不应该理解 HCI 数据内容 Transport Layer 负责承载 HCI 数据至于具体 UART HCI、USB HCI、SDIO HCI 怎么定义要看 Volume 4 其他部分。常见的 Transport 相关内容包括HCI USB Transport Layer HCI UART Transport Layer HCI SDIO Transport Layer这些章节会具体说明HCI Packet 怎么封装到 USB 传输里 HCI Packet 怎么封装到 UART 字节流里 HCI Packet 类型如何区分 初始化流程是什么 流控怎么做 错误怎么处理8. 2.1 This section is no longer used 是什么意思截图里有2.1. [This section is no longer used]意思是第 2.1 节已经不再使用。这通常表示蓝牙规范历史版本中这里曾经有内容但后来内容被删除、迁移、废弃或不再适用。学习时可以直接跳过。不要在这里纠结因为它没有有效技术内容。9. 这部分的关键信息9.1 Host 和 Controller 之间不只是 HCI还需要传输层HCI 定义逻辑接口。Transport Layer 负责实际搬运 HCI 数据。HCI 逻辑接口 Transport Layer 传输承载9.2 Transport Layer 的核心目标是透明性Host Controller Interface Driver 不应该依赖具体的传输方式。也就是说HCI Driver 不应该强绑定UART USB SDIO而应该尽量只面对统一的 HCI 逻辑。9.3 Transport Layer 不理解 HCI 数据内容Transport Layer 不需要知道这包数据是LE Set Advertising Parameters LE Set Scan Enable LE Create Connection HCI ACL Data HCI Event它只负责搬运。真正理解 HCI 数据含义的是Host 侧 HCI Driver Controller 侧 Lower HCI9.4 这种设计是为了方便升级和替换由于 HCI 和 Transport Layer 解耦所以Controller 可以升级 HCI 可以增加新命令 Transport Layer 可以保持不变 底层总线可以替换 Host 上层逻辑可以尽量少受影响10. 结合 BLE 开发应该怎么理解对于 BLE App 开发来说一般接触不到 Transport Layer。因为在手机上App ↓ 系统蓝牙 API ↓ 系统 Host 协议栈 ↓ HCI ↓ 蓝牙芯片 ControllerApp 通常无法直接操作 HCI Transport。但是在这些场景下Transport Layer 就很重要做蓝牙芯片驱动 做嵌入式 Linux 蓝牙适配 做 Android 蓝牙底层调试 做蓝牙模块固件对接 分析 btsnoop / HCI log 调试 UART HCI 蓝牙模块 调试 USB 蓝牙 Dongle例如一个 UART 蓝牙模块主控通过串口连接蓝牙芯片MCU / Linux Host ↓ UART Driver ↓ HCI UART Transport ↓ Bluetooth Controller此时你看到的串口数据本质上就是 HCI Packet 被 UART Transport 承载后的字节流。11. 和前面 Introduction 的关系前面 Introduction 讲的是HCI 是 Host 和 Controller 之间的接口这一节进一步补充HCI 数据在 Host 和 Controller 之间传输时需要 Transport Layer 来承载所以完整关系是Host ↓ Upper HCI ↓ Host Controller Transport Layer ↓ Lower HCI ↓ Controller也可以简单总结为Host 通过 HCI 控制 Controller。 HCI Packet 通过 Transport Layer 在 Host 和 Controller 之间传输。 Transport Layer 只负责搬运不负责理解 HCI 语义。12. 对这部分内容的学习建议这部分不需要深挖太多重点掌握一个概念即可HCI 是逻辑接口Transport Layer 是承载通道。如果当前目标是理解 BLE 广播、扫描、连接、GATT 通信那么优先级更高的是HCI Command HCI Event HCI ACL Data LE Controller Commands LE Meta Event ATT / GATT GAPTransport Layer 只需要知道它负责把 HCI Packet 通过 UART、USB、SDIO 等方式送到 Controller 即可。除非后续要做蓝牙芯片驱动、Linux 蓝牙底层、UART HCI 模块调试否则暂时不用深入。