Hallo,
ich versuche gerade, eine SD-Karte über den USB auszulesen. Die Karte
befindet sich an einem LPC2378.
Dazu habe ich die USB Mass storage Spezifikation auf dem ARM
implementiert. Vorlage war das Buch "USB Mass Storage" von Jan Axelson.
Es wird das Bulk Only Protocol benutzt.
Leider ist mir nicht ganz klar, welche SCSI-Kommandos unterstützt werden
müssen, die Beschreibung einiger Kommandos ist auch in diesem Buch recht
rudimentär.
Enumeration scheint zu funktionieren, nach dem Anstöpseln des Boards an
den USB eine Win-XP PC's ertönt das Windows-Pling und eine
Laufwerksbuchstabe erscheint. Das Laufwerk lässt sich öffnen, egal ob
eine Karte gesteckt ist oder nicht, hat aber immer Kapazität 0. Meine
Debugausgabe zeigt mir, dass folgende SCSI-Kommandos verschickt werden
(nur Verkehr auf den BULK endpoints):
1. 0x12 (INQUIRY)
2. 0x23 (READ FORMAT CAPACITY)
3. 0x25 (READ CAPACITY)
4. 0x28 (READ 10)
... -lange Pause --
5. Reset (2mal)
Konkret nun meine Fragen, vielleicht kennt sich jemand hier im Forum
aus:
1. Wieso wird READ FORMAT CAPACITY gesendet, laut Spezifikation ist
dieses Kommando nur für UFI devices, also Floppy Disks. Was muss ich als
"Formattable Capacity" angeben, wenn noch gar keine Karte im SLot
steckt?
2. Wie teile ich mit, dass kein Medium im Slot steckt? In diesem Fall
setze ich den Descriptor code auf "No Cartridge in Drive", ist das
richtig?
Warum tut Windows dann so, ob doch ein Medium im Laufwerk ist und sendet
Lesebefehle? Was sende ich dann in der Antwort auf READ CAPACITY als
maximalen Block ? 0 oder -1?
3. Das READ10 Kommando hat im SCSI Block (CBWCB) eine Transfer Länge von
0, aber das entsprechende Feld CBW.dCBWDataTransferLength ist 0x10000.
Wieviele Byte soll ich senden 0 oder 64k?
Wenn irgendjemand Informationen dazu hat, wäre ich ihm sehr dankbar.
Gruss
Mike
Mit den MSD-Dateils kann ich nicht weiterhelfen aber es gibt Code für
LPC23xx/24xx zur Inspiration in den Eval.-Versionen von Keil/ARM MDK-ARM
(sehr ähnlich dem Code-Bundle von NXP) und IAR EWARM (sehr ähnlich den
Beispielen die Olimex bei deren LPC23xx-Boards mitliefert).
Zumindest die Handhabung und Verarbeitung SCSI-Kommandos kann man draus
ablesen. Zumindest der Olimex/IAR-Code nutzt als Speichermedium wenn
richtig erinnert auch SD-Karte via MCI (ist allerdings nicht ganz leicht
auf andere Compiler zu übertragen).
Danke für die Tips,
nach langem Suchen habe ich den Fehler gefunden: SCSI Parameter sind BIG
Endian, der ARM aber Little endian. Ich hätte eher darauf kommen können.
Dadurch wurden unsinnige Parameter beim READ CAPACITY Befehl an den
Mass Storage Treiber von Windows übermittelt, wodurch dieser verwirrt
wurde.
Inzwischen kann ich schon mal eine SD-Karte lesen, schreiben kommt
später.
Gruss
Mike
Hurra, es klappt!
Meine SD-Karte wird erkannt und kann gelesen und geschrieben werden.
Läuft unter Windows stabil, leider noch nicht mit Linux, woran könnte
das liegen?
Die Geschwindigkeit ist noch nicht so berauschend, vielmehr dürfte aber
bei USB Full speed nicht drin sein. Zum Test habe ich eine 495 Mb Datei
auf eine leere 4G SD Karte geschrieben und wieder heruntergelesen:
Lesen: 495831 kB: 885 s <> 560 kB/s
Schreiben: 495831 kB: 875 s <> 554 kB/s
Lesen ist also nur marginal schneller als Schreiben.
In einem Standard USB-Kartenleser schafft die Karte 12.7 Mb/s beim Lesen
und 7.3 beim Schreiben. Aber der hat ja auch High-Speed.
Gruss
Mike
> nach langem Suchen habe ich den Fehler gefunden: SCSI Parameter sind BIG> Endian, der ARM aber Little endian. [...]
Haha, wie oft bin ich selber darauf schon reingefallen. Ich weiss echt
nicht, warum man die Bits und Bytes nicht einfach überall in der
natürlichen Reihenfolge abspeichern kann.
> Und welche ist Deiner Ansicht nach die "natürliche" Reihenfolge? Die> Verfechter beider Varianten sehen ihre als die "natürliche" an ...
Jetzt bitte keinen Streit! Das ist genaus sinnvoll wie die Frage, an
welchem Ende man das Frühstücksei aufschlagen sollte! (s. Gulliver's
Reisen).
Fakt ist jedoch, dass die meisten heutigen Prozessoren Little-endian
sind.
Big-endian gibt es eigentlich nur beim 68000 und deren Derivaten, z.B.
PowerPC. Vermutlich stammt SCSI aus Zeiten, in denen der 68000 noch
stark verbreitet war, d.h. vor der Intel-Dominanz.
Gruss
Mike