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

    • SDK 总览
    • 支持芯片与蓝牙认证
    • 工程结构导航
  • 开发环境与构建

    • 环境搭建与工具链安装
    • 编译指南与工程选择
    • 烧录与生产工具
  • BLE 透传/数传应用

    • 透传应用框架与处理模块
    • 透传与数传示例
    • 多连接与自定义服务示例
    • FindMy 与查找网络示例
  • HID 人机交互应用

    • 键盘与按键设备示例
    • 鼠标设备示例
    • 遥控器示例
    • HID 蓝牙应用模块
  • 公共 BSP 模块

    • 按键、编码器与红外输入
    • 传感器驱动
    • LED 与显示控制
    • 串口与 USB 通信
    • 存储、参数与时钟
    • 电源与温度管理
    • 消息、内存与系统配置
    • OTA 升级框架
  • 蓝牙协议栈与库

    • BLE 控制器与协议栈适配
    • 经典蓝牙 BR/EDR 支持
    • 第三方蓝牙协议
    • 设备管理框架
    • DUT 测试与射频认证
  • 构建系统与开发工具

    • Makefile 构建系统
    • 固件后处理与配置工具
    • 辅助脚本与库合并
  • 文档与硬件资料

    • AT 命令参考
    • 硬件参考资料
    • SDK 文档与在线资源

经典蓝牙 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.chid 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.cdemo 主文件,定义 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_support0HCI 层 Inquiry 支持;开启后应用可驱动经典蓝牙设备发现
btstack_emitter_support0BT Stack "发射器"模式(如遥控/广播类外设)
a2dp_mutual_support0A2DP 双向:本机既做 Sink 也做 Source(互连/中转)
more_addr_reconnect_support0多地址重连(记录并回连多个历史设备)
more_hfp_cmd_support0扩展 HFP 命令(AT 命令集扩展)
more_avctp_cmd_support0扩展 AVCTP 命令(AVRCP 控制命令扩展)
adt_profile_support0ADT Profile 支持
pbg_support_enable0PBG(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["正常重连/重试策略"]

流程要点:

  1. 总开关先行:CONFIG_NEW_BREDR_ENABLE 在编译期选择 BR/EDR 代码路径,并连带启用 TWS 时隙参数(CONFIG_TWS_RUN_SLOT = 200)。该宏在 lib_btctrler_config.c 的 #ifdef 分支中出现,说明它影响的是控制器调度层配置;
  2. 控制器开关组决定链路行为:Inquiry 开关决定设备是否可见;LMP 开关组决定配对(Passkey)、设备名请求、Master eSCO 是否可用;AFH 用户开关决定跳频表由控制器自动生成还是由应用经 USER_CTRL_AFH_CHANNEL 控制;
  3. Profile 开关决定能力面:a2dp_mutual_support 等决定音频/控制方向;这些开关与控制器开关叠加后,协议栈库在链接期只保留被引用的符号;
  4. 重连故障自愈:config_delete_link_key = 1 是一条专门的恢复路径——经典蓝牙最常见的重连失败原因是本机/对端 link key 不一致,此配置在收到 PIN or Link Key Missing 错误时删除本地密钥,为重新配对让路。

使能 BR/EDR 的典型操作顺序

基于以上源码证据,在一个产品工程中开放经典蓝牙能力的推荐顺序为:

  1. 在编译选项中定义 CONFIG_NEW_BREDR_ENABLE(若需要新 BR/EDR 路径及 TWS 时隙);
  2. 将 lib_btctrler_config.c 中需要的开关置 1:如需要被发现则 CONFIG_BREDR_INQUIRY = 1;需要语音则保持 CONFIG_LMP_MASTER_ESCO_ENABLE = 1 等;
  3. 按产品功能在 lib_profile_config.c 中打开对应 Profile 扩展(如 a2dp_mutual_support、more_hfp_cmd_support);
  4. 保持 config_delete_link_key = 1 与 rx_fre_offset_adjust_enable = 1 等健壮性配置;
  5. 在 app_main.c 中为 IRQ_BREDR_IP 分配实际优先级(当前默认 //no use,值为 3),并确认与 IRQ_BTSTACK_MSG_IP、IRQ_BT_RXMCH_IP 不冲突;
  6. 重新编译,链接期自动裁剪未使用的 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_enableu81RX 频率偏移自适应调整使能
config_bredr_fcc_fix_freint0FCC 测试固定频点(0=默认)
ble_disable_wait_enableint1升级调用 ll_destory 时等待 BLE 关闭,避免 BT 访问 MMU 异常
config_btctler_eir_version_info_lenint0EIR 中版本信息长度(0=不携带)
CONFIG_TEST_DUT_CODEint1编译 DUT 测试代码
CONFIG_TEST_FCC_CODEint1编译 FCC 测试代码
CONFIG_TEST_DUT_ONLY_BOX_CODEint0仅产测盒模式
CONFIG_BREDR_INQUIRYint0BR/EDR Inquiry(设备发现)使能
CONFIG_INQUIRY_PAGE_OFFSET_ADJUSTint0Inquiry/Page 时序偏移调整
CONFIG_ESCO_MUX_RX_BULK_ENABLEint0eSCO RX 批量复用使能
CONFIG_LMP_NAME_REQ_ENABLEint1LMP Name Request 处理使能
CONFIG_LMP_PASSKEY_ENABLEint1LMP Passkey 配对使能
CONFIG_LMP_MASTER_ESCO_ENABLEint1本机作为 Master 发起 eSCO 使能
CONFIG_WIFI_DETECT_ENABLEint0Wi-Fi 检测使能(共存相关)
ESCO_FORWARD_ENABLEint0eSCO 音频转发使能(TWS 相关)
config_bt_functionint0BT 功能选择
config_btctler_bredr_masterint0BR/EDR 强制 Master
config_btctler_dual_a2dpint0双 A2DP 支持
config_bredr_afh_userint0AFH 由应用下发 Map(经 USER_CTRL_AFH_CHANNEL)
config_bt_temperature_pll_trimint0BT PLL 温度跟随 trim
config_bt_security_vulnerabilityint0经典蓝牙安全漏洞缓解
config_dut_protocol_modeint0DUT 通信模式:0=HCI,1=2-wire
config_delete_link_keyint1连接失败返回 PIN or Link Key Missing 时删除 link key
CONFIG_TWS_RUN_SLOTint200(仅 CONFIG_NEW_BREDR_ENABLE 定义时)TWS 运行时隙
CONFIG_PAGE_SCAN_POWERint7Page 扫描功率等级
CONFIG_INQUIRY_POWERint7Inquiry 发射功率等级
CONFIG_INQUIRY_SCAN_POWERint7Inquiry 扫描功率等级

lib_profile_config.c 中的经典蓝牙 Profile 开关(均 const u8,默认 0):

配置项默认值说明
hci_inquiry_support0HCI 层 Inquiry 支持
btstack_emitter_support0BT Stack 发射器模式
a2dp_mutual_support0A2DP 双向(Sink+Source)
more_addr_reconnect_support0多地址重连
more_hfp_cmd_support0扩展 HFP 命令
more_avctp_cmd_support0扩展 AVCTP 命令
adt_profile_support0ADT Profile 支持
pbg_support_enable0PBG(电话本)支持

提示:同一工程的 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 两种产测通信方式。

扩展点

  1. 按产品裁剪:通过两份配置文件(controller + profile)即可完成"纯 BLE → 双模经典蓝牙"的功能扩展,无需改动协议栈源码;
  2. 运行时 AFH 控制:config_bredr_afh_user = 1 时,应用可经 USER_CTRL_AFH_CHANNEL 下发自定义 AFH Map,适合干扰规避(如避开 LTE/Wi-Fi 频段)与认证测试场景;
  3. 产测扩展:config_dut_protocol_mode 提供 HCI/2-wire 两种产测通道,产线工具可据此对接;
  4. 中断布局预留:IRQ_BREDR_IP(当前 //no use)为 BR/EDR 中断优先级预留,双模产品可复用该符号挂接经典蓝牙中断处理。

相关链接

  • lib_btctrler_config.c(transfer demo,Bluetooth Classic setting)
  • lib_profile_config.c(transfer demo,Profile 支持开关)
  • lib_btctrler_config.c(hid demo,CONFIG_NEW_BREDR_ENABLE 分支)
  • app_main.c(transfer demo,IRQ_BREDR_IP 中断优先级)
  • app_main.c(hid demo,IRQ_BREDR_IP 中断优先级)
  • 相关目录页:BLE 配置、双模共存、TWS 音频(如目录中存在对应页面,可在此处交叉引用)
Prev
BLE 控制器与协议栈适配
Next
第三方蓝牙协议