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.

Category : Allgemein

Tags :

Comments

4 Responses

  1. David sagt:

    Hi Georg,
    David ist mein Name und ich arbeite gerade an meiner Bachelorarbeit für den Studiengang Elektrotechnik und hierbei ist es ebenfalls notwendig, dass ein Raspi einen USB-Stick emuliert und als solcher von einem anderen System erkannt wird.
    Diesbezüglich wollte ich gerne fragen, ob diese Funktion nur am USB-C-Slot möglich ist und falls ja, wie du dann die Stromversorgung des Pi 4 realisiert hast, weil ich denke, dass beispielsweise ein Laptop die notwendige Leistung nicht bereitsstellen kann, vor allem wenn noch weitere Peripherie am Raspi hängt.
    Ich freue mich über deine Antwort und danke dir im Voraus 🙂

    Grüße
    David

    • georg sagt:

      Hallo David,
      Ja, soweit ich weiß geht das nur via den USB-C Port, der auch für die Stromversorgung verwendet wird.
      Die Stromversorgung erfolgt über die IO Pins und ein Handy Ladegerät. Hab ich auch im Artikel “Raspberry Pi am Solarfocus Therminator II” beschrieben
      https://www.höllrigl.at/2020/06/raspberry-pi-am-solarfocus-therminator-ii/
      Das birgt aber gewisse Risiken.
      Die Original Anleitung war von https://de.pinout.xyz/pinout/pin4_5v_stromversorgung
      Manche Laptops haben übrigens eigene USB Ports die Schnelladen unterstützten und auch die 1000-2000mA bringen.
      lg
      Georg

      • David sagt:

        Hi Georg,
        Danke für deine Antwort!
        Ich habe gemerkt, dass der Raspi auch gut vom Laptop aus versorgt werden kann; geht wahrscheinlich nicht bis ins unermessliche, aber zum Testen reichts 🙂
        Die Versorgung über die GPIO-Pins muss man dann noch elektrotechnisch mit einem kleinen Platinenlayout absichern, daran sollte es aber nicht scheitern 🙂

        Eine andere Frage bezüglich des Images von einem USB-Stick, welches man direkt zu Beginn benötigt.
        Win32DiskImager will sich bei mir nicht installieren, habe in einem anderen Forum aber gelesen, dass es wohl auch mit balenaEtcher gehen soll. Benötigt man hierzu einen “physischen” USB-Stick, um dieses Image auf die Micro-SD zu flashen oder geht das auch anders? Hast du hierfür vielleicht eine Anleitung von irgendwo parat?

        Danke dir vielmals!
        Grüße
        Dave

      • David sagt:

        Hi, ich bins nochmal; bin dabei deine Liste an Befehlen abzuarbeiten, nur leider läuft so ziemlich nichts. Hast du den vorangehenden Artikel vielleicht bei dir privat gespeichert und kannst ihn schicken? Dann muss ich da kein Abo abschließen.
        Das wäre wirklich sehr hilfreich, danke nochmaks, dass du das alles hier so veröffentlicht hast! 🙂

        Grüße
        Dave

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.