Эмуляция физического USB-устройства Linux

У меня есть приложение Linux, которое я бы хотел автоматизировать для некоторых тестов, и его состояние должно измениться в зависимости от состояния определенных устройств, то есть USB-устройств, WLAN-устройств, WAN-устройств. Однако у нас больше нет физических USB-устройств, WLAN, WAN и т.д. Устройств, поэтому мне нужно выяснить способ протестировать эту программу без фактического подключения к физическим устройствам, включения/выключения и т.д.

Я начинаю с простого создания виртуального USB-устройства, которое я могу контролировать из пользовательского пространства, но с моей стороны возникает фундаментальная нехватка знаний, которая мешает мне принимать какие-либо из похожих тем на этих форумах и применять их к моим проект. Я чувствую, что мне нужно создать какой-то виртуальный USB-драйвер, а затем связать его с какой-то программой на уровне пользователя, а не с usbfs. Однако, даже если я создаю этот виртуальный драйвер, как мне "подключить" это устройство из пользовательского пространства и получить мою программу, зарегистрированную с помощью этого конкретного драйвера? Это то, что я пытаюсь сделать даже возможно?

Ответ 1

Лучший способ - использовать драйверы и оборудование для гаджетов Linux, которые позволяют вам быть USB-устройством. Драйвер гаджета позволяет компьютеру "притворяться" любым устройством. Тогда ваша тестируемая система имеет один кабель USB OTG для гаджета. Вам даже не нужно отключать кабель, если у вашего гаджета есть подходящее оборудование. "Гаджет-ящик" может быть вашим рабочим столом/ноутбуком под управлением Linux (если он поддерживает USB OTG) или даже Android-телефоном или малиной Pi. (Помните, что USB-кабели сосать. Просто потому, что кабель подходит не означает, что он правильно подключен для USB OTG.)

Как только у вас появится подходящее оборудование USB OTG, ваш гаджет - это все программное обеспечение:

1) Если тестируемое устройство поддерживает OTG, убедитесь, что ваш гаджет не пытается и не является USB-хостом. (Тогда ваше тестируемое устройство станет USB-клиентом.) I.e. убедитесь, что такие вещи, как usb_storage, не загружаются автоматически.

2) Ядро ядра поддерживает гаджеты для USB-концентраторов, USB-Ethernet, USB-последовательных портов и USB-накопителей. Просто загрузите нужные модули в свой гаджет, и он "просто работает". Например, чтобы создать USB-накопитель, сделайте что-то вроде этого: "insmod g_file_storage.ko file=/dev/ram0". Дальняя сторона будет думать, что вы подключили USB-накопитель.

Для последовательных устройств ваш гаджет может запускать код пользовательского пространства, который "подбирает телефон" на /dev/USBx "и разговаривает с тестируемым устройством. (Предположительно, эмуляция 4G-модема или что-то еще.)

Тонны устройств действительно "USB-серийные" под капотом, потому что производитель был слишком ленив, чтобы понять USB.

3) С небольшим повторным компиляцией или настройкой вы можете использовать эти универсальные устройства гаджета для обозначения различных идентификаторов USB или возврата различных строк поставщика и т.д. Это будет не то же самое, что "тестирование на реальном аппаратном обеспечении", но, по крайней мере, вы тестируете стандартную версию этих устройств.

4) Для типов устройств, которые еще не находятся в ядре (например, Wi-Fi или что-то еще), вы сами по себе. С достаточным количеством пота и слез крови вы можете написать свой собственный тип гаджета. (В идеале, как можно больше в пространстве пользователя, и обрабатывайте только критически важные компоненты в ядре..)

Остерегайтесь: невозможно одновременно понять и оценить USB.

Ответ 2

Можете ли вы протестировать свое приложение в виртуальной среде с помощью VMWare? Затем вы можете "подключить" любое виртуальное устройство на своем компьютере к гостевой виртуальной машине и протестировать приложение таким образом.