如何连接USB设备?

如何连接USB设备?

有一个传感器。该传感器通过 USB 连接,文件名为 ttyUSB0,位于 /dev 文件夹中。有一组命令:

1: -m 1024 \
2: -cpu core2duo \
3: -serial stdio \
4: -display none \
5: -hda /dev/sdb \
6: -usb \
7: -usb -device usb-host:productid=0x1a86,vendorid=0x7523 \
8: -drive file=/home/fedor/Git/usb.img \
9: -kernel $BUILD/$E_INIT/$BUILD_TARGET

连接 USB 设备的命令位于第 6、7、8 行,但它们不起作用。显示以下错误消息:

-device usb-host:productid=0x1a86,vendorid=0x7523: Parameter 'driver' is missing

该文件被授予完全读/写权限 sudo chmod -R uog=rwx /dev/ttyUSB0

使用以下命令创建文件映像:mkisofs -J -o usb.img /dev/ttyUSB0

fedor@fedor-VirtualBox:~$ lsusb
Bus 001 Device 003: ID 1a86:7523 QinHeng Electronics CH340 serial converter
Bus 001 Device 002: ID 80ee:0021 VirtualBox USB Tablet
Bus 001 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

我已经查看了很多来源,尝试了很多选项,但设备无法连接。

额外回应:

第一个链接 -在此输入链接描述

第二个链接-在此输入链接描述

第三个链接-在此输入链接描述

就这样吧,我不会再找别的东西了。是的,这些是运行指令,它们位于扩展名为.sh的文件中,它很大,它只是其中的一小部分。如果我插入 -serial /dev/ttyUSB0 而不是 3 行,则一切正常,但没有与设备进行交换。我只想将 USB 设备放入 qemu 中,仅此而已。


总结。设备无法重置,为什么?我不知道,也许其他人可以告诉我。

1: sudo modprobe -r ch341要返回一切原来的样子,您需要编写sudo modprobe ch341.

2: sudo chown -R fedor /dev/bus/usb

3: qemu-system-x86_64 -help我在终端中写入并获得“USB 选项”:

3.1: -usb enable on-board USB host controller (if not enabled by default)

3.2: -usbdevice name add the host or guest USB device 'name'

4: lsusb -v接下来,我编写的命令不是 lsusb,而是 lsusb -v。我发现两行:idVendor 0x1a86 QinHeng Electronics, idProduct 0x7523 CH340 serial converter.

5:接下来,我打开 qemu 并检查设备是否可见。我在终端中写入:qemu-system-x86_64。 Qemu 打开。

5.1:我通过按打开 qemu 终端Ctrl+Alt+2

5.2:我在 qemu 里面写info usbhost.之后,我得到以下信息: Bus 1, Addr 3, Port 2, Speed 12 Mb/s, Class ff: USB device 1a86:7523

6:确保设备可用后,我将以下内容写入扩展名为 .sh 的文件中:

1:  -m 1024 \
2:  -cpu core2duo \
3:  -serial stdio \
4:  -display none \
5:  -hda /dev/sdb \
6:  -usb \
7:  -usbdevice host,vendorid=0x1a86,productid=0x7523 \
8:  -kernel $BUILD/$E_INIT/$BUILD_TARGET

添加了第 6 行和第 7 行

7:显示以下错误:could not add USB device 'host,vendorid=0x1a86,productid=0x7523'

答案1

看起来您正在进行嵌套虚拟化:您在 VirtualBox VM 中运行 Linux,并尝试在该 VM 内运行另一个 Qemu VM - 这是正确的吗?

您还应该指定您正在使用的 Linux 发行版的名称和版本,或者至少指定您正在使用的 Qemu 版本。

如果您使用-serial /dev/ttyUSB0,那么传感器应该在 Qemu VM 中显示为“真正的”串行设备,即就/dev/ttyS0好像 Qemu VM 的操作系统是 Linux 或COM1:Windows。

如果您想将串行转换器(以及传感器)作为 USB 设备交给 Qemu VM 控制,则必须首先让 VirtualBox 将其提供给您的 Linux VM。由于它在lsusb列表中可见,因此您已经实现了这一点。下一步是断开 Linux VM 的 usbserial 驱动程序与设备的连接。有很多方法可以实现这一目标:

卸载负责串行转换器支持的USB串行驱动模块:

sudo modprobe -r ch341

或者找到串口转换器的USB路径规范,并告诉驱动程序将其解除绑定。例如:

ls -l /sys/bus/usb-serial/devices/ttyUSB0
lrwxrwxrwx 1 root root 0 Dec  6 16:47 /sys/bus/usb-serial/devices/ttyUSB0 -> ../../../devices/pci0000:00/0000:00:14.0/usb1/1-8/1-8:1.0/ttyUSB0/

在我的示例中,USB 路径是1-8:1.0.解除绑定的方法如下:

echo -n "1-8:1.0" > sudo tee /sys/bus/usb/drivers/ch341/unbind

您必须找到适合您的系统的正确路径。

USB 串行转换器驱动程序退出后,您需要确保 Qemu 有权访问“原始”USB 设备。如果您以用户身份运行虚拟机fedor

 sudo chown -R fedor /dev/bus/usb

之后,您应该能够启动 Qemu VM 并让它为自己声明 USB 串行转换器设备。

请注意,您的选项列表-usb在第 #6 行和第 #7 行指定了两次。也许只需要一次就足够了?

还,Qemu 4.2.50 的 Qemu USB 仿真文档说USB-device选项应该是

-device usb-host,productid=0x1a86,vendorid=0x7523 \

而不是你的

-device usb-host:productid=0x1a86,vendorid=0x7523 \

请注意逗号而不是冒号。这可能是导致错误消息的原因,或者不同版本的 Qemu 中的语法可能有所不同。

你的三个链接都没有提到你的mkisofs命令:我仍然不清楚你希望用它实现什么。

答案2

没有modprobe -r什么必要。 AFAIK qemu 会为你处理除许可之外的所有事情(因此setfacl; chown/chmod也很好)。

在此输入图像描述

在此输入图像描述

根据我的经验,应该模拟与设备连接到主机上的控制器类型相同的主机控制器。因此,对于大多数现代机器,选择是qemu-xhci对于某些较旧的机器,您可能想尝试usb-ehci一下。

编辑:看起来如果设备是全速(12M)或低速(1.5M)设备,并且无论出于何种原因您都不能使用模拟的 XHCI 主机控制器-usb(模拟 UHCI 控制器)设备是正确的切换使用。

如果您的 qemu 太旧而无法安装其中任何一个,您可以了解可用的替代方案:

$ qemu-system-x86_64 -device help | grep '[e|x]hci'
name "ich9-usb-ehci1", bus PCI
name "ich9-usb-ehci2", bus PCI
name "nec-usb-xhci", bus PCI
name "qemu-xhci", bus PCI
name "usb-ehci", bus PCI

参考号:https://github.com/qemu/qemu/blob/master/docs/system/devices/usb.rst

相关内容