USB-HID鼠標、鍵盤通訊格式【轉】


轉自:https://blog.csdn.net/techhome803/article/details/9928873

轉自:http://www.amobbs.com/forum.php?mod=viewthread&tid=4823160&page=1&authorid=249202

想用STM32做個無線鍵鼠遙控、找了好幾天沒有找到完整的USB鼠標鍵盤協議介紹。最后自己收集整理了一份,希望對需要的朋友有所幫助。

廢話不多說,進入正題:

鼠標發送給PC的數據每次4個字節
BYTE1 BYTE2 BYTE3 BYTE4
定義分別是:
BYTE1 --
       |--bit7:   1   表示   Y   坐標的變化量超出-256   ~   255的范圍,0表示沒有溢出 
       |--bit6:   1   表示   X   坐標的變化量超出-256   ~   255的范圍,0表示沒有溢出 
       |--bit5:   Y   坐標變化的符號位,1表示負數,即鼠標向下移動 
       |--bit4:   X   坐標變化的符號位,1表示負數,即鼠標向左移動 
       |--bit3:     恆為1 
       |--bit2:     1表示中鍵按下 
       |--bit1:     1表示右鍵按下 
       |--bit0:     1表示左鍵按下 
BYTE2 -- X坐標變化量,與byte的bit4組成9位符號數,負數表示向左移,正數表右移。用補碼表示變化量 
BYTE3 -- Y坐標變化量,與byte的bit5組成9位符號數,負數表示向下移,正數表上移。用補碼表示變化量
BYTE4 -- 滾輪變化。
由於手上沒有USB鼠標,對BYTE1的4-7位沒有測試,對於BYTE2 BYTE3做個測試,BYTE1的4-7全為0的時候,BYTE2 BYTE3的正負表示鼠標移動方向

鍵盤發送給PC的數據每次8個字節
BYTE1 BYTE2 BYTE3 BYTE4 BYTE5 BYTE6 BYTE7 BYTE8
定義分別是:
BYTE1 --
       |--bit0:   Left Control是否按下,按下為1 
       |--bit1:   Left Shift  是否按下,按下為1 
       |--bit2:   Left Alt    是否按下,按下為1 
       |--bit3:   Left GUI    是否按下,按下為1 
       |--bit4:   Right Control是否按下,按下為1  
       |--bit5:   Right Shift 是否按下,按下為1 
       |--bit6:   Right Alt   是否按下,按下為1 
       |--bit7:   Right GUI   是否按下,按下為1 
BYTE2 -- 暫不清楚,有的地方說是保留位
BYTE3--BYTE8 -- 這六個為普通按鍵
鍵盤經過測試。
例如:鍵盤發送一幀數據   02 00 0x04 0x05 00 00 00 00
表示同時按下了Left Shift + ‘a’+‘b’三個鍵
對於鍵碼和PS2的鍵盤有所不同,具體請看附件。
USB HID to PS2 Scan Code 對照表.pdfourdev_651088NZ5EKW.pdf(文件大小:133K) (原文件名:USB HID to PS2 Scan Code Translation Table .pdf) 


2011.6.23補充說明
補充對於鍵盤BYTE2的說明:
參照百合網(http://www.baiheee.com/OpenSource/Easy%20USB%2051%20Programer/Easy%20USB%2051%20Programer12.htm)鍵盤的報告描述符,如下
/*******************************************************************************************/
//這里只列出了第二個字節的說明
    //這樣的數據段個數為1    
    0x95, 0x01,                    //   REPORT_COUNT (1)    
    //每個段長度為8bits    
    0x75, 0x08,                    //   REPORT_SIZE (8)    
    //輸入用,常量,值,絕對值    
    0x81, 0x03,                    //   INPUT (Cnst,Var,Abs)    
        
    //上面這8個bit是常量,設備必須返回0  
/*******************************************************************************************/
這里只是指明了這是一個以字節為單位的輸入數據,並沒有指明它的取值范圍。

在HID1.11協議的Appendix B-->B.1 Protocol 1 (Keyboard) 的報告描述符中也有這樣的說明(HID1.11協議的59頁)
/*******************************************************************************************/
   Report Count (1),  
   Report Size (8), 
   Input (Constant),              ;Reserved byte 
   Report Count (5),  
   Report Size (1), 
/*******************************************************************************************/
在注釋中說明,這個字節是保留字節。
這里我也把HID1.11傳上來給大家研究。
ourdev_651409JXHOAD.pdf(文件大小:661K) (原文件名:HID1.11協議.pdf) 

ourdev_651410WJINWH.pdf(文件大小:745K) (原文件名:HID用途表1.12.pdf)

把鍵盤的輸出字節補充出來
USB-HID鍵盤一般還會有一個輸出字節,由PC發送給鍵盤,控制鍵盤指示燈。
BYTE0 
格式如下
BYTE0 --
       |--bit0:   NUM LOCK 
       |--bit1:   CAPS LOCK 
       |--bit2:   SCROLL LOCK 
       |--bit3:   COMPOSE
       |--bit4:   KANA 
       |--bit5:   CONSTANT 
       |--bit6:   CONSTANT  
       |--bit7:   CONSTANT 

       0 = OFF, 1 = ON
CONSTANT表示保留位,為常數0

注:這種數據一般是根據Report Descriptor指定數據格式的,只能說大部分是這樣。比如羅技的鼠標,它就包含有5個字節,關於X和Y每個有12bit,而不是1Byte(8bit)。有的多功能鼠標還包含其他功能,比如說前進,后退,肯定不止這些功能,所以數據肯定不止這些


免責聲明!

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



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