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 что-то не то намудрили с драйвером.