我的外置硬盘底座需要一个令人沮丧的安装顺序,其中插入 USB 电缆必须是最后一步(即插入硬盘、开机、插入)。
当我这样做时,它工作得很好,但电缆不太容易接近,我担心频繁的插拔最终会损坏它。
因此,我尝试在保持 USB 电缆插入的情况下打开设备电源。有时有效,有时无效。当它不起作用时,我收到此消息(dmesg):
[372734.412683] xhci_hcd 0000:00:14.0: Command completion event does not match command
[372734.412686] xhci_hcd 0000:00:14.0: Timeout while waiting for setup device command
[372739.622686] xhci_hcd 0000:00:14.0: Timeout while waiting for setup device command
[372739.826432] usb 3-5: device not accepting address 21, error -62
lsusb -v 给出:
Bus 003 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 3.00
bDeviceClass 9 Hub
bDeviceSubClass 0 Unused
bDeviceProtocol 3
bMaxPacketSize0 9
idVendor 0x1d6b Linux Foundation
idProduct 0x0003 3.0 root hub
bcdDevice 4.02
iManufacturer 3 Linux 4.2.0-0.bpo.1-amd64 xhci-hcd
iProduct 2 xHCI Host Controller
iSerial 1 0000:00:14.0
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 31
bNumInterfaces 1
bConfigurationValue 1
iConfiguration 0
bmAttributes 0xe0
Self Powered
Remote Wakeup
MaxPower 0mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 1
bInterfaceClass 9 Hub
bInterfaceSubClass 0 Unused
bInterfaceProtocol 0 Full speed (or root) hub
iInterface 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0004 1x 4 bytes
bInterval 12
bMaxBurst 0
Hub Descriptor:
bLength 12
bDescriptorType 42
nNbrPorts 6
wHubCharacteristic 0x000a
No power switching (usb 1.0)
Per-port overcurrent protection
bPwrOn2PwrGood 10 * 2 milli seconds
bHubContrCurrent 0 milli Ampere
bHubDecLat 0.0 micro seconds
wHubDelay 0 nano seconds
DeviceRemovable 0x00
Hub Port Status:
Port 1: 0000.02a0 5Gbps power Rx.Detect
Port 2: 0000.02a0 5Gbps power Rx.Detect
Port 3: 0000.02a0 5Gbps power Rx.Detect
Port 4: 0000.02a0 5Gbps power Rx.Detect
Port 5: 0000.02e0 5Gbps power Polling
Port 6: 0000.02a0 5Gbps power Rx.Detect
所以如果我理解正确的话,内部 USB 集线器内存在一些错误。
所以我想知道是否有一种方法可以模拟某种重置,使设备再次注册,而无需操作 USB 电缆。
例如,这也有助于远程安装设备。
谢谢
答案1
这有点旧了,但我只是需要答案并在其他地方找到了它。
首先,从错误消息中复制您的集线器设备名称。就你而言,0000:00:14.0
然后,以 root 身份执行以下操作:
echo 0000:00:14.0 >> /sys/bus/pci/drivers/xhci_hcd/unbind
echo 0000:00:14.0 >> /sys/bus/pci/drivers/xhci_hcd/bind
很快:集线器已重置,您可以继续使用。
我多年来一直在处理这个错误。我不确定这是内核问题还是硬件问题(我的主要怀疑)。但至少现在我不需要重新启动只是为了重置 USB 集线器。
答案2
最接近真正拔出并重新插入的是绝对不是:
- 解除绑定 + 绑定(即通过
/sys/bus/usb/devices/.../driver/bind
) usbreset
ioctl()
,通过 USBDEVFS_RESET启动- 都不
ioctl()
与 USBDEVFS_(DIS)CONNECT
因为内核消息看起来与真正的物理重新插入不同。
看起来什么内核日志中与真正重新插入无法区分的是:
- 界面
/sys/bus/usb/devices/.../port/disable
- 写入
1
该文件以禁用 - 记住该接口基于控制器的位置
pwd -P
- 或阅读这么长的答案有关重新启用设备的更多详细信息和示例
它可能完整的端口控制并不是在任何地方都能很好地工作,因为某些硬件绝对不能禁用 USB 端口的 5V 电源。我在一台旧办公室电脑和一台(也是旧的)带有 USB 集线器的办公室显示器上测试了一些随机端口:效果很好。