linux usb组合设备,USB组合设备(5)

最近做一个组合设备,说白了就是在一个usb 设备上面,实现2个或者更多功能,但是说实话中文的资料还是比较少,没找到多少比较靠谱的,就去外文网站翻翻了 还是不少的,下面我将自己的理解理清改一下,希望也可以帮助一些需要的,这里只对HID设备而言。

1. 关于配置符

如 上图,一个USB设备有一个设备描述符,设备描述符里面决定了该设备有多少种配置,每种配置描述符对应着配置描述符;而在配置描述符中又定义了该配置里面 有多少个接口,每个接口有对应的接口描述符;在接口描述符里面又定义了该接口有多少个端点,每个端点对应一个端点描述符,端点描述符定义了端点的大小,类 型等等。

0818b9ca8b590ca3270a3433284dd417.png

也 就是说,我们可以采用多个接口,多个端点来实现不同的功能,这些是通过配置符描述来实现。注意的是,接口描述符:接口描述符里面的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.实例:

可以参考一下网页:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值