USB百科
+ -

Windows和Linux不同主机下USB设备枚举过程中的差别

2021-12-12 2318 2

第一次获取设备描述符的不同

USB设备刚上电时,是通过端点0使用控制方式来获取设备描述符。不同的设备模式获取端点0的大小不同的:

  • 高速模式的端点0最大包长固定为64个字节;
  • 全速模式可端点0在8、16、32、64字节中选择;
  • 低速模式的端点0最大包长固定为8个字节

由于USB主机和USB设备第一次通讯时,所以并不知道端点0的最大包长度,所以不能正确检测控制传输中的数据段的结束。

如果USB主机指定USB端点0的最大包长度为64字节,而实际USB的端点0最大包长度为8字节,但由于USB设备描述符的的长度为18字节,USB主机在获取第一个GET_DESCRIPTOR设备描述符时要求设备返回18字节的数据。但对于USB设备由于其端点0的最大包长度为8字节,所以18个字长的设备描述符需要3次事务传输过铖,分别为8字节,8字节和2字节的事务传输。但由于USB主机发起的事务指定的数据长度为64字节或设备描述符18字节,所以当USB主机收到8字节时由于收到的数据长度小于其假定的最大包长度64字节时,USB主机认为数据阶段已经完成,而USB设备此时还在准备在发送第二个字节的事务,所以这会导致通讯双方的状态不同步而导致无法完成。
所以针对以上问题,不同的操作系统使用不同的解决方案。

Windows下的解决方案

对于Windows操作系统,主机要求返回64字节的设备描述符并默认设备端点0的最大包长度为64字节了,如果设备端点0的最大长度不小于标准描述符的长度(18字节),那么USB设备就可以一次将18个字节的设备描述符发送给主机,通信的双方保持同步;如果设备的端点0最大包长度小于设备描述符的18字节长度,那么此时USB设备面要使用多个事务向主机发送一个完整的设备描述符,前述的不同步问题会出现。对此,Windows7系统在第一次获取设备描述符后,直接进行复位(Reset),将设备状态重置为初始状态。 而由于设备端所支持的最小的最大包长度为8.此时主机一定能获取到设备描述符的前8个字节:而设备描述符的第8个字节)就是设备端点0所支持的最大包长度。主机可以在后续的控制传输中使用这个设备端的最大包长度来保证双方正常通信。所以“Reset”就是这个解决方案的关键点。

Linux Ubuntu下的解决方案

而在Linux Ubuntu的解决方案如下:
主机第一次获取设备描述符时只获取其前8字节。此时,不管USB设备 端点的最大包长度是多少,USB设备只能发送8字节的数据,同时通信双方 同步结束数据阶段。之后USB主机读取USB设备描述符的第8个字节,得 到设备端点0的最大包长度,并用于后续的控制传输。这个解决方案的关键 点就是第一次获取设备描述符时只获取其前8字节。

这两种解决方案都能解决实际的问题,但是解决问题的思路有所不同, Wndos7的解决方案是一种异常处理的方式,而LimmxUbunt的解决方案 则体现了一种精细控制、避免出错的思想。读者可以根据自己的实际情况选 择相应的解决方案。

获取配置描述符的不同

USB主机复位设备后,这时会使用18字节的长度获取设备描述符。然后紧跟着的一般是获取配置描述符
在Windows下,在获取第一次配置描述符其实是经过了三次。

  • 第一次使用255字节获取
  • 第二次使用9字节获取
  • 第三次使用实际的长度获取
    在Windows三次获取配置描述符
    而在Linux Ubuntu下只有后两次。
HID人机交互QQ群:564808376    UAC音频QQ群:218581009    UVC相机QQ群:331552032    BOT&UASP大容量存储QQ群:258159197    STC-USB单片机QQ群:315457461    USB技术交流QQ群2:580684376    USB技术交流QQ群:952873936   

0 篇笔记 写笔记

USB音箱 UAC设备描述符分析
这里看到,USB规范采用的是USB1.1版本,不过字符串中又显示的是”USB2.0 Device”,所以这里就有点迷~关于设备描述符各字段的详细解释,详见USB规范中设备描述符一节。从bDeviceClass,bDeviceSubClass和bDeviceSubClass都被置为0来看,这是一个典......
USB音箱 UAC配置描述符分析
该USB音箱的配置描述符和普通USB设备描述符结构体一致,并无特别区别。该配置描述符的总长度(包括后续的所有其它描述符)为110字节,这里相对华为耳机的要少了很多,这是因为少了像麦克风和HID。从配置描述符的字段bmAttributes来看,并不支持远程唤醒功能。 ------------......
华为UAC耳机 配置描述符
配置描述符的大小其实不光包括配置描述符自身,也包括后续的所有描述符。这里我们只先介绍一下配置描述符,后续的接口描述符和其它UAC相关描述符在后续一节介绍。配置描述符的内容如下: ------------------ Configuration Descriptor --------------......
Windows10设备管理器USB设备描述符请求失败(未知的usb设备)
在电脑中插入USB设备后,有时会报USB设备描述符请求失败,导致USB设备在设备管理器中枚举失败。一种专业的解决办法见:http://www.usbzh.com/article/detail-1059.htmlUSB设备描述符请求失败现象USB设备描述符请求失败在设备管理器中发现通用串行总线......
UAC 其它速率配置描述符
在UAC规范中,并没有定义特别的其它速率配置描述符,故UAC音频设备的其它速率描述符应符合USB规范中的其它速率配置描述符。......
USB-UAC麦克风 配置描述符
UAC麦克风采用的配置描述符结构和USB配置描述符的结构一致.偏移地址字段长度值描述0bLength10x09配置描述符的长度1bDescriptorType10x02描述符类型,配置描述符类型2wTotalLength20x0064配置描述符的总长度(包括后续的UAC音频控制和UAC音频流接口描述......
USB设备描述符布局
通用串行总线USB以其强大的功能,方便的连接广受用户使用,这些都得益于USB灵活多样的描述符。USB设备通过配置描述符,接口描述符,端点描述符等描述符实现设备功能。USB设备灵活多变的角色转换是通过USB的配置描述符来实现的,但一个USB设备有多个配置描述符时,就表明了这个USB设备支持多角的转换......
USB超高速设备描述符的bMaxPacketSize0为0x09
USB3的设备中,其USB设备描述符和2.0的结构一致,不过在含义上有的字段稍有区别。比如说在USB3.2的版本中,其设备描述符中的bMaxPacketSize0和USB2.0有就所不同。在USB2.0中bMaxPacketSize0代表的是USB设备默认端点0的最大包的大小,一般为0x40即64字......
华为UAC耳机 设备描述符
从UAC的设备描述符可知,音频是属于接口级别的,在UAC1.0版本,是需要将相关的配置参数bDeviceClass,bDeviceSubClass,bDeviceProtocoll置为0。对于别的参数,可参考USB设备描述符进行相关配置。本设备只有一个配置描述符,且端点0的bMaxPacketSiz......
HID 设备描述符关系
HID设备连接到USB主机后,主机通过发送Get_Descriptor请求读取HID设备的描述符,了解描述符对了解USB设备是至关重要的。HID设备的描述符HID设备除了支持USB设备的5种标准描述符之外,还支持HID设备特有的3种描述符。这些描述符是:USB标准描述符:设备描述符配置描述符、......
USB设备描述符配置描述符、接口描述符和端点描述符的拓扑关系
在USB设备的逻辑组织中,包含设备、配置、接口和端点4个层次。每个USB设备都提供了不同级别的配置信息,可以包含一个或多个配置,不同的配置使设备表现出不同的功能组合(在探测/连接期间需从其中选定一个),配置由多个接口组成。一次只能有一个配置是活动的。大多数的设备只有一个配置和一个接口,当一个设备......
USB 其它速率配置描述符
其它速率配置描述符(OTHER_SPEED_CONFIGURATION)。其它速率配置描述符与设备限定描述符(Device Qualifier Descriptor)配合使用, 当工作在其他速度下时使用, 除了描述符类型, 其他字段含义格式与配置描述符完全一致。 位移字段名称长度(字节......
USB 设备描述符
USB设备描述符是USB设备在进行插拔和初始化过程中,最先被主机读取的一部分信息,它包含了设备的一些基本属性信息,如USB规范版本、设备类、设备子类、设备协议、最大数据包长度等。USB设备描述符通常是在设备插入时被主机读取,在获取到设备描述符后,主机可以自动加载相应的驱动程序,完成设备的初始化和配......
UAC 配置描述符
UAC配置描述符仅用于单一功能的USB设备,没有专门的UAC特定的配置描述符,所以UAC音频设备的配置描述符应满足通用USB设备的配置描述符规范。......
USB-UAC麦克风 设备描述符
UAC麦克风采用的设备描述符结构和USB设备描述符的结构一致,只是有些字段的值有所要求。偏移地址字段长度值描述0bLength10x12设备描述符的总和长度1bDescriptorType10x01设备描述符类型2bcdUSB 20x01001.00使用的USB版本号4bDeviceClass10x......
关注公众号
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!