蓝牙控制器层(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_NORMAL | 0x01 | 正常量产模式(默认) |
BT_BQB | 0x02 | 实验室 RF/BQB 认证测试 |
BT_FCC | 0x04 | RF FCC 认证测试 |
BT_FRE | 0x10 | 定频测试(频点 2402MHz,发射功率最大) |
BT_PER | 0x20 | 性能测试(仪器直连,需复位恢复) |
Source: btcontroller_mode.h
头文件注释特别强调:量产测试建议保持 BT_NORMAL,通过运行时 API bredr_set_dut_enble(u8 en, u8 phone) 动态进入 DUT 测试(phone 参数控制是否允许手机连接),测试完成后需要复位或重新上电才能恢复。这避免了测试模式固化在固件里带来的产线风险。
关键运行时配置项
| 符号 | 类型 | 默认值(spp_and_le) | 说明 |
|---|---|---|---|
CONFIG_TWS_RUN_SLOT | int | 200 | TWS 双耳运行槽位(新 BR/EDR 使能时) |
CONFIG_PHONE_RUN_SLOT | int | 120 | 手机链路运行槽位 |
CONFIG_TWS_LOW_LATENCY_RUN_SLOT | int | 16 | TWS 低延迟模式槽位 |
CONFIG_PHONE_LOW_LATENCY_RUN_SLOT | int | 150 | 手机低延迟模式槽位 |
CONFIG_LOW_LATENCY_ENABLE | int | 1 | 低延迟模式总开关 |
CONFIG_BTCTLER_TWS_ENABLE | int | 0 | TWS 功能开关 |
CONFIG_BTCTLER_FAST_CONNECT_ENABLE | int | 0 | 快速连接开关 |
CONFIG_A2DP_DATA_CACHE_LOW/HI | int | 120/160 | A2DP 数据缓存水位(低/高) |
CONFIG_A2DP_DATA_CACHE_LOW_AAC | int | 100/150 | AAC 编码缓存水位 |
CONFIG_A2DP_DATA_CACHE_LOW_SBC | int | 120/160 | SBC 编码缓存水位 |
CONFIG_A2DP_DELAY_TIME | int | 200 | A2DP 延迟时间(ms) |
CONFIG_PAGE_POWER | int | 4 | Page 发射功率档位 |
CONFIG_PAGE_SCAN_POWER | int | 7 | Page Scan 发射功率档位 |
CONFIG_INQUIRY_POWER | int | 7 | Inquiry 发射功率档位 |
CONFIG_INQUIRY_SCAN_POWER | int | 7 | Inquiry Scan 发射功率档位 |
CONFIG_LMP_NAME_REQ_ENABLE | int | 1 | LMP Name Request 使能 |
CONFIG_LMP_PASSKEY_ENABLE | int | 1 | LMP Passkey 使能 |
CONFIG_LMP_MASTER_ESCO_ENABLE | int | 1 | 主端 eSCO 使能 |
CONFIG_TEST_DUT_CODE | int | 1 | 编译 DUT 测试代码 |
CONFIG_TEST_FCC_CODE | int | 1 | 编译 FCC 测试代码 |
CONFIG_BREDR_INQUIRY | int | 0/1 | 经典蓝牙 Inquiry 支持(随 EDR_EMITTER_EN) |
config_force_bt_pwr_tab_using_normal_level | int | 0 | 固定使用正常发射功率等级表 |
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。
扩展点
- 配置符号扩展:新增
const int config_xxx符号并在lib_btctrler_config.c定义,即可为控制器库开放新的编译期开关——这是官方裁剪机制的标准用法。 - 测试盒信息扩展:通过
bt_testbox_ex_info_get_handle_register(info_type, handle)注册回调,TESTBOX_INFO_*枚举可扩充产测信息维度。 - BLE DUT 操作集:
extern const struct ble_dut_ops_t *__ble_dut_ops允许替换/扩展 DUT 测试实现,struct ble_dut_ops_t的init/ioctrl/exit三接口定义了完整的生命周期契约。 - HCI 传输层:
btctrler_task_init的transport参数注入 HCI 传输实现,支持串口/USB 等不同物理通道而不改动控制器内核。 - 平台端口:
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)指南。