內容為網絡轉載,如有版權問題請聯系刪除
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的正負表示鼠標移動方向
備注:本人實測結果如下(win10x64):
BYTE1的高4位完全無用,
BYTE2,X坐標變化量,負數表示向左移,正數表示向右移,
BYTE3,Y坐標變化量,負數表示向上移,正數表示向下移
鍵盤發送給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頁)
在注釋中說明,這個字節是保留字節。
這里我也把HID1.11傳上來給大家研究。
ourdev_651409JXHOAD.pdf(文件大小:661K) (原文件名:HID1.11協議.pdf)
ourdev_651410WJINWH.pdf(文件大小:745K) (原文件名:HID用途表1.12.pdf)