最近做一个组合设备,说白了就是在一个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.实例:

可以参考一下网页:

linux usb组合设备,USB组合设备(5)相关推荐

  1. “复合设备(Compound Device)”可以占用多个地址。所谓复合设备其实就是把多个功能设备 通过内置的USB HUB 组合而成的设备,比如带录音话筒的USB 摄像头

    ROOT HUB 是一个特殊的USB HUB,它集成在主机控制器里,不占用地址.ROOT HUB 不但 实现了普通USB HUB 的功能,还包括其他一些功能,具体在增强型主机控制器的规范中有详细的介 ...

  2. USB Compound Device,USB复合设备 ; USB Composite Device,USB组合设备【转】

    本文转载自:https://blog.csdn.net/autumn20080101/article/details/52776863 科普下USB复合设备和USB组合设备的区别. 关键字 Commu ...

  3. linux系统怎么关闭usb端口,linux系统挂载以及卸载USB接口的设备的解决办法

    Linux如何挂载一个USB设备通常,在Linux系统中,如果要使用硬盘.光盘.软盘或U盘等存储设备,一般先要挂载(但有些高版本的Linux可以做到自动识别和加载设备).当存储设备挂载完成后就可以像目 ...

  4. 写入usb设备 linux 程序,模拟物理USB设备Linux

    最好的方法是使用Linux Gadget驱动程序和硬件,使您成为一个USB设备.小工具驱动程序允许计算机"假装"为任何类型的设备.然后,您的受测系统有一个USB OTG电缆连接到小 ...

  5. linux判断usb进程命令,一种在Linux系统下审计USB设备历史使用情况的方法与流程...

    本发明涉及计算机审计技术领域,具体涉及一种在Linux系统下审计USB设备历史使用情况的方法. 背景技术: 如今,在linux系统中,对于USB设备的插入拔出事件,系统自身是不带有审计功能的,这使得普 ...

  6. Linux下,查看USB设备信息

    Linux下,查看USB设备信息 首先需要将usbfs挂载一下,然后才能查看. $ mount -t usbfs none /proc/bus/usb $ cat  /proc/bus/usb/dev ...

  7. linux查看usb设备名称,Linux系统下查看USB设备名及使用USB设备

    1.系统插入USB设备后,从控制台界面有如下提示: 从控制台信息可以看出插入的USB设备名. 从上图可以看出,插入的USB设备为sde4. 但是,如果是CRT工具远程连接过去,可以使用下面的命令来查看 ...

  8. linux 看usb 存储设备,找到哪个驱动器对应于Linux中的哪个USB大容量存储设备

    我有几个USB大容量存储闪存驱动器连接到Ubuntu Linux计算机(Ubuntu 10.04.1,内核2.6.32-25-386),我需要以编程方式区分它们(如果可能的话,从bash,但我不害怕编 ...

  9. LINUX设备usb无法连接,linux下无法使用usb接口设备

    1.在X-Windows环境中打开"控制中心",展开"信息→USB设备"控制台树,查看Linux是否已经正确识别您的USB存储器,如果没有看到USB设备信息,那 ...

最新文章

  1. Python数组合并
  2. 查看关于yum的配置
  3. linux下测试RTC驱动相关的命令date和hwclock常见用法简介
  4. oracle 字段 查找重复,oracle数据库查询重复的索引列
  5. 现代通用计算机的雏,1834年巴贝奇设计的( )是现代通用计算机的雏形 答案:分析机...
  6. trycatch处理流IO流中的异常
  7. 首个中国高校AI人才培养计划启动,Hinton、Hopcroft和李开复开班授课
  8. Python基础笔记(三) dict、set、函数
  9. 一、Oracle学习笔记:认识数据库
  10. PHP压缩html网页代码(清除空格,换行符,制表符,注释标记)
  11. Python Django项目-Django基本运行过程
  12. Django REST framework 中文文档
  13. Win10自更改鼠标指针重启后恢复默认解决方法_windows10 每一次开机都把鼠标指针还原成系统默认的指针
  14. bouncycastle android,Android和BouncyCastle的IllegalAccessError
  15. 红包分配:指定金额指定上下限后随机分发成若干个红包,随机抽
  16. Windows使用CMD命令查看WIFI密码
  17. Jmeter——BeanShell PreProcessor的用法
  18. Matlab GUI handles结构体入门
  19. 三、Zstack云平台快速安装与初始化(ZCCT云计算认证)
  20. 如何查看局域网的其他计算机,怎么查看局域网中其他电脑的信息

热门文章

  1. 使用fliter实现ie下css中rgba的效果
  2. [LeetCode] NO. 100 Same Tree
  3. 基于UDP的socket客户服务器编程
  4. 移动端重构系列1——前期准备工作
  5. Caused by: java.lang.NoSuchMethodException: onClick_Flashlight [class android.view.View]
  6. JS模式:jq中简单的模式--》采摘自js设计(tomxu_version)
  7. 活动目录实战系列二(主域控无法正常启动)
  8. javascript es6 特性简介
  9. linux tree命令 树结构显示目录文件
  10. ClamAV病毒库增加特征码