0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

HID協(xié)議是什么意思

麥辣雞腿堡 ? 來源:嵌入式Linux系統(tǒng)開發(fā) ? 作者:韋東山老師驅(qū)動大 ? 2023-07-17 17:41 ? 次閱讀

對于 USB 接口的 HID 設(shè)備,有一套協(xié)議。

1.1 描述符

HID 設(shè)備有如下描述符:

圖片

  • HID
    設(shè)備的"設(shè)備描述符"并無實際意義,沒有使用"設(shè)備描述符"來表示自己是 HID 設(shè)備。
  • HID
    設(shè)備只有一個配置,所以只有一個配置描述符
  • 接口描述符
    • bInterfaceClass
      為 3,表示它是 HID 設(shè)備
    • bInterfaceSubClass
      是 0 或 1,1 表示它支持"Boot Interface"(表示 PC 的 BIOS 能識別、使用它),0
      表示必須等操作系統(tǒng)啟動后通過驅(qū)動程序來使用它。
    • bInterfaceProtocol:0-None,
      1-鍵盤, 2-鼠標(biāo)
  • 端點描述符:HID
    設(shè)備有一個控制端點、一個中斷端點

圖片

對于鼠標(biāo),HOST 可以通過中斷端點讀到數(shù)據(jù)。

1.2 數(shù)據(jù)格式

1.2.1 鍵盤

通過中斷傳輸可以讀到鍵盤數(shù)據(jù),它是 8 字節(jié)的數(shù)據(jù),格式如下:

偏移大小描述
01字節(jié)"Modifier
keys status",就是ctrl、alt、shift等按鍵的狀態(tài)
11字節(jié)保留
21字節(jié)第1個按鍵的鍵值
31字節(jié)第2個按鍵的鍵值
41字節(jié)第3個按鍵的鍵值
51字節(jié)第4個按鍵的鍵值
61字節(jié)第5個按鍵的鍵值
71字節(jié)第6個按鍵的鍵值

第 0 個字節(jié)中每一位都表示一個按鍵的狀態(tài),某位等于 1
時,表示對應(yīng)的按鍵被按下,格式如下:

長度描述
01Left
Ctrl
11Left
Shift
21Left
Alt
31Left
GUI(Windows/Super key)
41Right
Ctrl
51Right
Shift
61Right
Alt
71Right
GUI(Windows/Super key)

讀到的鍵盤數(shù)據(jù)里有 6 個按鍵值,每個按鍵值都是 8 位的數(shù)據(jù)。如果某個按鍵值不等于
0,就表示某個按鍵被按下了。按鍵值跟按鍵的對應(yīng)關(guān)系,請看后面的《1.2.4 掃描碼》。

示例:按鍵"A"、"B"、"C"、"X"的按鍵值分別是 4、5、6、0x1B。

按下了"A",USB 鍵盤上報的數(shù)據(jù)為:

00 00 04 00 00 00 00 00

松開"A",USB 鍵盤上報的數(shù)據(jù)為:

00 00 00 00 00 00 00 00

按下"A"、"B",USB 鍵盤上報的數(shù)據(jù)為:

00 00 04 05 00 00 00 00

保持"A"、"B"不松開,繼續(xù)按下"C",USB 鍵盤上報的數(shù)據(jù)為:

00 00 04 05 06 00 00 00

松開"A",但是保持"B"、"C"不松開,USB 鍵盤上報的數(shù)據(jù)為:

00 00 05 06 00 00 00 00

USB
鍵盤上報的數(shù)據(jù)里,哪個按鍵先被按下,就先記錄它的按鍵值。在上面的例子里,"A"松開后只有"B"、"C"這兩個按鍵,"B"、"C"的按鍵值挪到了前面。

按下"Left shift"、并且按下"X",USB 鍵盤上報的數(shù)據(jù)為:

02 00 1B 00 00 00 00 00

USB
鍵盤只能上報 6 個按鍵值,如果有超過 6 個按鍵被按下,那么它將上報"phantom condition"(6 個按鍵值都是
1),但是"Modifier keys status"還是有效的。比如"Right Shift"被按下,另外超過 6 個的按鍵也被按下時,USB
鍵盤上報的數(shù)據(jù)為:

20 00 01 01 01 01 01 01

1.2.2 LED

我們還可控制鍵盤的 LED,需要發(fā)出一個控制傳輸請求:SetReport ,使用這個請求發(fā)送一個字節(jié)的數(shù)據(jù)。

這個字節(jié)的數(shù)據(jù)格式如下,某位為 1 時,會點亮相應(yīng)的 LED:

長度描述
01Num
Lock
11Caps
Lock
21Scroll
Lock
31Compose
41Kana
51保留,寫為0

發(fā)出的 SetReport,是一個控制傳輸?shù)?setup packet",格式如下:

圖片

以 libusb 的函數(shù)描述它的參數(shù),如下:

int LIBUSB_CALL libusb_control_transfer(libusb_device_handle *dev_handle,
 uint8_t request_type, uint8_t bRequest, uint16_t wValue, uint16_t wIndex,
 unsigned char *data, uint16_t wLength, unsigned int timeout);

/* 示例代碼 */
unsigned char data = (1< < 1); /* 點亮Caps Lock */
uint16_t wValue = (0x02< < 8)|0; // 0x02: 發(fā)給設(shè)備, 0: report ID
uint16_t wIndex = 0; // 一般是0, the interface number of the USB keyboard
libusb_control_transfer(dev_handle, 0x21, 0x09, wValue, wIndex, &data, 1, timeout);

1.2.3

鼠標(biāo)

通過中斷傳輸可以讀到鼠標(biāo)數(shù)據(jù),它是
8 字節(jié)的數(shù)據(jù),格式如下:

偏移大小描述
01字節(jié)
11字節(jié)按鍵狀態(tài)
22字節(jié)X
位移
42字節(jié)Y
位移
61字節(jié)或2字節(jié)滾輪

按鍵狀態(tài)里,每一位對應(yīng)鼠標(biāo)的一個按鍵,等
1 時表示對應(yīng)按鍵被點擊了,格式如下:

長度描述
01鼠標(biāo)的左鍵
11鼠標(biāo)的右鍵
21鼠標(biāo)的中間鍵
35保留,設(shè)備自己定義bit3:
鼠標(biāo)的側(cè)邊按鍵bit4:

X
位移、Y 位移都是 8 位的有符號數(shù)。對于 X 位移,負(fù)數(shù)表示鼠標(biāo)向左移動,正數(shù)表示鼠標(biāo)向右移動,移動的幅度就使用這個 8 位數(shù)據(jù)表示。對于 Y
位移,負(fù)數(shù)表示鼠標(biāo)向上移動,正數(shù)表示鼠標(biāo)向下移動,移動的幅度就使用這個 8 位數(shù)據(jù)表示。

1.2.4 掃描碼

USB 規(guī)范里為每個按鍵定義了 16 位的按鍵值,注意:它是 16 位的,但是 USB 鍵盤只使用 8
位表示按鍵值。所以有些按鍵需要通過"Modifier keys status"來確定。比如"Left Ctrl"的按鍵值是 224,這無法通過 8
位數(shù)據(jù)來表示,在 USB 鍵盤上報的數(shù)據(jù)里,使用第 0 字節(jié)的 bit4 來表示。

圖片

libusb
有同步接口和異步接口,異步接口可以同時支持多個鼠標(biāo)使用。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 接口
    +關(guān)注

    關(guān)注

    33

    文章

    8257

    瀏覽量

    149959
  • usb
    usb
    +關(guān)注

    關(guān)注

    60

    文章

    7773

    瀏覽量

    262392
  • HID
    HID
    +關(guān)注

    關(guān)注

    2

    文章

    125

    瀏覽量

    46448
收藏 人收藏

    評論

    相關(guān)推薦

    基于HID協(xié)議的USB人機交互設(shè)備的接口設(shè)計

      目前市場上USB設(shè)備的種類繁多,但是這些設(shè)備會有一些共同的特性,根據(jù)這些特性可以把USB設(shè)備劃分為不同的類,如顯示設(shè)備、通信設(shè)備、音頻設(shè)備、大容量存儲設(shè)備、人機
    發(fā)表于 09-12 10:09 ?2481次閱讀
    基于<b class='flag-5'>HID</b><b class='flag-5'>協(xié)議</b>的USB人機交互設(shè)備的接口設(shè)計

    請問檢測模擬量后如何用HID協(xié)議傳給上位機?

    檢測模擬量后如何用HID協(xié)議傳給上位機?
    發(fā)表于 03-26 06:54

    STM32F107移植了USB-HID實現(xiàn)鍵盤功能,BIOS下不識別怎么解決?

    STM32F107移植了官方的USB-HID協(xié)議,實現(xiàn)鍵盤功能,BIOS下不識別,有什么可以解決的辦法嗎?
    發(fā)表于 04-15 07:14

    基于 I2C 的人機接口設(shè)備 (HID) 協(xié)議鍵盤實現(xiàn),適用于 Windows 8

    `描述該參考設(shè)計是經(jīng)過驗證的鍵盤掃描儀或控制器。這個 128 鍵位掃描器件專門針對操作系統(tǒng)為 Windows 8 的終端設(shè)備。該器件完全符合 Microsoft 規(guī)定的 HID Over I2C
    發(fā)表于 04-15 10:43

    想做CC2640控制藍(lán)牙外設(shè),求資源

    打算用CC2640做一個 主HID 來控制藍(lán)牙外設(shè),同時也要做為從HID與手機連接。想咨詢一下CC2640的資源,如Flash夠不夠用啊?聽說HID協(xié)議棧不小的,有七八十K。另外,C
    發(fā)表于 03-25 14:26

    采用HID協(xié)議實現(xiàn)工控自定義鍵盤接口設(shè)計

    USB連接、斷開操作)、u***_istr.c(直接處理USB中斷)、u***_prop.c(用于上層協(xié)議處理,比如HID協(xié)議,大容量存儲設(shè)備協(xié)議)、u***_desc.c(具體設(shè)備的
    發(fā)表于 06-20 05:00

    是否可以在用戶PC應(yīng)用程序中使用PIKIT 3作為SPI主端口或UART?

    PICkit串行分析器,但我想實現(xiàn)后者的一些功能。也許有一些關(guān)于PICkit 3 HID協(xié)議的信息?我可以自己編寫電腦應(yīng)用程序。
    發(fā)表于 10-15 15:57

    請問單片機只有串口怎么才能使用HID協(xié)議?

    單片機只有串口,希望使用HID協(xié)議使用鼠標(biāo)做到絕對坐標(biāo)定位.求詳細(xì)一點的解答~~感激不盡啊
    發(fā)表于 03-13 09:00

    基于潤和Neptune開發(fā)板的鍵盤藍(lán)牙模塊DIY指南資料

    項目簡介這個項目適合:有線u***鍵盤升級藍(lán)牙鍵盤,改造后鍵盤有線/藍(lán)牙模式只能二選一。支持BLE 4.2協(xié)議,可向下兼容舊BLE版本,如: BLE 4.0。支持HID協(xié)議(Human Interface Device),理論上
    發(fā)表于 04-30 17:02

    怎么改多媒體鍵盤的鍵值和按鍵排布順序?

    \EVT\EXAM\BLE\HID_Keyboard\Project怎么改多媒體鍵盤的鍵值和按鍵排布順序有沒有什么軟件可以生成HID的描述符摳藍(lán)牙HID協(xié)議真的是很費勁
    發(fā)表于 09-05 07:57

    新唐的BSP包是用來干什么用的?

    新唐的BSP包是用來干什么用的?小白一個。。。畢設(shè)要做NANO120的HID協(xié)議
    發(fā)表于 08-25 07:02

    Universal Serial Bus (USB)HID協(xié)

    Universal Serial Bus (USB)HID協(xié)議手冊 THIS SPECIFICATION IS PROVIDED
    發(fā)表于 03-12 09:27 ?154次下載

    USB HID協(xié)議學(xué)習(xí)入門

    USB HID 類是比較大的一個類,HID 類設(shè)備屬于人機交互操作的設(shè)備。用于控制計算機操作的一些方面,如USB 鼠標(biāo),USB 鍵盤,USB 游戲操縱桿,USB 觸摸板,USB 軌跡球、電話撥號設(shè)備、VCR 遙
    發(fā)表于 11-15 14:39 ?315次下載

    基于HID協(xié)議的工控自定義鍵盤接口設(shè)計

    發(fā)表于 08-24 18:36 ?16次下載

    基于 I2C 的人機接口設(shè)備 (HID協(xié)議鍵盤實現(xiàn)

    發(fā)表于 09-22 19:30 ?41次下載