HCI 指令 HCI_Write_LE_Host_Support
是 Bluetooth Host 向 Controller 发送的一条指令,用于启用或禁用主机对 Bluetooth Low Energy(LE)的支持能力。该指令属于 HCI(Host Controller Interface)命令集合中,规范位置为 Core Spec v5.x,Vol 2, Part E, Section 7.3.79。
c
7 2025-04-24 15:55:53.351405 host controller HCI_CMD 6 Sent Write LE Host Supported
Bluetooth HCI Command - Write LE Host Supported
Command Opcode: Write LE Host Supported (0x0c6d)
0000 11.. .... .... = Opcode Group Field: Host Controller & Baseband Commands (0x03)
.... ..00 0110 1101 = Opcode Command Field: Write LE Host Supported (0x06d)
Parameter Total Length: 2
LE Supported Host: true (0x01)
Simultaneous LE Host: false (0x00)
[Response in frame: 8]
[Command-Response Delta: 0.521ms]
1. 简要理解
HCI_Write_LE_Host_Support
指令的目的是:
告诉 Controller(控制器)主机是否支持 LE(Low Energy)功能。
LE 是 Bluetooth 4.0 引入的一种低功耗通信机制,开启这个支持标志后,控制器会在其特性(Feature Mask)中标记主机支持 LE。
2. 指令定义(HCI_Write_LE_Host_Support)

1. Command Parameters(命令参数)
-
LE_Supported_Host(1 Octet)
- 用于设置主机是否支持 LE。
- 取值参考 [Core Spec Vol 2, Part C, Section 3.2] 中的定义。
- 常用值:
0x00
:不支持0x01
:支持
-
Unused(1 Octet)
- 历史遗留字段,当前控制器会忽略这个字段。
- 任意值都可以写入。
2. Return Parameters(返回参数)
字段 | 长度 | 描述 |
---|---|---|
Status | 1 Octet | 结果状态码 |
-
0x00
:表示指令执行成功。 -
0x01
~0xFF
:指令执行失败,错误码参考 [Vol 1] Part F(错误码定义)。
3. 事件通知
- 该命令完成后,Controller 会发送
HCI_Command_Complete
事件,向 Host 报告执行结果。 - Host 应监听该事件以判断设置是否成功。
3. 应用场景(为什么需要设置它?)
在有些系统中(尤其是支持双模 Bluetooth 的设备),LE 支持并不是默认启用的。这条指令允许主机在启动时显式启用对 LE 的支持,从而使 Controller 更新自己的 Feature Mask,使得后续的 LE 操作(如 LE Advertising、LE Scanning、LE Connection)被允许。
例如:
- 手机或车载主机首次启动 Bluetooth 时,可以通过该指令通知控制器它支持 BLE 功能。
- 蓝牙堆栈初始化流程中,某些芯片厂商可能要求 Host 显式调用该命令,否则控制器不会开启 LE 支持。
4. 与其他指令的关系
-
HCI_Read_Local_Supported_Features:用于读取 Controller 当前支持的 Feature。
-
HCI_Read_LE_Host_Support:读取当前主机是否启用了 LE 支持。
-
HCI_Write_LE_Host_Support:用于设置是否启用主机对 LE 的支持(本文所述)。
-
HCI_Write_LE_Host_Support 的设置只影响 Controller 的 LMP features 表现,不直接影响 Host 逻辑。
5. aosp示例
如果你正在调试蓝牙协议栈初始化流程,这条指令通常会在堆栈初始化阶段调用,比如 Android 蓝牙堆栈中设置主机 LE 支持标志,以确保后续 LE 操作生效。是否调用成功可通过 HCI_Command_Complete
事件回调判断。
c
static constexpr uint64_t kDefaultEventMask = 0x3dbfffffffffffff;
static constexpr uint64_t kDefaultLeEventMask = 0x000000004d02fe7f;
// system/gd/hci/controller.cc
struct Controller::impl {
void Start(hci::HciLayer* hci) {
...
le_set_event_mask(kDefaultLeEventMask);
set_event_mask(kDefaultEventMask);
write_le_host_support(Enable::ENABLED, Enable::DISABLED);
...
}
/*
enable:表示是否启用 LE Supported Host 功能(主机是否支持 BLE)。
deprecated_host_bit:表示是否启用一个已废弃的功能位 Simultaneous LE and BR/EDR Host support。
*/
void write_le_host_support(Enable enable, Enable deprecated_host_bit) {
if (deprecated_host_bit == Enable::ENABLED) {
// 如果设置了 deprecated_host_bit, 打印一个警告
// Since Bluetooth Core Spec 4.1, this bit should be 0
LOG_WARN("Setting deprecated Simultaneous LE BR/EDR Host bit");
}
std::unique_ptr<WriteLeHostSupportBuilder> packet = WriteLeHostSupportBuilder::Create(enable, deprecated_host_bit);
hci_->EnqueueCommand(
std::move(packet),
module_.GetHandler()->BindOnceOn(this, &Controller::impl::check_status<WriteLeHostSupportCompleteView>));
}
- 在初始化 Controller 模块时, 在 Controller::impl::Start 函数中就会调用 write_le_host_support 函数去设置
1. deprecated_host_bit
是什么?
deprecated_host_bit
是 HCI_Write_LE_Host_Support
命令中的第二个参数,对应协议定义中的:
Simultaneous LE and BR/EDR to Same Device Capable (Host)
这个位早期用于标识主机是否支持同时对同一个设备进行 BLE 和传统蓝牙的连接。
但是:
- 从 Bluetooth Core Spec 4.1 起,这个位就被弃用了。
- 控制器在处理这个位时会 忽略它的值。
- 现在大多数 Host 都设置为
0x00
(即DISABLED
)。