USB組合設備(5)

USB組合設備(5)

2012-06-03 00:25 by 細雨淅淅, 100 閱讀, 0 評論, 收藏編輯

最近做一個組合設備,說白了就是在一個usb 設備上面,實現2個或者更多功能,但是說實話中文的資料還是比較少,沒找到多少比較靠譜的,就去外文網站翻翻了 還是不少的,下面我將自己的理解理清改一下,希望也可以幫助一些需要的,這裏只對HID設備而言。

1. 關於配置符

如 上圖,一個USB設備有一個設備描述符,設備描述符裏面決定了該設備有多少種配置,每種配置描述符對應着配置描述符;而在配置描述符中又定義了該配置裏面 有多少個接口,每個接口有對應的接口描述符;在接口描述符裏面又定義了該接口有多少個端點,每個端點對應一個端點描述符,端點描述符定義了端點的大小,類 型等等。

也 就是說,我們可以採用多個接口,多個端點來實現不同的功能,這些是通過配置符描述來實現。注意的是,接口描述符:接口描述符裏面的On this combined interface, you cannot apply boot device.(bInterfaceClass, bInterfaceSubclass, bInterfaceProtocol)= (0x03, 0x00, 0x00) = (HID class, no subclass, no protocol)。

例如:

/* USB Standard Device Descriptor */
const U8 USB_DeviceDescriptor[] =

{
  USB_DEVICE_DESC_SIZE,              /* bLength */
  USB_DEVICE_DESCRIPTOR_TYPE,        /* bDescriptorType */
  WBVAL(0x0200), /* 2.00 */          /* bcdUSB */
  0x00,                              /* bDeviceClass */
  0x00,                              /* bDeviceSubClass */
  0x00,                              /* bDeviceProtocol */
  USB_MAX_PACKET0,                   /* bMaxPacketSize0 */
  //WBVAL(0xC251),                     /* idVendor b4,04*/    
  //WBVAL(0x2501),                     /* idProduct 70,63*/
  0xb4,0x04,
  0x70,0x63,
  WBVAL(0x0100), /* 1.00 */          /* bcdDevice */
  0x01,                              /* iManufacturer */
  0x02,                              /* iProduct */
  0x03,                              /* iSerialNumber */
  0x01                               /* bNumConfigurations: one possible configuration*/
};

2 關於報表描述符

A report descriptor can include more than one top-level collection. The HID class driver enumerates the top-level collections of an input device and creates a physical device object (PDO) for each top-level collection.

實現多個功能的話,報表設置裏面可以使用多個 report descriptor,並且通過 report ID來識別不同的功能。報表爲1個的時候,report ID默認是0 ,如果有多個報表的時候,HID_ReportID  GLOBAL項目設置,直到遇到下一個HID_ReportID之前,所以的項目用在這個ID的report上面。多個報表的時候,報表的ID不能設置爲 0 。在使用的時候,在發送數據的前面第一個字節發送 report id來實現不同的報表

以鼠標鍵盤組合設備爲例報表如下:

Usage Page (Generic Desktop),
Usage (Keyboard),
Collection (Application),
Report ID (01),
Report Size (1),
Report Count (8),
Usage Page (Key Codes),
Usage Minimum (224),
Usage Maximum (231),
Logical Minimum (0),
Logical Maximum (1),
Input (Data, Variable, Absolute), ;Modifier byte
Report Count (1),
Report Size (8),
Input (Constant), ;Reserved byte
Report Count (5),
Report Size (1),
Usage Page (LEDs),
Usage Minimum (1),
Usage Maximum (5),
Output (Data, Variable, Absolute), ;LED report
Report Count (1),
Report Size (3),
Output (Constant), ;LED report padding
Report Count (6),
Report Size (8),
Logical Minimum (0),
Logical Maximum(255),
Usage Page (Key Codes),
Usage Minimum (0),
Usage Maximum (101),
Input (Data, Array),
End Collection

Usage Page (Generic Desktop),
Usage (Mouse),
Collection (Application),
Usage (Pointer),
Collection (Physical),
Report ID (02),
Report Count (3),
Report Size (1),
Usage Page (Buttons),
Usage Minimum (1),
Usage Maximum (3),
Logical Minimum (0),
Logical Maximum (1),
Input (Data, Variable, Absolute),
Report Count (1),
Report Size (5),
Input (Constant),
Report Size (8),
Report Count (2),
Usage Page (Generic Desktop),
Usage (X),
Usage (Y),
Logical Minimum (-127),
Logical Maximum (127),
Input (Data, Variable, Relative),
End Collection,
End Collection

 

使用的時候 數據發送格式如下:

offset (byte)
0 report ID (01)
1 modifier keys
2 padding
3 - 8 keycode array

For mouse,

offset (byte)
0 report ID (02)
1 buttons
2 X asis

   3 Y axis

3 關於接口

  所有的HID設備通過USB的控制管道(默認管道,即端點0)和中斷管道與主機通信。

表1、USB HID規範定義的HID設備可用端點

管道

要求

說明

控制(端點0)

必須

傳輸USB描述符、類請求代碼以及供查詢的消息數據等

中斷輸入

必須

傳輸從設備到主機的輸入數據

中斷輸出

可選

傳輸從主機到設備的輸出數據

  控制管道主要用於以下3個方面:

  • 接收/響應USB主機的控制請示及相關的類數據
  • 在USB主機查詢時傳輸數據(如響應Get_Report請求等)
  • 接收USB主機的數據

  中斷管道主要用於以下兩個方面:

  • USB主機接收USB設備的異步傳輸數據
  • USB主機發送有實時性要求的數據給USB設備

4.實例:

可以參考一下網頁:

http://www.cygnal.org/ubb/Forum9/HTML/001496.html 

 

 

 

 

 

 

 

 

 

 

 

轉載網址:http://hi.baidu.com/zsb517/blog/item/9db41c8653dfd434c65cc393.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章