1. 项目概述
最近在研究NRF DESKTOP项目的代码结构,发现其中几个关键模块的实现方式很有意思。作为一个经常接触嵌入式开发的工程师,我想分享一下对其中两个核心模块的分析心得——hids.c和usb_state.c。这两个文件分别负责BLE HID服务和USB设备的初始化工作,是设备与外设通信的基础。
在Nordic的SDK架构中,模块化设计思想贯穿始终。每个功能模块通常由一个头文件(.h)和一个源文件(.c)组成,这种设计使得代码结构清晰,便于维护和扩展。今天要讨论的这两个文件就是典型代表,它们虽然功能不同,但在初始化流程和设计模式上有很多共通之处。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心模块解析
2.1 BLE HID服务初始化(hids.c)
hids.c文件实现了BLE HID(Human Interface Device)服务的初始化逻辑。HID over BLE是蓝牙低功耗协议中的一个重要profile,允许设备作为键盘、鼠标等输入设备使用。
在NRF SDK中,HID服务的初始化通常包含以下几个关键步骤:
- 服务结构体定义:
c复制BLE_HIDS_DEF(m_hids, NRF_SDH_BLE_TOTAL_LINK_COUNT);
这行代码定义了HID服务实例,NRF_SDH_BLE_TOTAL_LINK_COUNT参数指定了支持的最大连接数。这种宏定义方式使得修改连接数配置非常方便。
- 特征值初始化:
HID服务包含多个特征值,如协议模式、报告映射、输入/输出报告等。每个特征值都需要单独配置属性和权限。例如:
c复制static ble_hids_init_t hids_init_obj = {
.info_report_id = 0,
.report_map_len = sizeof(report_map),
.p_report_map = report_map,
// 其他特征值初始化...
};
- 安全设置:
BLE HID通常需要设置适当的安全级别,以防止未授权访问:
c复制hids_init_obj.security_mode_write_perm = SEC_JUST_WORKS;
hids_init_obj.security
