usb-c

Raspberry Pi 4 als USB Stick

Written by  on Juni 10, 2020

Ich suche mindestens seit 2016, Solarfocus Bedienteil, nach einem Gerät, dass sich auf der einen Seite wie ein USB Stick verhält und auf der anderen Seite Daten ins Netzwerk schicken kann. Idealerweise über WLAN.
c’t 2020, Heft 10, S.136ff, Voll aufgebohrt, USB-C-Anschluss des Raspberry Pi 4 ausnutzen, präsentiert die Lösung für das Problem.
Man braucht zuerst einen Raspberry Pi 4 mit Raspbian buster.

# /boot/config.txt
# Device Tree Overlay laden
# im Abschnitt [pi4]
dtoverlay=dwc2
# /etc/modules
# Eröffnet die Konfiguration via SysFS
# Am Ende anhängen
libcomposite

Pi neu starten.
Es wird ein Image von einem USB Stick mit vFAT Dateisystem benötigt. Am einfachsten in Windows formatieren und ein Image mit Win32DiskImager erstellen. 2 GB sollten reichen. Ablegen am Pi unter /media/usbdisk.img.
Die Details kommen aus dem Script initgadget der c’t (Download Link oben!).
Ich habe es soweit gekürzt, dass nur der USB Stick emuliert wird. Zu Beginn wird noch das Image vom USB Stick zum Mounten auf der Pi-Seite vorbereitet. Der Teil muss passieren, bevor ein Lock durch die Gegenstelle passiert.

# /usr/local/sbin/initgadget
losetup -o 32256 /dev/loop0 /media/usbdisk.img
cd /sys/kernel/config/usb_gadget/
mkdir -p pi4
cd pi4
echo 0x1d6b > idVendor
echo 0x0104 > idProduct
echo 0x0100 > bcdDevice
echo 0x0200 > bcdUSB
echo 0xEF > bDeviceClass
echo 0x02 > bDeviceSubClass
echo 0x01 > bDeviceProtocol
mkdir -p strings/0x409
cat /sys/firmware/devicetree/base/serial-number > strings/0x409/serialnumber
echo "Raspberry Pi Foundation" > strings/0x409/manufacturer
echo "Raspberry Pi 4" > strings/0x409/product
mkdir -p configs/c.1/strings/0x409
echo 250 > configs/c.1/MaxPower
echo "Config 1: USB Gadget" > configs/c.1/strings/0x409/configuration
mkdir -p functions/mass_storage.usb0
echo 1 > functions/mass_storage.usb0/stall
echo 0 > functions/mass_storage.usb0/lun.0/removable
echo 0 > functions/mass_storage.usb0/lun.0/cdrom
echo 0 > functions/mass_storage.usb0/lun.0/ro
echo 0 > functions/mass_storage.usb0/lun.0/nofua
echo /media/usbdisk.img > functions/mass_storage.usb0/lun.0/file
ln -s functions/mass_storage.usb0 configs/c.1/
udevadm settle -t 5 || :
ls /sys/class/udc > UDC
# Die Initialisierung als Service aktivieren
/etc/systemd/system/initgadget.service
[Unit]
Description=Raspi 4 USB Gadget
DefaultDependencies=yes

[Service]
Type=simple
ExecStart=/usr/local/sbin/initgadget

[Install]
WantedBy=local-fs.target
#----
cp initgadget.service /etc/systemd/system/
systemctl enable initgadget.service
systemctl start initgadget.service

Jetzt kann man das ausprobieren, indem man den Pi an einen Windows Rechner hängt.

Der „USB Stick“ taucht im Device Manager auf. Man kann ein Test File anlegen.

Dann am Pi mounten

/bin/mount -o ro /dev/loop0  /mnt

Und die Daten auslesen

Es sei darauf hingewiesen, dass man am Pi jetzt besser nichts zurückschreibt ins Image. FAT ist kein Dateisystem dass für gleichzeitige Zugriffe von verschiedenen Rechnern ausgelegt ist. Daher würde ich am Pi nur Read-only mounten. Und immer wenn man die aktuellen Daten verwenden will, neu mounten.