您尚未登录。

楼主 # 今天 11:47:48

XIVN1987
会员
注册时间: 2019-08-30
已发帖子: 275
积分: 336.5

WINUSB MS OS 2.0 设备中 wMaxPacketSize 必须是 512 吗?

为单片机 USB HS 接口编写 WINUSB MS OS 2.0 例程,,当 wMaxPacketSize 设置为 128 或 256 时,,Windows 报错“无法识别的 USB 设备”。。
使用 usbpv 抓包结果如下,,可以看到系统获取设备描述符成功、设置地址成功、然后从新地址获取设备描述符和配置描述符也成功。。
但之后系统就不再继续后续步骤了,,而是从头重新上述步骤,,重复 4 次上述流程后,,彻底停止枚举。。

将 wMaxPacketSize 修改为 512 后,,可以正确枚举,,抓取结果如下:

我问 deepseek 为什么会这样,,它说 USB HS 下 Bulk 端点的 wMaxPacketSize 必须是 512,,我查了下 USB spec,,发现 spec 上确实是这样规定的:

但是之前编写 USB HS 接口的 U 盘例程时,,wMaxPacketSize 设置成了 128 却是可以正常枚举、正常工作的。。

所以 Windows 对不同类型的设备,,对 wMaxPacketSize 的约束有差异??

离线

#1 今天 13:23:03

小兵
会员
注册时间: 今天
已发帖子: 16
积分: 16

Re: WINUSB MS OS 2.0 设备中 wMaxPacketSize 必须是 512 吗?

USB HS 下 Bulk 端点的 wMaxPacketSize 按规范确实必须是 512,不是 128/256/512 可选。

FS Bulk 才允许 8/16/32/64;HS Bulk 是固定 512。

所以 WinUSB 这里不是因为 MS OS 2.0 特殊,而是配置描述符里 HS Bulk endpoint 的 wMaxPacketSize=128/256 本身就是不合规的。Windows 在拿到配置描述符后停止继续枚举,反复重试几次,这个现象也符合“描述符校验失败/配置不可用”的表现。

之前 U 盘例程里 wMaxPacketSize=128 还能工作,建议确认几件事:

  1. 当时设备是否真的跑在 High-Speed,而不是 Full-Speed;

  2. 抓包看到的 endpoint descriptor 是不是当前实际使用的 HS config;

  3. 是否存在 Device Qualifier / Other-Speed Configuration 描述符混淆;

  4. Windows 的 Mass Storage 栈可能容忍了某些不规范描述符,但这不代表规范允许。

结论:HS Bulk endpoint 建议老老实实填 512。WinUSB 下更应该按规范来,否则 Windows 很可能直接拒绝配置。

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn


东莞哇酷科技有限公司开发