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

Linux中使用扩展USB Hub的问题
大家好,我的问题如下:

我有一个嵌入式设备为Linux系统,将主板上的一个USB口连接一个USB Hub扩展出多个USB口连接到多个不同的设备。由我的程序控制设备进行一些自动化工作。当其中的某个设备出现异常问题时,程序会自动的对USB口上挂接的设备进行断电和上电的复位操作,相当于拔插了一次设备,以此来恢复设备的工作。通过大规模测试,发现如下问题:

1、当对某一个USB口上的设备进行断电上电的复位操作时,有时会影响该USB Hub上的其它USB口设备,造成其它USB口设备短暂性的没有数据输出;
2、在某些异常情况下,会连续不断的对某个USB口上的设备进行断电上电的复位操作,知道设备正常为止,但这种频繁的复位操作往往造成USB设备不能正常挂载,造成设备丢失。错误信息如下:
Mar 30 03:28:14 KnowYouLinux kernel: usb 1-6.2: new full speed USB device using ehci_hcd and address 49
Mar 30 03:28:29 KnowYouLinux kernel: usb 1-6.2: device descriptor read/64, error -110
Mar 30 03:28:44 KnowYouLinux kernel: hub 1-6:1.0: unable to enumerate USB device on port 2

哪位大侠能否解释一下上述现象的原因,驱动问题?跟autosuspend有关?还是其它。

------解决方案--------------------
1、当对某一个USB口上的设备进行断电上电的复位操作时,有时会影响该USB Hub上的其它USB口设备,造成其它USB口设备短暂性的没有数据输出; 

//感觉是电源问题,测试下板子和usb的整体供电,或者换个大些电流的电源,这是我的常规做法,
如果是生产类似的现场还要特别数据线尽量做短些,严格考虑抗干扰问题,因为usb是高速通讯,细节要考虑


2、在某些异常情况下,会连续不断的对某个USB口上的设备进行断电上电的复位操作,知道设备正常为止,但这种频繁的复位操作往往造成USB设备不能正常挂载,造成设备丢失。错误信息如下:

// 看看linux/drivers/usb/core/hub.c的源码:
static int old_scheme_first = 0; 
改为
static int old_scheme_first = 1; 

#define SET_ADDRESS_TRIES 2 
改为
#define SET_ADDRESS_TRIES 4

主要是usb设备兼容性问题,国外有篇文章专门做说明和介绍的