Hallo, bei einem aktuellen Projekt möchte ich einen externen NOR Flash und SRAM über USB mit Daten füllen. Als µC wird ein STM32F103C8 verwendet. Im ersten Anlauf werde ich wohl einfach ein USB CDC Device nutzen und ein Programm für den PC schreiben um die Daten zu übertragen. Allerdings soll das Ganze nacher möglichst ohne zusätzliche Software oder Treiber möglich sein. Ich dachte daher an etwas wie ein USB Mass Storage Device. Dabei soll der aktuelle Inhalt von Flash und SRAM als jeweils eine Datei angezeigt werden. Dabei soll es möglich sein den aktuellen Inhalt auszulesen und den Inhalt zu überschreiben. Die zuweisung ob Flash oder SRAM soll über die Dateiendung geschehen. Das Problem beim Mass Storage Device scheint allerdings zu sein, dass dieses auf Dateisystemebene funktioniert. Ich müsste also ein virtuelles Dateisystem bereitstellen um den aktuellen Inhalt von Flash und SRAM zu präsentieren. Das wäre ja eventuell noch machbar aber ich sehe vor allem beim Schreiben die Probleme. Wenn man vom PC aus direkten Zugriff aufs Dateisystem hat kann man alles Mögliche anstellen, wie z.B. das Mass Storage Device mit NTFS neu formatieren oder Tausend 1KB Dateien drauf kopieren. Damit kann man natürlich den SRAM oder Flash nicht sinnvoll füllen aber das Ganze soll wenigstens so robust werden, dass man den µC dadurch nicht total durcheinander bringen kann und Alles spätestens nach einer Neuformatierung mit FAT und maximal 2 Dateien wieder alles richtig läuft. Als die andere Alternative sehe ich das Media Transfer Protocol. Das arbeitet auf Dateiebene und ich vermute das Device kann dort Dateitransfers ablehnen wenn Dateien mit unbekannter Dateiendung oder mehrere Dateien mit gleicher Dateiendung geschrieben werden sollen. Nachteil ist leider, dass die Unterstützung unter Linux noch nicht ganz so weit fortgeschritten ist, aber das kann ja eigentlich nur besser werden. Weiterer Nachteil ist, dass ich keinen Beispielcode finden konnten. Es git zwar ein MTP Host Beispiel von ST, aber ein Device Beispiel. Wie kompliziert wird es das Device selbst zu Implementieren? Welcher der beiden Ideen ist einfacher realisierbar? Oder habe ich eventuell etwas viel einfacheres übersehen?
Weiß nicht obs hilft, aber für den AVR USB Stack LUFA gibt es einen Mass Storage Bootloader, der auch Betriebssystemtreiber für Laufwerke nutzt um den internen Flash zu beschreiben. Ähnliches nutzt auch mbed. Vielleicht mal reinsehen und adaptieren.
Die LUFA Library kannte ich schon daher hatte ich dort schonmal geschaut. Scheinbar habe ich den USB Mass Storage Bootloader aber übersehen. Das wäre sicherlich schonmal ein guter Startpunkt. Ich habe gerade mal kurz den Code überflogen. Die Implementierung des virtuellen FAT12 sieht jetzt nicht so kompliziert aus. Für mich sieht es gerade so aus, als ob Schreibzugriffe auf die Verzeichniseinträge ignoriert werden. Wenn man bei Mass Storage für bestimmte Bereiche einfach Read-Only spielt, dann kann man schonmal alles verhindern was nicht die vorhandenen Dateien überschreibt. Es sieht für mich aber gerade so aus, als ob die Schreibvorgänge einfach ignoriert werden. Das könnte möglicherweise den PC verwirren. Ich habe erst Sonntag Abend wieder einen AVR zur Hand um den Bootloader mal zu testen.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.