首页 > 其他分享 >USB协议详解第4讲(USB描述符-标准配置描述符)

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

时间:2024-08-11 12:50:26浏览次数:8  
标签:USB 配置 0x00 描述符 详解 HID 标准配置

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就是配置描述符集合的长度。

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即可。

标签:USB,配置,0x00,描述符,详解,HID,标准配置
From: https://www.cnblogs.com/linhaostudy/p/18353258

相关文章

  • USB PD和USB TYPE-C 的区别
    USBPowerDelivery(USBPD)和USBType-C是两个不同但相关的技术标准,它们在功能和应用上有所区别。1.USBType-C连接器标准:USBType-C是一种物理连接器标准。它定义了USB接口的外形和引脚排列。双面插入:USBType-C的设计使其可以双面插入,这意味着无论插头的正反......
  • BUUCTF 81题吹着贝斯的二维码详解(包含各类工具和python脚本)
    在网上看了很多类似解题步骤和说明,感觉对小白都不友好,于是决定搜集整理下,做个详尽的解题步骤:压缩包解压得到36个无后缀名文件和一个flag.zip压缩包再看压缩包,解压发现有压缩密码,用winhex查看是不是伪加密,在末尾发现一串可疑字符串,拷贝下来留用:GNATOMJVIQZUKNJXGRCTGNRTG......
  • Buuctf 弱口令详解附送图片隐写工具cloacked-pixel安装配置使用实列
    下载一个zip压缩包,解压需要密码,使用bandizip,打开看看,发现注释栏有一些隐藏的东西ctl+c复制在粘贴板,再ctl+v黏贴到sunblime文本编辑软件下是摩斯密码,记录下来......-...-..-----..-.---.-...---在线摩斯密码翻译器HELL0FORUM用此作为密码解压压缩包......
  • iOS的CoreImage框架技术详解
    CoreImage提供图像处理、人脸识别、图像增强、图像滤镜、图像转场。它操作的数据来自CoreGraphics、CoreVideo、ImageIO,使用CPU或GPU进行渲染。CoreImage对底层实现进行封装,为上层提供简单易用的API。一、CoreImage框架CoreImage框架分为:渲染层、处理层、API层。其中,渲染......
  • iOS的AudioUnit音效框架技术详解
    iOS的AVAudioUnit提供的音效包括:混响、延迟、均衡器、失真、变速、变调等。按照类型划分为AudioEffect和TimeEffect,其中AudioEffect包括混响、延迟、均衡器和失真,而TimeEffect主要是变速、变调。一、音效应用层框架音效的应用层框架以AVAudioUnit作为核心抽象类,如下图所......
  • 数据存储技术详解:从基础概念到未来趋势
    一、数据存储的基础概念数据存储是指通过特定的介质和技术手段保存和管理信息的过程。在当今信息化社会,数据存储无处不在,从个人计算机上的文件保存到企业数据中心的大规模存储,再到云计算平台的海量数据管理,数据存储技术在各个层面都发挥着至关重要的作用。数据存储不仅仅涉及......
  • 什么是 PPA?详解 Ubuntu 软件安装的强大工具
    在Linux世界中,尤其是Ubuntu和其他基于Debian的发行版,用户通常通过官方软件仓库来安装和管理软件。然而,有时官方仓库中的软件版本可能较旧,或者根本没有你想要的软件。在这种情况下,PPA(PersonalPackageArchive,个人软件包档案)为用户提供了一种灵活且方便的方式来获取最新的......
  • C++ call_once详解
    引言在多线程编程中,常常需要确保某些初始化操作只执行一次,例如初始化一个全局资源或单例模式中的实例创建。C++11引入了std::call_once和std::once_flag,为这种需求提供了便捷和高效的解决方案。一、基本概念1.std::call_oncestd::call_once是一个函数模板,它确保某个函数在......
  • USB协议详解第3讲(USB描述符-设备描述符)
    我们第一个学习要点就是USB描述符,所谓描述符其实就是C语言里面的结构体或者数组,数组包含的信息说明当前的设备具有哪些特征。USB描述符有设备描述符、配置描述符、接口描述符、端点描述符、字符串描述符,HID设备有HID描述符、报告描述符和物理描述符。我们先学会每个描述符的细节,我......
  • USB 控制写传输、控制读传输、无数据控制传输都是在什么场景下?
    在USB通信中,控制传输(ControlTransfer)是一个非常常见且重要的传输类型,主要用于配置设备、查询设备状态以及发送和接收命令。控制传输有三种主要形式:控制写传输(ControlWriteTransfer)、控制读传输(ControlReadTransfer)和无数据控制传输(NoDataControlTransfer)。这些传输类型......