|
主机请求命令,设备上传设备描述符,配置描述符,字符串描述符(可有可无),接口描述符,端点描述符。这些在上一篇详细学习了。在接口描述符里还需要上传一个HID报告描述符,这篇将解读之。因报告描述符为整个HID设备的核心内容,分类解读。
一、标准键盘: 标准键盘一般都是使用8个byte上传数据给主机。如此定义: hid_keyboard_report_descriptor =
{
0x05, 0x01, // Usage Page (Generic Desktop), 用途页
0x09, 0x06, // Usage (Keyboard), 定义用途为键盘
0xA1, 0x01, // Collection (Application), Collection开始,应用开始 0x85, 0x01, // Report ID (1) 报告ID
0x05, 0x07, // Usage Page (Key Codes); 普通按键为07H 多媒体为0CH 电源键为01H //第一个字节定义 Modifier byte
0x19, 0xE0, // Usage Minimum (224),
0x29, 0xE7, // Usage Maximum (231), 用途范围从0XE0至0XE7,Table里对应8个控制
0x15, 0x00, // Logical Minimum (0),
0x25, 0x01, // Logical Maximum (1), 逻辑范围为0-1,因为位操作,只能0或1
0x75, 0x01, // Report Size (1), 代表每个数据是1bit*1
0x95, 0x08, // Report Count (8), 总的个数有8个,也就是8*1bit刚好一个字节
0x81, 0x02, // Input (Data, Variable, Absolute), 可变值,变量,绝对值 //第二个字节定义 Reserved byte 0x95, 0x01, // Report Count (1), 1byte
0x75, 0x08, // Report Size (8), 8*1bit=1byte
0x81, 0x03, // Input (Constant,Variable,Absolute), 常量,变量,绝对值
//此为LED输出位,按相应的键,主机将返回灯的对应位,点亮该灯 0x95, 0x05, // Report Count (5), 总的有5个灯,5*1bit
0x75, 0x01, // Report Size (1), 每个数据1bit
0x05, 0x08, // Usage Page (LEDs), 定义灯的用途页
0x19, 0x01, // Usage Minimum (1), 用途范围NumLock、Cap Lock、Scroll Lock、Compose、Kana
0x29, 0x05, // Usage Maximum (5),
0x91, 0x02, // Output (Data, Variable, Absolute), 输出 可变值,变量,绝对值
//剩下的3位保留,但也要定义成输出 0x95, 0x01, // Report Count (1),
0x75, 0x03, // Report Size (3), 3*1bit
0x91, 0x03, // Output (Constant), ;LED report padding //余下6byte为标准键盘键码,不包括多媒体按键和电源按键,因为Usage Page不一样
0x95, 0x06, // Report Count (6), 6*1byte=6byte
0x75, 0x08, // Report Size (8), 8*1bit=1byte
0x15, 0x00, // Logical Minimum (0), 逻辑范围 从00H到FFH
0x25, 0xff, // Logical Maximum(255),
0x05, 0x07, // Usage Page (Key Codes), 用途页为键盘
0x19, 0x00, // Usage Minimum (0), 逻辑范围从00H到FFH
0x29, 0xff, // Usage Maximum (255),
0x81, 0x00, // Input (Data, Array), ;Key arrays (6 bytes)
0xC0 // End Collection 结束应用,必须要有开始和结束
}; 二、16位鼠标 hid_mouse_report_descriptor =
{
0x05, 0x01, // USAGE_PAGE (Generic Desktop) 用途页
0x09, 0x02, // USAGE (Mouse) 总用途为鼠标
0xa1, 0x01, // COLLECTION (Application) 应用
0x85, 0x01, // Report ID (1) 报告ID
0x09, 0x01, // USAGE (Pointer) 应用为指针
0xa1, 0x00, // COLLECTION (Physical) 物理特性
//第一字节低5位,5个按键 0x05, 0x09, // USAGE_PAGE (Button) 按键:左键,右键,中键 0x19, 0x01, // USAGE_MINIMUM (Button 1)
0x29, 0x05, // USAGE_MAXIMUM (Button 5) 从button1~button5
0x15, 0x00, // LOGICAL_MINIMUM (0) 逻辑范围0-1,只能位0或位1
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x95, 0x05, // REPORT_COUNT (5) 5*1bit
0x75, 0x01, // REPORT_SIZE (1) 1bit
0x81, 0x02, // INPUT (Data,Var,Abs) 可变量,变量,绝对值 //第一字节高3位,保留位
0x95, 0x01, // REPORT_COUNT (1)
0x75, 0x03, // REPORT_SIZE (3) 1*3bit
0x81, 0x01, // INPUT (Cnst,Var,Abs) 常量,变量,绝对值
//第二字节+第三字节低四位:X 第三字节高4位+第四字节:Y
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x30, // USAGE (X)
0x09, 0x31, // USAGE (Y)
0x16, 0x01, 0xF8, // Logical Minimum (-2047)
0x26, 0xFF, 0x07, // Logical Maximum (2047) 逻辑值从-2047至2047 16位鼠标值
0x75, 0x0C, // REPORT_SIZE (12) 每个数据12bit
0x95, 0x02, // REPORT_COUNT (2) 2*12bit=3byte
0x81, 0x06, // INPUT (Data,Var,Rel) 可变量,变量,相对值(相对上次位移量)
//第五字节:滚轮Wheel
0x09, 0x38, // USAGE (Wheel)
0x15, 0x81, // LOGICAL_MINIMUM (-127)
0x25, 0x7f, // LOGICAL_MAXIMUM (127) 逻辑值为00~7F和FF~80
0x75, 0x08, // REPORT_SIZE (8) 每个数据8bit
0x95, 0x01, // REPORT_COUNT (1) 1*8bit=1byte
0x81, 0x06, // INPUT (Data,Var,Rel) 可变量,变量,相对值
0xc0, // END_COLLECTION 结束物理特性
0xc0, // END_COLLECTION 结束应用
};
三、系统电源:Power Sleep Wakeup hid_systempower_report_descriptor =
{
0x05, 0x01, // Usage Page (Generic Desktop),
0x09, 0x80, // USAGE (System control) 系统电源在系统控制里
0xa1, 0x01, // Collection (Application),
0x85, 0x02, // Report ID (2) 报告ID
0x05, 0x01, // Usage Page (Generic Desktop), 根据Table 3个系统键用途页在01H
//字节低3位有效
0x19, 0x81, // Usage Minimum (Powerdown),
0x29, 0x83, // Usage Maximum (Wakeup), 用途从Powerdown到Wakeup
0x15, 0x00, // Logical Minimum (0), 逻辑值为0-1,因为bit只能0或1
0x25, 0x01, // Logical Maximum (1),
0x95, 0x03, // Report Count (3), 共用了3*1bit
0x75, 0x01, // Report Size (1), 1bit
0x81, 0x06, // Input (Data,Var,Rel) 可变量,变量,相对值 //字节高5位保留
0x95, 0x01, // Report Count (1),
0x75, 0x05, // Report Size (5),
0x81, 0x01, // Input (Const,Ary,Abs) 常量,数组,绝对值
0xc0, // END_COLLECTION 结束应用}; 四:多媒体按键 1、映射表方式 hid_Multimedia_report_descriptor = { 0x05 , 0x0C, // USAGE_PAGE (Consumer Devices) 用途页:0CH
0x09 , 0x01, // USAGE (Consumer Control)
0xA1 , 0x01, // COLLECTION (Application)
0x85 , 0x03, // REPORT_ID (3)
0x15 , 0x00, // LOGICAL_MINIMUM (0)
0x25 , 0x01, // LOGICAL_MAXIMUM (1) 逻辑值0-1
0x75 , 0x01, // REPORT_SIZE (1) 数据位1bit
0x95 , 0x12, // REPORT_COUNT (18) 18*1bit
//18个对应的映射表
0x0A , 0x94 , 0x01, // USAGE (My Computer) 0
0x0A , 0x92 , 0x01, // USAGE (AL Calculator) 1
0x0A , 0x83 , 0x01, // USAGE (Media) 2
0x0A , 0x23 , 0x02, // USAGE (WWW Home) 3
0x0A , 0x8A , 0x01, // USAGE (AL Email) 4
0x0A , 0x2A , 0x02, // USAGE (AC Favorite) 5
0x0A , 0x21 , 0x02, // USAGE (AC Search) 6
0x0A , 0x24 , 0x02, // USAGE (AC Back) 7
0x0A , 0x25 , 0x02, // USAGE (AC Forward) 8
0x0A , 0x26 , 0x02, // USAGE (AC Stop) 9
0x0A , 0x27 , 0x02, // USAGE (AC Refresh) 10
0x09 , 0xB6, // USAGE (Scan Previous Track) 11
0x09 , 0xB5, // USAGE (Scan Next Track) 12
0x09 , 0xB7, // USAGE (Stop) 13
0x09 , 0xCD, // USAGE (Play) 14
0x09 , 0xE9, // USAGE (Volume Up) 15
0x09 , 0xEA, // USAGE (Volume Down) 16
0x09 , 0xE2, // USAGE (Mute) 17
0x81 , 0x02, // INPUT (Data,Var,Abs) 可变量,变量,绝对值 //剩下6个保留位,注意上面增减这里也要更改
0x95 , 0x01, // REPORT_COUNT (1)
0x75 , 0x06, // REPORT_SIZE (6) 18+6=24bit=3byte 所以上面更改长度,这也需要相应的更改
0x81 , 0x03, // INPUT (Cnst,Var,Abs) 常量,变量,绝对值
0xC0, // END_COLLECTION}; 2、标准格式: hid_Multimedia_report_descriptor = { 0x05, 0x0c, // USAGE_PAGE (Consumer Devices)
0x09, 0x01, // USAGE (Consumer Control)
0xa1, 0x01, // COLLECTION (Application)
0x85, 0x03, // Report ID (3) //需要2个字节
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x26, 0x80, 0x03, // LOGICAL_MAXIMUM (0380H)
0x19, 0x00, // Usage Minimum (0)
0x2a, 0x80, 0x03, // Usage Maximum (0380H)
0x75, 0x10, // REPORT_SIZE (0x10) 2*16bit=2byte
0x95, 0x01, // REPORT_COUNT (1)
0x81, 0x00, // Input (Data,Ary,Abs) 可变量,数组,绝对值
0xc0, // END_COLLECTION }; 五、游戏手柄(正在开发,以下未验证,做参考): hid_joystick_report_descriptor =
{
0x05, 0x01, // Usage Page (Generic Desktop)
0x09, 0x04, // Usage (Joystick) 不明白joystick跟gamepad的区别
0xA1, 0x01, // Collection (Application)
0xA1, 0x02, // Collection (Logical)
0x85, 0x04, // Report ID 4 //前5个字节:X、Y、Z、Rz和保留
0x75, 0x08, // Report Size (8) 每个数据8*1bit=1byte
0x95, 0x05, // Report Count (5) 5byte
0x15, 0x00, // Logical Minimum (0)
0x26, 0xFF, 0x00, // Logical Maximum (255)
0x35, 0x00, // Physical Minimum (0)
0x46, 0xFF, 0x00, // Physical Maximum (255)
0x09, 0x30, // Usage (X)
0x09, 0x31, // Usage (Y)
0x09, 0x32, // Usage (Z)
0x09, 0x35, // Usage (Rz)
0x09, 0x00, // Usage (Undefined)
0x81, 0x02, // Input (Data, Variable, Absolute) 可变量,变量,绝对值 //第六字节低4位为苦力帽 01H~07H代表8个方向
0x75, 0x04, // Report Size (4) 每个数据4bit
0x95, 0x01, // Report Count (1) 1*4bit
0x25, 0x07, // Logical Maximum (7) 逻辑值从01H~07H
0x46, 0x3B, 0x01, // Physical Maximum (315) 不理解
0x65, 0x14, // Unit (Degrees) 8个角度的集合
0x09, 0x39, // Usage (Hat switch) 用途苦力帽
0x81, 0x42, // Input (Data, Variable, Absolute, Null State) //空状态参考P195 //第六字节高4位+第七字节 = 12位,代表12个按键
0x65, 0x00, // Unit (None) 空组合
0x75, 0x01, // Report Size (1) 每个数据1bit
0x95, 0x0C, // Report Count (12) 12个数据
0x25, 0x01, // Logical Maximum (1) 逻辑范围0~1
0x45, 0x01, // Physical Maximum (1)
0x05, 0x09, // Usage Page (Button) 用途页为按键
0x19, 0x01, // Usage Minimum (1) button1~button12
0x29, 0x0C, // Usage Maximum (12)
0x81, 0x02, // Input (Data, Variable, Absolute) 可变量,变量,绝对值
0xC0, // End Collection
//不清楚干嘛用,也许是输出马达
0xA1, 0x02, // Collection (Logical)
0x75, 0x08, // Report Size (8)
0x95, 0x04, // Report Count (4)
0x46, 0xFF, 0x00, // Physical Maximum (255)
0x26, 0xFF, 0x00, // Logical Maximum (255)
0x09, 0x02, // Usage (Reserved)
0x91, 0x02, // Output (Data, Variable, Absolute)
0xC0, // End Collection
0xC0, // End Collection}
|
|