DUT 测试与射频认证
本页介绍 fw-AW33N_BLE_SDK 中用于设备测试(DUT,Device Under Test)与射频认证(BQB / FCC / 定频 / 性能测试)的完整机制:测试模式配置、BLE/BREDR DUT 控制 API、定频测试流程以及配套的产测信息上报接口。
Purpose and Scope
本文档覆盖该 SDK 中与射频测试与认证相关的全部软件机制:
- 经典蓝牙(BREDR)与低功耗蓝牙(BLE)的 DUT(Device Under Test)测试模式
- 实验室射频认证模式:BQB、FCC、定频(FRE)、性能(PER)测试
- BLE DUT 测试模块的操作接口(
ble_dut_ops_t)与控制类型(BLE_DUT_CTRL_TYPE) - 量产产测辅助接口:测试盒信息上报、RX 批量切换、LMP 特性请求等
以下内容属于其他页面范畴,不在本页展开:协议栈运行模式(Controller/Stack 任务调度,参见 btctrler_task.h 的 Task 机制)、音频链路与 TWS 快速连接、普通蓝牙连接的建立与断开流程。
Overview
射频认证(Radio Frequency Certification)是蓝牙产品量产前必须通过的实验室测试,涵盖 BQB(Bluetooth Qualification Body,蓝牙资格认证)、FCC(美国联邦通信委员会认证)、CE 等标准。测试仪器(如 R&S、Anritsu 的蓝牙综测仪)要求被测设备(DUT)进入特殊的测试模式:设备不再执行正常的连接流程,而是响应仪器的测试指令——例如定频发射、接收误码率统计等。
该 SDK 通过 btcontroller_mode.h 中的编译期测试模式宏(BT_NORMAL / BT_BQB / BT_FCC / BT_FRE / BT_PER / BT_QUA)选择固件的默认行为,再配合运行期 API 动态进入/退出 DUT 模式:
- BREDR DUT:调用
bredr_set_dut_enble(u8 en, u8 phone)使能后,测试仪器即可链接设备进行经典蓝牙测试 - BLE DUT:通过
__ble_dut_ops操作接口(init/ioctrl/exit)设置 RX/TX 模式并结束测试取回误码统计 - 定频测试:
bt_fix_fre_api()/ble_fix_fre_api()一键进入 2402MHz 最大功率发射模式(用于产线屏蔽箱测试)
关键设计意图:测试代码与正常业务代码共存于同一固件,通过编译期宏裁剪 + 运行期函数调用两种粒度控制,既满足实验室认证(专用测试固件)又满足量产产测(同固件动态切换),避免维护多套工程。
Architecture
下图展示了 DUT 测试与射频认证能力的整体架构:上层应用(产测程序/按键/串口指令)通过两类入口触达底层控制器,控制器再驱动射频硬件进入测试状态。
flowchart TD
subgraph sg_App["应用层 (App)"]
App["产测程序 / 按键 / 串口指令"]
end
subgraph sg_API["测试入口 API"]
BredrDut["bredr_set_dut_enble()<br/>BREDR DUT 使能"]
FixFre["bt_fix_fre_api() / ble_fix_fre_api()<br/>定频测试"]
BoxApi["bt_testbox_ex_info_get_handle_register()<br/>测试盒信息上报"]
BulkApi["bredr_bulk_change_rx_bulk()<br/>RX 批量切换"]
end
subgraph sg_BLE["BLE DUT 模块 (ble_dut_ops_t)"]
Ops["__ble_dut_ops"]
Init["init() 初始化"]
Ioctrl["ioctrl() 控制"]
Exit["exit() 退出"]
CtrlType["BLE_DUT_CTRL_TYPE<br/>RX_MODE / TX_MODE / TEST_END"]
TxParam["ble_dut_tx_param_t<br/>通道/载荷/PHY"]
RxParam["ble_dut_rx_param_t<br/>通道/PHY"]
end
subgraph sg_Cfg["编译期配置 (btcontroller_mode.h)"]
Mode["CONFIG_BT_MODE<br/>BT_NORMAL / BQB / FCC / FRE / PER / QUA"]
Codes["CONFIG_TEST_DUT_CODE<br/>CONFIG_TEST_FCC_CODE<br/>CONFIG_TEST_DUT_ONLY_BOX_CODE"]
end
subgraph sg_HW["底层控制器与射频"]
BREDR["BREDR Controller"]
BLE["BLE Controller"]
RF["射频前端 (天线/PA/LNA)"]
end
App --> BredrDut
App --> FixFre
App --> BoxApi
App --> BulkApi
App --> Ops
Ops --> Init
Ops --> Ioctrl
Ops --> Exit
Ioctrl --> CtrlType
CtrlType --> TxParam
CtrlType --> RxParam
Mode --> BREDR
Mode --> BLE
Codes --> Mode
BredrDut --> BREDR
FixFre --> BREDR
FixFre --> BLE
BulkApi --> BREDR
BREDR --> RF
BLE --> RF
架构说明:
- 应用层:产测程序(通常运行在产测盒/PC 上位机)通过串口或按键事件触发测试入口 API,测试盒信息上报接口
bt_testbox_ex_info_get_handle_register向仪器侧暴露设备信息(电量、烧录码、SDK 版本等,见 btctrler_task.h 第 80-86 行)。 - 测试入口 API:BREDR DUT 使能、定频测试、批量 RX 切换等,均为底层控制器向应用导出的薄封装,见 btcontroller_mode.h 第 17-48 行。
- BLE DUT 模块:以操作接口指针
__ble_dut_ops形式注册(btctrler_task.h 第 108-141 行),通过ioctrl变参函数下发BLE_DUT_CTRL_TYPE控制命令,携带 TX/RX 参数结构体。 - 编译期配置:
CONFIG_BT_MODE决定固件启动后的默认测试姿态,CONFIG_TEST_DUT_CODE/CONFIG_TEST_FCC_CODE等常量用于裁剪测试代码(btcontroller_modules.h 第 82-85 行)。
测试模式配置(CONFIG_BT_MODE)
测试模式在编译期通过 CONFIG_BT_MODE 宏选定,定义与默认值如下:
| 宏 | 值 | 用途 |
|---|---|---|
BT_NORMAL | 0x01 | 正常模式(默认),量产测试时通过外部操作动态进入 DUT |
BT_BQB | 0x02 | 实验室 BQB 射频测试固件 |
BT_FCC | 0x04 | 实验室 FCC 射频测试固件 |
BT_FRE | 0x10 | 定频测试:频点 2402MHz、发射功率最大 |
BT_PER | 0x20 | 性能测试:仪器直接连接,测试后需复位/上电恢复 |
BT_QUA | 0x40 | 质量(Qualification)相关扩展模式 |
#define BT_NORMAL 0x01
#define BT_BQB 0x02
#define BT_FCC 0x04
#define BT_FRE 0x10
#define BT_PER 0x20
#define BT_QUA 0x40
#define CONFIG_BT_MODE BT_NORMAL
Source: btcontroller_mode.h 第 50-58 行
设计意图:不同实验室(BQB/FCC)和产线(FRE/PER)对固件行为的要求互斥——认证测试需要设备上电即保持可被发现、可被仪器链接的"裸"状态;正常量产固件则必须维持完整业务(提示音、TWS、ANC 等)。因此采用编译期宏裁剪,为每个场景构建专用固件,避免运行期复杂的模式切换逻辑干扰测试结果。头文件注释明确警告:
开启测试模式时,uart0、按键等功能默认关闭,特殊情况需自行处理(见 btcontroller_mode.h 第 17-20 行)。
各模式的行为差异
- BT_BQB / BT_FCC:实验室测试专用,设备上电后直接进入可测试状态,不加载业务逻辑。
- BT_FRE:定频测试,固定 2402MHz 频点、最大发射功率,用于产线屏蔽箱内的链路校准与天线验证。
- BT_PER:性能测试,仪器直接连接即可测吞吐/误码;测试完毕后必须复位或重新上电才会恢复正常流程,且不复位时只支持链接一个设备——这是有意设计:PER 固件无需恢复业务,简化实现。
- BT_NORMAL + 运行期 DUT:量产固件保持
BT_NORMAL,产测程序在适当时机调用bredr_set_dut_enble()临时进入 DUT 状态,测完复位即恢复正常——避免为产测维护独立工程。
测试代码裁剪常量
btcontroller_modules.h 声明了一组用于 LTO(链接时优化)裁剪的测试常量:
extern const int CONFIG_TEST_DUT_CODE;
extern const int CONFIG_TEST_FCC_CODE;
Source: btcontroller_modules.h 第 82-83 行
其中 CONFIG_TEST_DUT_CODE、CONFIG_TEST_FCC_CODE、CONFIG_TEST_DUT_ONLY_BOX_CODE 与 CONFIG_BREDR_INQUIRY 配套使用(btcontroller_modules.h 第 84-85 行),用于把 DUT/FCC 相关代码段编入或剔除出最终固件,减小量产固件体积、避免误入测试流程。
BLE DUT 测试模块
BLE DUT 测试通过 struct ble_dut_ops_t 操作接口驱动,接口指针以全局符号 __ble_dut_ops 导出:
struct ble_dut_ops_t {
/* *****************************************************************************/
/**
* @brief : initialize the ble dut test module
*
* @param : void
*
* @return : pointer to instance of test module
*/
/* *****************************************************************************/
void *(*init)(void);
/* *****************************************************************************/
/**
* @brief : ble dut test control api,such as setting rx/tx mode,stop testing
*
* @param : control type,using enum BLE_DUT_CTRL_TYPE value;
* @param : vary from different control type;
*/
/* *****************************************************************************/
int (*ioctrl)(int ctrl, ...);
/* *****************************************************************************/
/**
* @brief : exit the ble dut test module
*
* @param : poniter to instance of test module
*/
/* *****************************************************************************/
void (*exit)(void *priv);
};
extern const struct ble_dut_ops_t *__ble_dut_ops;
Source: btctrler_task.h 第 108-141 行
接口语义:
init():初始化 BLE DUT 测试模块,返回模块实例指针(priv)。典型实现会停止正常连接、配置测试状态机。ioctrl(ctrl, ...):变参控制接口,这是 DUT 的核心命令通道,ctrl取BLE_DUT_CTRL_TYPE枚举值,后续可变参数随控制类型不同而不同。exit(priv):退出测试模块,释放资源、恢复控制器状态。
控制类型(BLE_DUT_CTRL_TYPE)
enum BLE_DUT_CTRL_TYPE {
BLE_DUT_SET_RX_MODE = 0, //param1:struct ble_dut_rx_param_t *param;
BLE_DUT_SET_TX_MODE, //param1:struct ble_dut_tx_param_t *param;
BLE_DUT_SET_TEST_END, //param1:u16 *pkt_valid_cnt,param2:u16 *pkt_err_cnt;
};
Source: btctrler_task.h 第 102-106 行
三种控制命令构成 BLE DUT 测试的完整生命周期:
BLE_DUT_SET_RX_MODE:进入接收模式。参数为struct ble_dut_rx_param_t *,设备在指定通道、指定 PHY 上持续监听,统计接收到的测试包。BLE_DUT_SET_TX_MODE:进入发射模式。参数为struct ble_dut_tx_param_t *,设备按指定通道、载荷长度/类型、PHY 速率连续发射测试包,供仪器侧做功率/调制/频偏测量。BLE_DUT_SET_TEST_END:结束测试。通过出参u16 *pkt_valid_cnt(有效包计数)和u16 *pkt_err_cnt(错误包计数)取回本次 RX 测试的统计结果,供产测程序计算 PER(Packet Error Rate,误包率)。
TX / RX 参数结构
struct ble_dut_tx_param_t {
u8 ch_index; //data[0]
u8 payload_len; //data[1]
u8 payload_type;//data[2]
u8 phy_type; //data[3]
};
struct ble_dut_rx_param_t {
u8 ch_index; //data[0]
u8 phy_type; //data[1]
};
Source: btctrler_task.h 第 90-100 行
字段与 BLE 测试协议(蓝牙 Core Spec 5.x 的 Direct Test Mode)一一对应:
ch_index:RF 通道索引(0-39,对应 2402MHz 起每 2MHz 一个通道)。payload_len:TX 测试包载荷长度(字节)。payload_type:载荷类型(PRBS9 伪随机序列 / 0x00 / 0xFF 等,用于调制质量与误码测试)。phy_type:PHY 速率(1M / 2M / Coded 125k / Coded 500k),对应不同速率等级下的射频指标测试。
BREDR DUT 测试
经典蓝牙 DUT 通过 bredr_set_dut_enble() 动态使能,适用于 BT_NORMAL 量产固件:
调用 void bredr_set_dut_enble(u8 en,u8 phone )
en 1 :使能 bredr dut 测试然后就可以使用仪器链接测试
phone: 1 可以被手机连接,0 不可以被手机连接上
Source: btcontroller_mode.h 第 31-34 行
en:使能位。置 1 后仪器可链接设备执行经典蓝牙测试。phone:是否允许被普通手机连接——产测场景通常置 0,避免测试期间被用户设备干扰;需要人机交互验证时置 1。
配套操作:进入 DUT 前,需同时关闭耳机快速链接并开启可发现/可链接,头文件给出标准操作序列(btcontroller_mode.h 第 36-40 行):
tws_cancle_all_noconn() ; // 取消 TWS 快速连接逻辑
bt_cmd_prepare(USER_CTRL_WRITE_SCAN_ENABLE, 0, NULL); // 开启可被发现
bt_cmd_prepare(USER_CTRL_WRITE_CONN_ENABLE, 0, NULL); // 开启可被连接
该序列保证设备从"耳机业务状态"干净地切换到"裸测试状态",防止 TWS 快速连接、白名单等逻辑拦截仪器的 Inquiry/Page 请求。
定频测试(FRE)
定频测试是产线射频校准的核心手段,SDK 提供两个一键 API:
5、可以调用 void bt_fix_fre_api() 函数实现经典蓝牙定频测试,频点2402,发射功率最大, 调用后不可恢复之前状态,只是用来量产测试,测试完需要复位或重新上电开机!
6、可以调用 void ble_fix_fre_api()函数实现ble定频测试,发射功率最大,
Source: btcontroller_mode.h 第 43-47 行
关键约束(设计意图):定频 API 是"单向"操作——进入后不可恢复,必须复位或重新上电。这是刻意的简化:定频测试只需固定频点最大功率连续发射,不需要完整的协议栈状态机;如果实现可逆切换,反而引入状态残留风险,可能让设备带着错误的射频配置进入市场固件。产测流程天然是"测完即复位",因此单向设计在工程上最安全。
与 BT_FRE 编译期模式的区别:BT_FRE 是上电即定频的专用固件;而 bt_fix_fre_api() / ble_fix_fre_api() 允许 BT_NORMAL 量产固件在运行期被产测程序触发定频,同一固件同时服务"正常出货"与"产线测试"两个阶段。
核心测试流程
BLE DUT 测试流程
下图展示了产测程序驱动 BLE DUT 的完整时序:初始化 → RX/TX 模式 → 结束取统计 → 退出。
sequenceDiagram
participant TP as 产测程序 (Test Program)
participant Ops as ble_dut_ops (__ble_dut_ops)
participant Ctl as BLE Controller
participant RF as 射频前端
TP->>Ops: init()
Ops->>Ctl: 停用正常连接、进入测试状态
Ctl-->>TP: 返回模块实例 priv
TP->>Ops: ioctrl(BLE_DUT_SET_RX_MODE, rx_param)
Ops->>Ctl: 设置通道 ch_index + PHY phy_type
Ctl->>RF: 进入 RX 监听,统计收包
TP->>Ops: ioctrl(BLE_DUT_SET_TX_MODE, tx_param)
Ops->>Ctl: 设置通道/载荷长度/载荷类型/PHY
Ctl->>RF: 连续发射测试包
TP->>Ops: ioctrl(BLE_DUT_SET_TEST_END, &valid_cnt, &err_cnt)
Ctl-->>TP: 返回 pkt_valid_cnt / pkt_err_cnt
TP->>TP: 计算 PER = err / (valid + err)
TP->>Ops: exit(priv)
Ops->>Ctl: 恢复控制器状态、释放资源
流程要点:
init()必须最先调用,返回的priv贯穿后续所有调用。- RX 与 TX 测试通常分两轮进行(仪器分别测量接收灵敏度和发射指标),两者共用
ioctrl通道。 BLE_DUT_SET_TEST_END的统计出参是 RX 测试的裁决依据,产测程序据此计算 PER 并与产测阈值比对(如 PER < 2% 判 PASS)。exit()负责恢复,避免 DUT 状态泄漏到后续正常使用。
BREDR DUT 进入流程(量产固件)
flowchart TD
Start([产测程序触发]) --> Op1["tws_cancle_all_noconn()<br/>取消快速连接"]
Op1 --> Op2["bt_cmd_prepare(USER_CTRL_WRITE_SCAN_ENABLE, 0, NULL)<br/>开启可发现"]
Op2 --> Op3["bt_cmd_prepare(USER_CTRL_WRITE_CONN_ENABLE, 0, NULL)<br/>开启可连接"]
Op3 --> Op4{"bredr_set_dut_enble(1, phone)"}
Op4 -->|"phone=0"| Op5["仅允许仪器链接"]
Op4 -->|"phone=1"| Op6["仪器 + 手机均可链接"]
Op5 --> Test["仪器执行 BQB/FCC/PER 测试"]
Op6 --> Test
Test --> End([测试完毕,复位/重新上电恢复正常流程])
该流程明确体现了"业务态 → 测试态"的切换纪律:先解除业务层的连接策略(TWS 快速连接、可发现/可连接标志),再使能 DUT,最后以复位收尾。
使用示例
以下示例均取自本仓库实际源码注释与头文件声明。
示例 1:编译期选择测试模式
固件构建时在 btcontroller_mode.h 中指定测试模式,例如实验室 FCC 认证固件:
#define BT_NORMAL 0x01
#define BT_BQB 0x02
#define BT_FCC 0x04
#define BT_FRE 0x10
#define BT_PER 0x20
#define CONFIG_BT_MODE BT_NORMAL
Source: btcontroller_mode.h 第 50-58 行
将 CONFIG_BT_MODE 改为 BT_FCC 即构建 FCC 测试固件;量产固件保持 BT_NORMAL 并在运行期调用 DUT API。
示例 2:运行期进入 BREDR DUT(量产固件)
// 1. 先解除业务层策略
tws_cancle_all_noconn() ;
bt_cmd_prepare(USER_CTRL_WRITE_SCAN_ENABLE, 0, NULL);
bt_cmd_prepare(USER_CTRL_WRITE_CONN_ENABLE, 0, NULL);
// 2. 使能 BREDR DUT,仅允许仪器链接(phone=0)
bredr_set_dut_enble(1, 0);
Source: btcontroller_mode.h 第 36-40 行
示例 3:BLE DUT 控制命令定义
产测程序通过 __ble_dut_ops->ioctrl 下发控制命令,命令类型与参数约定如下:
enum BLE_DUT_CTRL_TYPE {
BLE_DUT_SET_RX_MODE = 0, //param1:struct ble_dut_rx_param_t *param;
BLE_DUT_SET_TX_MODE, //param1:struct ble_dut_tx_param_t *param;
BLE_DUT_SET_TEST_END, //param1:u16 *pkt_valid_cnt,param2:u16 *pkt_err_cnt;
};
Source: btctrler_task.h 第 102-106 行
示例 4:BLE DUT 参数结构(Direct Test Mode 参数映射)
struct ble_dut_tx_param_t {
u8 ch_index; //data[0]
u8 payload_len; //data[1]
u8 payload_type;//data[2]
u8 phy_type; //data[3]
};
struct ble_dut_rx_param_t {
u8 ch_index; //data[0]
u8 phy_type; //data[1]
};
Source: btctrler_task.h 第 90-100 行
示例 5:定频测试一键触发
// 经典蓝牙定频:频点 2402MHz,发射功率最大,不可恢复,测试后需复位
bt_fix_fre_api();
// BLE 定频:发射功率最大
ble_fix_fre_api();
Source: btcontroller_mode.h 第 43-47 行
示例 6:测试盒信息上报注册
产测盒可注册自定义信息获取句柄,仪器侧通过测试盒读取设备状态(电量、烧录码、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 第 80-86 行
各信息类型的句柄签名(注释所示):VBAT 值返回 u16 毫伏、电量百分比返回 u8、烧录码与 SDK 版本返回 u8* 缓冲并通过 len 出参告知长度。
Configuration Options
以下配置项全部位于 apps/include_lib/bt_controller_include/ 下的头文件中,属编译期配置(修改后需重新编译固件)。
| 配置项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
CONFIG_BT_MODE | 宏 | BT_NORMAL (0x01) | 固件默认测试模式,见 btcontroller_mode.h 第 58 行 |
CONFIG_TEST_DUT_CODE | const int | 由构建配置决定 | DUT 测试代码段裁剪开关,见 btcontroller_modules.h 第 82 行 |
CONFIG_TEST_FCC_CODE | const int | 由构建配置决定 | FCC 测试代码段裁剪开关,见 btcontroller_modules.h 第 83 行 |
CONFIG_TEST_DUT_ONLY_BOX_CODE | const int | 由构建配置决定 | 仅测试盒(无仪器直连)场景的 DUT 代码裁剪,见 btcontroller_modules.h 第 84 行 |
CONFIG_BREDR_INQUIRY | const int | 由构建配置决定 | BREDR Inquiry(发现)功能裁剪,见 btcontroller_modules.h 第 85 行 |
CONFIG_BLE_HRATE_FEATURE | 宏 | 0 | BLE 高速率特性:CONFIG_BLE_HRATE_4K (1<<1) / CONFIG_BLE_HRATE_8K (1<<2),载荷 5 字节,见 btcontroller_mode.h 第 63-68 行 |
CONFIG_BLE_CS_EN | 宏 | 0 | BLE Channel Sounding 使能(测距特性),见 btcontroller_mode.h 第 73 行 |
CONFIG_BLE_VADV_EN | 宏 | 0 | BLE VADV(可变广告)使能,见 btcontroller_mode.h 第 75 行 |
说明:
CONFIG_TEST_*_CODE系列为extern const int声明,实际值由各工程构建脚本/配置头决定,用于链接期常量折叠(LTO)裁剪测试代码。CONFIG_BLE_HRATE_FEATURE、CONFIG_BLE_CS_EN、CONFIG_BLE_VADV_EN与射频测试模式无关,但同为btcontroller_mode.h提供的特性开关,此处一并列出便于查阅。
API Reference
BREDR DUT
void bredr_set_dut_enble(u8 en, u8 phone)
使能/关闭经典蓝牙 DUT 测试模式。
参数:
en(u8):1使能 DUT(仪器可链接测试);0关闭。phone(u8):1允许被手机连接;0不允许被手机连接。
说明: 适用于 BT_NORMAL 量产固件运行期进入 DUT;进入前需先调用 tws_cancle_all_noconn() 并开启可发现/可连接(bt_cmd_prepare(USER_CTRL_WRITE_SCAN_ENABLE / USER_CTRL_WRITE_CONN_ENABLE, 0, NULL))。
Source: btcontroller_mode.h 第 31-40 行
void bt_fix_fre_api(void)
经典蓝牙定频测试:固定频点 2402MHz、最大发射功率。单向操作,调用后不可恢复,测试完需复位或重新上电。
Source: btcontroller_mode.h 第 43-44 行
void ble_fix_fre_api(void)
BLE 定频测试:最大发射功率发射。
Source: btcontroller_mode.h 第 46 行
BLE DUT 模块(__ble_dut_ops)
全局符号 extern const struct ble_dut_ops_t *__ble_dut_ops(btctrler_task.h 第 141 行),指向控制器实现的 DUT 操作集。
void *(*init)(void)
初始化 BLE DUT 测试模块。
返回: 模块实例指针 priv,供后续 exit 使用。
int (*ioctrl)(int ctrl, ...)
BLE DUT 控制命令通道(变参)。
参数:
ctrl(int):BLE_DUT_CTRL_TYPE枚举值:BLE_DUT_SET_RX_MODE (0):后续参数struct ble_dut_rx_param_t *paramBLE_DUT_SET_TX_MODE (1):后续参数struct ble_dut_tx_param_t *paramBLE_DUT_SET_TEST_END (2):后续参数u16 *pkt_valid_cnt、u16 *pkt_err_cnt(出参,返回统计结果)
返回: int,0 表示成功,非 0 表示失败。
Source: btctrler_task.h 第 102-129 行
void (*exit)(void *priv)
退出 BLE DUT 测试模块。
参数:
priv(void*):init()返回的模块实例。
Source: btctrler_task.h 第 131-138 行
产测辅助接口
void bt_testbox_ex_info_get_handle_register(u8 info_type, void *handle)
注册测试盒信息获取句柄。
参数:
info_type(u8):TESTBOX_INFO_*枚举:TESTBOX_INFO_VBAT_VALUE (0):电池电压,句柄签名u16 (*handle)(void)TESTBOX_INFO_VBAT_PERCENT (1):电量百分比,句柄签名u8 (*handle)(void)TESTBOX_INFO_BURN_CODE (2):烧录码,句柄签名u8 *(*handle)(u8 *len)TESTBOX_INFO_SDK_VERSION (3):SDK 版本,句柄签名u8 *(*handle)(u8 *len)
handle(void*):对应类型的回调函数指针。
Source: btctrler_task.h 第 80-86 行
u8 bredr_bulk_change_rx_bulk(u8 mode)
BREDR 批量数据接收模式切换(bulk 模式,用于高速批量吞吐测试)。
参数:
mode(u8):目标 bulk 模式。
返回: u8,切换结果状态。
Source: btctrler_task.h 第 87 行
void lmp_set_features_req_step(u8 *addr)
按步骤发送 LMP features request(用于 BREDR 特性协商测试,配合认证仪器验证 Feature 位图)。
参数:
addr(u8*):目标设备 BD 地址。
Source: btctrler_task.h 第 88 行
故障模式、边界情况与并发
故障模式
| 故障场景 | 表现 | 处理方式(源码依据) |
|---|---|---|
BT_PER 测试后不复位 | 只支持链接一个设备,流程不恢复 | 头文件明确要求"测试完毕后需要复位或者上电开机才会恢复正常流程"(btcontroller_mode.h 第 28-29 行),属有意设计,产测程序须在 PER 用例后主动复位 |
| 定频后直接出货 | 设备固定 2402MHz 最大功率发射,射频指标异常、功耗异常 | bt_fix_fre_api() / ble_fix_fre_api() 不可恢复,仅限产线使用;出货前必须重新烧录 BT_NORMAL 固件并复位(btcontroller_mode.h 第 43-44 行) |
| 测试模式占用外设 | 开启测试模式时 uart0、按键等功能默认关闭 | 头文件注释明确警告"请看特殊情况自行处理"(btcontroller_mode.h 第 18-19 行),量产固件需评估 uart0 日志等功能的可用性 |
| BLE 测试串口冲突 | 测试串口默认使用 USB 口,若 USB 被其他功能占用则测试指令无法下发 | "ble 测试串口默认使用usb口,代码要确保usb口没有其他地方使用"(btcontroller_mode.h 第 17-18 行) |
边界情况
- BREDR DUT 进入顺序:必须先执行
tws_cancle_all_noconn()与可发现/可连接开启,再调用bredr_set_dut_enble()。顺序颠倒会导致 TWS 快速连接/白名单拦截仪器请求,测试超时。 - BLE DUT 生命周期:
BLE_DUT_SET_RX_MODE/BLE_DUT_SET_TX_MODE是互斥状态,切换前应先BLE_DUT_SET_TEST_END结束当前测试并取回统计;BLE_DUT_SET_TEST_END的两个出参指针不可为 NULL,否则统计结果丢失。 - 参数取值域:
ble_dut_tx_param_t/ble_dut_rx_param_t的ch_index应为 0-39(BLE 通道)、phy_type应匹配控制器支持的 PHY;越界值行为未在头文件中定义,产测程序应使用仪器侧标准的 Direct Test Mode 参数。 - phone 参数语义:
phone=1时仪器与手机均可连接,测试结果易受普通手机干扰,仅用于需要手机交互的验证场景。
并发与状态一致性
- DUT 测试模块与正常蓝牙连接流程互斥:进入 DUT 前必须停用正常连接行为(
USER_CTRL_WRITE_SCAN_ENABLE/USER_CTRL_WRITE_CONN_ENABLE配合tws_cancle_all_noconn()),从源头避免连接事件与测试状态竞争。 - 测试期间若设备收到用户按键等业务事件,测试模式固件默认关闭相关功能(uart0/按键),降低并发面;
BT_NORMAL量产固件则依赖产测程序保证测试窗口内无业务干扰。 __ble_dut_ops为全局 const 指针,模块初始化(init)在控制器任务上下文中执行,ioctrl调用应由同一任务串行发起;多任务并发调用ioctrl可能破坏测试状态机(头文件未提供加锁语义,调用方需自行保证串行)。
性能与运维考虑
- 测试吞吐:
bredr_bulk_change_rx_bulk()提供 BREDR 批量接收模式切换,用于高速吞吐测试场景;批量模式下接收路径绕过常规流控,吞吐量更高,但仅限测试态使用。 - 固件体积:
CONFIG_TEST_DUT_CODE/CONFIG_TEST_FCC_CODE/CONFIG_TEST_DUT_ONLY_BOX_CODE借助 LTO 常量折叠裁剪测试代码——量产固件可剔除 DUT/FCC 代码段以减小 ROM 占用并杜绝误入测试态;认证固件则保留完整测试代码。 - 产线节拍:定频 API 的单向设计(免恢复)与 PER 后的强制复位约定,都是为了简化产线自动化:每个工位的测试序列以"烧录→测试→复位"为单位,状态天然清零,无需运行期复杂的模式恢复逻辑。
- 可追溯性:
bt_testbox_ex_info_get_handle_register支持上报烧录码与 SDK 版本,产测系统可在测试日志中记录每台设备的固件版本与烧录信息,便于射频指标溯源与不良品分析。
扩展点
- 新增测试信息类型:在
TESTBOX_INFO_*枚举后追加新枚举值,并调用bt_testbox_ex_info_get_handle_register注册对应句柄,即可向测试盒暴露自定义设备信息(如温度、校准参数)。 - 自定义 BLE DUT 行为:
struct ble_dut_ops_t是接口抽象(btctrler_task.h 第 108-139 行),可通过替换__ble_dut_ops指向的实现扩展控制类型(在BLE_DUT_CTRL_TYPE中追加枚举),例如增加载波驻留时间、功率步进等产测专属命令。 - 特性开关组合:
CONFIG_BLE_HRATE_FEATURE(4K/8K)、CONFIG_BLE_CS_EN、CONFIG_BLE_VADV_EN提供 BLE 特性级裁剪(btcontroller_mode.h 第 63-75 行),认证固件可按被测特性组合开启,量产固件保持关闭。 - 产测触发方式:
BT_NORMAL固件可通过按键、串口指令、产测盒 IO 等多种外部方式调用bredr_set_dut_enble()/bt_fix_fre_api()/ble_fix_fre_api()进入测试态,触发源由应用层自由接入。
相关链接
- btcontroller_mode.h — 测试模式宏与 DUT 使用说明
- btctrler_task.h — BLE DUT 操作接口与参数结构
- btcontroller_modules.h — 测试代码裁剪常量
- 控制器任务调度与模块注册机制:参见控制器任务相关页面(
btctrler_task.h任务模块定义) - 蓝牙连接流程与 TWS 快速连接:参见连接管理相关页面(本页 DUT 流程依赖的
tws_cancle_all_noconn()/bt_cmd_prepare()属连接管理能力) - 产测烧录与量产流程:参见量产工具与烧录相关页面