找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2198|回复: 1
打印 上一主题 下一主题
收起左侧

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

[复制链接]
跳转到指定楼层
楼主
51hei小林 发表于 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
}



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享分享 分享淘帖 顶 踩
回复

使用道具 举报

沙发
穿山跃海 发表于 2020-11-23 22:40 | 只看该作者
注释好详细,收藏了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

Powered by 单片机教程网

快速回复 返回顶部 返回列表