问题描述
rtthread usb驱动某些U盘只能读出大小,文件系统挂在不成功,多插拔几次后不能识别u盘。
解决方案
- 上电不能识别
fatfs文件系统还没注册已进入usb中断
int elm_init(void)
{
dfs_register(&dfs_elm);
}
//INIT_COMPONENT_EXPORT(elm_init);
INIT_PREV_EXPORT(elm_init);
- 热插入不能识别
能读u盘大小但是挂载失败。具体原因不明,望告知。但可以通过修改代码成功挂载u盘。代码在后面
- 多次插拔出错
connect_status状态问题。情况2和3修改代码如下:
static int drv_pipe_xfer(upipe_t pipe, rt_uint8_t token, void *buffer, int nbytes, int timeouts)
{
int timeout = timeouts;
rt_err_t ret = RT_EOK;
while (1)
{
if (!connect_status)
{
return -1;
}
int times = 10;
while(times > 0)
{
times--;
rt_completion_init(&urb_completion);
HAL_HCD_HC_SubmitRequest(&stm32_hhcd_fs,
pipe->pipe_index,
(pipe->ep.bEndpointAddress & 0x80) >> 7,
pipe->ep.bmAttributes,
token,
buffer,
nbytes,
0);
ret = rt_completion_wait(&urb_completion, timeout);
if(RT_EOK == ret)
break;
else
RT_DEBUG_LOG(RT_DEBUG_USB, ("rt_completion_wait = %d\n", ret));
}
if(ret)
{
connect_status = RT_FALSE;
return -RT_ETIMEOUT;
}
rt_thread_mdelay(1);
需要在 usb_common.h中修改USB_TIMEOUT_LONG时间
/*
* Time of usb timeout
*/
#ifndef USB_TIMEOUT_BASIC
#define USB_TIMEOUT_BASIC (RT_TICK_PER_SECOND) /* 1s */
#endif
#ifndef USB_TIMEOUT_LONG
#define USB_TIMEOUT_LONG (RT_TICK_PER_SECOND) /* 1s */
#endif
#ifndef USB_DEBOUNCE_TIME
#define USB_DEBOUNCE_TIME (RT_TICK_PER_SECOND / 5) /* 0.2s */
#endif