经典蓝牙中的HCI

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。