USB является асимметричным :Существуют ведущие устройства USB (ваш ПК )и ведомые устройства USB (устройства ). Вот почему существует два разных типа USB-разъемов: тип A для ведущих и тип B для ведомых, хотя различие становится размытым из-за того, что разработчики оборудования используют тип A везде, а USB OTG может делать и то, и другое.
USB-гаджеты Linux — это модули ядра, представляющие USB-устройство на ведомом USB-контроллере. Им нужен (ведомый -)хост-контроллер (HC )для подключения; во встроенной системе Linux, представляющей устройство, это будет драйвер для контроллера USB. На ПК нет железа.
Но есть еще один модуль ядра, который может имитировать подчиненный контроллер USB:dummy_hcd
. Этот модуль предоставляет виртуальный (ведомый -)хост-контроллер для подключения гаджетов и виртуальный (главный -)хост-контроллер, который дает вам дополнительную шину USB, на которой отображаются эти устройства.
Пример:
# modprobe dummy_hcd
# lsusb
...
Bus 005 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
# modprobe g_serial
# lsusb
...
Bus 005 Device 002: ID 0525:a4a7 Netchip Technology, Inc. Linux-USB Serial Gadget (CDC ACM mode)
Bus 005 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
И вы получаете два новых узла устройства, /dev/ttyGS0
из g_serial
для гаджета и /dev/ttyACM0
из автоматически загружаемого модуля cdc_serial
, представляющего устройство. Вы можете проверить, что они взаимодействуют, записывая в один и читая из другого.
Существует также g_webcam
драйвер гаджета UVC. Он создает новое /dev/video*
устройство, и, как и /dev/ttyGS0
выше, вы можете передавать потоковое видео на это устройство, чтобы использовать гаджет.И это то, что делает ваша uvc-gadget
программа пользовательского пространства :Она либо берет статическое изображение, либо вводится другое существующее «настоящее» устройство UVC и передает его во вновь созданное /dev/video*
, чтобы вы могли передать свое USB-устройство. реальные данные и посмотрите, правильно ли они выводятся на USB-мастере, который использует это устройство.
Однако это не работает с шиной dummy_hcd
(Я попробовал только что ):Как и выше, второе/dev/video*
устройство должно быть создано модулем ядра USB на главная сторона, которая использует веб-камеру. Этого не происходит; вместо этого система USB становится настолько запутанной через короткое время, что я больше не могу использовать клавиатуру и мышь.
Так что либо g_webcam
глючит, либо возможно видеоподсистема пытается создать оба устройства с одним и тем же идентификатором и потом ломается, а может еще что. Я не знаю.
Таким образом, это может работать только в реальной встроенной системе с настоящим (ведомым -)хост-контроллером.
Итак, да, есть доступные инструменты, которые могут это сделать, но, к сожалению, симуляция содержит ошибки, если вы хотите, чтобы симулируемое устройство отображалось на том же компьютере (и на обычном ПК ). Это может по-прежнему работать на встроенной системе (, вы не сказали, где и как вы хотите использовать эмулируемое устройство ).