国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設(shè)計 > 正文

USB HID報告及報告描述符簡介

2019-11-11 02:27:59
字體:
供稿:網(wǎng)友

http://www.baiheee.com/Documents/081126/081126115257.htm

USB HID報告及報告描述符簡介

 

在USB中,USB HOST是通過各種描述符來識別設(shè)備的,有設(shè)備描述符,配置描述符,接口描述符,端點描述符,字符串描述符,報告描述符等等。USB報告描述符(Report Descriptor)是HID設(shè)備中的一個描述符,它是比較復雜的一個描述符。

    USB HID設(shè)備是通過報告來給傳送數(shù)據(jù)的,報告有輸入報告和輸出報告。輸入報告是USB設(shè)備發(fā)送給主機的,例如USB鼠標將鼠標移動和鼠標點擊等信息返回給電腦,鍵盤將按鍵數(shù)據(jù)數(shù)據(jù)返回給電腦等;輸出報告是主機發(fā)送給USB設(shè)備的,例如鍵盤上的數(shù)字鍵盤鎖定燈和大寫字母鎖定燈等。報告是一個數(shù)據(jù)包,里面包含的是所要傳送的數(shù)據(jù)。輸入報告是通過中斷輸入端點輸入的,而輸出報告有點區(qū)別,當沒有中斷輸出端點時,可以通過控制輸出端點0發(fā)送,當有中斷輸出端點時,通過中斷輸出端點發(fā)出。

    而報告描述符,是描述一個報告以及報告里面的數(shù)據(jù)是用來干什么用的。通過它,USB HOST可以分析出報告里面的數(shù)據(jù)所表示的意思。它通過控制輸入端點0返回,主機使用獲取報告描述符命令來獲取報告描述符,注意這個請求是發(fā)送到接口的,而不是到設(shè)備。一個報告描述符可以描述多個報告,不同的報告通過報告ID來識別,報告ID在報告最前面,即第一個字節(jié)。當報告描述符中沒有規(guī)定報告ID時,報告中就沒有ID字段,開始就是數(shù)據(jù)。更詳細的說明請參看USB HID協(xié)議,該協(xié)議可從Http://www.usb.org下載。

    USB報告描述符可以通過使用HID Descriptor tool來生成,這個工具可以到Http://www.usb.org下載,為了方便大家,我順便上傳了一份。

http://www.ednchina.com/Upload/Blog/2007/4/2/af7c3443-ad61-4465-adc7-a74d28bbc322.zip

    下面通過由HID Descriptor tool生成的USB鼠標和USB鍵盤來說明一下報告描述符和報告。

 code char KeyBoardReportDescriptor[63] = {       //表示用途頁為通用桌面設(shè)備       0x05, 0x01,                    // USAGE_PAGE (Generic Desktop)         //表示用途為鍵盤       0x09, 0x06,                    // USAGE (Keyboard)              //表示應(yīng)用集合,必須要以END_COLLECTION來結(jié)束它,見最后的END_COLLECTION       0xa1, 0x01,                    // COLLECTION (application)              //表示用途頁為按鍵       0x05, 0x07,                    //   USAGE_PAGE (Keyboard)         //用途最小值,這里為左ctrl鍵       0x19, 0xe0,                    //   USAGE_MINIMUM (Keyboard LeftControl)       //用途最大值,這里為右GUI鍵,即window鍵       0x29, 0xe7,                    //   USAGE_MAXIMUM (Keyboard Right GUI)       //邏輯最小值為0       0x15, 0x00,                    //   LOGICAL_MINIMUM (0)       //邏輯最大值為1       0x25, 0x01,                    //   LOGICAL_MAXIMUM (1)       //報告大小(即這個字段的寬度)為1bit,所以前面的邏輯最小值為0,邏輯最大值為1       0x75, 0x01,                    //   REPORT_SIZE (1)       //報告的個數(shù)為8,即總共有8個bits       0x95, 0x08,                    //   REPORT_COUNT (8)       //輸入用,變量,值,絕對值。像鍵盤這類一般報告絕對值,       //而鼠標移動這樣的則報告相對值,表示鼠標移動多少       0x81, 0x02,                    //   INPUT (Data,Var,Abs)       //上面這這幾項描述了一個輸入用的字段,總共為8個bits,每個bit表示一個按鍵       //分別從左ctrl鍵到右GUI鍵。這8個bits剛好構(gòu)成一個字節(jié),它位于報告的第一個字節(jié)。       //它的最低位,即bit-0對應(yīng)著左ctrl鍵,如果返回的數(shù)據(jù)該位為1,則表示左ctrl鍵被按下,       //否則,左ctrl鍵沒有按下。最高位,即bit-7表示右GUI鍵的按下情況。中間的幾個位,       //需要根據(jù)HID協(xié)議中規(guī)定的用途頁表(HID Usage Tables)來確定。這里通常用來表示       //特殊鍵,例如ctrl,shift,del鍵等               //這樣的數(shù)據(jù)段個數(shù)為1       0x95, 0x01,                    //   REPORT_COUNT (1)       //每個段長度為8bits       0x75, 0x08,                    //   REPORT_SIZE (8)       //輸入用,常量,值,絕對值       0x81, 0x03,                    //   INPUT (Cnst,Var,Abs)              //上面這8個bit是常量,設(shè)備必須返回0           //這樣的數(shù)據(jù)段個數(shù)為5       0x95, 0x05,                    //   REPORT_COUNT (5)       //每個段大小為1bit       0x75, 0x01,                    //   REPORT_SIZE (1)       //用途是LED,即用來控制鍵盤上的LED用的,因此下面會說明它是輸出用       0x05, 0x08,                    //   USAGE_PAGE (LEDs)       //用途最小值是Num Lock,即數(shù)字鍵鎖定燈       0x19, 0x01,                    //   USAGE_MINIMUM (Num Lock)       //用途最大值是Kana,這個是什么燈我也不清楚^_^       0x29, 0x05,                    //   USAGE_MAXIMUM (Kana)       //如前面所說,這個字段是輸出用的,用來控制LED。變量,值,絕對值。       //1表示燈亮,0表示燈滅       0x91, 0x02,                    //   OUTPUT (Data,Var,Abs)         //這樣的數(shù)據(jù)段個數(shù)為1       0x95, 0x01,                    //   REPORT_COUNT (1)       //每個段大小為3bits       0x75, 0x03,                    //   REPORT_SIZE (3)       //輸出用,常量,值,絕對       0x91, 0x03,                    //   OUTPUT (Cnst,Var,Abs)           //由于要按字節(jié)對齊,而前面控制LED的只用了5個bit,       //所以后面需要附加3個不用bit,設(shè)置為常量。               //報告?zhèn)€數(shù)為6       0x95, 0x06,                    //   REPORT_COUNT (6)       //每個段大小為8bits       0x75, 0x08,                    //   REPORT_SIZE (8)       //邏輯最小值0       0x15, 0x00,                    //   LOGICAL_MINIMUM (0)       //邏輯最大值255       0x25, 0xFF,                    //   LOGICAL_MAXIMUM (255)       //用途頁為按鍵       0x05, 0x07,                    //   USAGE_PAGE (Keyboard)       //使用最小值為0       0x19, 0x00,                    //   USAGE_MINIMUM (Reserved (no event indicated))       //使用最大值為0x65       0x29, 0x65,                    //   USAGE_MAXIMUM (Keyboard Application)       //輸入用,變量,數(shù)組,絕對值       0x81, 0x00,                    //   INPUT (Data,Ary,Abs)       //以上定義了6個8bit寬的數(shù)組,每個8bit(即一個字節(jié))用來表示一個按鍵,所以可以同時       //有6個按鍵按下。沒有按鍵按下時,全部返回0。如果按下的鍵太多,導致鍵盤掃描系統(tǒng)       //無法區(qū)分按鍵時,則全部返回0x01,即6個0x01。如果有一個鍵按下,則這6個字節(jié)中的第一       //個字節(jié)為相應(yīng)的鍵值(具體的值參看HID Usage Tables),如果兩個鍵按下,則第1、2兩個       //字節(jié)分別為相應(yīng)的鍵值,以次類推。           //關(guān)集合,跟上面的對應(yīng)       0xc0                           // END_COLLECTION   };   

      通過上面的分析,我們知道這個報告中只有一個報告,所以沒有報告ID,因此返回的都是實際使用的數(shù)據(jù)。總共有8字節(jié)輸入,1字節(jié)輸出。其中輸入的第一字節(jié)用來表示特殊按鍵,第二字節(jié)保留,后面的六字節(jié)為普通按鍵。如果只有左ctrl鍵按下,則返回01 00 00 00 00 00 00 00(十六進制),如果只有數(shù)字鍵1 按下,則返回00 00 59 00 00 00 00 00,如果數(shù)字鍵1 和2 同時按下,則返回00 00 59 5A 00 00 00 00,如果再按下左shift 鍵,則返回02 00 59 5A 00 00 00 00,然后再釋放1   鍵,則返回02 00 5A 00 00 00 00 00,然后全部按鍵釋放,則返回00 00 00 00 00 00 00 00。這些數(shù)據(jù)(即報告)都是通過中斷端點返回的。當按下Num Lock鍵時,PC會發(fā)送輸出報告,從報告描述符中我們知道,Num Lock的LED對應(yīng)著輸出報告的最低位,當數(shù)字小鍵盤打開時,輸出xxxxxxx1(二進制,打x的由其它的LED狀態(tài)決定);當數(shù)字小鍵盤關(guān)閉時,輸出xxxxxxx0(同前)。取出最低位就可以控制數(shù)字鍵鎖定LED了。 

下面這個報告描述符是USB鼠標報告描述符,比起鍵盤的來說要簡單些。它描述了4個字節(jié),第一個字節(jié)表示按鍵,第二個字節(jié)表示x軸(即鼠標左右移動,0表示不動,正值表示往右移,負值表示往左移),第三個字節(jié)表示y軸(即鼠標上下移動,0表示不動,正值表示往下移動,負值表示往上移動),第四個字節(jié)表示鼠標滾輪(正值為往上滾動,負值為往下滾動)。

 code char MouseReportDescriptor[52] = {       //通用桌面設(shè)備       0x05, 0x01,                    // USAGE_PAGE (Generic Desktop)       //鼠標       0x09, 0x02,                    // USAGE (Mouse)       //集合       0xa1, 0x01,                    // COLLECTION (Application)       //指針設(shè)備       0x09, 0x01,                    //   USAGE (Pointer)       //集合       0xa1, 0x00,                    //   COLLECTION (Physical)       //按鍵       0x05, 0x09,                    //     USAGE_PAGE (Button)       //使用最小值1       0x19, 0x01,                    //     USAGE_MINIMUM (Button 1)       //使用最大值3。1表示左鍵,2表示右鍵,3表示中鍵       0x29, 0x03,                    //     USAGE_MAXIMUM (Button 3)       //邏輯最小值0       0x15, 0x00,                    //     LOGICAL_MINIMUM (0)       //邏輯最大值1       0x25, 0x01,                    //     LOGICAL_MAXIMUM (1)       //數(shù)量為3       0x95, 0x03,                    //     REPORT_COUNT (3)       //大小為1bit       0x75, 0x01,                    //     REPORT_SIZE (1)       //輸入,變量,數(shù)值,絕對值       //以上3個bit分別表示鼠標的三個按鍵情況,最低位(bit-0)為左鍵       //bit-1為右鍵,bit-2為中鍵,按下時對應(yīng)的位值為1,釋放時對應(yīng)的值為0       0x81, 0x02,                    //     INPUT (Data,Var,Abs)         //填充5個bit,補足一個字節(jié)       0x95, 0x01,                    //     REPORT_COUNT (1)       0x75, 0x05,                    //     REPORT_SIZE (5)       0x81, 0x03,                    //     INPUT (Cnst,Var,Abs)         //用途頁為通用桌面       0x05, 0x01,                    //     USAGE_PAGE (Generic Desktop)       //用途為X       0x09, 0x30,                    //     USAGE (X)       //用途為Y       0x09, 0x31,                    //     USAGE (Y)       //用途為滾輪       0x09, 0x38,                    //     USAGE (Wheel)       //邏輯最小值為-127       0x15, 0x81,                    //     LOGICAL_MINIMUM (-127)       //邏輯最大值為+127       0x25, 0x7f,                    //     LOGICAL_MAXIMUM (127)       //大小為8個bits       0x75, 0x08,                    //     REPORT_SIZE (8)       //數(shù)量為3個,即分別代表x,y,滾輪       0x95, 0x03,                    //     REPORT_COUNT (3)       //輸入,變量,值,相對值       0x81, 0x06,                    //     INPUT (Data,Var,Rel)         //關(guān)集合       0xc0,                          //   END_COLLECTION       0xc0                           // END_COLLECTION   };   

 通過對上面的報告分析,我們知道報告返回4個字節(jié),沒有報告ID。如果鼠標左鍵按下,則返回01 00 00 00(十六進制值),如果右鍵按下,則返回02 00 00 00,如果中鍵按下,則返回04 00 00 00,如果三個鍵同時按下,則返回07 00 00 00。如果鼠標往右移動則第二字節(jié)返回正值,值越大移動速度越快。其它的類推。

 這里只對報告描述符做一個簡單的介紹,更詳細的資料請參看USB HID協(xié)議以及HID Usage Tables,可以從Http://www.usb.org下載。

根據(jù)這個實際設(shè)計的USB鍵盤和USB鼠標:

USB鍵盤:http://computer00.21ic.org/user1/2198/archives/2007/36484.html

http://www.ednchina.com/blog/computer00/20134/message.aspx

USB鼠標:http://computer00.21ic.org/user1/2198/archives/2007/36520.html

http://www.ednchina.com/blog/computer00/20135/message.aspx

溫馨提示:

  百合電子工作室有一個關(guān)于USB開發(fā)方面的開源項目-Easy USB 51 PRogramer,整個開發(fā)過程寫得非常詳細,不防參考一下,您還可以進入她的論壇參與此項目的討論。

   
 相關(guān)文章:
USB入門系列之一 —— USB概述USB入門系列之二 —— USB的連接模型[圖]USB入門系列之三 —— USB的電氣特性USB入門系列之四 —— USB的線纜以及插頭、插座[圖]USB入門系列之五 —— USB設(shè)備的插入檢測機制[圖]USB入門系列之六 —— USB設(shè)備的枚舉過程USB入門系列之七 —— USB的描述符及各種描述符之間的依賴關(guān)系USB HID 設(shè)備類協(xié)議入門

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 孟州市| 通化县| 凤山市| 东兴市| 平陆县| 塘沽区| 鹿泉市| 蚌埠市| 乐都县| 水城县| 虎林市| 丘北县| 波密县| 广宗县| 广水市| 南江县| 白银市| 延寿县| 上高县| 万年县| 新营市| 瓮安县| 宁远县| 柳河县| 五指山市| 泰安市| 大同市| 荆州市| 通渭县| 滕州市| 宜兰县| 泰州市| 湘潭县| 左贡县| 昌吉市| 大足县| 遂昌县| 青铜峡市| 合山市| 驻马店市| 乐清市|