您现在的位置是:主页 > USB百科 >
Windows和Linux不同主机下USB设备枚举过程中的差别
发布时间:2022-12-20 11:50:46所属栏目:USB百科 已帮助人编辑作者:【USB接口百科】
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操作系统,主机要求返回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下,在获取第一次配置描述符其实是经过了三次。

而在Linux Ubuntu下只有后两次。
以上就是USB接口百科为您提供Windows和Linux不同主机下USB设备枚举过程中的差别的解读,本文章链接: http://www.usb-hub.cn/usbbk/42111.html 欢迎分享转载,更多婚礼相关资讯请前往USB百科
上一篇:USB设备的枚举过程分析
相关文章
USB接口百科推荐
USB设备和USB集线器HUB的数据传输
USB设备类bDeviceClass、bDeviceSubClass、bDeviceProtocol
USB2.0一定支持高速模式吗?
USB 配对/伴随端口(Companion Port)
USB3.0和USB2.0有什么区别
USB的连接模型
USB与其它总线相比的优点是什么
USB的VendorID、ProductID和BcdDevice有什么作用
Windows下USB堆栈如何枚举USB设备
同样的soc板子用的同一个USB驱动设备名称,厂商和产品ID都一样,使用什么方法
USB通信设备类CDC简介
USB设备的枚举过程分析
USB3.0传输速度是多少?
DisplayLink简介 USB显示技术
USB规范分类大全和USB协议关系树