USB MSC Infosammlung
Inhaltsverzeichnis
[Verbergen]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].