feat(hids): 添加HID服务模块支持键盘和多媒体功能
- 新增hids_module.c实现蓝牙HID服务,支持键盘NKRO和Consumer控制 - 添加hid_report_descriptor.h定义统一的HID描述符,包括键盘、多媒体和RAW HID - 在CMakeLists.txt中注册hids模块源文件 - 配置prj.conf启用蓝牙HID相关配置项,设置设备名称和外观 - 修改main.c移除启动LED效果,简化主函数逻辑 - 添加settings_loader_def.h确保模块依赖正确加载 - 配置pm_static.yml分配flash存储空间给mcuboot和settings - 调整电源管理超时时间从20秒增加到300秒 - 启用MCUBOOT引导加载器支持
This commit is contained in:
104
inc/hid_report_descriptor.h
Normal file
104
inc/hid_report_descriptor.h
Normal file
@@ -0,0 +1,104 @@
|
||||
#ifndef HID_REPORT_DESCRIPTOR_H_
|
||||
#define HID_REPORT_DESCRIPTOR_H_
|
||||
|
||||
#include "hid_types.h"
|
||||
#include <zephyr/usb/class/usbd_hid.h>
|
||||
|
||||
/*
|
||||
* HID_USAGE_PAGE() 只支持 1 字节 Usage Page。
|
||||
* Vendor Defined Page(0xFF00) 需要 2 字节编码,因此在本地补一个 16 位版本,
|
||||
* 避免在描述符里混用裸字节,后续维护时可以一眼看出字段语义。
|
||||
*/
|
||||
#define HID_USAGE_PAGE16(page_lsb, page_msb) \
|
||||
HID_ITEM(HID_ITEM_TAG_USAGE_PAGE, HID_ITEM_TYPE_GLOBAL, 2), page_lsb, page_msb
|
||||
|
||||
/*
|
||||
* 键盘(NKRO) + Consumer 的复合 Report 描述符:
|
||||
* - USB Report 接口和 BLE HIDS Report Map 统一使用这份定义,
|
||||
* 避免两边手写常量后长期演进出现不一致。
|
||||
*/
|
||||
#define HID_DESC_KEYBOARD_NKRO_CONSUMER() \
|
||||
{ \
|
||||
/* Generic Desktop 页:声明这是一个 Keyboard Application 集合。 */ \
|
||||
HID_USAGE_PAGE(HID_USAGE_GEN_DESKTOP), \
|
||||
HID_USAGE(HID_USAGE_GEN_DESKTOP_KEYBOARD), \
|
||||
HID_COLLECTION(HID_COLLECTION_APPLICATION), \
|
||||
HID_REPORT_ID(REPORT_ID_KEYBOARD), \
|
||||
\
|
||||
/* Keyboard/Keypad 页:先定义 8bit Modifier,再定义 232bit NKRO 位图。 */ \
|
||||
HID_USAGE_PAGE(HID_USAGE_GEN_DESKTOP_KEYPAD), \
|
||||
HID_USAGE_MIN8(0xE0), \
|
||||
HID_USAGE_MAX8(0xE7), \
|
||||
HID_LOGICAL_MIN8(0), \
|
||||
HID_LOGICAL_MAX8(1), \
|
||||
HID_REPORT_SIZE(1), \
|
||||
HID_REPORT_COUNT(8), \
|
||||
HID_INPUT(0x02), \
|
||||
HID_USAGE_MIN8(0x00), \
|
||||
HID_USAGE_MAX8(0xE7), \
|
||||
HID_LOGICAL_MIN8(0), \
|
||||
HID_LOGICAL_MAX8(1), \
|
||||
HID_REPORT_SIZE(1), \
|
||||
HID_REPORT_COUNT(0xE7 + 1), \
|
||||
HID_INPUT(0x02), \
|
||||
\
|
||||
/* Report 协议下键盘 LED 输出(NumLock/CapsLock/ScrollLock/Compose/Kana)。 */ \
|
||||
HID_USAGE_PAGE(0x08U), \
|
||||
HID_USAGE_MIN8(0x01), \
|
||||
HID_USAGE_MAX8(0x05), \
|
||||
HID_LOGICAL_MIN8(0), \
|
||||
HID_LOGICAL_MAX8(1), \
|
||||
HID_REPORT_SIZE(1), \
|
||||
HID_REPORT_COUNT(5), \
|
||||
HID_OUTPUT(0x02), \
|
||||
/* 补齐到 1 字节:3bit padding,标记为常量。 */ \
|
||||
HID_REPORT_SIZE(3), \
|
||||
HID_REPORT_COUNT(1), \
|
||||
HID_OUTPUT(0x01), \
|
||||
HID_END_COLLECTION, \
|
||||
\
|
||||
/* Consumer 页:使用 16bit Usage 承载多媒体按键(音量/播放/亮度等)。 */ \
|
||||
HID_USAGE_PAGE(0x0CU), \
|
||||
HID_USAGE(0x01U), \
|
||||
HID_COLLECTION(HID_COLLECTION_APPLICATION), \
|
||||
HID_REPORT_ID(REPORT_ID_CONSUMER), \
|
||||
HID_LOGICAL_MIN8(0), \
|
||||
HID_LOGICAL_MAX16(0xEA, 0x00), \
|
||||
HID_USAGE_MIN16(0x00, 0x00), \
|
||||
HID_USAGE_MAX16(0xEA, 0x00), \
|
||||
HID_REPORT_SIZE(16), \
|
||||
HID_REPORT_COUNT(1), \
|
||||
HID_INPUT(0x00), \
|
||||
HID_END_COLLECTION, \
|
||||
}
|
||||
|
||||
/*
|
||||
* RAW HID 的固定 64 字节输入/输出描述符。
|
||||
* 设计意图:
|
||||
* - 采用 Vendor Defined(0xFF00) 页,避免与标准键盘/多媒体语义冲突;
|
||||
* - IN/OUT 都固定 64 字节,便于固件与上位机用定长帧做双向透传;
|
||||
* - 不使用 Report ID,接口只承载一个 RAW Report,减少主机端解析分支。
|
||||
*/
|
||||
#define HID_DESC_RAW_64() \
|
||||
{ \
|
||||
/* Vendor Defined 页(0xFF00):供厂商私有协议传输,不绑定标准 HID 语义。 */ \
|
||||
HID_USAGE_PAGE16(0x00, 0xFF), \
|
||||
HID_USAGE(0x01), \
|
||||
HID_COLLECTION(HID_COLLECTION_APPLICATION), \
|
||||
HID_LOGICAL_MIN8(0), \
|
||||
HID_LOGICAL_MAX16(0xFF, 0x00), \
|
||||
HID_REPORT_SIZE(8), \
|
||||
\
|
||||
/* 输入页:定义 64 字节 Input 报文,Data|Var|Abs(0x02) 与原描述符一致。 */ \
|
||||
HID_REPORT_COUNT(0x40), \
|
||||
HID_USAGE(0x01), \
|
||||
HID_INPUT(0x02), \
|
||||
\
|
||||
/* 输出页:定义 64 字节 Output 报文,与输入长度对齐,简化双向协议。 */ \
|
||||
HID_REPORT_COUNT(0x40), \
|
||||
HID_USAGE(0x01), \
|
||||
HID_OUTPUT(0x02), \
|
||||
HID_END_COLLECTION, \
|
||||
}
|
||||
|
||||
#endif
|
||||
17
inc/settings_loader_def.h
Normal file
17
inc/settings_loader_def.h
Normal file
@@ -0,0 +1,17 @@
|
||||
/*
|
||||
* Defines modules that must reach READY before CAF settings_loader
|
||||
* calls settings_load().
|
||||
*/
|
||||
|
||||
/* Enforce single inclusion in the final link unit. */
|
||||
const struct {} settings_loader_def_include_once;
|
||||
|
||||
#include <caf/events/module_state_event.h>
|
||||
|
||||
static inline void get_req_modules(struct module_flags *mf)
|
||||
{
|
||||
module_flags_set_bit(mf, MODULE_IDX(main));
|
||||
#ifdef CONFIG_CAF_BLE_STATE
|
||||
module_flags_set_bit(mf, MODULE_IDX(ble_state));
|
||||
#endif
|
||||
}
|
||||
Reference in New Issue
Block a user