是否可以在不物理断开/连接 PC 的情况下重置 USB 设备的连接?
具体来说,我的设备是数码相机。我正在使用gphoto2
,但最近我收到“设备读取错误”,所以我想尝试对连接进行软件重置。
据我所知,没有为相机加载内核模块。唯一看起来相关的是usbhid
.
是否可以在不物理断开/连接 PC 的情况下重置 USB 设备的连接?
具体来说,我的设备是数码相机。我正在使用gphoto2
,但最近我收到“设备读取错误”,所以我想尝试对连接进行软件重置。
据我所知,没有为相机加载内核模块。唯一看起来相关的是usbhid
.
将以下内容另存为
usbreset.c
在终端中运行以下命令:
编译程序:
获取要重置的 USB 设备的总线和设备 ID:
使我们编译的程序可执行:
以 sudo 权限执行程序;通过运行以下命令对找到的
<Bus>
和id进行必要的替换:<Device>
lsusb
上述程序来源:http ://marc.info/?l=linux-usb&m=121459435621262&w=2
我以前没有在你的具体情况下发现自己,所以我不确定它是否足够,但我发现重置 USB 设备的最简单方法是这个命令:(不需要外部应用程序)
那是我用来重置我的 Kinect 的实际方法,因为 libfreenect 似乎没有让它重新进入睡眠状态的 API。它在我的 Gentoo 机器上,但内核应该足够新,可以为 sysfs 使用相同的路径结构。
您的显然不会,
1-4.6
但您可以从内核日志 (dmesg
) 中提取该设备路径,或者您可以使用诸如lsusb
获取供应商和产品 ID 之类的东西,然后使用这样的快速命令来列出路径与不同供应商的关系/产品 ID 对:这将重置所有 USB1/2/3 连接的端口[1]:
我相信这会解决你的问题。如果您不想重置所有 USB 端点,您可以使用适当的设备 ID 从
/sys/bus/pci/drivers/ehci_hcd
注: [1]:
*hci_hcd
内核驱动程序通常控制 USB 端口。ohci_hcd
和uhci_hcd
用于 USB1.1 端口,ehci_hcd
用于 USB2 端口和xhci_hcd
用于 USB3 端口。(参见https://en.wikipedia.org/wiki/Host_controller_interface_(USB,_Firewire))我创建了一个 Python 脚本,可根据此处的答案简化整个过程。
将下面的脚本另存为 reset_usb.py 或克隆此 repo。
用法:
脚本:
我需要在 python 脚本中自动执行此操作,因此我将 LiLo 的非常有用的答案改编为以下内容:
就我而言,它是 cp210x 驱动程序(我可以从中看出
lsmod | grep usbserial
),因此您可以将上面的代码段保存为 reset_usb.py,然后执行以下操作:如果您的系统上还没有 ac 编译器设置,这也可能会有所帮助,但您确实有 python。
Since the APT package usbutils provides the usbreset binary you can just reset the USB device by:
我通过重新加载模块来使用一种大锤。这是我的 usb_reset.sh 脚本:
这是我的系统服务文件 /usr/lib/systemd/system/usbreset.service 在我的显示管理器启动后运行 usb_reset.sh :
最快的重置方法是重置 USB 控制器本身。这样做将强制 udev 在断开连接时取消注册设备,并在启用后重新注册。
这应该适用于大多数 PC 环境。但是,如果您使用一些自定义硬件,您可以简单地遍历设备名称。使用此方法,您无需通过 lsusb 查找设备名称。您也可以合并到自动化脚本中。
由于问题的特殊情况是 gphoto2 与 USB 上的相机的通信问题,因此 gphoto2 中有一个选项可以重置其 USB 连接:
也许这个选项在 2010 年问这个问题时不存在。
我制作了一个 python 脚本,它将根据设备号重置特定的 USB 设备。您可以通过命令 lsusb 找到设备号。
例如:
在这个字符串中 004 是设备号