Kann ein USB-Flash-Laufwerk mit nur 1 KB Speicherplatz erstellt werden?

576
iFreilicht

Einführung

Auf einem USB-Gerät, das ich gerade entwickle, möchte ich einen USB-Massenspeicher-Endpunkt für Konfigurationsaktualisierungen anbieten.

Das Gerät ist intern über einen USB-Pin-Header angeschlossen. Um die Konfiguration zu aktualisieren, müsste ein Benutzer nur eine Datei auf das "falsche" Flash-Laufwerk kopieren, sodass keine zusätzliche Software erforderlich ist. Dies macht die Lösung zwischen allen Arten von Betriebssystemen portierbar und verbessert die Benutzererfahrung.

Mit LUFA ist es mir gelungen, ein USB-Gerät mit einem Mass Storage-Endpunkt zu implementieren, der genügend grundlegende SCSI-Befehle unterstützt, um von Windows als Speichergerät erkannt zu werden.

Jetzt, wo ich versuche, den SCSI-Befehlssatz für reduzierte Blockierung vollständig zu implementieren, ist mir klar, dass möglicherweise ein Problem vorliegt. Die von mir verwendete MCU, eine Atmega32u4, hat nur 2,5 KB SRAM. Ein Teil davon wird von globalen Variablen und Puffern für die Hauptfunktionalität beansprucht, daher möchte ich nur 1 KB davon für die SCSI-Speicherfunktionen verwenden.

Problembeschreibung

TL; DR von oben: Ich habe nur etwa 1 KB für einen Speicherpuffer zur Verfügung, um die grundlegendsten USB-Massenspeicherfunktionen auf einer MCU zu implementieren.

Um richtig als Blockgerät zu funktionieren, muss ein Massenspeichergerät meines Wissens formatiert werden. Ich weiß nicht, welches das am häufigsten unterstützte Dateisystem (Windows und Linux) ist. Meine Annahme ist FAT32, aber in jedem Fall müssen alle Informationen, die einer Partition zugeordnet sind, und eine Datei darauf zusätzlich zu der Datei selbst gespeichert werden. Darüber hinaus scheint SCSI mit einer Blockgröße von 512 Byte zu funktionieren, so dass das gesamte "Flash-Laufwerk" mit nur zwei Blockschreibvorgängen beschrieben würde, was sich als problematisch erweist.

Meine Frage (n) ist / sind jetzt:

Kann man mit nur 1 KB Speicherplatz eine voll funktionsfähige USB-Flash-Disk erstellen / emulieren? Was würde mich davon abhalten? Wie viel Overhead-Platz würde eine leere Partition benötigen? Könnte ich dies vielleicht sogar implementieren, ohne das Gerät unter Verwendung eines Nicht-SCSI-USB-Modus zu partitionieren?

0
Ich bin hier verwirrt. Sie werden ein Massenspeichergerät implementieren, wissen jedoch nicht, wie die Gerätespeicherstruktur und die Mindestkapazität aussehen sollen. Wie wollen Sie dann das Design umsetzen? Vor FAT32 gab es übrigens perfekte Massenspeichergeräte mit FAT16 und sogar FAT12. Ale..chenski vor 6 Jahren 0
Ah, ich wusste gar nicht, dass FAT16 noch existiert. Der Massenspeicher sollte lediglich eine tragbare Schnittstelle zur Aktualisierung der Konfiguration sein. Die maximale Kapazität beträgt 1 KB, das Minimum beträgt wahrscheinlich 512 KB, da so ein Sektor groß ist. Nicht sicher, was Sie mit Struktur meinen. Alle diese Dinge könnten für mich ganz simuliert werden. iFreilicht vor 6 Jahren 0

1 Antwort auf die Frage

2
cybernard

Sie benötigen einen MBR 512 Byte, eine FAT-Tabelle, eine Backup-FAT-Tabelle. Der erste Sektor der Partition ist das Stammverzeichnis und dann der Speicher. Jeder benötigt 512 Bytes. Die FAT16-FAT-Tabelle kann 256 Cluster / Sektoren enthalten. Wenn Sie mehr benötigen, benötigen Sie mehr Sektoren in der FAT-Tabelle.

 1 MBR 2 FAT 3 Backup FAT 4 Root directory partition 1 5 512 bytes storage 6 512 bytes storage 

Also ein Minimum von 6 Sektoren mit FAT16 und ein paar mehr für FAT32.

Wenn Sie die FAT-Tabelle und die Sicherungs-FAT emuliert haben, könnten Sie mit jeweils etwa 20 Byte davonkommen. (Sie würden nur den Rest der FAT als Nullstellen angeben.) Die anderen Sektoren wären schwer zu reduzieren.

Ich empfehle mindestens 10k oder 20 Sektoren, damit Sie genügend Platz für den Fall haben, dass Ihre Datei mit der Zeit größer wird.

Was ist mit FAT12? Ale..chenski vor 6 Jahren 0
@AliChen Das FAT12-Dateisystem hat den gleichen Overhead. Sie können einfach mehr Cluster pro Sektor in die 2 FAT-Tabellen einfügen. Dies ist irrelevant, da er nur zwei Cluster tatsächlichen Speichers benötigt. Selbst bei 100 Clusters auf FAT32 sind 400 Bytes, und Sie haben noch 112 Bytes übrig. 100 Cluster sind 50.000, viel mehr als nötig. cybernard vor 6 Jahren 0
+1 für wertvolle Informationen, danke. Ich denke, das OP sollte ein kleines 8-Pin-EEPROM mit SPI für größere Speicherkapazität einbetten, und das Problem wird gelöst. Ale..chenski vor 6 Jahren 0
Sie benötigen keinen MBR. Die meisten Flash-Laufwerke haben standardmäßig keine Partitionstabelle. Microsoft nennt dies eine "Super-Diskette". (Wenn Sie eine erstellen, wird Windows auch nicht an die erste Partition angehängt.) Bob vor 6 Jahren 1
@Bob Wenn Sie ein logisches Gerät von einem physischen Gerät installieren, das korrekt ist. Da es keinen MBR gibt, könnten Sie niemals eine Partitionstabelle haben. cybernard vor 6 Jahren 0
Das ist sehr nützliche Information, vielen Dank! Die Datei muss nicht wirklich genau auf dem Gerät vorhanden sein. Meine Idee war es, sie direkt zu lesen, wenn sie geschrieben wurde, und wenn Lesezugriff gewünscht wird, generieren Sie sie direkt. Ich würde auf jeden Fall versuchen, dies zu emulieren, und es sind 32 KB Flash verfügbar, sodass ich alle FAT-Informationen dort speichern und aus dem Programmspeicher lesen kann, wenn diese Sektoren gelesen werden. Ich müsste nicht unbedingt Nullen generieren. iFreilicht vor 6 Jahren 0
@AliChen Leider sind die Pins für SPI bereits in Gebrauch und ich kann sie nicht neu zuordnen. Ich bezweifle, dass ich sogar ein EEPROM darin installieren könnte, ohne die physische Größe zu erhöhen. Etwas, das ich möglichst vermeiden möchte. iFreilicht vor 6 Jahren 0