解决STM32虚拟U盘枚举过慢的问题

1、最近在一个项目中使用STM32虚拟U盘功能,外接SPI flash,连接到电脑上面后虚拟出一个U盘出来,软件使用RT thread的usb device, mass storte大容量存储设备。代码移植很简单,使用menuconfig打开设置一下。


2、这个代码在测试过程中发现U盘枚举过长,通过增加打印信息观察到如下:

msh />message type 5 reset the port
reset 0
message type 0  请求设备描述符:80 06 00 01 00 00 40 00
[
  setup_request : 0x80
  request       : 0x06
  value         : 0x0100
  index         : 0x0000
  length        : 0x0040
]
_get_device_descriptor
message type 2   ep0 out notify
message type 5   reset
reset 0
message type 0   set address 00 05 3d 00 00 00 00 00 
[
  setup_request : 0x00
  request       : 0x05
  value         : 0x003d 设备地址00 3d
  index         : 0x0000
  length        : 0x0000
]
_set_address
message type 0   获取设备描述符 80 06 00 01 00 00 12 00
[
  setup_request : 0x80
  request       : 0x06
  value         : 0x0100
  index         : 0x0000
  length        : 0x0012  设备描述符长度
]
_get_device_descriptor
message type 2
message type 0    获取配置描述符 80 06 00 02 00 00 ff 00
[
  setup_request : 0x80
  request       : 0x06
  value         : 0x0200   0x02获取配置描述符
  index         : 0x0000
  length        : 0x00ff
]
_get_config_descriptor
message type 2
message type 0    获取字符串描述符 80 06 03 03 09 04 ff 00
[
  setup_request : 0x80
  request       : 0x06
  value         : 0x0303  0x03 获取字符串描述符  index:03 获取03位置的字符串,即是320219198301
  index         : 0x0409  语言ID
  length        : 0x00ff
]
_get_string_descriptor
message type 2
message type 0    获取字符串描述符 80 06 00 03 00 00 ff 00
[
  setup_request : 0x80
  request       : 0x06
  value         : 0x0300   0x03 获取字符串描述符  index:00  获取语言ID, 返回04 03 09 04
  index         : 0x0000
  length        : 0x00ff
]
_get_string_descriptor
message type 2
message type 0    获取字符串描述符 80 06 02 03 09 04 ff 00
[
  setup_request : 0x80
  request       : 0x06
  value         : 0x0302   0x03 获取字符串描述符  index:02  获取03位置的字符串,即是RTT Composite Device
  index         : 0x0409
  length        : 0x00ff
]
_get_string_descriptor
message type 2
message type 0    获取设备限定描述符 80 06 00 06 00 00 0A 00  全速设备不响应此请求
[
  setup_request : 0x80
  request       : 0x06
  value         : 0x0600 06:设备限定描述符
  index         : 0x0000
  length        : 0x000a
]
这里会有5秒时间
message type 0
[
  setup_request : 0x80
  request       : 0x06
  value         : 0x0100
  index         : 0x0000
  length        : 0x0012
]
_get_device_descriptor
message type 2
message type 0
[
  setup_request : 0x80
  request       : 0x06
  value         : 0x0200
  index         : 0x0000
  length        : 0x0009
]
_get_config_descriptor



      根据以上打印信息发现,主机会获取设备限定描述符,对于STM32虚拟U盘来说是全速设备,端点0回复STALL即可,可是这里产生了较长时间的等待,大约5秒,就是这5秒导致U盘枚举过慢。

3、解决办法
      通过查看处理设备限定描述符的代码,对比ST 虚拟U盘示例程序代码分析,在对端点0的STALL处理不一样,修改如下,增加对IN端点0的处理:

 

4、再次测试枚举过程,这个5秒的延时没有了,枚举变快了。

usb reset:111.287s
usb connect:111.288s
message type 5
reset 0
message type 6
usb reset:111.675s
message type 5
reset 1
usb ep0_setup_handler:111.712s
message type 0
[time:111.716
  setup_request : 0x80
  request       : 0x06
  value         : 0x0100
  index         : 0x0000
  length        : 0x0040
]
_get_device_descriptor
usb ep0 data in stage:111.730s
message type 2
usb reset:111.751s
message type 5
reset 0
usb ep0_setup_handler:111.787s
message type 0
[time:111.791
  setup_request : 0x00
  request       : 0x05
  value         : 0x0021
  index         : 0x0000
  length        : 0x0000
]
usb ep0 data in stage:111.804s
_sb ep0 data usb ep0_setup_handler:111.815s
message type 0
[time:111.819
  setup_request : 0x80
  request       : 0x06
  value         : 0x0100
  index         : 0x0000
  length        : 0x0012
]
_get_device_descriptor
usb ep0 data in stage:111.833s
message type 2
usb ep0_setup_handler:111.838s
message type 0
[time:111.842
  setup_request : 0x80
  request       : 0x06
  value         : 0x0200
  index         : 0x0000
  length        : 0x00ff
]
_get_config_descriptor
usb ep0 data in stage:111.857s
usb ep0_setup_handler:111.859s
message type 2
message type 0
[time:111.865
  setup_request : 0x80
  request       : 0x06
  value         : 0x0303
  index         : 0x0409
  length        : 0x00ff
]
_get_string_descriptor
usb ep0 data in stage:111.880s
usb ep0_setup_handler:111.882s
message type 2
message type 0
[time:111.888
  setup_request : 0x80
  request       : 0x06
  value         : 0x0300
  index         : 0x0000
  length        : 0x00ff
]
_get_string_descriptor
usb ep0 data in stage:111.902s
usb ep0_setup_handler:111.905s
message type 2
message type 0
[time:111.911
  setup_request : 0x80
  request       : 0x06
  value         : 0x0302
  index         : 0x0409
  length        : 0x00ff
]
_get_string_descriptor
usb ep0 data in stage:111.926s
usb ep0_setup_handler:111.928s
message type 2
message type 0   处理获取设备限定描述符操作
[time:111.934
  setup_request : 0x80
  request       : 0x06
  value         : 0x0600
  index         : 0x0000
  length        : 0x000a
]
EP0 stall set  不响应读取设备限定描述符, 这里和下面的请求设备描述符时间只有70ms间隔了,枚举变快了。
usb ep0_setup_handler:111.953s
message type 0
[time:111.957
  setup_request : 0x80
  request       : 0x06
  value         : 0x0100
  index         : 0x0000
  length        : 0x0012
]
_get_device_descriptor
usb ep0 data in stage:111.972s
usb ep0_setup_handler:111.975s
message type 2
message type 0
[time:111.980
  setup_request : 0x80
  request       : 0x06
  value         : 0x0200
  index         : 0x0000
  length        : 0x0009
]
_get_config_descriptor
usb ep0 data in stage:111.995s
usb ep0_setup_handler:111.998s
message type 2
message type 0
[time:112.003
  setup_request : 0x80
  request       : 0x06
  value         : 0x0200
  index         : 0x0000
  length        : 0x0020
]
_get_config_descriptor
usb ep0 data in stage:112.18s
usb ep0_setup_handler:112.20s
message type 2
message type 0
[time:112.026
  setup_request : 0x80
  request       : 0x06
  value         : 0x0300
  index         : 0x0000
  length        : 0x0002
]
_get_string_descriptor
usb ep0 data in stage:112.41s
usb ep0_setup_handler:112.43s
message type 2
message type 0
[time:112.049
  setup_request : 0x80
  request       : 0x06
  value         : 0x0300
  index         : 0x0000
  length        : 0x0004
]
_get_string_descriptor
usb ep0 data in stage:112.63s
usb ep0_setup_handler:112.66s
message type 2
message type 0
[time:112.071
  setup_request : 0x80
  request       : 0x06
  value         : 0x0303
  index         : 0x0409
  length        : 0x0002
]
_get_string_descriptor
usb ep0 data in stage:112.86s
usb ep0_setup_handler:112.89s
message type 2
message type 0
[time:112.094
  setup_request : 0x80
  request       : 0x06
  value         : 0x0303
  index         : 0x0409
  length        : 0x001a
]
_get_string_descriptor
usb ep0 data in stage:112.109s
usb ep0_setup_handler:112.112s
message type 2
message type 0
[time:112.117
  setup_request : 0x00
  request       : 0x09
  value         : 0x0001
  index         : 0x0000
  length        : 0x0000
]
_set_config
rt_usbd_set_config
rt_usbd_find_config
Mass storage function enabled
usb ep0 data in stage:112.137s
usb ep0_setup_handler:112.140s
message type 0
[time:112.144
  setup_request : 0xa1
  request       : 0xfe
  value         : 0x0000
  index         : 0x0000
  length        : 0x0001
]
rt_usbd_find_interface
mstorage_interface_handler
USBREQ_GET_MAX_LUN
usb ep0 data in stage:112.163s
message type 2
message type 1
_ep_out_handler 31
ep_out reside 36
_inquiry_cmd
usb ep1 data in stage:112.173s
message type 1
_ep_in_handler
_send_status
usb ep1 data in stage:112.180s
message type 1
_ep_in_handler
return to cbw status
message type 1
_ep_out_handler 31
ep_out reside 36
_inquiry_cmd
usb ep1 data in stage:112.193s
message type 1
_ep_in_handler
_send_status
usb ep1 data in stage:112.200s


 

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值