单片机教程网

电脑版
提示:原网页已由神马搜索转码, 内容由www.51hei.com提供.
查看:4461|回复:1
打印上一主题下一主题

USB学习之HID报告篇--枚举

[复制链接]
跳转到指定楼层
楼主
ID:140343发表于 2016-9-25 11:20|只看该作者回帖奖励
主机请求命令,设备上传设备描述符,配置描述符,字符串描述符(可有可无),接口描述符,端点描述符。这些在上一篇详细学习了。在接口描述符里还需要上传一个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
}



沙发
ID:240600发表于 2020-11-23 22:40|只看该作者
注释好详细,收藏了

手机版|小黑屋|51黑电子论坛|51黑电子论坛6群QQ管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网