闲暇就玩USB之: USB鼠标和键盘

本文介绍了如何创建不支持boot的USB HID键盘的Report Descriptor,详细解释了Descriptor中的关键术语,并提供了简化版Descriptor示例。通过示例,展示了如何定义一个仅支持一个字节输入的键盘Descriptor,以及如何利用USAGE_MINIMUM和USAGE_MAXIMUM定义键的范围。此外,还探讨了Report ID在支持多个设备时的作用,并给出了同时支持键盘和鼠标的Descriptor例子。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

其实这个问题很多人都玩过了,而且HID Spec上有标准例子,但是USB鼠标和键盘的确很有意思,而且俺还尝试了一点和别人不一样的东西,在此以记之。

HID SPEC上讲的键盘和鼠标都是支持boot的,就是可以被Bios支持的,比如在开机的时候设置Bios的时候就可以用。因此那个Report Descriptor真的是相当的复杂啊,都63个字节了,就差一个字节就超过俺的EP0的Max Pack Size。其实介绍Report Descriptor的最好网络文章是《USB/HID设备报告描述符详解》,看用词像个台湾同胞写的,可以在下列地址阅读:

http://blog.chinaunix.net/u2/63560/showart.php?id=1900045

其实这个似乎都还是比较复杂,我做了一个不支持boot的键盘的Report Descriptor,只支持一个字节的输入,其实一个字节也是可以输入101个键的,HID Spec里面的Descriptor其实是支持6个键同时输入的,所以用了6个字节。下面俺的简陋型HID Descriptor就是这个样子的:

char HidBoardReportDescriptor[23] = {
    0x05, 0x01,                    // USAGE_PAGE (Generic Desktop)
    0x09, 0x06,                    // USAGE (Keyboard)
    0xa1, 0x01,                    // COLLECTION (Application)
    0x05, 0x07,                    //   USAGE_PAGE (Keyboard)
    0x19, 0x1E,                    //   USAGE_MINIMUM (Keyboard ! and 1)
    0x29, 0x25,                    //   USAGE_MAXIMUM (Keyboard * and 8)

    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
    0x25, 0xff,                    //   LOGICAL_MAXIMUM (255)
    0x75, 0x08,                    //   REPORT_SIZE (8)
    0x95, 0x01,                    //   REPORT_COUNT (1)
    0x81, 0x00,                    //   INPUT (Data,Ary,Abs)
    0xc0                           // END_COLLECTION
};

Descriptor中的几个术语大概是这个意思,俺的通俗理解:

Usage Page:相当于用法类别,或者功能类别,用我的地址做比较,相当于“北京市海淀区”的“北京市”

Usage:相当于具体的用法,比如“海淀区”,一个完整的用法需要Usage Page和Usage配合才能完整表达,用地址类比一下。。。好像不能用“北京市海淀区”,海淀区中国只听说过这一个!比如说“石门坎”吧,云贵川有几百个地方叫“石门坎”,因此必须说明“四川省宁南县华弹镇石门坎”才有意义,兄弟,扯得有点远了!

由于Usage Page是全局的,因此只声明一次就行了,除非下面要什么新的Usage Page。而Usage是要一个一个的声明的。但是101个键要写101次太麻烦,因此使用USAG

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值