Lu Blog

Segment fault!

STM32F0 usbd_ctlreq.c中的BUG

在实现WinUSB时,发现无论如何都无法收到Extended Properties请求。经过一番排查,最终定位问题在usbd_ctlreq.c文件的USBD_StdItfReq函数中。
usbd_ctlreq.png

如上图所示,当主机发起bmRequest = 0xC0时,程序进入USB_REQ_TYPE_VENDOR分支,随后掉入下方分支中。问题就出在对req->wIndex的检查中,这里本意应该是确保在Class和Standard的请求中,interface的索引值不会超过设备预所设置的最大值。但实际在Vendor设备中,WinUSB会将wIndex设置为0x05,而我的interface只有一个,导致检查不通过,无法继续向下执行。
解决办法
要解决这个问题,目前想到两个办法:

  1. 直接修改usbd_ctlreq.c文件,将Vendor与Class和Standard的判断逻辑分开。
  2. 修改CubeMX中,对USB Device的参数设定(下图),将USBD_MAX_NUM_INTERFACES 改为5或更高即可。

cubemx.png

因为我将实际业务代码与自动生成的代码分开。所以这里我选择不修改usbd_ctlreq.c文件,而是在CubeMX中修改设置,然后重新生成代码。

评论卡