USB裝置驅動6 usb HID 報告描述符

2021-09-08 14:21:37 字數 2802 閱讀 8615

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

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) 

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 inte***ce 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 inte***ce device (hid)》, 《universal serial bus hid usage tables》

USB裝置驅動

1.linux usb架構 usb通訊都是由host端發起的。usb裝置驅動程式分配並初始化乙個urb發給usb core,usb core改一改,發給usb主機控制器驅動,usb主機控制器驅動把它解析成包,在匯流排上進行傳送。usb core是由核心實現的,其實也就是把host control d...

USB裝置驅動

把usb裝置接到pc 右下角彈出 發現android phone 跳出乙個對話方塊,提示你安裝驅動程式 問1.既然還沒有 驅動程式 為何能知道是 android phone 答1.windows裡已經有了usb的匯流排驅動程式,接入usb裝置後,是 匯流排驅動程式 知道你是 android phon...

linux裝置驅動 USB

系統核心中有usb匯流排驅動程式,作用是識別裝置,查詢並安裝裝置驅動程式,提供讀寫函式 當乙個usb裝置插入時,會有以下操作 1.某條線被拉低,硬體感知有裝置接入 2.usb匯流排驅動程式為裝置分配新位址,並告訴usb裝置 3.獲取描述符 4.根據獲取的裝置描述符中的資訊在usb匯流排中新增devi...