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