日期:2014-05-16  浏览次数:20738 次

求助:我的单板偶尔检测不到U盘的插拔
大家好,我的单板上面有两个USB接口,正常情况下可以检测到U盘的插拔

可是有的时候用两个U盘反复进行插拔的时候,会导致某一个USB接口失去作用,也就是U盘拔出来时,内核不提示打印,仿佛

是没有检测到U盘的拔出,然后再插入到那个USB接口后,也无法检测到插入

我ps了一下,发现有几个奇怪的进程:

 1296 root SW< [scsi_eh_16]
 1297 root SW< [usb-storage]
 1299 root DW< [usb-stor-scan]

按理说,当U盘拔出时,上面3个进程都会消失的,现在这几个进程没有消失,就是说内核没有检测到U盘的拔出,所以这三个

进程才会变成这样的状态?

此时,如果再次插入U盘,就不会有任何响应了,因为上面3个进程还在,内核就会以为U盘是一直插在上面的?

我想把这三个进程杀掉,然后再重新插拔,来证实我的想法,可是这些进程又没有办法杀掉

大家能否就这种情况给点提示?非常感谢!!!

------解决方案--------------------

这种情况是有的, 我觉得应该是 u 盘拔出的 中断没有正确响应,也就导致 
usb disconnect 没有正确执行,相关资源没有正确释放。
这3个是内核线程, 杀不死的。 但是可以通过 reset usb 接口来实现。
------解决方案--------------------
这个情况跟 usb 设备的 热插拔有关系, 有时候 usb 接口正在交换数据,
然后设备被拔出,虽然硬件已经感知到 设备被拔出,但是驱动没办法正常处理,
因为数据处理部分在发送/接受数据, 传输失败的时候会进行重试,
如果驱动不够强壮,就会出现问题, 驱动没有正确处理 disconnect 。然后就出现你的问题了 。
你 dmesg看一下,是否有错误信息。 

另外关于 usb reset , 你 google 一下 libusb ,这个库中有相应的接口,需要你自己移植
并编写程序来实现。

------解决方案--------------------
内核版本是多少?