Virtual usb port linux

Emulate physical USB device Linux

I have a Linux application that I would like to automate some tests for, and its state should change depending on the status of certain devices, i.e. USB devices, WLAN devices, WAN devices. However, we no longer have physical USB, WLAN, WAN, etc devices at our disposal, so I need to figure out a way to test this program without actually plugging in physical devices, turning them on/off, etc. I am starting off by simply creating a virtual USB device that I can control from user space, but there is a fundamental lack of knowledge on my part preventing me from taking any of the similar topics on these forums and applying them to my project. I feel like I will need to create some kind of virtual USB driver, and then have it communicate with some user-level program rather than usbfs. However, even if I create this virtual driver, how do I «plug in» this device from user-space and get my program registered with this particular driver? Is what I’m trying to do even possible?

2 Answers 2

The best way is to use the Linux Gadget Drivers and hardware that allows you to be a USB device. The gadget driver allow a computer to «pretend» to be any kind of device. Then your system under test has a single USB OTG cable to the gadget box. You don’t even need to unplug the cable if your gadget box has the right hardware. The «gadget box» could be your desktop/laptop running Linux (if it supports USB OTG), or even an Android phone or Raspberry Pi. (Beware that USB cables suck. Just because the cable fits doesn’t mean it’s wired correctly for USB OTG.)

Once you have the right USB OTG hardware, your gadget box is all software:

1) If your device under test supports OTG, make sure your gadget box does NOT try and become a USB host. (Then your device under test will become a USB client.) I.e. make sure things like usb_storage are not automatically loaded.

2) Out of the box, the kernel supports gadgets for USB Hubs, USB Ethernet, USB Serial ports and USB sticks. Just load the right modules on your gadget box and it «just works». For example, to create a USB stick, do something like this: » insmod g_file_storage.ko file=/dev/ram0 «. The far side will think that you plugged in a USB stick.

For serial devices, your gadget can run user-space code that «picks up the phone» on /dev/USBx» and talks to your device under test. (Presumably emulating a 4G modem or whatever.)

Tons of devices are really «USB serial» under the hood because the manufacturer was too lazy to understand USB.

Читайте также:  Linux создаем рут пользователя

3) With a little re-compiling or configuring, you can have those generic Gadget Devices pretend to be various USB IDs or return various vendor strings, etc. This won’t be the same as «testing against real hardware», but at least you are testing with generic version of these devices.

4) For device types that aren’t already in the kernel (i.e WiFi or something), you’re on your own. With enough blood sweat and tears, you can use write your own gadget type. (Ideally, keep as much as possible in user space, and only handle the performance critical parts in the kernel..)

Beware: it is impossible to simultaneously understand and appreciate USB.

Источник

как сделать эмуляцию serial порта на usb-устройстве?

В windows’е для определенного устройства есть специальный драйвер. Как мне его воспроизвести на linux mint 15? http://dumpz.org/753081/ — вот код драйвера.

Написать драйвер. Что за устройство-то?

Написать драйвер. Что за устройство-то?

Самодельное — дали поюзать, описали протокол взаимодействия по Serial-порту, дали драйвер под винду..)

Как драйвер под венду называется?

Установи пакет tinyserial, запускай com /dev/ttyACM0 [скорость] . Или тупо screen используй — он-то у всех установлен.

А еще можно при помощи setserial или minicom настроить «порт» и фигачить посредством echo туда всякую дребедень, считывая tailf ‘ом.

Это, извиняюсь, говнище какое-то, но никак не код «драйвера»!

Да, конечно. Я бы даже не начинал разбираться, если б протокола не было )))

Лол, это *.inf от вендового драйвера; не код, да.

В общем, похоже, ТС собирается сделать «то, не знаю, что». Трудно ему придется.

В общем, похоже, ТС собирается сделать «то, не знаю, что». Трудно ему придется.

Для того тему и завел — спросить совета. tinyserial в mint’е нету. $ /dev/ttyACM0 не появляется. С setserial и minicom не разобрался. Да. Трудно.

Как страшно жить.

Вынимаешь железку, вставляешь, смотришь dmesg что там определилось. В девайсах у тебя появятся ttyACM0 или ttyU0 . На него и натравливаешь cu или minicom .

Par example: cu -s 9600 -l /dev/ttyU0

beastie ★★★★★ ( 11.12.13 00:29:50 MSK )
Последнее исправление: beastie 11.12.13 00:31:08 MSK (всего исправлений: 1)

Либо эта самоделка глючит либо драйвер её не опознаёт.

Попробуй lsusb, может он его покажет. Но то, что в dmesg его не видно это плохой признак.

Кабель к нему тоже самопальный идёт?

Кабель к нему тоже самопальный идёт?

Покупной обычный Mini usb — Crc-драйвер успешно ищется и встает на винде — только-что попробовал.

Ну ты как маленький прямо! Запусти udevadm monitor и воткни железяку. Если по выхлопу удева не поймешь, то dmesg тебе, возможно, что-то подскажет.

А если это не CDC, а хитрожопая вантузная НĒХ, то придется при помощи libusb что-нибудь пилить.

В девайсах у тебя появятся ttyACM0 или ttyU0

dmesg что говорит? А lsusb ? А udevadm monitor при втыкании железяки?

Если все молчат, производитель железки — козел.

До неё только дошел — уже завтра буду разбираться. Через pyusb делаю:

>>> import usb In [35]: usb.core.find(bDeviceClass=1) In [36]: usb.core.find(bDeviceClass=0) Out[36]: In [37]: usb.core.find(bDeviceClass=3) In [38]: usb.core.find(bDeviceClass=2) In [39]: usb.core.find(bDeviceClass=2) Out[39]: In [40]: dev = usb.core.find(bDeviceClass=2) 

путем исключения после втыкания и вытыкания usb-девайсов, становится понятно, что что-то там видно на usb-порте. вопрос тепрь, как с этим «что-то» работать, через вот эту либу.

после втыкания и вытыкания usb-девайсов, становится понятно, что что-то там видно на usb-порте.

Посмотри через lsusb, что за VID и PID у железяки. А еще глянь, какое устройство ей соответствует (/dev/bus/usb/[BUS]/[DEV]) и попробуй его открыть в обычном последовательном терминале. Вдруг случится чудо? Тогда просто правило для удева напишешь для этих VID и PID, чтобы симлинк делал.

Читайте также:  Этапы установки linux кратко

Есть нормальные железные эмуляшки от старых нокиа. Банка пива.
Правда получается не com1, com2 и с програматорами правильно не сростется.
Если конечно для этого нужно. rts, cts и тп.

Поднял задницу — нашел.
Bus 005 Device 002: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port
Оно.

USB CDC ACM Vendor and Product ID Definitions VID 04D8 PID 000A

Гуглишь «linux VID 04D8 PID 000A» и находишь что стоит его один раз воткнуть в Ubuntu 10.04 — оно начинает рабоать везде. Так что выкинь нахер свой минт и ставь убунту.

I did not change anything. No patches, nothing. I just loaded «usbserial», «cdc_acm» and «ftdi_sio», plugged in the device and it worked. I added the modules to /etc/modules and the board gets ready with the RPi boot. Perfect! The only difference is, that I plugged it once into my notebook with Ubuntu 10.04 (2.6.+).

Волшебный дистрибутив — сам пользуюсь 🙂

Возможно ТС-у просто нужно вручную сделать:

$ modprobe usbserial $ modprobe cdc_acm

и воткнуть девайс. Возможно тогда оно подцепится в Mint.

Скорее всего, в параметрах указав pid и vid девайса (product=xxx, vendor=xxx).

Источник

Linux Virtual USB device driver

My goal is to create a virtual USB char device (not block device) for Linux 2.6.32 and above (I use debian squeeze) that would be recognize by the system. I would like that this device be listed with lsusb as a normal USB device, and that every application could use libusb in order to open the device, and send control message, and make bulk write/read. But behind this virtual device, it’s behavior would be set by my application. I want to set it’s product ID, it’s vendor ID, answer to USB status, and bulk read. I’ve read some posts about how to use USB/IP in order to create a virtual USB device, and that’s exactly what I want to do Installation and emulation of virtual USB Device http://breaking-the-system.blogspot.fr/2014/08/emulating-usb-devices-in-python-with-no.html But unfortunately, when I tried with 2.6.32 kernel and above, I didn’t succeed making it work. So I looked at how to create a kernel module that would create the virtual device : http://pete.akeo.ie/2011/08/writing-linux-device-driver-for-kernels.html This one looks great also, but the sample provided doest not indicate how to make it an USB device. I’ve seen some post talking about it with windows but none that could help me with Linux. I would like to avoid buying some USB programmable cards when it can be done with software. Have anyone any leads on how to make the first methods works under newer kernel, or convert the sample code of the second method for making an USB device ?

Читайте также:  Права суперпользователя linux debian

2 Answers 2

In the original code are missing USB requests like set configuration and get status. Without the implementation of all USB requests used for the OS driver the code will not work.

I guess raw-gadget kernel module is the thing that you want?

you can check the dummy_hcd and tests directory inside the repo, it will guide you how to create a virtual USB device

Linked

Hot Network Questions

Subscribe to RSS

To subscribe to this RSS feed, copy and paste this URL into your RSS reader.

Site design / logo © 2023 Stack Exchange Inc; user contributions licensed under CC BY-SA . rev 2023.7.14.43533

By clicking “Accept all cookies”, you agree Stack Exchange can store cookies on your device and disclose information in accordance with our Cookie Policy.

Источник

Как создать виртуальный USB-накопитель?

Нужно сэмулировать подключенную к usb флешку с возможностью определить ее размер и работать как с физическим устройстов в режиме чтения\записи.

А почему именно флешку ? Простой виртуальный диск не подойдет ?

Dark_SavanT ★★★★★ ( 06.04.15 16:06:53 MSK )
Последнее исправление: Dark_SavanT 06.04.15 16:07:35 MSK (всего исправлений: 1)

Потому, что я работаю с программой VirtualBox и в ней «оно» должно определяться именно как подключенная физическая флешка.

Тогда пробуй USB gadget как советовал Dark_SavanT

insmod g_file_storage.ko file=/my_virtual_usb_storage.dat 

Я не так давно на Linux как вы могли подумать, судя из совета и гугла мне нужно написать собственный драйвер?

надо сходить в гугл и научиться ставить это

insmod g_file_storage.ko file=/my_virtual_usb_storage.dat (это файл, который прикидывается флешкой)

и засунуть это в терминал.

нет все уже написано до вас, нужно просто установить (есть вероятность что у вас уже установлено) и настроить.

Про файл который прикидываеться флешкой я понял. Что это g_file_storage.ko и где его взять? Терминал отвечает, что модуль не загружен, нет такого модуля в директории, но это и понятно.

g_mass_storage, только это тебе не надо

тебе надо в настройки виртуал бокса, там должно быть создание usb диска для этой виртуальной машины.

Linux version 3.16.0-4-686-pae (debian-kernel@lists.debian.org) (gcc version 4.8.4 (Debian 4.8.4-1) ) #1 SMP Debian 3.16.7-ckt7-1 (2015-03-01)

если «no such device», то видимо у тебя нету устройства, которое прикидывается usb device, usb host так по умолчанию не умеет.

У меня нет модуля с таким названием.
И не понимаю,причём тут наличие или отсутствие устройств?
Как я понимаю эти модули продвинутая версия loop устройства умеющего прикинуться диском полностью,
причём здесь что либо ещё?

Как я понимаю эти модули продвинутая версия loop устройства

неправильно понимаешь, это часть usb gadget framework, об этом нам говорит g_*

Источник

Оцените статью
Adblock
detector