USB的5大描述符和HID描述符

1. USB描述符

USB是一种通用的串行总线,它支持一个主机与一个或多个外设之间通信。

当插入USB设备后,主机会向设备请求各种描述符来识别设备。那什么是设备描述符呢?

Descriptor即描述符,是一个完整的数据结构,可以通过C语言等编程实现,并存储在USB设备中,用于描述一个USB设备的所有属性,USB主机是通过一系列命令来要求设备发送这些信息的。

描述符的作用就是通过命令操作作来给主机传递信息,从而让主机知道设备具有什么功能、属于哪一类设备、要占用多少带宽、使用哪类传输方式及数据量的大小,只有主机确定了这些信息之后,设备才能真正开始工作。
USB有5种标准描述符:

  • 设备描述符
  • 配置描述符
  • 字符描述符
  • 接口描述符
  • 端点描述符

描述符之间有一定的关系,一个设备只有一个设备描述符,而一个设备描述符可以包含多个配置描述符,而一个配置描述符可以包含多个接口描述符,一个接口使用了几个端点,就有几个端点描述符。

由此我们可以看出,USB的描述符之间的关系是一层一层的,最上一层是设备描述符,下面是配置描述符,再下面是接口描述符,再下面是端点描述符。

在获取描述符时,先获取设备描述符,然后再获取配置描述符,根据配置描述符中的配置集合长度,一次将配置描述符、接口描述符、端点描述符一起一次读回。其中可能还会有获取设备序列号,厂商字符串,产品字符串等。

//*****************USB Descriptor Types*****************************
//bDescriptorType:描述符的类型。

#define USB_DEVICE_DESCRIPTOR_TYPE                  1		//设备描述符
#define USB_CONFIGURATION_DESCRIPTOR_TYPE      		2		//配置描述符
#define USB_STRING_DESCRIPTOR_TYPE             		3		//字符描述符
#define USB_INTERFACE_DESCRIPTOR_TYPE          		4		//接口描述符
#define USB_ENDPOINT_DESCRIPTOR_TYPE           		5		//端点描述符
#define USB_DEVICE_QUALIFIER_DESCRIPTOR_TYPE   		6		
#define USB_OTHER_SPEED_CONFIG_DESCRIPTOR_TYPE 		7
#define USB_INTERFACE_POWER_DESCRIPTOR_TYPE    		8
#define USB_OTG_DESCRIPTOR_TYPE                     9
#define USB_DEBUG_DESCRIPTOR_TYPE                  10
#define USB_INTERFACE_ASSOCIATION_DESCRIPTOR_TYPE  11
//*****************USB Descriptor Types End******************************

1.1 设备描述符

标准的设备描述符的字节是18个字节,具体定义如下:
在这里插入图片描述(1)bLength
描述符长度(18字节,十六进制为0x12),就是标志描述符数据结构的长度。
(2)bDescriptorType
bDescriptorType代表了本描述符的类型,设备描述符为0x01。所有的描述符类型表示如下图:
在这里插入图片描述(3)bcdUSB
USB协议版本,表示形式0xJJMN版本JJ.M.N(JJ - 主要版本号,M - 次要版本号,N - 次要版本)

     例:如果是USB2.0,写成:0200H;如果是USB1.1,写成:0110H 如果是USB3.11,写成:0311H

(4)bDeviceClass、bDeviceSubClass、bDeviceProtocol
bDeviceClass、bDeviceSubClass、bDeviceProtocol分别代表设备类型,子类型,设备使用的协议,USB-IF区分设备类分了三个等级(类-子类-协议码)其中,类包含人机交互类、图像类、无线类、音频类等等,子类比如音频类的音频控制、音频流等等,协议比如人机接口类中的鼠标、键盘、触摸屏等,为何会有这么多USB的Class分类,子分类,设备协议。我们要知道,USB协议设计的目的,就是为实现通用,用单一的USB接口取代之前种类繁多的各种其他接口。而为了取代其他各种接口,那意味着就要实现各种设备所对应的各种功能。
(5)bMaxPackeSize0
端点一次最大传多少个字节。USB协议里有规定,端点0最低8字节,端点的最大传输大小和USB速度等级以及传输类型有关,控制传输一般使用端点0,低速最大8字节,全速和高速最大传输64字节,如下图:
在这里插入图片描述6)idVender
厂商ID,就是个2字节的编号,由USB协议分配,厂商申请时需要交费。自己随便写的话,仅限于学习、测试的情况下,不能用做产品。
(7)idProduct
产品ID,厂家自己随便定义。
(8)bcdDevice
产品版本号,厂家自己随便定义。
(9)iManufacturer
描述厂商的字符串的索引,为0则表示没有。
(10)iProduct
描述产品的字符串的索引,为0则表示没有。
(11)iSerialNumber
产品序列号字符串的索引,为0则表示没有。
(12)bNumConfigurations
指示设备有多少个配置,前面提到过,一个USB可能有多个配置,一般USB产品都是1个配置。

struct _DEVICE_DEscriptOR_STRUCT
{
  BYTE   bLength;    //设备描述符的字节数大小
  BYTE   bDescriptorType;   //描述符类型编号,为0x01
  WORD  bcdUSB;   //USB版本号
  BYTE  bDeviceClass;   //USB分配的设备类代码,0x01~0xfe为标准设备类,0xff为厂商自定义类型,0x00不是在设备描述符中定义的,如HID
  BYTE   bDeviceSubClass;  //usb分配的子类代码,同上,值由USB规定和分配的,HID设备此值为0
  BYTE  bDeviceProtocl;  //USB分配的设备协议代码,同上HID设备此值为0
  BYTE   bMaxPacketSize0;  //端点0的最大包的大小
  WORD   idVendor;  //厂商编号
  WORD   idProduct;  //产品编号
  WORD  bcdDevice;  //设备出厂编号
  BYTE   iManufacturer;   //描述厂商字符串的索引
  BYTE   iProduct;   //描述产品字符串的索引
  BYTE   iSerialNumber;  //描述设备序列号字符串的索引
  BYTE   bNumConfiguration;   //可能的配置数量
}
1.2 配置描述符

一个设备只有一个设备描述符,而一个设备描述符可以包含多个配置描述符。
USB配置描述符只有9个字节,具体的详细内容如下表所示:
在这里插入图片描述

	bLength:大小为1字节,表示该描述符的长度。标准的USB配置描述符的长度为9字节。
	bDescriptorType:配置描述符的类型。
	wTotalLength:表示整个配置描述符集合的总长度,包括配置描述符、接口描述符、端点描述符和类特殊描述符(HID类)。注意低字节在前。
	bNumInterfaces:该配置描述符所支持的接口数量。功能单一设备只有一个,而复合设备则具有多个接口。
	bConfigurationValue:表示该配置的值。通常一个USB设备可以支持多个配置,bConfigurationValue就是每个配置的标识。
	iConfiguration:描述该配置的字符串的索引值。如果该值为0,则表示没有字符串。
	bmAttributes:用来描述设备的一些特性。其中,D7是保留的,必须要设置为1。D6表示供电方式,D6=1时,表示设备自供电;D6=0时,表示设备时总线供电。D5表示是否支持远程唤醒,D5=1时,支持远程唤醒。D4~D0保留,设置为0。
	bMaxPower:表示设备需要从总线获取的最大电流量,单位为2mA。如需要200mA的最大电流,则该字节的值为100.
struct _CONFIGURATION_DEscriptOR_STRUCT
{
  BYTE  bLength;   //配置描述符的字节数大小
  BYTE   bDescriptorType;   //描述符类型编号,为0x02
  WORD   wTotalLength;   //配置所返回的所有数量的大小
  BYTE   bNumInterface;  //此配置所支持的接口数量
  BYTE   bConfigurationVale;   //Set_Configuration命令需要的参数值
  BYTE   iConfiguration;  //描述该配置的字符串的索引值
  BYTE  bmAttribute;  //供电模式的选择
  BYTE   MaxPower;   //设备从总线提取的最大电流

}
1.3 字符描述符
struct _STRING_DEscriptOR_STRUCT

{
    BYTE bLength; //字符串描述符的字节数大小
    BYTE bDescriptorType; //描述符类型编号,为0x03
    BYTE SomeDescriptor[36]; //UNICODE编码的字符串
}
1.4 接口描述符

一个配置描述符可以包含多个接口描述符。根据USB协议规定,接口描述符不能单独返回,必须附着在配置描述符后一并返回。标准的接口描述符的结构如下:
在这里插入图片描述

bLength:标准描述符的长度。
bDescriptorType:描述符的类型。
bInterfaceNumber:接口编号。当一个配置具有多个接口时,每个接口的编号都不相同。从0开始依次递增对一个配置的接口进行编号。
bNumEndpoints:该接口所使用的端点数(不包括0端点)。如果为0,则表示没有非0端点,只使用默认的控制端点。
struct _INTERFACE_DEscriptOR_STRUCT
{

    BYTE bLength; //接口描述符的字节数大小
    
    BYTE bDescriptorType; //描述符类型编号,为0x04
    
    BYTE bInterfaceNunber; //接口的编号
    
    BYTE bAlternateSetting;//备用的接口描述符编号
    
    BYTE bNumEndpoints; //该接口使用端点数,不包括端点0
    
    BYTE bInterfaceClass; //接口类型 HID设备此值为0x03
    
    BYTE bInterfaceSubClass;//接口子类型 HID设备此值为0或者1
    
    BYTE bInterfaceProtocol;//接口所遵循的协议
    
    BYTE iInterface; //描述该接口的字符串索引值
}
1.5 端点描述符

一个接口使用了几个端点,就有几个端点描述符。
端点描述符不能单独返回,必须附着在配置描述后一并返回。USB协议规定的标准端点描述符的结构如下:

在这里插入图片描述

bLength:描述符的长度。

bDescriptorType:描述符的类型。

bEndpointAddress:该端点的地址。最高为D7为该端点的传输方向,1为输入,0为输出。D3~D0为端点号。

bmAttributes:端点的属性。最低两位D1~D0表示该端点的传输类型,0为控制传输,1为等时传输,2位批量传输,3为中断传输。如果该端点是非等时传输的端点,那么D7~D2为保留值,设置为0。如果该端点是等时传输的,则D3~D2表示同步的类型,0为无同步,1为异步,2为适配,3为同步;D5~D4表示用途,0为数据端点,1为反馈端点,2位暗含反馈的数据端点,3是保留值。D7~D6保留。
/* bmAttributes in Endpoint Descriptor */
#define USB_ENDPOINT_TYPE_MASK                 0x03
#define USB_ENDPOINT_TYPE_CONTROL              0x00
#define USB_ENDPOINT_TYPE_ISOCHRONOUS          0x01
#define USB_ENDPOINT_TYPE_BULK                 0x02
#define USB_ENDPOINT_TYPE_INTERRUPT            0x03
#define USB_ENDPOINT_SYNC_MASK                 0x0C
#define USB_ENDPOINT_SYNC_NO_SYNCHRONIZATION   0x00
#define USB_ENDPOINT_SYNC_ASYNCHRONOUS         0x04
#define USB_ENDPOINT_SYNC_ADAPTIVE             0x08
#define USB_ENDPOINT_SYNC_SYNCHRONOUS          0x0C
#define USB_ENDPOINT_USAGE_MASK                0x30
#define USB_ENDPOINT_USAGE_DATA                0x00
#define USB_ENDPOINT_USAGE_FEEDBACK            0x10
#define USB_ENDPOINT_USAGE_IMPLICIT_FEEDBACK   0x20
#define USB_ENDPOINT_USAGE_RESERVED            0x30
wMaxPackeSize:该端点所支持的最大包长度。注意低字节在先。对于全速模式和低速模式,D10 - D0表示端点的最大包长度,其他保留为0。对于高速模式,D12~D11为每个帧附加的传输次数,具体看USB2.0协议。

bInterval:该端点的查询时间。对于查询的帧间隔数。对于等时传输以及高速模式的中断、批量传输,该字段的意义请参看USB2.0协议。
struct _ENDPOIN_DEscriptOR_STRUCT
{
    BYTE bLength; //端点描述符的字节数大小
    
    BYTE bDescriptorType; //描述符类型编号,为0x05
    
    BYTE bEndpointAddress; //端点地址及输入输出属性
    
    BYTE bmAttribute; //端点的传输类型属性
    
    WORD wMaxPacketSize; //端点收、发的最大包的大小
    
    BYTE bInterval; //主机查询端点的时间间隔
}

端点描述符举例:

/* Endpoint, HID Interrupt In  这个端点用来传状态包*/
  USB_ENDPOINT_DESC_SIZE,                   /* bLength */
  USB_ENDPOINT_DESCRIPTOR_TYPE,    /* bDescriptorType */
  USB_ENDPOINT_IN(1),                               /* bEndpointAddress */
  USB_ENDPOINT_TYPE_INTERRUPT,       /* bmAttributes */
  WBVAL(0x0040),                                          /* wMaxPacketSize 原来是04*/
  2,          /* 2ms */                                           /* bInterval 可控制时间片的长度*/
    //增加一个输出端点,用于接收主机的数据
  USB_ENDPOINT_DESC_SIZE,                     /* bLength */
  USB_ENDPOINT_DESCRIPTOR_TYPE,      /* bDescriptorType */
  USB_ENDPOINT_OUT(1),                             /* bEndpointAddress */
  USB_ENDPOINT_TYPE_INTERRUPT,        /* bmAttributes */
  WBVAL(0x0020),                                           /* wMaxPacketSize 接收数据包大小为32字节*/
  20,                                   /* 20ms */               /* bInterval */

2. HID设备与描述符

HID是一种USB通信协议,无需安装驱动就能进行交互。

2.1 HID设备简介

USBHID是USB设备中的一大类,即Human Interface Devices,人机接口设备。它主要用于人与计算机进行交互,并且是USB最早支持的一类设备。

HID设备支持低速、全速、高速三种设备。由于HID设备要求用户输入能够得到及时响应,故其传输方式通常采用“中断方式”。HID设备类一般配置数据传输端点为中断传输,由于USB不支持硬件中断,所以USB的中断传输实际上是主机在一定的时间内不断地轮询设备检查其是否有数据需要传输。

PC轮询的周期非常重要,太低数据可能会流失;太高又会占去太多的总线带宽。对于全速设置(12Mbps)而言,端点可以设定 1ns至255ms之间的轮询间隔。因此,换算可得全速设备的最快轮询速度为IKHz。另外对于低速设备而言,仅能设定10ms至255ms的轮询间隔,如果因为错误而发生传送失败的话,可以在下一个轮询期间重新再传送一次。

HID设备仅适用于小量和中量的低速数据传输。低速每一次最大8byte,全速最大64byte,高速最大1024byte。HID设备的最大传输速度有限制。主机低速设备中断断点每10ms内最多1次,每秒最多800Bytes;全速断点每1ms一笔事务,每一秒最多64000Bytes;高速断点每125us三笔事务,每秒最多是24.576MB。

所有的HID设备通过USB的控制管道(默认管道,即端点0)和中断管道(端点1或端点2)与主机进行通信。

在这里插入图片描述

注:USB主机为PC,USB设备如鼠标等。中断端点的描述中,指定了主机轮询的时间 Interval。即,主机会隔一段时间来“要”数据。

控制管道主要用于下面3个方面

接收/响应USB主机的控制请求以及相关的类数据
在USB主机查询时传输数据(如响应Get_Report请求等)
接收USB主机的数据

中断管道主要用于下面两个方面

USB主机接收USB设备的异步传输数据
USB主机发送有实时性要求的数据给USB设备

从USB主机到USB设备的中断输出数据传输是可选的,当不支持中断输出数据时,USB主机通过控制管道将数据传输给USB设备。

HID设备的描述符除了5个USB的标准描述符(设备描述符、配置描述符、接口描述符、端点描述符、字符串描述符)外,还包括三个HID设备类特定的描述符:HID描述符、报告描述符(Report)、实体描述符(Physical)。
HID设备描述符与其他五大描述符之间的层次关系如图:
在这里插入图片描述
可以看到,在 Interface desc 层,就对 HID desc 有指定。

除了HID的三个特定描述符组成对HID设备的解释外,5个标准描述符中与HID设备有关的部分有:

设备描述符中:bDeviceClass, bDeviceSubClass, bDeviceProtocol三个值必须为 0。在这里插入图片描述

接口描述符中:bInterfaceClass 的值必须是 0x03, bInterfaceSubClass 的值为 0 或 1。

 1表示HID设备是一个启动设备(BootDevice, 一般对PC机有意义,意思是BIOS启动时能识别您使用的HID设备,切只有标准鼠标或者键盘才能称为BootDevice)。
 0表示HID设备是操作系统启动后才能识别使用的设备。

在这里插入图片描述

2.2 HID固件要求

HID设备固件必须符合下列要求:

  • 设备描述符必须识别该设备包含有 HID 接口(描述符);
  • 除了默认控制管道外,固件必须另外支持一个中断输入管道;
  • 固件必须包含一个报表描述符来定义要传送与接收的设备数据。

传输数据要求:

  • 固件必须支持 Get_Report 控制传输与中断输入传输,Set_Report 控制传输与选择性的中断输出传输;
  • 所有的HID数据都必须使用定义过的报告描述符格式来定义数据的大小与内容。
2.3 HID设备描述符

HID类的设备在配置描述符中还需要一个HID描述符。它是一个类描述符,应该跟在接口描述符后面。HID的描述符包括HID描述符、报告描述符(Report)、实体描述符(Physical)。
在这里插入图片描述
在USB协议中,HID设备的定义放置在接口描述符中,USB的设备描述符和配置描述符中不包含HID设备信息。因此,对于某些特定的HID设备,可以做HID复合设备,所谓的复合设备就是具有两个独立的USB设备功能,但是集中在同一个硬件上的USBHID设备,PC会识别为两个独立的HID设备。

从描述符之间的关联来看,HID描述符依赖于接口描述符。所以如果一个HID有2端点,设备就不需要为每个端点搞一个HDI描述符。接口和HID描述符、端点描述符的关联如下:
在这里插入图片描述

2.3.1 HID描述符

HID描述符的主要作用是用来识别HID通信所使用的额外描述符。下表是HID描述符结构。
在这里插入图片描述 在这里插入图片描述HID描述符里又包含了其附属的描述符的类型和长度(如报告描述符),然后主机再根据HID描述符的信息请求其相关的描述符。也就是说,主机通过获取描述符,就知道该设备是一个 HID 设备。

bcdHID:设备与其描述符所遵循的HID规范的版本号码,此数值是4个16进位的BCD格式字符。例如版本1.1的bcdHID是0110h。

bCountryCode:硬件目的国家的识别码。如果不说明,该字段为0。

HID描述符举例:


static const u8 sHIDDescriptor[] = {
//HID
    //InterfaceDeszcriptor:接口描述符。根据USB协议规定,接口描述符不能单独返回,必须附着在配置描述符后一并返回。
    USB_DT_INTERFACE_SIZE,     // bLength,1byte,该描述符的长度(9字节)
    USB_DT_INTERFACE,          // DescriptorType,0x04,bDescriptorType,1byte,该描述符类型(0x04),告知PC该部分为USB接描述。USB_INTERFACE_DESCRIPTOR_TYPE
    /* 0x04,                      // bInterface number */
    0x00,                       // bInterface number,bInterfaceNumber,1byte,该接口的编号(从0开始)
    0x00,                      // AlternateSetting,bAlternateSetting,1byte,该接口的备用编号
    0x01,                      // NumEndpoint,bNumEndpoints,1byte,该接口所使用的端点数
    /* 0x02,                        // NumEndpoint */
    USB_CLASS_HID,             // Class = Human Interface Device。bInterfaceClass,1byte,该接口所使用的类
    0x00,                      // Subclass, 0 No subclass, 1 Boot Interface subclass。bInterfaceSubClass,1byte,该接口所使用的子类
    0x00,                      // Procotol, 0 None, 1 Keyboard, 2 Mouse。bInterfacPtotocol,1byte,该接口所使用的协议
    0x00,                      // Interface Name。iConfiguration,1byte,描述该接口的字符串的索引
//***********************InterfaceDeszcriptor End*****************************************************************************************


//HID类的设备在配置描述符中还需要一个HID描述符。它是一个类描述符,应该跟在接口描述符后面。
//HID的描述符包括HID类描述符、报表(Report)和实体(Physical)描述符。
//HID描述符的主要作用是用来识别HID通信所使用的额外描述符。
    //HIDDescriptor:
    0x09,                      // bLength,本描述符长度一共9字节
    USB_HID_DT_HID,            // bDescriptorType, HID Descriptor//0x21,告知PC,我是一个hid设备
    0x01, 0x02,                // bcdHID, HID Class Specification release NO.//bcdHID:设备与其描述符所遵循的HID规范的版本号码,此数值是4个16进位的BCD格式字符。例如版本1.1的bcdHID是0110h。
    0x00,                      // bCuntryCode, Country localization (=none)//bCountryCode:硬件目的国家的识别码。如果不说明,该字段为0。
    0x01,                       // bNumDescriptors, Number of descriptors to follow//HID描述符下面的类别描述符数目,至少得有一个报表描述符。还可以有实体描述符。
    0x22,                       // bDescriptorType, Report Desc. 0x22, Physical Desc. 0x23//类别描述符的类型,0x22是报表描述符;0x23是物理描述符。
    0,//LOW(ReportLength)
    0, //HIGH(ReportLength)

    //EndpointDescriptor:
    USB_DT_ENDPOINT_SIZE,       // bLength//描述符的长度。
    USB_DT_ENDPOINT,            // bDescriptorType, Type
    USB_DIR_IN | HID_EP_IN_2,     // bEndpointAddress
    USB_ENDPOINT_XFER_INT,      // Interrupt
    LOBYTE(MAXP_SIZE_HIDIN), HIBYTE(MAXP_SIZE_HIDIN),// Maximum packet size
    0x01,     // Poll every 10msec seconds

//@Endpoint Descriptor:
    /* USB_DT_ENDPOINT_SIZE,       // bLength
    USB_DT_ENDPOINT,            // bDescriptorType, Type//bDescriptorType:描述符的类型。
    USB_DIR_OUT | HID_EP_OUT,   // bEndpointAddress//bEndpointAddress:该端点的地址。最高为D7为该端点的传输方向,1为输入,0为输出。D3~D0为端点号。
    USB_ENDPOINT_XFER_INT,      // Interrupt//bmAttributes:端点的属性端点的属性。最低两位D1~D0表示该端点的传输类型,0为控制传输,1为等时传输,2位批量传输,3为中断传输。如果该端点是非等时传输的端点,那么D7~D2为保留值,设置为0。如果该端点是等时传输的,则D3~D2表示同步的类型,0为无同步,1为异步,2为适配,3为同步;D5~D4表示用途,0为数据端点,1为反馈端点,2位暗含反馈的数据端点,3是保留值。D7~D6保留。
    LOBYTE(MAXP_SIZE_HIDOUT), HIBYTE(MAXP_SIZE_HIDOUT),// Maximum packet size//wMaxPackeSize:该端点所支持的最大包长度。注意低字节在先。对于全速模式和低速模式,D10~D0表示端点的最大包长度,其他保留为0。对于高速模式,D12~D11为每个帧附加的传输次数,具体看USB2.0协议。
    0x01,                       // bInterval, for high speed 2^(n-1) * 125us, for full/low speed n * 1ms//bInterval:该端点的查询时间。对于查询的帧间隔数。对于等时传输以及高速模式的中断、批量传输,该字段的意义请参看USB2.0协议。 */
};
2.3.2 报告(Report)描述符

报告描述符是 USB 的所有描述里面最复杂的一个,因为他和其他的不一样,没有固定的长度和表。是一个可变而且变化比较多样的一类描述符。

报告描述符,其实就是告诉主机,通过中断端点传输的数据,哪些位或者哪些 Bytes ,代表着什么含义。这样讲,可能会比较抽象,但是看完后面的描述后,在回头看来,会觉得比较清晰。

要了解报告描述符,需要两份 USB 官方的 HID 资料:

《Device Class Definition for human interface device (HID)》

《Universal Serial Bus HID Usage Tables》

一份是说明 HID 的描述符的协议,另一个说明 HID 的报表描述符的内容定义。

报表描述符由一个一个的 Item 构成,Item 分为了两种,格式分别如下:
在这里插入图片描述上述中,这里主要讲述 Short Item,用得最多的是 Short Item。

在 Short Item 中,起始的 1 Byte 代表了这个 Item 的用途:
在这里插入图片描述
bSize :代表后面的数据,最大 4 bytes。

bType :代表了这个 Item 是什么类型的 Item,这里有三种大的类型:Main(0x00)、Global(0x01)、Local(0x02)。

bTag :代表在对应的 Item 下的更加细的分类。

| —— Main      分为:Input、Output、Feature、Collection、End Collection。

| —— Global    分为:Usage Page、 Logical Minimum、Logical Maximum、等等。

| —— Local     分为 :Usage 、Usage Minimum、Usage Maximum、String 等等。

对于 bSize + bType + bTag 的 1 Byte 的组合详见下表:
在这里插入图片描述
根据官方的给出的资料,报告描述符的组成结构如下:

在这里插入图片描述
由一个 App Collection 开始,如果有多个 Report 结构,则增加 Collection 进行组合。

首先需要描述他的 Usage 然后依次描述 Logical Minimum 、Logical Maximum、Report Size 、Report Count 等等。

3. 数据通讯相关函数

  1. usb_bulk_write

函数定义:

int usb_bulk_write(usb_dev_handle *dev, int ep, const char *bytes, int size, int timeout);

函数功能:向usb设备批量写数据,*dev为设备操作句柄,ep为传入指定的端点号,*bytes为发送的数据地址,size为发送的数据长度,timeout 为超时时间(ms)。成功返回实际写入设备的字节数,失败返回负值。

  1. usb_bulk_read

函数定义:

int usb_bulk_read(usb_dev_handle *dev, int ep, char *bytes, int size, int timeout);

函数功能:批量读usb设备传过来的数据,*dev为设备操作句柄,ep为传入指定的端点号,*bytes为接收的数据地址,size为预计接收的数据长度,timeout 为超时时间(ms)。成功返回实际写入设备的字节数,失败返回负值。

  1. usb_interrupt_write

函数定义:

int usb_interrupt_write(usb_dev_handle *dev, int ep, const char *bytes, int size, int timeout);

函数功能:以中断的方式向usb设备写数据,*dev为设备操作句柄,ep为传入指定的端点号,*bytes为发送的数据地址,size为发送的数据长度,timeout 为超时时间(ms)。成功返回实际写入设备的字节数,失败返回负值。

  1. usb_interrupt_read

函数定义:

int usb_interrupt_write(usb_dev_handle *dev, int ep, const char *bytes, int size, int timeout);

函数功能:以中断的方式usb设备传过来的数据,*dev为设备操作句柄,ep为传入指定的端点号,*bytes为接收的数据地址,size为预计接收的数据长度,timeout 为超时时间(ms)。成功返回实际写入设备的字节数,失败返回负值。

  • 5
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ydgd118

您的鼓励是我最大的动力!谢赏!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值