强制 USB 断开/重新连接

强制 USB 断开/重新连接

我的外置硬盘底座需要一个令人沮丧的安装顺序,其中插入 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
  • usbresetioctl(),通过 USBDEVFS_RESET启动
  • 都不ioctl()与 USBDEVFS_(DIS)CONNECT

因为内核消息看起来与真正的物理重新插入不同。

看起来什么内核日志中与真正重新插入无法区分的是:

  • 界面/sys/bus/usb/devices/.../port/disable
  • 写入1该文件以禁用
  • 记住该接口基于控制器的位置pwd -P
  • 或阅读这么长的答案有关重新启用设备的更多详细信息和示例

可能完整的端口控制并不是在任何地方都能很好地工作,因为某些硬件绝对不能禁用 USB 端口的 5V 电源。我在一台旧办公室电脑和一台(也是旧的)带有 USB 集线器的办公室显示器上测试了一些随机端口:效果很好。

相关内容