杰理 SDK 文档中心
首页
首页
  • 项目概览

    • SDK 简介与核心特性
    • 芯片平台与硬件资料
    • SDK 版本与发布信息
  • 快速开始

    • 环境搭建与工具链
    • 编译工程
    • 烧录与量产工具
  • 工程结构与构建系统

    • 工程目录布局
    • 构建与链接配置
  • 应用层开发

    • mbox_flash 应用框架
    • 板级支持包 (BSP)
    • 公共应用模块
    • UI 显示子系统
  • 蓝牙子系统

    • BLE 控制器、链路层与 HCI 传输
    • GATT 服务框架
    • BLE 应用示例:遥控器 / Dongle / 对讲机
    • 经典蓝牙支持
  • 音频子系统

    • 音频编解码器
    • 音频设备接口 (DAC / ADC / APA)
    • 音效处理与 EQ
    • 播放、录音与 MIO 工作流
  • 设备与文件系统

    • 存储设备驱动 (NorFlash / SDMMC / USB)
    • 文件系统 (FAT / nor_fs / SYDF)
    • 设备管理框架 (dev_mg)
  • 系统服务与电源管理

    • 消息机制 (msg / hot_msg)
    • 配置与参数存储 (app_config / VM)
    • 电源管理 (SOFT OFF / POWER DOWN)
  • 固件升级

    • 升级框架总览 (code_v1 / code_v2)
    • 双 Bank 升级机制
    • 升级通道:UART / 测试盒 / BLE OTA / USB / SD
  • 补丁包与版本维护

    • 版本升级补丁链 (v1.1.0 → v1.4.0)
    • 问题修复补丁
    • 固件裁剪与资源优化
  • 开发工具与支持

    • 辅助工具与脚本
    • 文档、配置说明与常见问题

BLE 应用示例:遥控器 / Dongle / 对讲机

本文档介绍 AW30N BLE SDK 中三个典型 BLE 应用示例的实现:基于 HID Over GATT (HOGP) 的遥控器(Consumer Control 键盘)、负责扫描并接收 HID 数据的 Dongle(HID only scan),以及基于 2.4G 射频的对讲机音频双向传输(audio_rf_trans)。三个示例共用同一套 bt_common 应用框架,覆盖了 BLE 从"广播/扫描 → 连接 → 数据传输"的完整链路。

Purpose and Scope

本页面向需要基于 AW30N 开发 BLE 外设(遥控器、接收器、语音对讲设备)的嵌入式工程师,说明:

  • bt_common/hid 应用框架的入口与工程组织方式;
  • 遥控器示例(examples/keyboard)的 HID 报告映射、按键表与 BLE 初始化流程;
  • Dongle 示例(examples/hid_only_scan)的职责边界;
  • 对讲机示例(audio_rf_trans)的音频 RF 收发模块划分。

有意留待其他页面的内容:BLE 协议栈(btstack / btctrler)的内部机制、ble_test 测试用例、各 config/ 目录下的配置文件细节,请参见对应的协议栈与配置类目录页。本页聚焦"应用示例如何调用框架 API 实现具体产品形态",不展开协议栈底层实现。

Overview

AW30N 的 BLE 应用统一构建在 sdk/apps/app/bsp/common/bt_common/ 之下,按产品形态划分为多个示例。所有示例共享同一入口模型:app_main.c 定义应用任务,通过编译宏(如 TRANS_DATA_HID_EN、CONFIG_APP_KEYBOARD)裁剪出不同示例的代码路径。

三种示例在 BLE 体系中的角色截然不同:

示例角色数据方向核心机制
遥控器 (keyboard)HOGP 服务端(Peripheral)上行:按键 → HID ReportConsumer Control 报告 + GATT Notification
Dongle (hid_only_scan)HOGP 客户端(Central/扫描端)下行:接收 HID Report 并转发只扫描、连接后收取报告
对讲机 (audio_rf_trans)点对点 RF 音频链路双向:ADC 采集 → RF → DAC 播放音频打包/解包 + RF 收发队列

设计意图:SDK 用"一套框架 + 多个示例目录"的方式复用底层 BLE 栈与音频通路,产品开发只需选择对应示例目录、修改报告映射与按键表即可快速定型;对讲机路径则完全绕开 BLE,走独立的 2.4G RF 音频通道,避免蓝牙协议栈的时延与带宽限制。

Architecture

三个示例在 SDK 中的目录结构与依赖关系如下(节点名对应真实文件/模块):

flowchart TD
    subgraph sg_HidApp["bt_common/hid 应用框架"]
        Main["app_main.c(应用入口)"]
        Cfg["hid_app_config.h(宏裁剪)"]
    end

    subgraph sg_Remote["遥控器示例 examples/keyboard"]
        KeyTable["hid_key_click_table / hid_key_hold_table"]
        ReportMap["hidkey_report_map(Consumer Control)"]
        BleCfg["hidkey_ble_config"]
        Start["hidkey_app_start()"]
        Callback["hid_keyboard_recv_callback()"]
    end

    subgraph sg_Dongle["Dongle 示例 examples/hid_only_scan"]
        Scan["ble_only_scan.c(只扫描并接收)"]
    end

    subgraph sg_Talk["对讲机 audio_rf_trans"]
        Send["audio2rf_send.c + trans_packet.c"]
        Queue["rf_send_queue.c + rf_pa_port.c"]
        Recv["rf2audio_recv.c + trans_unpacket.c"]
    end

    Main --> Cfg
    Cfg --> Start
    KeyTable --> ReportMap
    ReportMap --> BleCfg
    BleCfg --> Start
    Start --> Callback
    Start -->|"HOGP 服务(GATT)"| Scan
    Main --> Send
    Send --> Queue
    Queue --> Recv

架构要点说明:

  • 遥控器:app_hid_comm.c 中静态定义报告映射与按键表,hidkey_app_start() 在应用启动时完成 PLL 时钟配置、btstack_ble_start_before_init() 注册 BLE 配置、le_hogp_set_reconnect_adv_cfg() 设置定向重连广播、le_hogp_set_output_callback() 注册下行数据回调,最后 btstack_init() 启动协议栈。整条链路由宏 TRANS_DATA_HID_EN 与 CONFIG_APP_KEYBOARD 双重裁剪。
  • Dongle:ble_only_scan.c 位于 hid 示例树的独立目录,职责是作为扫描端连接遥控器并接收其 HID 报告,随后转发给主机(Host)——与遥控器构成"服务端/客户端"配对关系。
  • 对讲机:audio_rf_trans 目录按功能拆分文件——发送(audio2rf_send + 打包 trans_packet)、排队与功放控制(rf_send_queue + rf_pa_port)、接收(rf2audio_recv + 解包 trans_unpacket)、总体管理(audio_rf_mge)。该路径与 BLE 栈解耦,适合对时延敏感的全双工语音场景。

核心流程

遥控器按键上报流程

sequenceDiagram
    participant U as 用户按键
    participant T as 按键表映射
    participant A as hidkey_app_start
    participant H as HOGP 服务
    participant P as 对端设备(手机/主机)

    U->>T: 按键事件(8 键位)
    T->>T: 查 hid_key_click_table / hid_key_hold_table
    T->>A: 得到 Consumer Usage(如 CONSUMER_VOLUME_INC)
    A->>H: 按 Report Map 组装 HID Report
    H->>P: GATT Notification(HID Report 特征)
    P-->>A: (可选下行)hid_keyboard_recv_callback 回调

对讲机音频收发流程

flowchart LR
    subgraph sg_Send["本端(发送方向)"]
        ADC["音频 ADC 采集"] --> S1["audio2rf_send.c"]
        S1 --> S2["trans_packet.c 打包"]
        S2 --> S3["rf_send_queue.c 发送队列"]
        S3 --> S4["rf_pa_port.c 功放控制"]
        S4 --> RF1["2.4G RF 发射"]
    end

    subgraph sg_Recv["对端(接收方向)"]
        RF2["2.4G RF 接收"] --> R1["rf2audio_recv.c"]
        R1 --> R2["trans_unpacket.c 解包"]
        R2 --> DAC["音频 DAC 播放"]
    end

    RF1 -->|"空中射频帧"| RF2

对讲机链路的设计意图:发送方向"采集 → 打包 → 排队 → 发射"、接收方向"接收 → 解包 → 播放"严格分离,便于分别优化缓冲区与功率控制;rf_send_queue 的存在说明 RF 发射是异步、可积压的,队列深度直接决定抗拥塞能力。

遥控器示例实现详解(examples/keyboard)

HID 报告映射(Report Map)

遥控器的核心是 HID 报告描述符。示例使用 Consumer Control (Usage Page 0x0C) 报告,把 8 个按键位映射为音量、播放/暂停、静音、上下曲、快进快退等消费类用法:

static const u8 hidkey_report_map[] = {
    0x05, 0x0C,        // Usage Page (Consumer)
    0x09, 0x01,        // Usage (Consumer Control)
    0xA1, 0x01,        // Collection (Application)
    0x85, 0x01,        //   Report ID (1)
    0x09, 0xE9,        //   Usage (Volume Increment)
    0x09, 0xEA,        //   Usage (Volume Decrement)
    0x09, 0xCD,        //   Usage (Play/Pause)
    0x09, 0xE2,        //   Usage (Mute)
    0x09, 0xB6,        //   Usage (Scan Previous Track)
    0x09, 0xB5,        //   Usage (Scan Next Track)
    0x09, 0xB3,        //   Usage (Fast Forward)
    0x09, 0xB4,        //   Usage (Rewind)
    0x15, 0x00,        //   Logical Minimum (0)
    0x25, 0x01,        //   Logical Maximum (1)
    0x75, 0x01,        //   Report Size (1)
    0x95, 0x10,        //   Report Count (16)
    0x81, 0x02,        //   Input (Data,Var,Abs,...)
    0xC0,              // End Collection
    // 35 bytes
};

Source: app_hid_comm.c

设计意图:选择 Consumer Control 页而非普通键盘页,是因为遥控器面向媒体控制场景,报告仅 35 字节、16 bit 位域即覆盖全部按键,空域开销极小;Logical Minimum=0 / Maximum=1 配合 16 位报告,让每个按键位独立表达"按下/释放"状态。

按键映射表(click / hold 双表)

示例把物理按键抽象为两张 8 项表:hid_key_click_table(单击)与 hid_key_hold_table(长按/按住),支持同一按键"短按一个功能、长按另一个功能"的消费类遥控器惯例:

// consumer key
#define CONSUMER_VOLUME_INC             0x0001
#define CONSUMER_VOLUME_DEC             0x0002
#define CONSUMER_PLAY_PAUSE             0x0004
#define CONSUMER_MUTE                   0x0008
#define CONSUMER_SCAN_PREV_TRACK        0x0010
#define CONSUMER_SCAN_NEXT_TRACK        0x0020
#define CONSUMER_SCAN_FRAME_FORWARD     0x0040
#define CONSUMER_SCAN_FRAME_BACK        0x0080

//----------------------------------
static const u16 hid_key_click_table[8] = {
    CONSUMER_PLAY_PAUSE,
    CONSUMER_SCAN_PREV_TRACK,
    CONSUMER_VOLUME_DEC,
    CONSUMER_SCAN_NEXT_TRACK,
    CONSUMER_VOLUME_INC,
    CONSUMER_MUTE,
    0,
    0,
};

static const u16 hid_key_hold_table[8] = {
    0,
    CONSUMER_SCAN_FRAME_BACK,
    CONSUMER_VOLUME_DEC,
    CONSUMER_SCAN_FRAME_FORWARD,
    CONSUMER_VOLUME_INC,
    0,
    0,
    0,
};

Source: app_hid_comm.c

设计意图:双表机制把"物理按键"与"逻辑功能"解耦——硬件改键只需改表项顺序;表中 0 表示该键位无对应功能。注意音量键在 click 与 hold 表中都出现,这使"按住连续调节音量"成为可能,而播放/暂停、静音仅响应单击,避免误触发。

BLE 初始化配置与启动

示例通过 ble_init_cfg_t 结构把报告映射与外观声明注册进协议栈,然后在 hidkey_app_start() 中依次完成时钟、重连广播、回调注册与协议栈启动:

static const ble_init_cfg_t hidkey_ble_config = {
    .same_address = 0,
    .appearance = BLE_APPEARANCE_HID_KEYBOARD,
    .report_map = hidkey_report_map,
    .report_map_size = sizeof(hidkey_report_map),
};

static int hid_keyboard_recv_callback(u8 *buffer, u16 size);
static void hidkey_app_start()
{
    log_info("-------------HID DEMO-----------------");

#if TCFG_USER_BLE_ENABLE
    /* wl_and_clk 1:std_48m;wl2adc_clk/wl2dac_clk 2:pll_96m */
    SFR(JL_CLOCK->PRP_CON2, 0, 2, 1);
    SFR(JL_CLOCK->PRP_CON2, 2, 2, 2);
    SFR(JL_CLOCK->PRP_CON2, 4, 2, 2);
    SFR(JL_CLOCK->PRP_CON2, 8, 1, 1);
    asm("csync");

    bt_pll_para(48000000, 48000000, 0, 0);

    btstack_ble_start_before_init(&hidkey_ble_config, 0);
    le_hogp_set_reconnect_adv_cfg(ADV_DIRECT_IND_LOW, 5000);
    //注册hogp数据接收回调函数
    le_hogp_set_output_callback(hid_keyboard_recv_callback);

    btstack_init();
#endif
}

Source: app_hid_comm.c

逐行说明(设计意图):

  1. same_address = 0:BLE 与经典蓝牙使用不同地址,避免与 EDR 场景地址冲突;
  2. appearance = BLE_APPEARANCE_HID_KEYBOARD:通告外观类型,帮助对端(手机/主机)在连接前就识别设备类别;
  3. SFR(PRP_CON2, ...) 时钟配置:显式把 RF 相关时钟切到标准 48M / PLL 96M,保证射频与音频采样时钟对齐,这是音频/HID 混用的关键;
  4. bt_pll_para(48M, 48M, ...):锁定 PLL 参数,避免低功耗模式切换时频偏;
  5. le_hogp_set_reconnect_adv_cfg(ADV_DIRECT_IND_LOW, 5000):断线后使用低占空比定向广播重连,5 秒超时,兼顾重连速度与功耗;
  6. le_hogp_set_output_callback():注册下行(对端 → 设备)数据回调,示例中为 hid_keyboard_recv_callback,用于接收对端发来的 HID 输出报告(如 LED 指示);
  7. btstack_init():正式启动协议栈任务,之后 HOGP 服务开始广播并接受连接。

应用入口与内存布局(app_main.c)

HID 应用入口在 app_main.c,其关键点是把 BLE 相关的全局数据放入专用段,并初始化应用状态变量:

static int _bt_nv_ram_min[BT_NV_RAM_SIZE / 4] sec_used(.sec_bt_nv_ram);//最少占用

APP_VAR app_var;

void app_var_init(void)
{
    app_var.play_poweron_tone = 1;
    app_var.auto_off_time =  0; //TCFG_AUTO_SHUT_DOWN_TIME;
    app_var.warning_tone_v = 340;
    app_var.poweroff_tone_v = 330;
}

Source: app_main.c

设计意图:sec_used(.sec_bt_nv_ram) 把蓝牙 NV RAM(配对信息等)固定在独立段,保证协议栈掉电保存数据不被应用数据覆盖;app_var_init() 集中管理开机提示音、自动关机时间等产品化参数,厂商可在不改动框架代码的前提下调整行为。文件头部还通过 #pragma bss_seg/.data_seg/.const_seg/.code_seg(".ble_app_*") 将整个 HID 应用代码/数据段隔离,便于链接器规划内存布局与低功耗管理(见 app_main.c)。

Dongle 示例(examples/hid_only_scan)

Dongle 示例位于 HID 示例树的独立目录 hid/examples/hid_only_scan/ble_only_scan.c,与遥控器示例(examples/keyboard)并列。从目录命名与示例组织结构可以确定其职责:

  • 只扫描(only scan):作为 BLE Central 主动扫描遥控器等 HID 外设的广播,不参与广播发起;
  • 连接后收取 HID 报告:与遥控器的 HOGP 服务建立 GATT 连接,订阅 HID Report 特征,把按键数据接收下来;
  • 转发给主机:Dongle 的典型产品形态是"无线接收器"——一端通过 BLE 收遥控器数据,另一端通过 USB/串口/HID over USB 上报给 PC 或机顶盒主机。
flowchart TD
    Sub["遥控器(HID 服务端)"] -->|"广播/定向重连"| Scan["ble_only_scan.c 扫描"]
    Scan --> Conn["GATT 连接 + 订阅 HID Report"]
    Conn --> Report["接收 HID 报告"]
    Report --> Host["USB/串口转发到主机"]

与遥控器的配对关系:遥控器使用 le_hogp_set_reconnect_adv_cfg(ADV_DIRECT_IND_LOW, 5000) 发起定向重连广播,Dongle 侧对应地需要响应这类定向广播并建立连接——两者构成典型的"外设 + 接收器"产品组合。

说明:本页撰写时未展开 ble_only_scan.c 的逐行实现;以上职责划分依据目录结构(hid_only_scan 与 keyboard 并列于 examples/ 下)与 HID 应用框架的通用流程得出。如需深入该文件,请直接阅读 ble_only_scan.c。

对讲机示例(audio_rf_trans)

对讲机(语音双向传输)示例位于 sdk/apps/app/bsp/common/audio_rf_trans/,是一个与 BLE 协议栈完全解耦的 2.4G RF 音频通道。目录内文件按职责划分:

文件职责(依据文件命名与目录结构)
audio_rf_mge.c音频 RF 传输的总体管理(初始化、任务调度、状态协调)
audio2rf_send.c发送方向:把音频数据送入 RF 链路
rf2audio_recv.c接收方向:从 RF 链路取出音频数据
trans_packet.c / trans_unpacket.c空中帧的打包 / 解包(协议编解码)
rf_send_queue.c发送队列管理(缓冲积压、流量控制)
rf_pa_port.c射频功放(PA)端口控制(发射使能/功率)

设计意图与工程要点:

  1. 收发分离:audio2rf_send 与 rf2audio_recv 独立成文件,使全双工对讲的发送/接收通路可以独立调优缓冲区与中断优先级,互不阻塞;
  2. 打包/解包对称设计:trans_packet 与 trans_unpacket 成对出现,表明空中帧协议有严格的对称性——任何一侧的帧格式变更必须同步另一侧,这是点对点 RF 链路的常见约束;
  3. 队列解耦:rf_send_queue 把"音频采集"与"RF 发射"在时间上解耦。当 RF 信道忙或 PA 退避时,音频帧先入队,避免丢帧;队列深度即抗拥塞能力上限;
  4. PA 端口独立:rf_pa_port 单独管理功放,便于针对不同天线/发射功率做硬件适配,且可在低占空比对讲时快速关断 PA 省电。

说明:本页撰写时未逐行读取上述文件;表格中职责依据文件名与 audio_rf_trans 目录结构推断,属于该目录的模块级索引。对讲机具体帧格式、队列深度等实现细节,请直接阅读 audio_rf_trans 目录。

Configuration Options

三个示例通过编译宏与配置结构控制行为,主要选项如下:

选项类型默认/典型值说明
TRANS_DATA_HID_EN编译宏0/1HID 透传数据总开关;app_main.c 与 app_hid_comm.c 均以此宏包住整个 HID 应用代码
CONFIG_APP_KEYBOARD编译宏0/1选择键盘(遥控器)示例代码路径,并引入 edr_hid_user.h、standard_hid.h 等头文件
TCFG_USER_BLE_ENABLE编译宏0/1用户 BLE 功能使能;关闭时 hidkey_app_start() 的协议栈初始化整体跳过
RCSP_BTMATE_EN编译宏0/1RCSP(杰理私有协议)使能,用于手机 App 联调/OTA,见 app_hid_comm.c 头部条件包含
ble_init_cfg_t.same_addressu80BLE 是否与 EDR 使用同一地址;示例置 0
ble_init_cfg_t.appearance枚举BLE_APPEARANCE_HID_KEYBOARD通告中的外观类型,对端据此识别设备类别
ble_init_cfg_t.report_mapu8*hidkey_report_mapHID 报告描述符指针
ble_init_cfg_t.report_map_sizeu1635报告描述符字节数
le_hogp_set_reconnect_adv_cfg 参数(u8, u32)(ADV_DIRECT_IND_LOW, 5000)重连广播类型与超时(ms);示例用低占空比定向广播
app_var.auto_off_timeu320自动关机时间(s),0 表示禁用
app_var.play_poweron_toneu81开机是否播放提示音
app_var.warning_tone_v / poweroff_tone_vu16340 / 330低电/关机提示音音量

配置来源:app_hid_comm.c 与 app_main.c

API Reference

以下 API 均为遥控器示例中直接调用的框架接口(签名以示例调用方式为准):

btstack_ble_start_before_init(const ble_init_cfg_t *cfg, u8 param)

在协议栈初始化前注册 BLE 配置(报告映射、外观等)。示例传 &hidkey_ble_config 与 0。必须在 btstack_init() 之前调用。

参数:

  • cfg (const ble_init_cfg_t *):BLE 初始化配置,含 same_address、appearance、report_map、report_map_size;
  • param (u8):保留参数,示例传 0。

调用时机: 完成 RF 时钟配置(SFR(PRP_CON2,...)、bt_pll_para())之后、btstack_init() 之前。

le_hogp_set_reconnect_adv_cfg(u8 adv_type, u32 adv_timeout)

设置 HOGP 断线重连的广播类型与超时。示例使用 ADV_DIRECT_IND_LOW(低占空比定向广播)+ 5000 ms 超时,兼顾重连速度与功耗。

le_hogp_set_output_callback(void *cb)

注册 HOGP 下行数据接收回调(对端 → 设备方向)。示例注册 hid_keyboard_recv_callback(u8 *buffer, u16 size),用于接收对端发来的输出报告。

btstack_init()

启动 BTStack 协议栈任务,之后 HOGP 服务开始广播并接受连接。示例在注册完所有回调后最后调用。

bt_pll_para(u32 osc, u32 sys, u8 low_power, u8 xosc)

配置蓝牙 PLL 参数。示例传 (48000000, 48000000, 0, 0),将振荡器与系统时钟锁定为 48M,避免低功耗切换导致频偏。

app_var_init(void)

初始化应用全局变量 app_var(开机提示音、自动关机时间、提示音音量)。由应用启动流程调用,见 app_main.c。

Failure Modes, Edge Cases & Concurrency

断线重连

遥控器断线后依赖 ADV_DIRECT_IND_LOW 定向广播重连,5 秒超时。边界情况:

  • 若对端(Dongle/手机)在 5 秒内未响应定向广播,设备将停止重连广播,需上层策略(如用户按键)触发重新进入可连接状态;
  • 定向广播只对上次连接的设备地址有效,换设备连接需先清除配对信息(NV RAM 中保存)。

时钟配置错误导致 RF 异常

hidkey_app_start() 中 SFR(JL_CLOCK->PRP_CON2, ...) 与 bt_pll_para() 是强制的时序依赖:若跳过,RF 时钟可能停留在非标准频率,表现为扫描/连接不稳定。修改时钟源(如改用 24M 晶振)时必须同步调整 bt_pll_para 参数。

宏裁剪导致的空入口

TRANS_DATA_HID_EN、CONFIG_APP_KEYBOARD、TCFG_USER_BLE_ENABLE 任一关闭,对应代码路径整体不编译(hidkey_app_start 内部被 #if 隔离)。切换示例时若发现"编译通过但无行为",应先检查这三个宏的组合。

对讲机 RF 发送队列拥塞

rf_send_queue.c 的存在表明 RF 发射异步可积压。当信道占用或 PA 退避导致队列满时,音频帧将丢失(对讲机场景通常容忍短时丢帧以换取实时性);全双工对讲需保证收发通路各自独立,避免接收中断长时间阻塞发送队列。

并发与内存布局

  • _bt_nv_ram_min[BT_NV_RAM_SIZE / 4] 使用专用段 .sec_bt_nv_ram,协议栈与应用对 NV RAM 的访问天然隔离,避免配对信息被应用数据覆盖;
  • 整个 HID 应用通过 #pragma *seg(".ble_app_*") 独立分段,链接器可将其放入特定 RAM 区域(低功耗/掉电保持场景),修改段布局时需同步调整链接脚本,否则会出现未定义符号或覆盖冲突。

Performance & Operational Considerations

  • 报告尺寸最优:遥控器报告描述符仅 35 字节、报告体 16 bit,单个 GATT Notification 即可承载,空中开销小、响应快;
  • 低功耗重连:ADV_DIRECT_IND_LOW 相比 ADV_IND 占空比更低(示例注释中给出了切换 ADV_IND, 5000 的备选方案),批量生产/长时间待机场景建议保持 LOW 模式;
  • 对讲机实时性:audio_rf_trans 路径绕开 BLE 协议栈,直接走 2.4G RF + 音频通路,是低时延语音的首选;BLE 路径用于控制/数据,两条链路可并行;
  • 调试入口:HID 示例开启了 LOG_ERROR/DEBUG/INFO/CLI(见 app_hid_comm.c),可用日志 tag [HID_KEY] 过滤运行日志。

Extension Points

  1. 自定义按键功能:修改 hid_key_click_table / hid_key_hold_table 两张表即可重映射 8 个键位的单击/长按行为,无需改动协议栈代码;
  2. 扩展报告描述符:若需要普通键盘键(如方向键、媒体键之外的按键),在 hidkey_report_map 中追加 Usage 并调整 Report Count/Report Size,同时更新 report_map_size;
  3. 更换设备外观:修改 ble_init_cfg_t.appearance(如 BLE_APPEARANCE_HID_MOUSE)可让对端按鼠标/键盘等不同类别枚举设备;
  4. 下行控制:通过 le_hogp_set_output_callback 注册的回调实现 LED 指示、锁键等对端 → 设备控制功能;
  5. 对讲机硬件适配:rf_pa_port.c 独立管理功放,适配不同天线/功率等级时只改该文件;rf_send_queue 深度可按音频采样率与 RF 带宽调整。

Tests

SDK 未在示例目录内提供独立单元测试;示例本身即"可运行参考实现",验证方式为编译后烧录并配合对端设备联调:

  • 遥控器:使用手机 BLE 调试工具(或杰理 RCSP App,RCSP_BTMATE_EN 使能时)连接,验证音量/播放等 Consumer 用法是否生效、断线后 5 秒内重连是否成功;
  • Dongle:与遥控器配对,验证报告接收与转发到主机的链路;
  • 对讲机:双设备互通,验证全双工语音时延与丢帧表现(可调整 rf_send_queue 深度对比)。

Related Links

  • HID 应用配置目录 config/ — 各 lib_*_config.c 为协议栈/驱动裁剪配置,属于配置类页面的范围
  • BLE 测试用例 ble_test/ — ble_master / ble_slave 透传测试,与示例应用互补,参见 BLE 测试相关页面
  • 音频 RF 传输 audio_rf_trans/ — 对讲机链路全部源码
  • 遥控器示例 app_hid_comm.c — 本页核心参考文件
  • HID 应用入口 app_main.c — 任务入口与内存布局
  • Dongle 扫描示例 ble_only_scan.c
Prev
GATT 服务框架
Next
经典蓝牙支持