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
?
|