USB MSC Infosammlung
Inhaltsverzeichnis
[Verbergen]- 1 USB Massenspeichermodus (MSC) von MCUs mit nativem USB
- 1.1 Worum gehts?
- 1.2 Funktion von USB MSC
- 1.3 Besonderheiten bei Nutzung von USB MSC mit MCUs
- 1.4 Firmwareupdate via USB MSC
- 1.5 FAT in internen Flash, direkte Freigabe via USB MSC
- 1.6 FAT in eine Datei, die im LittleFS vom internen Flash liegt, Freigabe dieser virtuellen FAT via USB MSC
- 1.7 FAT als RAMDRIVE, Freigabe FAT via USB MSC, Spiegeln RAMDRIVE nach LittleFS
USB Massenspeichermodus (MSC) von MCUs mit nativem USB
Worum gehts?
Einige moderne MCUs sind nun mit nativem USB ausgestattet und können sich dem Computer gegenüber als USB-Speicherlaufwerk ausgeben. Der Begriff dazu ist USB MSC. Das ermöglicht viel Komfortabilität, ist aber oft ganz schön "gehackt".
Funktion von USB MSC
USB MSC gibt sich dem Computer gegenüber als Speicher-Blockgerät aus, das Interface ist eigentlich recht einfach:
- onRead: Host kann einen bestimmten Speicherblock lesen
- onWrite: Host kann einen bestimmten Speicherblock schreiben
- onStartStop: Für sonstige Funktionen (Stromsparen, etc)
Das besondere ist dabei das das Dateisystem eigentlich vom Host verwaltet wird. Ein USB-Stick ist daher einfach nur eine große Halde für Speicherblöcke, die adressiert vom Host gelesen und geschrieben werden können. Der Host kann dann darin Partitionen anlegen (oder auch nicht und direkt ein Dateisystem reinpacken) und dann Dateisysteme darin anlegen.
Besonderheiten bei Nutzung von USB MSC mit MCUs
Natürlich kann eine MCU ihre USB MSC Fähigkeit einfach nutzen, um einen Teil ihres Speichers oder die angeschlossene SD-Karte 1:1 dem Host zur Verfügung zu stellen - damit hat man das gleiche Verhalten wie ein USB-Stick. Das allein ist langweilig - man möchte Interessantere Dinge tun wie:
- Auf die Dateien auch von der MCU zugreifen
- Ein Dateisystem anbieten, das größer ist als die MCU eigentlich Speicher hat
- Das Dateisystem nur im RAM halten
- Auf Veränderungen im Dateisystem sofort reagiern (Firmware-Update etc)
- Das Dateisystem im MCU-internen Flash abbilden, dass aber typischerweise deutlich größere Flash-Blöcke hat (z.B. 4096 Byte/Block bei ESP32 statt 512 Byte/Block bei Festplatten und anderen Datenträgern)
Folgende Probleme tauchen dabei auf:
- Manche Betriebssysteme erkennen USB-Speicher nur wenn eine Partitionstabelle darin ist (alte Windows Versionen)
- Nur wenige Dateisysteme werden gut von PCs und anderen Hosts unterstützt, eigentlich nur FAT
- MCUs benutzen gerne Wear-Leveling-Optimierte Dateisysteme wie SPIFFS oder LittleFS - Hosts können damit selten etwas anfangen
- Bei großen Blockgrößen der Flash-Blöcke in der MCU gibt es Beschränkungen, wie klein ein Laufwerk minimal sein kann - man kann dann nicht einfach ein FAT-Laufwerk mit großen Blöcken aber nur einigen KB-Speicher erzeugen
- Gemeinsamer Zugriff von USB und MCU sind sehr trickreich - die MCU muss genau erkennen, was da passiert
- Wear-Leveling: Bei FAT finden sehr viele Schreibzugriffe an die gleichen Stellen statt, insbesondere da wo die Dateieigenschaften wie Zeitstempel stehen. Die darunterliegenden Flash-Blöcke können dann schnell abgenutzt werden.
Firmwareupdate via USB MSC
Die MCU simuliert ein Speicherlaufwerk, dass allerdings nur ganz bestimmte Dateien annimmt, z.B. mit den Endungen .bin oder .uf2. Alle anderen Schreibzugriffe werden sofort verworfen. Interessant ist z.B. die Implementation von Arduino-ESP32 [1].
FAT in internen Flash, direkte Freigabe via USB MSC
Vorteile:
- Verhältnismäßig einfach machbar
- Gute PC Kompatibilität
Nachteile:
- Flash-Blockgröße von 4096 Bytes erfordert Cluster von 4096 Bytes (Jedes File belegt min. 4k)
- Es scheint eine minimale Größenbeschränkung zu geben, Berichten zufolge können keine FATs unter 0.5MB angelegt werden
- Schnelles Wear-Out vom Flash
- Gemeinsamer Zugriff nur schwer möglich (entweder USB MSC oder MCU greift auf FAT zu)
FAT in eine Datei, die im LittleFS vom internen Flash liegt, Freigabe dieser virtuellen FAT via USB MSC
Vorteile:
- Gute PC Kompatibilität
- Gutes Wear-Leveling
- Cluster-Größe von 512 Byte machbar
- Kleine Laufwerke machbar (unter 0.5MB)
Nachteile:
- Kompliziert
- Langsam
- Gemeinsamer Zugriff nur schwer möglich (entweder USB MSC oder MCU greift auf FAT zu)
FAT als RAMDRIVE, Freigabe FAT via USB MSC, Spiegeln RAMDRIVE nach LittleFS
Vorteile:
- Gute PC Kompatibilität
- Bestes Wear-Leveling
- Cluster-Größe von 512 Byte
- Kleine Laufwerke machbar (unter 0.5MB)
- Volle Kontrolle bei Spiegeln welche Dateien genommen werden
- Sehr schnell
Nachteile:
- Größe Beschränkt durch RAM (vermutlich dadurch max 256KB - aber ggf geht mehr mit PSRAM?)
- Kompliziert