1

这可能是一个愚蠢的问题,是否需要在超时后重新枚举USB大容量存储类?

我在运行嵌入式Linux的ARM-CortexM4平台(STM32F4系列)上调试USB存储设备。 ARM作为USB主机工作,并尝试与USB全速(12Mb/s)的拇指驱动器进行通信。

现在这里是问题。通过BULK传输成功枚举和多个SCSI命令后,容量和所有内容都可以正确读取。然而,约15秒后,当我再次尝试发送这些SCSI命令(同等条件下),USB主机控制器仅返回“交易错误”,它看起来像设备没有响应批量传输了(不确认序号)和主机控制器超时。问题是,USB大容量存储类或SCSI系统是否有超时机制,在超时后系统必须重新枚举或重新探测,否则它将不再响应?

我理解这可能会在我的计划是因为一个愚蠢的错误,或由于对特定的硬件一定的局限性。但是,当我在PC上的Linux上使用usbmon模块来捕获同一个驱动器上的传输时,我可以看到操作系统每5个实际发送一个序列探测命令(Read-max-Lun,接着是测试单元就绪)秒,这可能是为什么拇指驱动器没有在我的电脑上失败的原因。

谢谢!我期待着任何答复。

回答

0

我认为你是在正确的轨道与测试单元就绪命令上..我在写一个嵌入式设备的大容量存储设备驱动程序的中间,当OS X测试,最初的SCSI查询后,当没有其他活动发生时,我的设备每秒接收一次“测试单元就绪”命令。由于你的帖子已经很老了,所以如果你已经解决了你的问题,我建议你发布你自己的解决方案。

否则尝试从主机侧面加入定期测试单元准备命令时,有没有其他活动。您可以设置并激活每当USB处于活动状态的计时器。如果定时器启动,您可以发送一个测试单元就绪命令。冲洗重复。

+0

我很感谢您的回复。不幸的是,这个问题还没有解决一段时间,我已经放弃了现在。我曾尝试切换回由STMicro提供的USB主机固件,但它似乎在工作,但我试图将所有内容都复制到我的Linux设备驱动程序中,并在几秒钟后像以前那样挂起设备。 – caoyuan9642 2015-03-29 23:49:01

+0

由于我正在调试主机并且您正在设计一个设备,因此我的问题可能与您的问题有所不同。我不知道谁应该定期发送测试单元。很明显,它不会自动发送到Linux内核驱动程序本身的任何位置,所以我怀疑它是由一些用户空间守护程序(如udev)发送的?我对用户空间程序不是很熟悉,这只是一个猜测。希望这方面的专家能帮助我。谢谢! – caoyuan9642 2015-03-29 23:51:46