UVC эмулируемая веб-камера не распознается как USB-устройство на Raspberry Pi Zero 2W

Вопрос или проблема

Я пытаюсь создать USB-устройство, которое можно подключить к компьютеру и оно будет отображаться как веб-камера, но вместо камеры оно будет транслировать видео из MP4-файла на файловой системе устройства.

Проблема, с которой я сталкиваюсь, заключается в том, что устройство не отображается как USB-устройство, когда я подключаю его к своему Mac.

Я использую Raspberry Pi Zero 2W. Я пробовал это на Raspberry Pi OS (Full и Lite), которая основана на Debian Bookworm, а также на Ubuntu 24.10.

У меня есть скрипт, который работает и использует v4l2loopback для создания виртуальной камеры как /dev/video0, и я связываю контроллер в скрипте с UDC.

Когда я запускаю “v4l2-ctl –list-devices”:

3f980000.usb (gadget.0):
/dev/video1

VirtualCam (platform:v4l2loopback-000):
/dev/video0

После завершения настройки я запускаю: “uvc-gadget2 -d /dev/video1 -u /dev/video0 -r 1 -f 1” (это с https://github.com/wlhe/uvc-gadget)

Результат:

uvc device is VirtualCam on bus platform:v4l2loopback-000
uvc open succeeded, file descriptor = 3
(continues running in foreground)

Хотя последняя команда, похоже, выполняется, USB UVC-устройство все еще не отображается на моем Mac.

Мне удалось заставить это устройство имитировать виртуальный Ethernet-адаптер, загрузив g_ether в /boot/firmware/cmdline.txt и /etc/modules, а затем перезагрузив устройство и подключив его. Мой Mac увидел его как новый USB Ethernet-адаптер, так что я знаю, что использую хороший кабель для передачи данных/питания и устройство правильно настроено для работы в режиме otg / peripheral в config.txt.

Что я здесь упускаю?

Мой скрипт ниже.

#!/bin/bash

# Переменные, которые нам нужно для упрощения работы.

CONFIGFS="/sys/kernel/config"
GADGET="$CONFIGFS/usb_gadget"
VID="0x0525"
PID="0xa4a2"
SERIAL="0123456789"
MANUF=$(hostname)
PRODUCT="UVC Gadget"
BOARD=$(strings /proc/device-tree/model)
UDC=`ls /sys/class/udc` # определит 'первый' UDC

# Позже эта функция используется для того, чтобы сказать подсистеме USB, что мы хотим
# поддерживать определенный формат, размер кадров и интервалы кадров
create_frame() {
    # Пример использования:
    # create_frame <имя функции> <ширина> <высота> <формат> <имя> <интервалы>

    FUNCTION=$1
    WIDTH=$2
    HEIGHT=$3
    FORMAT=$4
    NAME=$5

    wdir=functions/$FUNCTION/streaming/$FORMAT/$NAME/${HEIGHT}p

    mkdir -p $wdir
    echo $WIDTH > $wdir/wWidth
    echo $HEIGHT > $wdir/wHeight
    echo $(( $WIDTH * $HEIGHT * 2 )) > $wdir/dwMaxVideoFrameBufferSize
    cat <<EOF > $wdir/dwFrameInterval
$6
EOF
}

# Эта функция настраивает функцию UVC гаджета в configfs и связывает нас
# с драйвером гаджета UVC.
create_uvc() {
    CONFIG=$1
    FUNCTION=$2

    echo "    Создание функциональности UVC гаджета: $FUNCTION"
    mkdir functions/$FUNCTION

    create_frame $FUNCTION 640 480 uncompressed u "333333
416667
500000
666666
1000000
1333333
2000000
"
    create_frame $FUNCTION 1280 720 uncompressed u "1000000
1333333
2000000
"
    create_frame $FUNCTION 1920 1080 uncompressed u "2000000"
    create_frame $FUNCTION 640 480 mjpeg m "333333
416667
500000
666666
1000000
1333333
2000000
"
    create_frame $FUNCTION 1280 720 mjpeg m "333333
416667
500000
666666
1000000
1333333
2000000
"
    create_frame $FUNCTION 1920 1080 mjpeg m "333333
416667
500000
666666
1000000
1333333
2000000
"

    mkdir functions/$FUNCTION/streaming/header/h
    cd functions/$FUNCTION/streaming/header/h
    ln -s ../../uncompressed/u
    ln -s ../../mjpeg/m
    cd ../../class/fs
    ln -s ../../header/h
    cd ../../class/hs
    ln -s ../../header/h
    cd ../../class/ss
    ln -s ../../header/h
    cd ../../../control
    mkdir header/h
    ln -s header/h class/fs
    ln -s header/h class/ss
    cd ../../../

    # Это настраивает USB-канал для разрешения 3x 1024 байта на
    # микрорамке, что дает нам максимальную скорость для USB 2.0. Другие
    # допустимые значения – 1024 и 2048, но это приведет к более низкой
    # поддерживаемой частоте кадров.
    echo 2048 > functions/$FUNCTION/streaming_maxpacket

    ln -s functions/$FUNCTION configs/c.1
}

# Это загружает модуль, ответственный за настройку USB-Гаджетов
# через configfs, без которой мы не можем подключиться к
# драйверу ядра гаджета UVC

##########################
# RDS
# Сначала отключите существующее видеооборудование
modprobe -r bcm2835_v4l2
modprobe -r bcm2835_codec
modprobe -r bcm2835_isp

# Затем загрузите loopback как video0
modprobe v4l2loopback devices=1 video_nr=0 card_label="VirtualCam" exclusive_caps=1

# Убедитесь, что video0 присутствует
ls /dev/video*
##########################

echo "Загрузка модуля композита"
modprobe libcomposite

# Этот раздел настраивает гаджет через configfs. Нам нужно
# создать кучу файлов и директорий, которые описывают USB
# устройство, которым мы хотим притвориться.

if
[ ! -d $GADGET/g1 ]; then
    echo "Обнаружение платформы:"
    echo "  плата : $BOARD"
    echo "  udc   : $UDC"

    echo "Создание USB-гаджета"

    echo "Создание директории гаджета g1"
    mkdir -p $GADGET/g1

    cd $GADGET/g1
    if
[ $? -ne 0 ]; then
        echo "Ошибка создания usb-гаджета в configfs"
        exit 1;
    else
        echo "ОК"
    fi

    echo "Установка идентификаторов производителя и продукта"
    echo $VID > idVendor
    echo $PID > idProduct
    echo "ОК"

    echo "Установка английских строк"
    mkdir -p strings/0x409
    echo $SERIAL > strings/0x409/serialnumber
    echo $MANUF > strings/0x409/manufacturer
    echo $PRODUCT > strings/0x409/product
    echo "ОК"

    echo "Создание конфигурации"
    mkdir configs/c.1
    mkdir configs/c.1/strings/0x409

    echo "Создание функций..."

    create_uvc configs/c.1 uvc.0

    echo "ОК"

    echo "Привязка контроллера USB"
    echo $UDC > UDC
    echo "ОК"
fi

Ответ или решение

Проблема с распознаванием симулированной вебкамеры UVC на Raspberry Pi Zero 2W

Ваша задача заключается в создании USB-устройства, которое может быть подключено к компьютеру и вести себя как вебкамера, используя при этом видеофайл формата MP4 с файловой системы устройства. Однако, судя по вашему описанию, существует проблема с тем, что устройство не распознается как USB-устройство при подключении к Mac. Давайте разберем основные аспекты данной проблемы и возможные решения.

1. Проверка конфигурации устройства

Перед началом диагностики важно убедиться, что ваше устройство Raspberry Pi Zero 2W настроено правильно для работы в режиме USB OTG (On-the-Go). Проверьте следующие настройки в конфигурационных файлах:

  • /boot/config.txt: Убедитесь, что у вас указаны необходимые параметры для работы USB OTG. Например, добавьте следующую строку, если она отсутствует:

    dtoverlay=dwc2
  • /boot/firmware/cmdline.txt: Убедитесь, что в этой строке есть modules-load=dwc2,g_ether или любая другая необходимая конфигурация для вашего USB-устройства.

2. Проверка зависимостей и модулей

Вы упомянули, что используете v4l2loopback, который создает виртуальную камеру. Убедитесь, что все необходимые модули загружены правильно. Например:

sudo modprobe v4l2loopback
sudo modprobe libcomposite

Проверьте вывод командой lsmod, чтобы убедиться, что модули действительно загружены.

3. Порядок загрузки вашего скрипта

Ваш скрипт для настройки USB-устройства выполняет множество операций. Убедитесь, что он выполняется с необходимыми привилегиями и в правильном порядке. В частности, убедитесь, что:

  • Модуль libcomposite загружается до создания конфигурации USB-устройства.
  • Вызовы команд echo для записи в файлы конфигурации выполняются успешно. Вы можете добавить больше отладочной информации, чтобы проверять статус каждой команды.

4. Убедитесь в правильности командного вывода

При запуске команды uvc-gadget2, вы видите успешное открытие файлового дескриптора. Однако, важно проверить, правильно ли отображается ваш виртуальный UVC-устройство. Если вы видите /dev/video1 как gadget.0, это означает, что ваше устройство работает, но не было привязано должным образом.

Для проверки выполните команду:

v4l2-ctl --list-devices

Эта команда должна отображать ваше устройство как вебкамеру. Если она этого не делает, возможно, проблема на уровне конфигурации.

5. Подключение к Mac

Также проверьте настройки на Mac. Иногда проблемы могут быть вызваны его настройками. Используйте System Information для выявления подключенных устройств USB. Возможно, ваш Mac просто не отображает устройство, но оно все же подключено.

6. Другие факторы

Если все вышеуказанные действия не помогают, рассмотрите следующие варианты:

  • Кабель и порт: Убедитесь, что используете качественный USB-кабель и что порт USB на Mac работает корректно.
  • Журнал ошибок: Изучите системные журналы (например, через dmesg), чтобы найти подсказки о возможных ошибках при подключении устройства.
  • Обновление системного программного обеспечения: Убедитесь, что на Raspberry Pi установлены последние обновления и что вы используете актуальные версии необходимых пакетов.

Заключение

Устранение проблем с распознаванием USB-устройств может потребовать времени и терпения. Следуя предложенным шагам и проверяя каждую конфигурацию, вы сможете выявить и устранить причину, почему ваше устройство Raspberry Pi Zero 2W не распознается как вебкамера на Mac. Если проблемы продолжаются, возможно, наиболее целесообразным будет обратиться к сообществу разработчиков или искать помощь на специализированных форумах.

Оцените материал
Добавить комментарий

Капча загружается...