Вопрос или проблема
Я пытаюсь создать “виртуальную веб-камеру” на Raspberry Pi Zero 2 W с Ubuntu 24.10.
Я работаю через этот учебник:
https://developer.ridgerun.com/wiki/index.php/How_to_use_the_UVC_gadget_driver_in_Linux
где они хотят создать “виртуальную веб-камеру”, чтобы передавать видео так, как будто оно поступает с локально подключенной камеры.
Я прошел по скрипту (прилагается ниже) до конца, и все работало, но устройство не отображается на моем Mac как USB-устройство. Я смог настроить это же устройство как g_ether, просто загрузив модули, и оно определяется на Mac, так что я знаю, что мое оборудование/кабели в порядке.
Сообщение dmesg показывает:
[ 923.318812] configfs-gadget.g1 gadget.0: uvc: uvc_function_bind() [ 923.320674] dwc2 3f980000.usb: bound driver configfs-gadget.g1
Однако Mac не видит его:
% system_profiler SPUSBDataType USB:
USB 3.1 Bus:
Host Controller Driver: AppleT6000USBXHCI
USB 3.1 Bus:
Host Controller Driver: AppleT6000USBXHCI
USB 3.1 Bus:
Host Controller Driver: AppleT6000USBXHCI
Я видел примечание о том, что нужно сделать:
echo peripheral > $UDC_ROLE
и я подозреваю, что проблема в том, что не устанавливается устройство в режим периферии, даже несмотря на то, что я указал это в /boot/firmware/config.txt как dr_mode=peripheral.
Скрипт указывает установить UDC Role так: UDC_ROLE=/sys/devices/platform/soc/78d9000.usb/ci_hdrc.0/role
Поскольку мой контроллер 3f980000.usb, я зашел в /sys/devices/platform/soc/3f980000.usb, но там нет папки ci_hdrc.0, и я искал файл с именем role, но ничего не нашел:
root@raspberrypi:/sys/devices/platform/soc/3f980000.usb# find . -name role -print
Буду признателен за любую помощь!
скрипт:
#!/bin/bash
# Переменные, которые нам нужны, чтобы упростить все позже.
#
set -e
# Сначала загрузите модуль libcomposite
modprobe libcomposite
UDC=`ls /sys/class/udc`
UDC_ROLE=/sys/devices/platform/soc/78d9000.usb/ci_hdrc.0/role
CONFIGFS="/sys/kernel/config"
GADGET="$CONFIGFS/usb_gadget"
VID="0x0525"
PID="0x0102"
SERIAL="0123456789"
MANUF=$(hostname)
PRODUCT="UVC Gadget"
mkdir -p $GADGET/g1
cd $GADGET/g1
echo $VID > idVendor
echo $PID > idProduct
mkdir -p strings/0x409
echo $SERIAL > strings/0x409/serialnumber
echo $MANUF > strings/0x409/manufacturer
echo $PRODUCT > strings/0x409/product
mkdir configs/c.1
mkdir configs/c.1/strings/0x409
CONFIG="configs/c.1"
FUNCTION="uvc.0"
mkdir functions/$FUNCTION
mkdir -p functions/$FUNCTION/streaming/uncompressed/u/360p
cat <<EOF > functions/$FUNCTION/streaming/uncompressed/u/360p/dwFrameInterval
666666
1000000
5000000
EOF
mkdir functions/$FUNCTION/streaming/header/h
cd functions/$FUNCTION/streaming/header/h
ln -s ../../uncompressed/u
cd ../../class/fs
ln -s ../../header/h
cd ../../class/hs
ln -s ../../header/h
cd ../../class/ss
ln -s ../../header/h
cd ../../../control
mkdir -p header/h
ln -s header/h class/fs
ln -s header/h class/ss
cd ../../../
echo 2048 > functions/$FUNCTION/streaming_maxpacket
ln -s functions/$FUNCTION configs/c.1
echo $UDC > UDC
echo "Готово. Список /dev/video*"
ls /dev/video*
Я пытался настроить устройство как в g_webcam, так и в configfs (по скрипту), и в обоих случаях устройство отображается как привязанный к UDC в dmesg, но устройство не обнаруживается на хосте (Mac).
Я пробовал использовать Raspberry Pi OS Lite 64 (Debian 12 Bookworm) и Ubuntu 24.10 и получаю такие же результаты. Оно будет определяться как g_ether, но не как g_webcam или через configfs.
Ответ или решение
Проблема, с которой вы столкнулись при настройке виртуальной камеры на Raspberry Pi Zero 2 W с использованием Ubuntu 24.10, может быть связана с различными факторами. Ваша цель – создать виртуальную веб-камеру так, чтобы она корректно отображалась на Mac, но в текущий момент устройство определяется только как g_ether (Ethernet), что указывает на то, что настройка USB-гаджета UVC (USB Video Class) прошла неудачно.
Вот несколько шагов и рекомендаций, которые могут помочь в решении вашего вопроса:
1. Проверка конфигураций USB
Убедитесь, что вы правильно задали режим работы порта USB в файле конфигурации. В вашем случае строка dr_mode=peripheral
должна находиться в файле /boot/firmware/config.txt
. Также проверьте, что другие опции, касающиеся USB, не находятся в конфликте с этой настройкой.
2. Установка роли UDC
Вы упомянули, что не можете найти файл role
в системе. Это может быть проблемой. Чтобы проверить, что контроллер USB правильно опознан, выполните команду:
ls /sys/class/udc/
Подождите, пока система отобразит список доступных UDC (USB Device Controllers). Вам нужно будет указать правильный путь к role
. Если вы не найдете ci_hdrc.0
, то посмотрите другие директории, возможно, ваш UDC будет расположен по другому пути, например, /sys/class/udc/usb3_udc/role
.
3. Правильная инициализация пакетов
Убедитесь, что вы вызвали команду echo peripheral > $UDC_ROLE
перед связыванием UVC функции. Это гарантирует, что штука будет работать в режиме периферийного устройства, что необходимо для корректной работы веб-камеры.
4. Проверка дров и модулей
Проверьте, что все необходимые модули загружены. Используйте команду:
lsmod | grep uvc
Если модуль uvcvideo
не загружен, выполните:
sudo modprobe uvcvideo
Это может потребоваться для корректной работы виртуальной камеры.
5. Логи и отладка
Посмотрите полные логи dmesg
, чтобы понять, не возникает ли ошибок при инициализации UVC:
dmesg | grep uvc
Так вы сможете выявить возможные проблемы на этапе инициализации.
6. Проверка Mac
На стороне Mac можно использовать утилиты, такие как system_profiler SPUSBDataType
для проверки, распознается ли устройство. Если устройство не отображается как веб-камера, это может указывать на то, что оно не пройдет процесс инициализации.
Заключение
Попробуйте выполнить вышеперечисленные шаги и проверьте статус вашего устройства после каждого изменения. Если проблема не решится, возможно, стоит попробовать использовать другой USB-кабель или порт. Не забывайте следить за обновлениями прошивки Raspberry Pi и изменениями в документации к вашему дистрибутиву. Это может помочь в устранении ошибок, связанных с совместимостью.
Если потребуется больше помощи, обратитесь к форумам Raspberry Pi или специализированным ресурсам, так как у вас уже есть базовые знания, и сообщество может предложить дополнительные советы или рекомендации.