feat(hid): 添加Vendor报告类型支持键盘掩码功能
- 新增REPORT_ID_VENDOR报告ID和相关常量定义 - 在HID报告描述符中添加Vendor页面的输入输出集合定义 - 更新BLE HID服务配置以支持3个输入报告和2个输出报告 - 实现hid_vendor_mask_event事件用于处理Vendor掩码数据 - 修改keyboard模块以支持物理状态和掩码状态分离 - 添加vendor_output_report_handler处理来自主机的掩码更新 - 更新CMakeLists.txt包含新的事件源文件 - 修改hid_tx_manager以支持Vendor报告的发送管理
This commit is contained in:
@@ -7,8 +7,20 @@
|
||||
enum {
|
||||
REPORT_ID_KEYBOARD = 1,
|
||||
REPORT_ID_CONSUMER = 3,
|
||||
REPORT_ID_VENDOR = 4,
|
||||
};
|
||||
|
||||
#define HID_KBD_USAGE_MAX 0x00E7U
|
||||
#define HID_KBD_MOD_COUNT 8U
|
||||
#define HID_KBD_BITMAP_BITS (HID_KBD_USAGE_MAX + 1U)
|
||||
#define HID_KBD_BITMAP_SIZE ((HID_KBD_BITMAP_BITS + 7U) / 8U)
|
||||
#define HID_KBD_PAYLOAD_SIZE (1U + HID_KBD_BITMAP_SIZE)
|
||||
#define HID_BOOT_KBD_PAYLOAD_SIZE 8U
|
||||
#define HID_CONSUMER_PAYLOAD_SIZE 2U
|
||||
#define HID_VENDOR_PAYLOAD_SIZE HID_KBD_PAYLOAD_SIZE
|
||||
#define HID_KBD_LED_PAYLOAD_SIZE 1U
|
||||
#define HID_FULL_REPORT_SIZE(payload) (1U + (payload))
|
||||
|
||||
/*
|
||||
* HID_USAGE_PAGE() 只支持 1 字节 Usage Page。
|
||||
* Vendor Defined Page(0xFF00) 需要 2 字节编码,因此在本地补一个 16 位版本,
|
||||
@@ -18,9 +30,12 @@ enum {
|
||||
HID_ITEM(HID_ITEM_TAG_USAGE_PAGE, HID_ITEM_TYPE_GLOBAL, 2), page_lsb, page_msb
|
||||
|
||||
/*
|
||||
* 键盘(NKRO) + Consumer 的复合 Report 描述符:
|
||||
* 键盘(NKRO) + Consumer + Vendor 的复合 Report 描述符:
|
||||
* - USB Report 接口和 BLE HIDS Report Map 统一使用这份定义,
|
||||
* 避免两边手写常量后长期演进出现不一致。
|
||||
* - Vendor Report 复用与 NKRO 键盘状态相同的 payload 结构:
|
||||
* [modifier(1B) | usage_bitmap(29B)]。
|
||||
* 这样主机可以下发“屏蔽遮罩”,设备也可以上报“真实键盘状态”。
|
||||
*/
|
||||
#define HID_DESC_KEYBOARD_NKRO_CONSUMER() \
|
||||
{ \
|
||||
@@ -44,7 +59,7 @@ enum {
|
||||
HID_LOGICAL_MIN8(0), \
|
||||
HID_LOGICAL_MAX8(1), \
|
||||
HID_REPORT_SIZE(1), \
|
||||
HID_REPORT_COUNT(0xE7 + 1), \
|
||||
HID_REPORT_COUNT(HID_KBD_BITMAP_BITS), \
|
||||
HID_INPUT(0x02), \
|
||||
\
|
||||
/* Report 协议下键盘 LED 输出(NumLock/CapsLock/ScrollLock/Compose/Kana)。 */ \
|
||||
@@ -74,6 +89,22 @@ enum {
|
||||
HID_REPORT_SIZE(16), \
|
||||
HID_REPORT_COUNT(1), \
|
||||
HID_INPUT(0x00), \
|
||||
HID_END_COLLECTION, \
|
||||
\
|
||||
/* Vendor 页:双向传输完整键盘状态/屏蔽遮罩,payload 结构与 NKRO 一致。 */ \
|
||||
HID_USAGE_PAGE16(0x00, 0xFF), \
|
||||
HID_USAGE(0x02U), \
|
||||
HID_COLLECTION(HID_COLLECTION_APPLICATION), \
|
||||
HID_REPORT_ID(REPORT_ID_VENDOR), \
|
||||
HID_LOGICAL_MIN8(0), \
|
||||
HID_LOGICAL_MAX16(0xFF, 0x00), \
|
||||
HID_REPORT_SIZE(8), \
|
||||
HID_REPORT_COUNT(HID_VENDOR_PAYLOAD_SIZE), \
|
||||
HID_USAGE(0x02U), \
|
||||
HID_INPUT(0x02), \
|
||||
HID_REPORT_COUNT(HID_VENDOR_PAYLOAD_SIZE), \
|
||||
HID_USAGE(0x02U), \
|
||||
HID_OUTPUT(0x02), \
|
||||
HID_END_COLLECTION, \
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user