USB設備驅動6:usb HID 報告描述符


在網上看了許多前輩的文章,就是無法理解報告描述符中的那些數字字符所表達的含義,幾經周折,總算大致了解了。

code char MouseReportDescriptor[63] = {    
    0x05, 0x01,                    // USAGE_PAGE (Generic Desktop)    
    0x09, 0x06,                  // USAGE (Keyboard)    
    0xa1, 0x01,                    // COLLECTION (Application)   

    0x05, 0x07,                    //   USAGE_PAGE (Keyboard)    
    0x19, 0xe0,                    //   USAGE_MINIMUM (Keyboard LeftControl)    
    0x29, 0xe7,                    //   USAGE_MAXIMUM (Keyboard Right GUI)    
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)    
    0x25, 0x01,                    //   LOGICAL_MAXIMUM (1)    
    0x75, 0x01,                    //   REPORT_SIZE (1)    
    0x95, 0x08,                    //   REPORT_COUNT (8)    
    0x81, 0x02,                    //   INPUT (Data,Var,Abs)  
    0x95, 0x01,                    //   REPORT_COUNT (1)    
    0x75, 0x08,                    //   REPORT_SIZE (8)    
    0x81, 0x03,                    //   INPUT (Cnst,Var,Abs) 

    0x95, 0x05,                    //   REPORT_COUNT (5)    
    0x75, 0x01,                    //   REPORT_SIZE (1)    
    0x05, 0x08,                    //   USAGE_PAGE (LEDs)    
    0x19, 0x01,                    //   USAGE_MINIMUM (Num Lock)    
    0x29, 0x05,                    //   USAGE_MAXIMUM (Kana)    
    0x91, 0x02,                    //   OUTPUT (Data,Var,Abs)   

    0x95, 0x01,                    //   REPORT_COUNT (1)    
    0x75, 0x03,                    //   REPORT_SIZE (3)    
    0x91, 0x03,                    //   OUTPUT (Cnst,Var,Abs) 

    0x95, 0x06,                    //   REPORT_COUNT (6)    
    0x75, 0x08,                    //   REPORT_SIZE (8)    
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)    
    0x25, 0xFF,                    //   LOGICAL_MAXIMUM (255)    
    0x05, 0x07,                    //   USAGE_PAGE (Keyboard)    
    0x19, 0x00,                    //   USAGE_MINIMUM (Reserved (no event indicated))    
    0x29, 0x65,                    //   USAGE_MAXIMUM (Keyboard Application)    
    0x81, 0x00,                    //   INPUT (Data,Ary,Abs)  

    0xc0                           // END_COLLECTION   

}; 

一般的,網文多是如上的報告描述符,據說是用一個工具產生的,有一些還配上了中文的說明,但也多是描述性的,而不是拆分解釋這些字符所代表的含義,比如,數組第一行的 0x05, 0x01,                    // USAGE_PAGE (Generic Desktop) 

我們一眼就能看出雙斜線后面的文字,是對前面數字的說明,即0x05,0x01所表達的是USAGE_PAGE (Generic Desktop) 的含義,但是,為何如此表達,則描述的不太清楚,對於熟悉的人而言,這自然不是問題,但對於新手,可就要費點功夫了。

 

0x05, 0x01,代表USAGE_PAGE (Generic Desktop) 的功能,是由《device class definition for human interface device (HID)》第24頁的Report Descriptors 規定的。

分兩部分,0x05為一部分,表示前綴,0x01為數據部分。

0x05轉換成二進制,就是0000  01001,按照HID類協議5.3 generic item format的定義,這個字節被分成3個部分,bit0~bit1代表的是這個前綴后面跟的數據長度,兩位可以表示最大4字節的數據,即bsize;bit2~bit3代表的是這個前綴的類型,總共可以有三種類型:0=main,1=global,2=local,3=reserved;bit4~bit7代表前綴的tag,一般分為input(二進制的1000 00 nn,即bit4~bit7=1000,代表一個tag,bit2~bit3=00,代表main,bit0~bit1=nn,代表這個前綴后面還有nn所代表的數據),output(二進制的 1001 00 nn),feature(1011 00 nn),collection(1010 00 nn),end collection(1100 00 nn),遵照這個原則,我們就可以解析0x05所表達的含義。

 

0x05轉換為二進制就是0000 0101,其高4位全為0,表示的tag為usage page  tag(協議45頁),bit2~bit3=01,表示的是類型,從協議中可以知道,這是一個全局類型的item(協議36頁),bit0~bit1=01,表示的是這個前綴后面跟着的數據長度為1字節,即0x05后面,有0x01作為這個前綴的數據部分,而0x01表示的是general desktop page(《universal serial bus HID usage table》第五頁,目錄),因此,這兩個數字合起來就是USAGE_PAGE (Generic Desktop)的含義。

 

總之,要了解報告描述符,需要兩份資料:《device class definition for human interface device (HID)》, 《Universal Serial Bus HID Usage Tables》


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM