Raspberry Pi в режиме USB gadget

Материал из LUWRAIN Wiki
Версия от 08:33, 14 июня 2021; Ilyapashuk (обсуждение | вклад) (Raspberry Pi в режиме USB gadget)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск

Raspberry Pi в режиме USB gadget[править]

на v4 аппаратная реализация позволяет использовать TypeC вход не только для питания, но и для передачи данных.


после прописывания в config.txt строки

dtoverlay=dwc2

linux начинает видеть этот разъём как udc (usb device controller)


в ядре linux есть модули, позволяющие малинке в таком режиме имитировать различные usb-устройства, такие как флешка или cdrom (в технической терминалогии это называется mass-storage)


для демонстрации можно сделать примерно так:


dd if=/dev/zero of=/f.img bs=1M count=64

fdisk /f.img

в fdisk создать метку msdos и один раздел с типом c (fat32)

losetup -f -P /f.img

он напишет, на какое loop-устройство подключил файл, скорее всего это будет loop0.

mkfs.vfat /dev/loop0p1

mount /dev/loop0p1 /mnt

echo 'hello, world' > /mnt/testfile

umount /mnt

losetup -d /dev/loop0


тут, думаю, всё стандартно и понятно.

а потом так:

modprobe g_mass_storage file=/f.img


и на этом этапе компьютер должен распознать подключенную малинку как флешку с нашим файлом.


есть и модули других гаджетов с префиксом g_


но с такими модулями в один момент времени можно эмулировать только что-то одно.


для более сложных конфигураций надо подгрузить модуль libcomposite и использовать sysfs для настройки.


кроме mass_storage в системе есть гаджеты для ethernet, serial-порта, звукового устройства и ряд других.


и там есть какое-то api, которое теоретически позволяет userspace-приложениям создавать свои гаджеты.


в текущей реализации это у меня выглядит так:

несколько bash-скриптов, конфигурирующих нужные значения sysfs и запускаемых через systemd при загрузке

для rndis настройки вбиты в NetworkManager так, что сразу после старта сетевого интерфейса, который получает имя usb0, на нём поднимается dhcp-сервер, и комп, если находит сетевую карту, получает ip автоматически.


одновременно через тот же networkmanager запускается точка доступа wifi, к которой можно подключиться со смартфона и управлять всем по ssh через termux.


через bluetooth, вероятно, было бы удобнее и красивее, и теоретически это возможно через bluetooth com-порты, но потребовало бы большого количества программирования с обеих сторон.

к сожалению, не все гаджеты и не всегда соглашаются взаимодействовать с операционкой. линуксы, похоже, соглашаются брать всё. в винде никаких проблем с com-портом и mass-storage. ethernet, а именно режим rndis, согласился подгружаться только тогда, когда я в диспетчере устройств вручную прописал драйвер. звуковое устройство отказывается работать, потому что в microsoft что-то не то намудрили с драйвером.