经典蓝牙 BR/EDR 支持
经典蓝牙(BR/EDR,Basic Rate / Enhanced Data Rate)是 AW33N 蓝牙 SDK 中与 BLE 并列的双模蓝牙能力之一,本页说明 SDK 中 BR/EDR 的使能方式、控制器配置、Profile 支持开关及其与 BLE 的共存关系。
Purpose and Scope
本页聚焦 fw-AW33N_BLE_SDK 中经典蓝牙 BR/EDR 的支持面:包括控制器层配置(lib_btctrler_config.c 的 "Bluetooth Classic setting" 段)、协议栈/Profile 层的功能开关(lib_profile_config.c)、编译宏 CONFIG_NEW_BREDR_ENABLE 的作用,以及 demo 工程中的相关符号(如 IRQ_BREDR_IP)。
以下内容不属于本页范围,留待对应页面:
- BLE 链路层的详细配置(如 PHY、扩展广播、连接参数),见 BLE 相关目录页;
- 具体 Profile(A2DP/AVRCP/HFP/SPP)的应用层实现与事件处理;
- 射频 RF/天线设计与 FCC/DUT 测试流程本身(本页仅说明相关配置项)。
说明:本 SDK 以 BLE 为主(仓库名为 BLE_SDK),BR/EDR 在 demo 中默认大多关闭。凡源码中未提供实现细节的部分,本页会明确标注"实现细节未在源码中找到",不做推测。
Overview
BR/EDR(经典蓝牙)是蓝牙 2.0/2.1 + EDR 时代的基带/链路技术,与 LE 共享同一射频前端,但使用不同的跳频(AFH)、链路层(LMP 协议)、语音/音频承载(SCO/eSCO)与发现机制(Inquiry/Page)。在 AW33N 上,BR/EDR 的能力通过配置文件中的常量开关逐项开放,而不是由应用代码直接调用底层 API:
- 控制器层:
lib_btctrler_config.c集中定义 BR/EDR 的 Inquiry、eSCO、LMP 行为、AFH、FCC/DUT 测试、link key 管理等开关; - 协议栈/Profile 层:
lib_profile_config.c定义 classic 相关 Profile 扩展支持(A2DP 双向、多地址重连、扩展 HFP/AVCTP 命令、PBG 等); - 编译宏:
CONFIG_NEW_BREDR_ENABLE决定是否启用"新 BR/EDR"代码路径,并联动 TWS 时隙配置; - 中断资源:demo 中保留
IRQ_BREDR_IP符号(当前标注//no use,值为 3),为 BR/EDR 中断预留优先级位。
这套设计意图是:用编译期/配置期常量裁剪固件体积与运行资源,让同一套 SDK 既能编译出纯 BLE 产品,也能编译出双模(BR/EDR + BLE)产品,而无需改动协议栈本体。
Architecture
BR/EDR 支持在 SDK 中的位置与数据流向如下图所示:
flowchart TD
subgraph sg_App["应用层 (apps/demo)"]
AppHID["hid demo"]
AppTransfer["transfer demo"]
end
subgraph sg_Cfg["配置层 (config)"]
CfgCtrl["lib_btctrler_config.c<br/>(Bluetooth Classic setting)"]
CfgProf["lib_profile_config.c<br/>(Classic Profile 开关)"]
CfgMacro["CONFIG_NEW_BREDR_ENABLE<br/>(编译宏)"]
end
subgraph sg_Stack["BR/EDR 协议栈"]
LMP["LMP<br/>(Name Req / Passkey / Master eSCO)"]
ESCO["eSCO 链路"]
AFH["AFH 跳频"]
INQ["Inquiry / Page 扫描"]
end
subgraph sg_HW["控制器硬件"]
HW["BR/EDR 射频控制器"]
end
AppHID --> CfgCtrl
AppTransfer --> CfgCtrl
AppTransfer --> CfgProf
CfgMacro --> CfgCtrl
CfgCtrl --> LMP
CfgCtrl --> ESCO
CfgCtrl --> AFH
CfgCtrl --> INQ
LMP --> HW
ESCO --> HW
AFH --> HW
INQ --> HW
架构解读:
- 配置层是唯一入口:demo 应用(
apps/demo/hid、apps/demo/transfer)各自携带一份config/lib_btctrler_config.c与config/lib_profile_config.c,BR/EDR 行为完全由这两份文件中的const int开关决定; - 控制器与协议栈耦合:控制器配置项直接映射到 LMP/eSCO/AFH/Inquiry 等链路层行为;这些模块的完整实现位于预编译库中(本仓库源码未包含),因此本页以配置语义为文档主体;
- 编译宏先行:
CONFIG_NEW_BREDR_ENABLE在编译期决定CONFIG_TWS_RUN_SLOT等 TWS 相关配置是否生效,属于"启用新 BR/EDR 特性集"的总开关。
主要源码入口
| 文件 | 角色 |
|---|---|
apps/demo/transfer/config/lib_btctrler_config.c | 控制器层 BR/EDR + BLE 配置(含 "Bluetooth Classic setting" 段) |
apps/demo/hid/config/lib_btctrler_config.c | hid demo 的控制器配置(与 transfer 同构,含 CONFIG_NEW_BREDR_ENABLE 分支) |
apps/demo/transfer/config/lib_profile_config.c | 协议栈/Profile 层 classic 功能支持开关 |
apps/demo/transfer/app_main.c / apps/demo/hid/app_main.c | demo 主文件,定义 IRQ_BREDR_IP 等中断优先级符号 |
控制器层:Bluetooth Classic setting 详解
控制器配置位于每个 demo 工程的 config/lib_btctrler_config.c。文件第 77 行起即为经典蓝牙配置段,全部为 const int / const u8 编译期常量:
/*-----------------------------------------------------------*/
/**
* @brief Bluetooth Classic setting
*/
const u8 rx_fre_offset_adjust_enable = 1;
const int config_bredr_fcc_fix_fre = 0;
const int ble_disable_wait_enable = 1; //不开启wait_enable会导致升级调用ll_destory的时候出现BT访问mmu异常
const int config_btctler_eir_version_info_len = 0;
const int CONFIG_TEST_DUT_CODE = 1;
const int CONFIG_TEST_FCC_CODE = 1;
const int CONFIG_TEST_DUT_ONLY_BOX_CODE = 0;
const int CONFIG_BREDR_INQUIRY = 0;
const int CONFIG_INQUIRY_PAGE_OFFSET_ADJUST = 0;
const int CONFIG_ESCO_MUX_RX_BULK_ENABLE = 0;
const int CONFIG_LMP_NAME_REQ_ENABLE = 1;
const int CONFIG_LMP_PASSKEY_ENABLE = 1;
const int CONFIG_LMP_MASTER_ESCO_ENABLE = 1;
const int CONFIG_WIFI_DETECT_ENABLE = 0;
const int ESCO_FORWARD_ENABLE = 0;
const int config_bt_function = 0;
///bredr 强制 做 maseter
const int config_btctler_bredr_master = 0;
const int config_btctler_dual_a2dp = 0;
///afh maseter 使用app设置的map 通过USER_CTRL_AFH_CHANNEL 设置
const int config_bredr_afh_user = 0;
//bt PLL 温度跟随trim
const int config_bt_temperature_pll_trim = 0;
/*security check*/
const int config_bt_security_vulnerability = 0;
//DUT使用哪种模式通信: 0: HCI 1:2_wire
const int config_dut_protocol_mode = 0;
//配置是否连接失败返回PIN or Link Key Missing时删除linkKey
const int config_delete_link_key = 1;
/*-----------------------------------------------------------*/
Source: lib_btctrler_config.c
关键开关的语义与设计意图
发现与连接(Inquiry / Page)
CONFIG_BREDR_INQUIRY = 0:BR/EDR 的 Inquiry(设备发现)功能总开关。默认关闭意味着设备默认不可被经典蓝牙搜索到,仅可被 Page 连接或主动连接他机——这是低功耗/低成本产品(如仅做从机回连的耳机)的典型裁剪;CONFIG_INQUIRY_PAGE_OFFSET_ADJUST = 0:Inquiry/Page 时序偏移微调,用于与 BLE 共存时错开射频时隙,0 表示不调整;- 扫描功率由文件前段(第 70–72 行)定义:
CONFIG_PAGE_SCAN_POWER = 7、CONFIG_INQUIRY_POWER = 7、CONFIG_INQUIRY_SCAN_POWER = 7,均取最大功率等级 7,保证发现/连接灵敏度优先。
链路与语音(LMP / eSCO)
CONFIG_LMP_NAME_REQ_ENABLE = 1:允许 LMP 层处理 Name Request,使对端可读取本机设备名;CONFIG_LMP_PASSKEY_ENABLE = 1:使能 Passkey(数字 PIN 输入)配对流程;CONFIG_LMP_MASTER_ESCO_ENABLE = 1:允许本机作为 Master 发起 eSCO 链路(语音/音频承载);CONFIG_ESCO_MUX_RX_BULK_ENABLE = 0、ESCO_FORWARD_ENABLE = 0:eSCO 的批量接收复用与转发能力默认关闭(与 TWS 音频转发相关,见下);rx_fre_offset_adjust_enable = 1:使能 RX 频率偏移自适应调整,补偿晶振/温漂。
TWS 与双 A2DP
config_btctler_dual_a2dp = 0:双 A2DP(同时连接两台音源并从中继)默认关闭;config_btctler_bredr_master = 0:BR/EDR 是否强制做 Master,默认跟随角色协商;- 文件开头(第 27–29 行)还有一处条件编译:当定义了
CONFIG_NEW_BREDR_ENABLE时,CONFIG_TWS_RUN_SLOT = 200生效——这是新 BR/EDR 路径下 TWS 两耳射频时隙的分配参数:
#ifdef CONFIG_NEW_BREDR_ENABLE
const int CONFIG_TWS_RUN_SLOT = 200;
Source: lib_btctrler_config.c
测试与认证(DUT / FCC)
CONFIG_TEST_DUT_CODE = 1、CONFIG_TEST_FCC_CODE = 1:编译进 DUT(蓝牙测试仪)与 FCC 测试代码;CONFIG_TEST_DUT_ONLY_BOX_CODE = 0:仅产测盒模式默认关闭;config_dut_protocol_mode = 0:DUT 通信模式 0=HCI、1=2-wire;config_bredr_fcc_fix_fre = 0:FCC 测试固定频点,0 表示使用默认跳频。
安全与健壮性
config_delete_link_key = 1:当连接失败且错误为 PIN or Link Key Missing 时删除本地 link key,避免陈旧密钥导致后续重连死锁——这是经典蓝牙最典型的重连故障恢复手段;config_bt_security_vulnerability = 0:安全漏洞(如已知的经典蓝牙安全缺陷)缓解措施默认关闭;config_bt_temperature_pll_trim = 0:BT PLL 温度跟随 trim 默认关闭。
中断资源
demo 主文件(apps/demo/transfer/app_main.c 与 apps/demo/hid/app_main.c)第 62 行保留经典蓝牙中断优先级符号:
const int IRQ_BREDR_IP = 3; //no use
Source: app_main.c
注释 //no use 表明在当前 demo 默认配置(BR/EDR 未启用)下该中断优先级不参与使用;当产品使能经典蓝牙时,此符号为 IRQ 分配预留(值为 3)。相邻的 IRQ_BTSTACK_MSG_IP = 4(BT STACK 消息)与 IRQ_BT_RXMCH_IP = 3 也印证了 BT 栈的中断布局。
Profile 层:经典蓝牙功能支持开关
apps/demo/transfer/config/lib_profile_config.c 集中定义经典蓝牙协议栈扩展能力,全部为 const u8 开关,默认 0(关闭):
const u8 hci_inquiry_support = 0;
const u8 btstack_emitter_support = 0;
const u8 a2dp_mutual_support = 0;
const u8 more_addr_reconnect_support = 0;
const u8 more_hfp_cmd_support = 0;
const u8 more_avctp_cmd_support = 0;
const u8 adt_profile_support = 0;
const u8 pbg_support_enable = 0;
Source: lib_profile_config.c
各开关含义(依据命名与上下文,具体实现位于预编译库中):
| 开关 | 默认 | 作用 |
|---|---|---|
hci_inquiry_support | 0 | HCI 层 Inquiry 支持;开启后应用可驱动经典蓝牙设备发现 |
btstack_emitter_support | 0 | BT Stack "发射器"模式(如遥控/广播类外设) |
a2dp_mutual_support | 0 | A2DP 双向:本机既做 Sink 也做 Source(互连/中转) |
more_addr_reconnect_support | 0 | 多地址重连(记录并回连多个历史设备) |
more_hfp_cmd_support | 0 | 扩展 HFP 命令(AT 命令集扩展) |
more_avctp_cmd_support | 0 | 扩展 AVCTP 命令(AVRCP 控制命令扩展) |
adt_profile_support | 0 | ADT Profile 支持 |
pbg_support_enable | 0 | PBG(Phone Book Group?)/电话本相关能力 |
设计意图:这些开关把代码体积与运行 RAM 的占用与产品功能面绑定——例如仅做 BLE 数传的 transfer demo 全部置 0;而做经典蓝牙音箱/耳机产品时,工程需将对应项置 1 并重新编译。由于这些常量以 u8 导出且无 #ifdef 包裹,它们属于链接期符号裁剪:协议栈库中未引用的功能在链接时被丢弃,从而节省 flash。
核心流程:BR/EDR 功能从配置到生效
BR/EDR 在本 SDK 中不经过"运行时初始化调用链",而是编译期配置 → 链接期裁剪 → 协议栈行为的静态流水线。整个使能路径如下:
flowchart TD
Start([产品定义]) --> Chk{"CONFIG_NEW_BREDR_ENABLE 是否定义"}
Chk -->|"是 (新 BR/EDR 路径)"| TWS["CONFIG_TWS_RUN_SLOT = 200<br/>TWS 时隙配置生效"]
Chk -->|"否 (默认路径)"| Default["使用默认 BR/EDR 行为"]
TWS --> Cfg["lib_btctrler_config.c<br/>Bluetooth Classic setting"]
Default --> Cfg
Cfg --> Inq{"CONFIG_BREDR_INQUIRY"}
Inq -->|"1"| Scan["使能 Inquiry 扫描<br/>CONFIG_INQUIRY_SCAN_POWER 生效"]
Inq -->|"0"| NoScan["仅 Page 直连/回连<br/>不可被发现"]
Cfg --> LMP["LMP 开关组<br/>Name Req / Passkey / Master eSCO"]
LMP --> AFH{"config_bredr_afh_user"}
AFH -->|"1"| AFHMap["应用通过 USER_CTRL_AFH_CHANNEL<br/>下发 AFH Map"]
AFH -->|"0"| AFHAuto["控制器自动 AFH 跳频"]
Cfg --> Prof["lib_profile_config.c<br/>Profile 支持开关"]
Prof --> A2DP{"a2dp_mutual_support"}
A2DP -->|"1"| A2DPOn["A2DP 双向 (Sink + Source)"]
A2DP -->|"0"| A2DPOff["A2DP 单向 (默认 Sink)"]
Scan --> Link["连接/配对流程<br/>(LMP Passkey / link key 管理)"]
NoScan --> Link
A2DPOn --> Link
A2DPOff --> Link
Link --> Fail{"连接失败且错误为<br/>PIN or Link Key Missing?"}
Fail -->|"是"| DelKey["config_delete_link_key = 1<br/>删除陈旧 link key 后重试"]
Fail -->|"否"| Normal["正常重连/重试策略"]
流程要点:
- 总开关先行:
CONFIG_NEW_BREDR_ENABLE在编译期选择 BR/EDR 代码路径,并连带启用 TWS 时隙参数(CONFIG_TWS_RUN_SLOT = 200)。该宏在lib_btctrler_config.c的#ifdef分支中出现,说明它影响的是控制器调度层配置; - 控制器开关组决定链路行为:Inquiry 开关决定设备是否可见;LMP 开关组决定配对(Passkey)、设备名请求、Master eSCO 是否可用;AFH 用户开关决定跳频表由控制器自动生成还是由应用经
USER_CTRL_AFH_CHANNEL控制; - Profile 开关决定能力面:
a2dp_mutual_support等决定音频/控制方向;这些开关与控制器开关叠加后,协议栈库在链接期只保留被引用的符号; - 重连故障自愈:
config_delete_link_key = 1是一条专门的恢复路径——经典蓝牙最常见的重连失败原因是本机/对端 link key 不一致,此配置在收到 PIN or Link Key Missing 错误时删除本地密钥,为重新配对让路。
使能 BR/EDR 的典型操作顺序
基于以上源码证据,在一个产品工程中开放经典蓝牙能力的推荐顺序为:
- 在编译选项中定义
CONFIG_NEW_BREDR_ENABLE(若需要新 BR/EDR 路径及 TWS 时隙); - 将
lib_btctrler_config.c中需要的开关置 1:如需要被发现则CONFIG_BREDR_INQUIRY = 1;需要语音则保持CONFIG_LMP_MASTER_ESCO_ENABLE = 1等; - 按产品功能在
lib_profile_config.c中打开对应 Profile 扩展(如a2dp_mutual_support、more_hfp_cmd_support); - 保持
config_delete_link_key = 1与rx_fre_offset_adjust_enable = 1等健壮性配置; - 在
app_main.c中为IRQ_BREDR_IP分配实际优先级(当前默认//no use,值为 3),并确认与IRQ_BTSTACK_MSG_IP、IRQ_BT_RXMCH_IP不冲突; - 重新编译,链接期自动裁剪未使用的 Profile 符号。
注意:以上步骤为配置层面的使能路径;BR/EDR 协议栈内部实现(LMP 状态机、eSCO 调度等)位于预编译库中,源码未提供,具体时序行为需以厂商文档或实际硬件验证为准。
使用示例
以下示例全部取自仓库实际源码,展示如何针对不同产品形态调整 BR/EDR 配置。
示例 1:纯 BLE 数传产品(默认配置,BR/EDR 关闭)
transfer demo 即此类形态:BR/EDR 开关全部为 0,仅保留 BLE 链路。此时经典蓝牙 Profile 支持开关亦全部为 0,链接期不会引入 classic 代码。
const int CONFIG_BREDR_INQUIRY = 0;
const int CONFIG_INQUIRY_PAGE_OFFSET_ADJUST = 0;
const int ESCO_FORWARD_ENABLE = 0;
const int config_btctler_bredr_master = 0;
const int config_btctler_dual_a2dp = 0;
Source: lib_btctrler_config.c
示例 2:可被发现的经典蓝牙设备(调整发现相关开关)
若产品需要被手机等经典蓝牙主机搜索到,应将 Inquiry 开关置 1,同时保持扫描功率配置(CONFIG_PAGE_SCAN_POWER / CONFIG_INQUIRY_SCAN_POWER 均为 7)以保障灵敏度:
const int CONFIG_PAGE_SCAN_POWER = 7;
const int CONFIG_INQUIRY_POWER = 7;
const int CONFIG_INQUIRY_SCAN_POWER = 7;
Source: lib_btctrler_config.c
示例 3:TWS 双耳场景(启用新 BR/EDR 路径)
TWS 产品需要 BR/EDR 音频转发,此时定义 CONFIG_NEW_BREDR_ENABLE,并配套 TWS 时隙参数与 eSCO 转发配置:
#ifdef CONFIG_NEW_BREDR_ENABLE
const int CONFIG_TWS_RUN_SLOT = 200;
Source: lib_btctrler_config.c
示例 4:产测/认证模式(DUT 与 FCC)
transfer demo 默认已编译 DUT 与 FCC 测试代码,产线/认证可通过 config_dut_protocol_mode 选择通信方式:
const int CONFIG_TEST_DUT_CODE = 1;
const int CONFIG_TEST_FCC_CODE = 1;
const int CONFIG_TEST_DUT_ONLY_BOX_CODE = 0;
//DUT使用哪种模式通信: 0: HCI 1:2_wire
const int config_dut_protocol_mode = 0;
Source: lib_btctrler_config.c 与 lib_btctrler_config.c
配置选项总表
以下汇总 lib_btctrler_config.c 中与 BR/EDR 相关的全部配置项(取自 transfer demo):
| 配置项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
rx_fre_offset_adjust_enable | u8 | 1 | RX 频率偏移自适应调整使能 |
config_bredr_fcc_fix_fre | int | 0 | FCC 测试固定频点(0=默认) |
ble_disable_wait_enable | int | 1 | 升级调用 ll_destory 时等待 BLE 关闭,避免 BT 访问 MMU 异常 |
config_btctler_eir_version_info_len | int | 0 | EIR 中版本信息长度(0=不携带) |
CONFIG_TEST_DUT_CODE | int | 1 | 编译 DUT 测试代码 |
CONFIG_TEST_FCC_CODE | int | 1 | 编译 FCC 测试代码 |
CONFIG_TEST_DUT_ONLY_BOX_CODE | int | 0 | 仅产测盒模式 |
CONFIG_BREDR_INQUIRY | int | 0 | BR/EDR Inquiry(设备发现)使能 |
CONFIG_INQUIRY_PAGE_OFFSET_ADJUST | int | 0 | Inquiry/Page 时序偏移调整 |
CONFIG_ESCO_MUX_RX_BULK_ENABLE | int | 0 | eSCO RX 批量复用使能 |
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 | 本机作为 Master 发起 eSCO 使能 |
CONFIG_WIFI_DETECT_ENABLE | int | 0 | Wi-Fi 检测使能(共存相关) |
ESCO_FORWARD_ENABLE | int | 0 | eSCO 音频转发使能(TWS 相关) |
config_bt_function | int | 0 | BT 功能选择 |
config_btctler_bredr_master | int | 0 | BR/EDR 强制 Master |
config_btctler_dual_a2dp | int | 0 | 双 A2DP 支持 |
config_bredr_afh_user | int | 0 | AFH 由应用下发 Map(经 USER_CTRL_AFH_CHANNEL) |
config_bt_temperature_pll_trim | int | 0 | BT PLL 温度跟随 trim |
config_bt_security_vulnerability | int | 0 | 经典蓝牙安全漏洞缓解 |
config_dut_protocol_mode | int | 0 | DUT 通信模式:0=HCI,1=2-wire |
config_delete_link_key | int | 1 | 连接失败返回 PIN or Link Key Missing 时删除 link key |
CONFIG_TWS_RUN_SLOT | int | 200 | (仅 CONFIG_NEW_BREDR_ENABLE 定义时)TWS 运行时隙 |
CONFIG_PAGE_SCAN_POWER | int | 7 | Page 扫描功率等级 |
CONFIG_INQUIRY_POWER | int | 7 | Inquiry 发射功率等级 |
CONFIG_INQUIRY_SCAN_POWER | int | 7 | Inquiry 扫描功率等级 |
lib_profile_config.c 中的经典蓝牙 Profile 开关(均 const u8,默认 0):
| 配置项 | 默认值 | 说明 |
|---|---|---|
hci_inquiry_support | 0 | HCI 层 Inquiry 支持 |
btstack_emitter_support | 0 | BT Stack 发射器模式 |
a2dp_mutual_support | 0 | A2DP 双向(Sink+Source) |
more_addr_reconnect_support | 0 | 多地址重连 |
more_hfp_cmd_support | 0 | 扩展 HFP 命令 |
more_avctp_cmd_support | 0 | 扩展 AVCTP 命令 |
adt_profile_support | 0 | ADT Profile 支持 |
pbg_support_enable | 0 | PBG(电话本)支持 |
提示:同一工程的
apps/demo/hid/config/lib_btctrler_config.c与apps/demo/transfer/config/lib_btctrler_config.c结构一致,修改时应以当前正在编译的 demo 工程下的配置文件为准。
失败模式、边界情况与并发
基于源码中的注释与配置语义,BR/EDR 相关的典型失败模式与边界情况如下:
Link Key 失配(最常见重连故障)
经典蓝牙重连失败的最常见原因是本机与对端保存的 link key 不一致(对端已删除配对、或配对后密钥被覆盖)。SDK 的应对策略是 config_delete_link_key = 1:当连接失败且错误类型为 PIN or Link Key Missing 时自动删除本地 link key,为重新配对创造干净状态。设计意图:把"陈旧密钥导致重连死锁"这一高发问题收敛为一条配置,避免应用层自行维护密钥清理逻辑。
升级过程中 BLE/BT 共存异常
ble_disable_wait_enable = 1 的注释明确指出:升级流程调用 ll_destroy 时若不等待 BLE 完成关闭,会出现 BT 访问 MMU 的异常。这属于双模共存下的时序边界——BR/EDR 与 BLE 共享控制器资源,关闭顺序必须串行化,不可直接销毁。
时序偏移与共存
CONFIG_INQUIRY_PAGE_OFFSET_ADJUST 用于调整 Inquiry/Page 的时隙偏移。当 BR/EDR 与 BLE 并发调度(如 TWS 双耳 + BLE 连接)时,偏移调整可错开两类链路的射频窗口;默认 0 表示不调整,适用于 BR/EDR 独占或低频使用场景。
安全边界
config_bt_security_vulnerability = 0 表明 SDK 对已知经典蓝牙安全缺陷(如 KNOB、BIAS 类攻击面)的缓解默认关闭。面向安全敏感产品(如支付、门禁)时,该开关应置 1 并重新编译;面向音频消费类产品时可保持 0 以节省资源。此为配置语义推断,具体缓解措施实现位于预编译库中。
并发说明
- BR/EDR 与 BLE 共享射频与时隙调度,
CONFIG_TWS_RUN_SLOT、CONFIG_INQUIRY_PAGE_OFFSET_ADJUST、CONFIG_WIFI_DETECT_ENABLE三类参数共同构成共存调度面; - 所有 BR/EDR 配置均为编译期常量,运行时不存在动态读写竞争;但
USER_CTRL_AFH_CHANNEL(config_bredr_afh_user = 1时)表明 AFH Map 可在运行时由应用下发,此时需注意与控制器内部 AFH 更新逻辑的同步。
性能与运维考量
- 链接期符号裁剪:
lib_profile_config.c的u8开关采用"未引用即不链接"策略,关闭不用的 Profile 可显著减小固件体积——这是纯 BLE 与双模产品共用同一 SDK 的关键机制; - 发现功耗:
CONFIG_BREDR_INQUIRY与扫描功率(7 档)直接影响待机功耗;不需要被发现的设备保持 Inquiry 关闭可避免周期性 Inquiry Scan 的电流开销; - TWS 时隙:
CONFIG_TWS_RUN_SLOT = 200决定 TWS 两耳分时复用的时隙长度,改动会直接影响音频转发的实时性与功耗,应谨慎调整; - 测试通道:DUT/FCC 代码默认编入(
CONFIG_TEST_DUT_CODE/CONFIG_TEST_FCC_CODE= 1),量产固件若需进一步裁剪可在编译期关闭;config_dut_protocol_mode支持 HCI 与 2-wire 两种产测通信方式。
扩展点
- 按产品裁剪:通过两份配置文件(controller + profile)即可完成"纯 BLE → 双模经典蓝牙"的功能扩展,无需改动协议栈源码;
- 运行时 AFH 控制:
config_bredr_afh_user = 1时,应用可经USER_CTRL_AFH_CHANNEL下发自定义 AFH Map,适合干扰规避(如避开 LTE/Wi-Fi 频段)与认证测试场景; - 产测扩展:
config_dut_protocol_mode提供 HCI/2-wire 两种产测通道,产线工具可据此对接; - 中断布局预留:
IRQ_BREDR_IP(当前//no use)为 BR/EDR 中断优先级预留,双模产品可复用该符号挂接经典蓝牙中断处理。