久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5482|回復: 1
收起左側

USB學習之HID報告篇--枚舉

[復制鏈接]
ID:140343 發(fā)表于 2016-9-25 11:20 | 顯示全部樓層 |閱讀模式
主機請求命令,設備上傳設備描述符,配置描述符,字符串描述符(可有可無),接口描述符,端點描述符。這些在上一篇詳細學習了。在接口描述符里還需要上傳一個HID報告描述符,這篇將解讀之。因報告描述符為整個HID設備的核心內容,分類解讀。
一、標準鍵盤:
       標準鍵盤一般都是使用8個byte上傳數(shù)據(jù)給主機。如此定義:
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
        //第一個字節(jié)定義      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),                代表每個數(shù)據(jù)是1bit*1                
        0x95, 0x08,       // Report Count (8),             總的個數(shù)有8個,也就是8*1bit剛好一個字節(jié)                  
        0x81, 0x02,        
// Input (Data, Variable, Absolute),   可變值,變量,絕對值
        //第二個字節(jié)定義   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),                 每個數(shù)據(jù)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)                物理特性
         //第一字節(jié)低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)                   可變量,變量,絕對值
         //第一字節(jié)高3位,保留位
         0x95, 0x01,                    //     REPORT_COUNT (1)
         0x75, 0x03,                    //     REPORT_SIZE (3)                        1*3bit
         0x81, 0x01,                   //     INPUT (Cnst,Var,Abs)                    常量,變量,絕對值

         //第二字節(jié)+第三字節(jié)低四位:X         第三字節(jié)高4位+第四字節(jié):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)                      每個數(shù)據(jù)12bit         
         0x95, 0x02,                    //     REPORT_COUNT (2)                    2*12bit=3byte
         0x81, 0x06,                    //     INPUT (Data,Var,Rel)                     可變量,變量,相對值(相對上次位移量)

         //第五字節(jié):滾輪Wheel
         0x09, 0x38,                    //     USAGE (Wheel)
         0x15, 0x81,                    //     LOGICAL_MINIMUM (-127)
         0x25, 0x7f,                     //     LOGICAL_MAXIMUM (127)          邏輯值為00~7F和FF~80
         0x75, 0x08,                    //     REPORT_SIZE (8)                       每個數(shù)據(jù)8bit
         0x95, 0x01,                    //     REPORT_COUNT (1)                  1*8bit=1byte
         0x81, 0x06,                   //     INPUT (Data,Var,Rel)                   可變量,變量,相對值

         0xc0,                              //   END_COLLECTION                        結束物理特性
         0xc0,                              // END_COLLECTION                          結束應用
};
三、系統(tǒng)電源:Power   Sleep    Wakeup
hid_systempower_report_descriptor  =
{
        0x05, 0x01,                   // Usage Page (Generic Desktop),
        0x09, 0x80,                  
// USAGE (System control)                系統(tǒng)電源在系統(tǒng)控制里

        0xa1, 0x01,                   // Collection (Application),
        0x85, 0x02,                   // Report ID (2)                                  報告ID
        0x05, 0x01,                   // Usage Page (Generic Desktop),    根據(jù)Table 3個系統(tǒng)鍵用途頁在01H

        //字節(jié)低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)                     可變量,變量,相對值
        //字節(jié)高5位保留
        0x95, 0x01,                   // Report Count (1),  
        0x75, 0x05,                   // Report Size (5),
        0x81, 0x01,                   // Input (Const,Ary,Abs)                    常量,數(shù)組,絕對值

        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)                數(shù)據(jù)位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個字節(jié)                            
         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)                         可變量,數(shù)組,絕對值
        
         0xc0,                             
// END_COLLECTION
};
五、游戲手柄(正在開發(fā),以下未驗證,做參考):
hid_joystick_report_descriptor =
{
         0x05, 0x01,                   //    Usage Page (Generic Desktop)
         0x09, 0x04,                   //    Usage (Joystick)    不明白joystick跟gamepad的區(qū)別
         0xA1, 0x01,                  //     Collection (Application)
         0xA1, 0x02,                  //     Collection (Logical)
         0x85, 0x04,                  
//     Report ID 4
        //前5個字節(jié):X、Y、Z、Rz和保留
         0x75, 0x08,                  //     Report Size (8)                  每個數(shù)據(jù)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)    可變量,變量,絕對值
         //第六字節(jié)低4位為苦力帽 01H~07H代表8個方向
         0x75, 0x04,                  //     Report Size (4)              每個數(shù)據(jù)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)  //空狀態(tài)參考P195
         
         //第六字節(jié)高4位+第七字節(jié) = 12位,代表12個按鍵
         0x65, 0x00,                  //     Unit (None)                     空組合
         0x75, 0x01,                  //     Report Size (1)              每個數(shù)據(jù)1bit
         0x95, 0x0C,                //     Report Count (12)         12個數(shù)據(jù)
         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 發(fā)表于 2020-11-23 22:40 | 顯示全部樓層
注釋好詳細,收藏了
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲一区二区电影网 | 久久精品在线免费视频 | 一级做a爰片久久毛片 | 久久久高清 | 日本粉嫩一区二区三区视频 | 国产精品一区二区三区四区 | 日韩视频―中文字幕 | 国产成人精品一区二区三区在线 | 亚州精品天堂中文字幕 | 91精品久久久久久久久中文字幕 | 精品综合久久 | 玖玖玖在线 | 美女网站视频免费黄 | 久久99精品久久久久久 | 亚洲成人av一区二区 | 日日做夜夜爽毛片麻豆 | 嫩草懂你的影院入口 | 91青娱乐在线 | 欧美在线观看一区 | 欧美一级二级三级视频 | 午夜视频在线免费观看 | 中文字幕乱码视频32 | 最新中文字幕第一页视频 | 久久蜜桃av一区二区天堂 | 午夜一级做a爰片久久毛片 精品综合 | 欧美精品一区二区三 | 亚洲欧美在线观看 | 日韩欧美手机在线 | 欧美一区不卡 | 在线观看国产网站 | 成年人网站国产 | 国产目拍亚洲精品99久久精品 | 天天干天天爱天天操 | 亚洲国产一区二区三区, | 午夜私人影院在线观看 | 亚洲日日夜夜 | 91精品久久久久久久久中文字幕 | 国产午夜精品一区二区三区四区 | 国产三级一区二区 | 亚洲一区二区免费视频 | 亚洲网址 |