USB: гаджет: режим устройства: configfs: uvc и запоминающее устройство на одной конфигурации?
Я пытаюсь добавить uvc и запоминающее устройство в режиме устройства для одного порта контроллера устройства USB. Я использую configfs, чтобы сделать работу.
Кто-нибудь может рассказать, как это сделать.
С уважением, GBiradar
1 ответ
Вы делаете устройство, которое функционирует как камера и флэш-накопитель? Может быть, ключ, где вы можете загружать видео, а затем воспроизводить их в Skype? В любом случае, это звучит как хорошее упражнение для configfs.
На высоком уровне шаги:
- Получите запоминающее устройство, работающее само по себе.
- Получите работу UVC (потоковую передачу изображений на хост) самостоятельно.
- Объедините два в один сценарий.
Слишком ранний переход к шагу 3 затруднит диагностику проблем. Например, если в программе userpace uvc-gadget есть проблемы, которые могут помешать перечислению обоих гаджетов.
В качестве пользователя root вы можете запустить следующий проверенный сценарий для перечисления и потоковой передачи на Raspberry Pi Zero W с помощью Raspbian 9. На шаге 1 вы можете удалить части, относящиеся к UVC, а затем аналогично со строками хранения в шаге 2.
#!/bin/bash -xe
modprobe libcomposite
cd /sys/kernel/config/usb_gadget/
mkdir -p stackru
cd stackru
echo 0x1d6b > idVendor # Linux Foundation
echo 0x0104 > idProduct # Multifunction Composite Gadget
echo 239 > bDeviceClass # USB_CLASS_MISC
echo 0x02 > bDeviceSubClass
echo 0x01 > bDeviceProtocol
mkdir -p strings/0x409
mkdir -p configs/c.1/strings/0x409
echo "My Composite Gadget" > strings/0x409/product
###################### mass storage ########################
mkdir -p functions/mass_storage.usb0
echo /dev/mmcblk0p1 > functions/mass_storage.usb0/lun.0/file
ln -s functions/mass_storage.usb0 configs/c.1/
############################################################
########################## UVC #############################
mkdir -p functions/uvc.usb1/control/header/h
cd functions/uvc.usb1/control/
ln -s header/h class/fs
cd ../../../
mkdir -p functions/uvc.usb1/streaming/uncompressed/u/360p
cat <<EOF > functions/uvc.usb1/streaming/uncompressed/u/360p/dwFrameInterval
666666
1000000
5000000
EOF
mkdir functions/uvc.usb1/streaming/header/h
cd functions/uvc.usb1/streaming/header/h
ln -s ../../uncompressed/u
cd ../../class/fs
ln -s ../../header/h
cd ../../class/hs
ln -s ../../header/h
cd ../../../../..
ln -s functions/uvc.usb1 configs/c.1/
############################################################
ls /sys/class/udc > UDC
######################## UVC part 2 ########################
sleep 1 # workaround: if gadget activated too soon, may hit a dmesg error with usb_function_activate [libcomposite]
./uvc-gadget -d
############################################################
(Для справки, вот мое репозиторий uvc-gadget с патчами.)
Указывая просто на загрузочный раздел на /dev/mmcblk0p1
это один из быстрых и грязных способов проверить запоминающее устройство на SD-карте Пи. Бежать sudo fdisk -l
чтобы найти то, что вы могли бы использовать в вашей конкретной системе.
Поскольку Pi Zero является устройством USB 2.0, мне не нужно было включать какие-либо class/ss
(супер скорость). Я также намеренно пропустил такие поля, как MaxPower, serialnumber и изготовитель, которые вы можете найти в других примерах. Этот скрипт предназначен для того, чтобы показать, что требуется для запуска и запуска.
Вы писали на других каналах, спрашивая об этом на платформах от NXP до TI, и я не могу предсказать, какие проблемы могут возникнуть там. Однако я увидел, что рекомендуется попробовать исправления, связанные с UVC, представленные в версии ядра 4.11-rc3. Поскольку Raspbian в настоящее время работает на версии 4.9, возможно, эти изменения не нужны.