杰理 SDK 文档中心
首页
首页
  • 概述

    • SDK 概览与产品定位
    • 支持芯片平台与蓝牙认证
    • SDK 架构与目录分层
  • 快速开始

    • 环境搭建与编译工具链
    • 编译构建系统
    • 板级工程与配置
    • 烧录与固件升级工具
  • 应用工程

    • 应用选择与工程总览
    • SPP + BLE 数传应用框架
    • 透传与 AT 指令示例
    • BLE 广播/中心与定位示例
    • 2.4G 私有协议与 Dongle 示例
    • 云平台接入示例
    • HID 人机交互应用框架
    • HID 示例工程(键盘/鼠标/遥控器/手柄)
    • Bluetooth Mesh 应用框架
    • Mesh 模型与 Mesh DFU 固件升级
    • Mesh 音频编解码演示
  • 芯片平台与硬件抽象

    • 芯片平台总览与差异
    • 音频编解码与时钟管理
    • 外设驱动接口(ADC/IIC/SPI/PWM/LED/充电)
    • 芯片配置工具与下载支持
  • 蓝牙协议栈

    • 蓝牙控制器层(btctrler)
    • 蓝牙协议栈与 Profile(btstack)
    • 蓝牙模块选择与配置
  • 媒体与音频框架

    • 音频流框架
    • 音频编解码与 A2DP 媒体
    • 音频效果处理(EQ/频谱/变调/环绕/超低音)
    • 本地 TWS 与音频同步
  • 系统服务与运行时

    • 实时操作系统与任务调度
    • 消息事件机制
    • 电源管理与低功耗
    • 存储与配置系统
    • 设备驱动框架(USB/RTC)
  • 应用公共组件

    • 音频应用组件
    • 设备外设抽象(按键/触摸/传感器/存储)
    • 蓝牙公共模块与消息联动
    • 调试与配置组件
    • 杰理关键词唤醒(jl_kws)
  • 第三方协议与云平台接入

    • 杰理 RCSP 私有协议
    • 低功耗蓝牙 Mesh 方案(llsync_mesh)
    • Sig Mesh 方案
    • 涂鸦协议接入
    • 腾讯连连接入
    • 华为 HiLink 接入
  • 固件升级与维护

    • OTA 升级机制
    • 升级补丁与版本维护
    • 升级工具链(BLE OTA / USB Dongle OTA)
  • 文档与开发资源

    • 数据手册与架构文档
    • 协议与云平台开发文档
    • 常见问题与技术支持

蓝牙控制器层(btctrler)

蓝牙控制器层(btctrler)是 fw-AC63_BT_SDK 中位于蓝牙协议栈底层的固件模块,负责经典蓝牙(BR/EDR)链路管理层(LMP)、低功耗蓝牙(BLE)链路层(LL)以及射频(RF)基带的实时控制,向上通过 HCI(Host Controller Interface)与蓝牙主机栈(如 btstack、le_common)交互。该层以预编译静态库(btctrler.a)形式随 SDK 发布,仅通过 include_lib/btctrler/ 下的头文件向应用层暴露接口。

Purpose and Scope

本页面完整介绍 btctrler 层的职责边界、任务模型、模块裁剪机制、模式选择、HCI 命令通路、低功耗挂起/恢复以及测试模式配置,涵盖:

  • include_lib/btctrler/btctrler_task.h —— 控制器任务与消息定义、任务生命周期 API;
  • include_lib/btctrler/btcontroller_modules.h —— 模块/功能开关与射频相关 API;
  • include_lib/btctrler/btcontroller_mode.h —— 测试模式(BQB/FCC/定频/性能)选择;
  • apps/*/config/lib_btctrler_config.c —— 各应用工程的控制器裁剪配置;
  • include_lib/btctrler/classic/ 与 include_lib/btctrler/ble/ —— BR/EDR 与 BLE 子模块头文件。

不在本页面范围:蓝牙主机协议栈(GAP/GATT/SMP/A2DP/AVRCP 等)属于 5.2 相关目录,请参见蓝牙主机层文档;TWS 的音频同步策略归 TWS 专题页面;各芯片平台(bd19/bd29/br23/br25/br30/br34)的底层寄存器与 RF 校准细节请参见对应平台文档。本页面聚焦控制器层自身的架构与对外契约。

概述

在经典的双芯片蓝牙架构中,控制器(Controller)与主机(Host)分离;本 SDK 将两者集成在同一颗 SoC 上,但依然保持了分层契约:应用/主机栈通过 HCI 命令驱动控制器,控制器通过 HCI 事件向上回报链路状态。btctrler 正是这一契约的“固件侧”实现:

  • BR/EDR 侧:实现 LMP(Link Manager Protocol)与基带调度,包括 inquiry/page 扫描、连接建立、SCO/eSCO 链路、AFH 跳频、功率控制、TWS 双耳同步等;
  • BLE 侧:实现 LL(Link Layer)状态机(adv/scan/init/connection)、连接参数更新、加密、DUT 测试等;
  • 射频层:负责 PLL 配置、发射功率档位管理、频偏校准、定频测试。

由于控制器对实时性要求极高(微秒级时隙调度),btctrler 以独立任务 + 消息队列方式运行,并大量使用编译期常量裁剪(LTO)以换取代码/内存优化,这解释了为什么配置全部以 const int 符号形式暴露给链接器。

flowchart TD
    subgraph sg_Host["主机层(Host)"]
        App["应用层 App"]
        BTStack["蓝牙主机协议栈<br/>btstack / le_common"]
    end

    subgraph sg_Ctrl["控制器层(btctrler)"]
        Task["btctrler 任务<br/>消息循环"]
        HCI["HCI 传输层<br/>hci_transport.h"]
        LMP["BR/EDR 控制器<br/>hci_lmp.h / lmp_config.h"]
        TWS["TWS 同步<br/>tws_api.h"]
        LL["BLE 控制器<br/>hci_ll.h / ll_config.h"]
        RF["射频/基带<br/>PLL · 功率 · 频偏"]
    end

    subgraph sg_HW["硬件"]
        Radio["2.4GHz 射频"]
    end

    App --> BTStack
    BTStack -->|"HCI 命令/事件"| Task
    Task --> HCI
    Task --> LMP
    Task --> LL
    LMP --> TWS
    LMP --> RF
    LL --> RF
    RF --> Radio

架构

btctrler 采用“单任务 + 消息分发 + 子模块编译期裁剪”的架构。所有控制器内部事件(LMP 事件、LL 事件)与外部请求(HCI 命令)统一汇入控制器任务的消息队列,由任务循环按消息类型分发到 BR/EDR 或 BLE 子模块处理。这种设计把高实时性代码收敛到一处串行执行,避免了多任务并发访问链路状态带来的竞态问题。

任务与消息模型

btctrler_task.h 定义了控制器任务的完整消息枚举,是理解整个层内部流转的入口:

enum {
    LMP_EVENT = Q_USER +  1,        // BR/EDR LMP 层事件
    LMP_HCI_CMD,                    // 发给 LMP 的 HCI 命令
    LMP_HCI_CMD_TO_CONN,            // 针对特定连接的 HCI 命令
    HCI_COMMON_CMD,                 // 通用 HCI 命令
    LL_EVENT,                       // BLE 链路层事件
    HCI_CMD_TO_LL,                  // 发给 BLE LL 的 HCI 命令
    TWS_LMP_EVENT,                  // TWS 同步的 LMP 事件
    MSG_BT_UPDATA_START,            // 蓝牙固件升级开始
    MSG_BT_UPDATE_LOADER_DOWNLOAD_START,
    MSG_BLE_TEST_UPDATA_START,
    MSG_BLE_TEST_OTA_LOADER_DOWNLOAD_START,
    MSG_TASK_READY,                 // 任务就绪通知
    MSG_TASK_DEL,                   // 任务删除通知
};

Source: btctrler_task.h

消息枚举基于 Q_USER(系统队列用户消息基址)扩展,说明控制器任务运行在系统 task.h 定义的队列机制之上。LMP_HCI_CMD 与 HCI_CMD_TO_LL 分别对应经典蓝牙与 BLE 两条 HCI 命令通路,而 LMP_HCI_CMD_TO_CONN 用于需要绑定连接句柄的命令(如 lmp_hci_cmd_to_conn_for_handle、lmp_hci_cmd_to_conn_for_addr)。

模块裁剪与 LTO 优化

控制器以静态库发布,为节省 Flash/RAM,SDK 通过“LTO 可达性分析”实现按需裁剪:应用只链接被引用的符号,btcontroller_modules.h 用位掩码声明两个核心模块:

#define BT_MODULE_CLASSIC                   BIT(0)   // 经典蓝牙 BR/EDR
#define BT_MODULE_LE                        BIT(1)   // 低功耗蓝牙 BLE

extern const int config_btctler_modules;
#define BT_MODULES_IS_SUPPORT(x)            (config_btctler_modules & (x))

Source: btcontroller_modules.h

config_btctler_modules 的实际值由各应用工程的 lib_btctrler_config.c 依据 TCFG_USER_BLE_ENABLE / TCFG_USER_EDR_ENABLE 自动推导(例如仅 BLE 时置为 BT_MODULE_LE)。类似的开关还有 config_btctler_mode(测试模式)、config_btctler_hci_standard(标准 HCI 与否)、config_bt_function(加密任务/主端 AFH/QoS 功能位)。

双模控制器的职责划分

  • include_lib/btctrler/classic/hci_lmp.h:BR/EDR 控制器对外 API(连接、扫描、查询、SCO、功率等),lmp_config.h 提供 LMP 参数配置;
  • include_lib/btctrler/ble/hci_ll.h:BLE 链路层 API(广播、扫描、连接、加密、DUT),ll_config.h 提供 LL 参数;
  • include_lib/btctrler/classic/tws_api.h / tws_data_trans.h / tws_event.h / tws_local_media_sync.h:TWS 双耳链路同步、数据透传与本地媒体同步;
  • include_lib/btctrler/hci_transport.h:HCI 传输层(命令/事件在 Host 与 Controller 间的搬运接口);
  • include_lib/btctrler/adapter/include/common/sys_timer.h:控制器定时器适配。

平台端口

include_lib/btctrler/port/ 下按芯片(bd19/bd29/br23 等)提供 btcontroller_config.h 与链接脚本(btctler_lib_text.ld / btctler_lib_data.ld / btctler_lib_bss.ld),用于把库的代码段、数据段、BSS 段映射到各芯片的 RAM/Flash 布局中——这是控制器层能够跨芯片复用的关键机制。

核心流程

控制器任务生命周期

控制器任务由 btctrler_task_init(transport, config) 创建,携带 HCI 传输层指针与控制器配置指针;就绪后通过 btctrler_task_ready() 查询状态。系统低功耗管理依赖挂起/恢复协议:

void btctrler_resume_req();          // 请求控制器恢复(如唤醒时)
void btctrler_resume();              // 真正恢复运行
int  btctrler_suspend(u8 suepend_rx_bulk);  // 挂起,参数控制是否挂起 RX bulk 传输
int  btctrler_task_ready();          // 查询任务是否就绪
int  btctrler_task_exit();           // 退出控制器任务
int  btctrler_task_close_bredr();    // 仅关闭经典蓝牙
void btctrler_task_init_bredr();     // 仅初始化经典蓝牙

Source: btctrler_task.h

btctrler_suspend 返回值为能否挂起(0 表示可挂起),应用在进入低功耗前必须先查询;btctrler_resume_req 与 btctrler_resume 分离的原因是控制器可能正处在一个不可打断的时隙(如 SCO 包)中,需要先“请求”再由控制器在安全点自行恢复。set_idle_period_slot(u16 slot) 用于调整空闲时隙周期,配合低功耗调度。

sequenceDiagram
    participant App as 应用层
    participant Task as btctrler 任务
    participant HCI as HCI 传输层
    participant LL as LL/LMP 子模块

    App->>Task: btctrler_task_init(transport, config)
    Task-->>App: MSG_TASK_READY 事件
    App->>Task: btctrler_hci_cmd_to_task(cmd, ...)
    Task->>HCI: 解析/校验 HCI 命令
    alt 经典蓝牙命令
        HCI->>LL: LMP_HCI_CMD / LMP_HCI_CMD_TO_CONN
    else BLE 命令
        HCI->>LL: HCI_CMD_TO_LL
    end
    LL-->>Task: LL_EVENT / LMP_EVENT
    Task-->>App: 事件上报(经 HCI 传输层)
    App->>Task: btctrler_suspend(...)
    Task-->>App: 返回可挂起标志
    App->>Task: btctrler_resume_req() / btctrler_resume()

HCI 命令下发通路

主机栈向控制器下发命令统一走 btctrler_hci_cmd_to_task(cmd, argc, ...),头文件提供两个宏封装,分别屏蔽了 BR/EDR 与 BLE 的消息类型差异:

#define lmp_hci_cmd_to_task(argc, ...)      btctrler_hci_cmd_to_task(LMP_HCI_CMD, argc, ## __VA_ARGS__)
#define ll_hci_cmd_to_task(argc, ...)       btctrler_hci_cmd_to_task(HCI_CMD_TO_LL, argc, ## __VA_ARGS__)

Source: btctrler_task.h

针对“命令需要绑定某条连接”的场景,还提供按连接句柄(lmp_hci_cmd_to_conn_for_handle(u16 handle, ...))与按对端地址(lmp_hci_cmd_to_conn_for_addr(u8 *addr, ...))两种寻址方式;bredr_link_event(void *link, ...) 与 bredr_tws_link_event(void *link, ...) 则分别用于向 BR/EDR 连接与 TWS 连接投递链路事件。命令均以变参形式投递到任务队列,由任务串行执行,保证同一连接的 HCI 命令不会并发交错。

事件上报方向

控制器产生的异步事件(连接建立、断开、查询结果、加密完成等)以 LMP_EVENT / LL_EVENT / TWS_LMP_EVENT 消息进入任务循环,经 HCI 传输层回传给主机栈。SYS_EVENT_FROM_CTRLER('CTR\0' 拼成的 32 位魔数)用于标识事件来源,应用可通过该魔数区分事件是否来自控制器层。

配置体系

控制器行为几乎全部由 lib_btctrler_config.c 中的 const int 符号决定。这些符号在链接期被控制器库引用,因此修改配置只需改 C 文件并重编译应用工程,无需重新编译控制器库——这是本 SDK 的一个重要扩展点。

模块与模式配置

以 apps/spp_and_le/config/lib_btctrler_config.c 为例:

#if (TCFG_USER_BLE_ENABLE)
#if (TCFG_USER_EDR_ENABLE)
const int config_btctler_modules        = BT_MODULE_CLASSIC | BT_MODULE_LE;
#else
const int config_btctler_modules        = BT_MODULE_LE;
#endif
#else
#if (TCFG_USER_EDR_ENABLE)
const int config_btctler_modules        = BT_MODULE_CLASSIC;
#else
const int config_btctler_modules        = 0;
#endif
#endif

const int config_btctler_mode        = CONFIG_BT_MODE;

#if (CONFIG_BT_MODE != BT_NORMAL)
const int config_btctler_hci_standard   = 1;   // 测试模式下使用标准 HCI
#else
const int config_btctler_hci_standard   = 0;
#endif

Source: lib_btctrler_config.c

设计意图:config_btctler_modules 由应用使能宏自动推导,避免手工维护;config_btctler_hci_standard 在测试模式(BQB/FCC 等)下自动切换为标准 HCI 行为,保证测试仪器能按规范与设备交互。

测试模式选择

btcontroller_mode.h 定义了五种模式,通过 CONFIG_BT_MODE 编译期选择:

宏值用途
BT_NORMAL0x01正常量产模式(默认)
BT_BQB0x02实验室 RF/BQB 认证测试
BT_FCC0x04RF FCC 认证测试
BT_FRE0x10定频测试(频点 2402MHz,发射功率最大)
BT_PER0x20性能测试(仪器直连,需复位恢复)

Source: btcontroller_mode.h

头文件注释特别强调:量产测试建议保持 BT_NORMAL,通过运行时 API bredr_set_dut_enble(u8 en, u8 phone) 动态进入 DUT 测试(phone 参数控制是否允许手机连接),测试完成后需要复位或重新上电才能恢复。这避免了测试模式固化在固件里带来的产线风险。

关键运行时配置项

符号类型默认值(spp_and_le)说明
CONFIG_TWS_RUN_SLOTint200TWS 双耳运行槽位(新 BR/EDR 使能时)
CONFIG_PHONE_RUN_SLOTint120手机链路运行槽位
CONFIG_TWS_LOW_LATENCY_RUN_SLOTint16TWS 低延迟模式槽位
CONFIG_PHONE_LOW_LATENCY_RUN_SLOTint150手机低延迟模式槽位
CONFIG_LOW_LATENCY_ENABLEint1低延迟模式总开关
CONFIG_BTCTLER_TWS_ENABLEint0TWS 功能开关
CONFIG_BTCTLER_FAST_CONNECT_ENABLEint0快速连接开关
CONFIG_A2DP_DATA_CACHE_LOW/HIint120/160A2DP 数据缓存水位(低/高)
CONFIG_A2DP_DATA_CACHE_LOW_AACint100/150AAC 编码缓存水位
CONFIG_A2DP_DATA_CACHE_LOW_SBCint120/160SBC 编码缓存水位
CONFIG_A2DP_DELAY_TIMEint200A2DP 延迟时间(ms)
CONFIG_PAGE_POWERint4Page 发射功率档位
CONFIG_PAGE_SCAN_POWERint7Page Scan 发射功率档位
CONFIG_INQUIRY_POWERint7Inquiry 发射功率档位
CONFIG_INQUIRY_SCAN_POWERint7Inquiry Scan 发射功率档位
CONFIG_LMP_NAME_REQ_ENABLEint1LMP Name Request 使能
CONFIG_LMP_PASSKEY_ENABLEint1LMP Passkey 使能
CONFIG_LMP_MASTER_ESCO_ENABLEint1主端 eSCO 使能
CONFIG_TEST_DUT_CODEint1编译 DUT 测试代码
CONFIG_TEST_FCC_CODEint1编译 FCC 测试代码
CONFIG_BREDR_INQUIRYint0/1经典蓝牙 Inquiry 支持(随 EDR_EMITTER_EN)
config_force_bt_pwr_tab_using_normal_levelint0固定使用正常发射功率等级表

Source: lib_btctrler_config.c

其中 A2DP 缓存水位与延迟时间的组合是“消抖抗卡顿”的关键:控制器用缓存水位决定何时向音频链路填充/暂停数据,低水位(LOW)触发补数据、高水位(HI)触发暂停,SBC 与 AAC 因编码延迟不同而各自独立配置,这正是不同编码格式音质表现差异的来源之一。

使用示例

1. 配置控制器模块(工程侧)

各应用的 lib_btctrler_config.c 是控制器层唯一需要应用工程维护的配置源。下面展示一个同时使能 BLE 与经典蓝牙、且启用低延迟与 TWS 槽位的典型配置骨架:

#include "app_config.h"
#include "system/includes.h"
#include "btcontroller_config.h"
#include "bt_common.h"
#include "le_common.h"

#if (TCFG_USER_BLE_ENABLE)
#if (TCFG_USER_EDR_ENABLE)
const int config_btctler_modules        = BT_MODULE_CLASSIC | BT_MODULE_LE;
#else
const int config_btctler_modules        = BT_MODULE_LE;
#endif
#endif

const int CONFIG_LOW_LATENCY_ENABLE     = 1;
const int CONFIG_A2DP_DATA_CACHE_LOW    = 120;
const int CONFIG_A2DP_DATA_CACHE_HI     = 160;

Source: lib_btctrler_config.c

2. 运行时动态配置蓝牙版本与功率

应用在收到 BT_STATUS_INIT_OK 状态通知后,可以调用 set_bt_version() 更改蓝牙核心规范版本号(4.2/5.0/5.1/5.2),或调用 bt_max_pwr_set() 设定发射功率上限:

#define BLUETOOTH_CORE_SPEC_42  0x08
#define BLUETOOTH_CORE_SPEC_50  0x09
#define BLUETOOTH_CORE_SPEC_51  0x0a
#define BLUETOOTH_CORE_SPEC_52  0x0b
extern void set_bt_version(u8 version);

void bt_max_pwr_set(u8 pwr, u8 pg_pwr, u8 iq_pwr, u8 ble_pwr);

Source: btcontroller_modules.h 与 btcontroller_modules.h

设计意图:set_bt_version 允许产品在不更换固件的情况下兼容不同手机/仪器的版本协商;bt_max_pwr_set 把 EDR Page/Inquiry/BLE 四种场景的功率上限分开配置,兼顾认证(限功率)与连接距离(提功率)。注意各芯片平台功率档位不同(如 BR23 为 0~9 档、BR30 为 0~8 档),超范围默认取最高档。

3. 射频频偏校准接口

生产校准常需读写频偏,控制器提供持久化与临时两种更新接口:

void bt_osc_offset_ext_save(s32 offset);     // 更新并保存频偏(掉电保持)
void bt_osc_offset_ext_updata(s32 offset);   // 仅更新当前频偏
void bt_set_rxtx_status_enable(u8 en);       // 使能 RF TX/RX 状态指示引脚

Source: btcontroller_modules.h

4. DUT 测试与自定义信息上报

产测场景下可通过 bt_testbox_ex_info_get_handle_register() 注册自定义信息回调(电压、电量、烧录码、SDK 版本等),供测试盒读取:

enum {
    TESTBOX_INFO_VBAT_VALUE = 0,   // (u16 (*handle)(void))
    TESTBOX_INFO_VBAT_PERCENT,     // (u8 (*handle)(void))
    TESTBOX_INFO_BURN_CODE,        // (u8 *(*handle)(u8 *len))
    TESTBOX_INFO_SDK_VERSION,      // (u8 *(*handle)(u8 *len))
};
void bt_testbox_ex_info_get_handle_register(u8 info_type, void *handle);

Source: btctrler_task.h

API 参考

任务生命周期

int btctrler_task_init(const void *transport, const void *config) 创建并启动控制器任务。

  • 参数:transport —— HCI 传输层实例;config —— 控制器配置结构。
  • 返回:0 成功,非 0 失败。

int btctrler_suspend(u8 suepend_rx_bulk) 请求控制器挂起。

  • 参数:suepend_rx_bulk —— 非 0 时同时挂起 RX bulk 传输。
  • 返回:0 表示允许挂起;非 0 表示当前不可挂起(如正处于关键时隙)。

void btctrler_resume_req() / void btctrler_resume()resume_req 提出恢复请求,resume 执行恢复;二者分离以便控制器选择安全恢复点。

int btctrler_task_ready() 查询控制器任务是否就绪(初始化完成),供应用在启动流程中轮询。

消息投递

int btctrler_hci_cmd_to_task(int cmd, int argc, ...) 向控制器任务投递 HCI 命令消息,cmd 取消息枚举(LMP_HCI_CMD / HCI_CMD_TO_LL 等)。

int lmp_hci_cmd_to_conn_for_handle(u16 handle, int argc, ...) 按连接句柄向指定 BR/EDR 连接投递命令。

int lmp_hci_cmd_to_conn_for_addr(u8 *addr, int argc, ...) 按对端 BD_ADDR 向指定连接投递命令,适合尚无句柄的寻呼阶段。

int bredr_link_event(void *link, int argc, ...) / int bredr_tws_link_event(void *link, int argc, ...) 向普通/TWS BR/EDR 连接投递链路事件。

射频与产测

void bt_max_pwr_set(u8 pwr, u8 pg_pwr, u8 iq_pwr, u8 ble_pwr) 设置 EDR 连接、Page、Inquiry、BLE 四类发射功率上限,档位范围依芯片而定(见头文件注释中的各平台功率表)。

void bt_osc_offset_ext_save(s32 offset) / void bt_osc_offset_ext_updata(s32 offset) 保存/更新晶振频偏,前者写非易失存储。

void ble_set_fix_pwr(u8 fix) / void bredr_set_fix_pwr(u8 fix) 动态固定 BLE/EDR 发射功率(0~max),用于产测或特殊场景。

void bt_production_test(u8 en) / void bt_fix_fre_api() / void ble_fix_fre_api() 产测入口:使能产测模式;经典/BLE 定频测试(频点 2402MHz、最大功率,调用后需复位恢复)。

struct ble_dut_ops_t(init / ioctrl / exit) BLE DUT 测试模块操作集:ioctrl 支持 BLE_DUT_SET_RX_MODE、BLE_DUT_SET_TX_MODE、BLE_DUT_SET_TEST_END 三类控制(参数为 struct ble_dut_rx_param_t / struct ble_dut_tx_param_t 或包计数指针),返回收发统计供产测比对。

Source: btctrler_task.h

故障模式、边界情况与并发

挂起/恢复竞态

btctrler_suspend 返回非 0 表示控制器正占用关键资源(例如处于 SCO/eSCO 时隙、TWS 同步窗口或 OTA 下载中),此时应用必须放弃进入低功耗并重试,否则将导致蓝牙链路断连或 RF 时钟异常。resume_req / resume 分离正是为了避免在控制器不可打断点强行恢复。头文件注释还提示:不开启 ble_disable_wait_enable 会在升级调用 ll_destory 时出现 BT 访问 MMU 异常——即 BLE 关闭流程必须等待控制器完成内部清理,这是一个容易踩中的边界条件。

Source: lib_btctrler_config.c

测试模式的不可逆性

BT_FRE/BT_PER/bt_fix_fre_api() 等定频/性能模式在配置后不可恢复,只能复位或重新上电。设计上刻意如此:避免产测残留状态污染正常使用。量产固件应使用 BT_NORMAL + 运行时 bredr_set_dut_enble(),并配合 tws_cancle_all_noconn() 与 USER_CTRL_WRITE_SCAN_ENABLE/USER_CTRL_WRITE_CONN_ENABLE 关闭快速连接与可发现/可连接,防止被测样机被手机抢连。

Source: btcontroller_mode.h

消息串行化与并发

所有 HCI 命令、链路事件统一经任务队列串行执行,因此同一连接上的命令天然有序,无需应用加锁;但这也意味着控制器任务成为热点:长时间阻塞的任务回调(如重负载的产测 I/O)会延迟链路事件处理,可能造成丢包或超时。高实时性路径(LMP/LL 时隙调度)位于库内中断/时隙上下文,与应用上下文完全隔离。

功率与温度

config_bt_temperature_pll_trim 存在意味着控制器支持温度相关的 PLL 微调;bt_set_ldos(u8 mode) 用于切换射频 LDO 模式。在高温或低电压(TESTBOX_INFO_VBAT_VALUE 上报场景)下功率档位可能被压低,产测时应按平台功率表核对实际输出(如 BR23 档位 0~9 对应 -15.7 ~ +6.4 dBm)。

性能与运行注意事项

  • 时隙预算:CONFIG_TWS_RUN_SLOT / CONFIG_PHONE_RUN_SLOT 等常量直接决定 TWS 双耳与手机链路的时隙分配。低延迟模式(CONFIG_LOW_LATENCY_ENABLE=1)下 TWS 槽位可缩至 16,换取更低音频延迟,但会压缩其他链路的可用时隙,双连接场景需实测权衡。
  • A2DP 缓存水位:CONFIG_A2DP_DATA_CACHE_LOW/HI 及 SBC/AAC 独立水位决定音频数据预取节奏,水位过低易断续、过高增延迟;CONFIG_A2DP_DELAY_TIME 控制补偿延迟。
  • LTO 裁剪:config_btctler_modules/config_stack_modules/config_btctler_mode 等符号被链接器可达性分析引用,未使用的控制器代码不会链接进固件。裁剪粒度是模块级(CLASSIC/LE)与功能级(config_bt_function 的加密任务、主端 AFH、主端 QoS),不能精确到单个 API。
  • 升级时序:MSG_BT_UPDATA_START、MSG_BLE_TEST_UPDATA_START 等升级类消息由控制器任务处理,升级期间应避免挂起/恢复竞争,且需保证 ble_disable_wait_enable 语义成立后再销毁 LL。

扩展点

  1. 配置符号扩展:新增 const int config_xxx 符号并在 lib_btctrler_config.c 定义,即可为控制器库开放新的编译期开关——这是官方裁剪机制的标准用法。
  2. 测试盒信息扩展:通过 bt_testbox_ex_info_get_handle_register(info_type, handle) 注册回调,TESTBOX_INFO_* 枚举可扩充产测信息维度。
  3. BLE DUT 操作集:extern const struct ble_dut_ops_t *__ble_dut_ops 允许替换/扩展 DUT 测试实现,struct ble_dut_ops_t 的 init/ioctrl/exit 三接口定义了完整的生命周期契约。
  4. HCI 传输层:btctrler_task_init 的 transport 参数注入 HCI 传输实现,支持串口/USB 等不同物理通道而不改动控制器内核。
  5. 平台端口:port/<chip>/btcontroller_config.h 与三段式链接脚本(text/data/bss)是移植到新芯片的入口。

测试

控制器层以静态库发布,仓库内不含其单元测试源码;但 CONFIG_TEST_DUT_CODE、CONFIG_TEST_FCC_CODE、CONFIG_TEST_DUT_ONLY_BOX_CODE、CONFIG_BREDR_INQUIRY 等编译开关表明库内置了 DUT/FCC 测试代码路径,可通过 BT_BQB/BT_FCC 模式配合蓝牙测试仪(如 R&S、Anritsu)验证。产线功能验证依赖 bredr_set_dut_enble() 与 bt_fix_fre_api()/ble_fix_fre_api() 的运行时入口。patch_release/ 目录中的 btctrler.a 补丁版本(如 AC630N 各 SDK release)说明控制器库存在独立于应用 SDK 的修复节奏,升级时应核对芯片(br23 等)与补丁对应关系。

Related Links

  • 蓝牙控制器任务头文件
  • 控制器模块/功能宏与射频 API
  • 控制器测试模式定义
  • SPP&LE 工程控制器配置
  • HID 工程控制器配置
  • Mesh 工程控制器配置
  • 经典蓝牙 HCI/LMP 接口
  • BLE HCI/LL 接口
  • HCI 传输层接口
  • TWS 同步 API
  • BR23 平台控制器配置

相关主题页面:蓝牙主机协议栈、TWS 双耳同步、低功耗管理、产测(DUT/FCC)指南。

Next
蓝牙协议栈与 Profile(btstack)