USB协议详解第4讲(USB描述符-标准配置描述符)

目录

1.USB描述符

2.标准配置描述符组成

3.STM32配置描述符集合代码(必须按照顺序)

4.标准配置描述符组成详解


 

1.USB描述符

USB描述符有设备描述符标准配置描述符接口描述符端点描述符字符串描述符,HID设备有HID描述符报告描述符物理描述符今天主要是学习USB标准配置描述符的组成。

2.标准配置描述符组成

一个USB设备至少有一个或者多个配置,这一点可以从设备描述符的最后一项bNumConfigurations得到,但是当前只能选择其中一种配置,每一种配置都对应一个配置描述符集合,为什么说是一个集合呢,因为这个配置包括标准配置描述符、接口描述符、端点描述符,如果是HID设备还会包括HID描述符,我们今天讲的是标准配置描述符,后期会讲解其他的描述符。标准配置描述符只有9个字节,组成如下:

3.STM32配置描述符集合代码(必须按照顺序)

/* USB Configuration Descriptor */
const uint8_t CustomHID_ConfigDescriptor[CUSTOMHID_SIZ_CONFIG_DESC] =
{
//
// 标准配置描述符
//	
    0x09, /* bLength: Configuation Descriptor size */
    USB_CONFIGURATION_DESCRIPTOR_TYPE, 	/* bDescriptorType: Configuration */
    CUSTOMHID_SIZ_CONFIG_DESC,			/* wTotalLength low : Bytes returned */
    0x00,								/* wTotalLength high: Bytes returned */
    0x01,         /* bNumInterfaces: 1 interface */
    0x01,         /* bConfigurationValue: Configuration value */
    0x00,         /* iConfiguration: Index of string descriptor describing the configuration*/
    0xC0,         /* bmAttributes: Bus powered */
                  /*Bus powered: 7th bit, Self Powered: 6th bit, Remote wakeup: 5th bit, reserved: 4..0 bits */
    0x96,         /* MaxPower 300 mA: this current is used for detecting Vbus */
    
//
// 接口描述符
//		
	/************** Descriptor of Custom HID interface ****************/
    /* 09 */
    0x09,         						/* bLength: Interface Descriptor size */
    USB_INTERFACE_DESCRIPTOR_TYPE,		/* bDescriptorType: Interface descriptor type */
    0x00,         /* bInterfaceNumber: Number of Interface */
    0x00,         /* bAlternateSetting: Alternate setting */
    0x02,         /* bNumEndpoints 此接口有两个端点 */
    0x03,         /* bInterfaceClass: HID */
    0x00,         /* bInterfaceSubClass : 1=BOOT, 0=no boot */
    0x00,         /* nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse */
    0,            /* iInterface: Index of string descriptor */
    
//
// HID描述符(后续讲解)
//		
	/******************** Descriptor of Custom HID HID ********************/
    /* 18 */
    0x09,         /* bLength: HID Descriptor size */
    HID_DESCRIPTOR_TYPE, /* bDescriptorType: HID */
    0x10,         /* bcdHID: HID Class Spec release number */
    0x01,
    0x00,         /* bCountryCode: Hardware target country 国家代码 */
    
	0x01,         /* bNumDescriptors: Number of HID class descriptors to follow
					 类别描述符数目(至少有一个报表描述符)*/
    0x22,         /* bDescriptorType 报告描述符 */
    CUSTOMHID_SIZ_REPORT_DESC,	/* wItemLength: Total length of Report descriptor 报告描述符大小 */
    0x00,						/* 标志类别描述符说明结束 */ 
	
	
//
// 端点1描述符
//		
	/******************** Descriptor of Custom HID endpoints ******************/
    /* 27 */
    0x07,          /* bLength: Endpoint Descriptor size */
    USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: */

    0x82,          /* bEndpointAddress: Endpoint Address (IN) */               
                   // bit 3...0 : the endpoint number
                   // bit 6...4 : reserved
                    // bit 7     : 0(OUT), 1(IN)
    0x03,          /* bmAttributes: Interrupt endpoint */
    0x40,          /* wMaxPacketSize: 64 Bytes max */
    0x00,
    0x02,          /* bInterval: Polling Interval (2 ms) */
    /* 34 */

//
// 端点2描述符
//		
    0x07,	/* bLength: Endpoint Descriptor size */
    USB_ENDPOINT_DESCRIPTOR_TYPE,	/* bDescriptorType: */
			/*	Endpoint descriptor type */
    0x01,	/* bEndpointAddress: */
			/*	Endpoint Address (OUT) */
    0x03,	/* bmAttributes: Interrupt endpoint */
    0x40,	/* wMaxPacketSize: 64 Bytes max  */
    0x00,
    0x02,	/* bInterval: Polling Interval (2 ms) */
    /* 41 */
}; /* CustomHID_ConfigDescriptor */

4.标准配置描述符组成详解

1.bLength

配置描述符的长度。

2.bDescriptorType

描述符类型,配置描述符为0x02。描述符的结构开头是一样的,都是先说描述符长度,然后说类型,每种描述符的类型是不一样的,如下表格,可速查。

图片

3.wTotalLength

配置描述符集合总长度,也就是说总共有多少个字节。第二节讲了,配置描述符是以集合的形式,集合里包含了标准配置描述符,接口描述符,端点描述符,HID描述符,wTotalLength就是配置描述符集合的长度。

4.bNumInterfaces,

当前配置下面有多少个接口,单一功能设备只有一个接口,如鼠标或者键盘,如果是复合设备,如果是鼠键一体的设备,那么它可能有两个接口,其实一个接口对应于一种功能,如果我们在软件实现的时候,把鼠标键盘当做一个功能实现的时候,那就是一个接口的设备(也就是单功能设备)。

5.bConfigurationValue,

前面说了,一个USB设备可能有多个配置,但是当前只能选择一种配置。bConfigurationValue就是当前配置的标识,如果主机想选择哪种配置,是通过标识去选择的,后面枚举的时候会详细讲解。

6.iConfiguration

描述该配置的字符串的索引值,如果没有字符串,那这个值就是0。

7.bmAttributes

在这个配置下,设备的一些特性。D7是保留位,默认为1;D6表示供电方式,0是自供电,1是总线供电;D5表示是否支持远程唤醒,为1表示设备支持远程唤醒;D4~D0保留,默认为0。大家可能会问为什么不把这些特性放在设备描述符里面,这些可都是设备的属性啊,在这里要告诉大家,USB设备会有多种配置,每种配置下的设备属性是不一样的,主机可以灵活的选择使用那种配置,从而实现对应配置上的功能,这样增加了总线设计的灵活性和可配置性,从而达到通用性。

8.bMaxPower

在这个配置下,设备需要的电流,单位是2ma。如果一个设备耗电量100ma,那么本字节设置为0x32即可。​

 

1.版权归本作者(一个早起的程序员)所有;

2.未经原作者允许不得转载本文内容,否则将视为侵权;

3.转载或者引用本文内容请注明来源及原作者;

4.对于不遵守此声明或者其他违法使用本文内容者,本人依法保留追究权等。

下面是我的个人微信公众号,关注【一个早起的程序员】精彩系列文章每天不断。

  • 29
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
gu8ConfigDescriptor是一个USB配置描述符数组,用于描述USB设备的配置信息。它通常由USB设备的制造商在设备固件中定义,由USB主机在插入设备时读取。 USB配置描述符包含了USB设备的配置信息,包括配置的唯一标识符、配置的描述信息、配置所需的最大功率、以及该配置所包含的所有接口和其他描述符的信息。 以下是一个典型的USB配置描述符的格式: ``` typedef struct { uint8_t bLength; // 描述符长度 uint8_t bDescriptorType; // 描述符类型 uint16_t wTotalLength; // 描述符总长度 uint8_t bNumInterfaces; // 接口数目 uint8_t bConfigurationValue; // 配置唯一标识符 uint8_t iConfiguration; // 配置描述信息 uint8_t bmAttributes; // 配置属性 uint8_t bMaxPower; // 配置所需的最大功率 } USB_ConfigurationDescriptorTypeDef; ``` 其中,bLength字段表示该描述符的长度;bDescriptorType字段表示该描述符的类型,这里应该为0x02,表示该描述符是一个配置描述符;wTotalLength字段表示该配置描述符及其后续的所有描述符的总长度;bNumInterfaces字段表示该配置所包含的接口数目;bConfigurationValue字段表示该配置的唯一标识符;iConfiguration字段表示该配置的描述信息的字符串索引;bmAttributes字段表示该配置的属性,包括是否需要供电、是否支持远程唤醒等;bMaxPower字段表示该配置所需的最大功率,单位为2mA。 在gu8ConfigDescriptor描述符数组中,每个USB配置描述符之后通常还会包括该配置所包含的所有接口的描述符和其他描述符,如字符串描述符、端点描述符等。这些描述符的总长度应该等于wTotalLength字段指定的长度。通过读取gu8ConfigDescriptor数组中的各个描述符USB主机可以了解到USB设备支持的配置信息、接口信息和传输方式等,从而选择最合适的驱动程序进行通信。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一个早起的程序员

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值