Hallo, ich quäle mich derzeit dadurch für den LPC2368 mit integriertem Interface Code zu schreiben, ausnahmsweise mal selbst, damit ich auch verstehe was da abläuft. Als Grundlage dient sample Code von Keil, mci.c Der LPC bedient die Karte im Multimedia Mode, also nicht per SPI. Man füttert bestimmte Register mit Daten und den Rest macht die CPU, lenkt die Daten in einen Fifo oder per DMA, wobei ich DMA erstmal weglasse, das ist wieder eine andere Sache. Jetzt habe ich mir die öffentliche SD Card Spec 2.0 von SAN Disk geholt und stelle fest, dass MMC und SD zwei Paar Schuhe sind, die Kommands sind völlig anders, die SD Card hat noch ACMD Kommandos, benutzt relative Adressen und man gewinnt den Eindruck, die haben einen kompletten Computer in diese Kärtchen gepackt, die Spec hat hunderte Seiten und da fehlen noch alle geheimen Strukturen, die nur an Mitglieder des Konsortiums gegeben werden. Jetzzt übelege ich, MMC ist doch so langsam "out", ich habe noch zwei dieser Karten mit 64MB, alle andere sind SD mit den Rippen an den Kontakten. Hat hier jemand schonmal für den LPC2368 Code geschrieben, der nur für SD Karten < 2GB läuft? Den Code von martin Thomas habe ich bereits gefunden, ist leider nicht sehr leserlich, da er komplett auf die Keil Routinen aufsetzt, um die Chan Fat Low Level Routinen abzubilden. Hat da jemand Erfarung bzw ist diesen schweren Weg schonmal gegangen und hat vielleicht Code Schnipsel für mich? Gruss, Christian
> ... um die Chan Fat Low Level Routinen abzubilden. Du meinst mit Chan FAT das hier? http://elm-chan.org/fsw/ff/00index_e.html Bei den "Sample projects" ist ein vollständiges LPC2368-Beispiel, das habe ich just ans Rennen gekriegt, auf einem 2468. Ich würde das zur Nachahmung empfehlen.
Hallo, ja, das habe ich auch, nur ist der Code eher "kryptisch", sehr stark auf das Keil Board zugeschnitten und baut ebenso auf Keil Routinen auf, die bei GNU nicht durchcompilieren, zB ist dort ein .s File mit Assembler, was Preprozessor Anweisungen enthält, die nur der Keil Compiler kennt. Keine Ahnung wie ich das in Gnu einbinden soll. Es liest den Fifo aus. Werde ich wohl in C umschreiben schreiben müssen. Ich habe ein Problem damit Code zu benutzen, den ich nicht ansatzweise durchschaue. Daher habe ich angefangen die Kernroutinen selbst zu schreiben, bzw. den Keil Code einzudeutschen, abzuspecken und lesbarer zu machen. Die Chat FAT selbst ist absolut unübersichtlich und man kann nur hoffen, dass da alles stimmt. 93kb Quelltext am Stück für die mit langen Dateinamen sind nicht jedermanns Sache. Jedenfalls habe ich erstmal die Uart am Laufen, so dass ich mit hterm (sehr schönes Programm) sehenn kann was er von sich gibt.
Ich konnte den Hardwarenahen Code problemlos auf einen ADUC (auch arm7) portieren. Als basis habe ich dafür die io-Funktion für einen AVR verwendet. Mit DMA, IRQs etc. wird das ganze natürlich etwas komplizierter.
Ich habe die Treiber für MMC/SD von Keil nach einigem Gebastel auch auf einem LPC 2378 zum Laufen bekommen. Ich hatte vorher keine Ahnung wie SD funktioniert, daher hab ich die Library zerhackstückt, bis sie lief. Gebe aber auch zu, dass jene wirklich mies programmiert und dokumentiert/kommentiert ist, aber sie funktioniert. Nachdem ich anhand des laufenden Codes die genaue funktionsweise der Kommandoablaeufe raushatte, habe ich die gesamte Library neu geschrieben, inklusive DMA. Jener hat mich am meisten genervt, weil man drauf achten muss, dass der zu kopierende Inhalt vorher im USB oder im ETHERNET RAM liegt, da der DMA nur darauf Zugriff hat. Die Library unterstützt MMC sowie SD, wobei sich beide eindeutig anhand der Initialisierung unterscheiden lassen. Ich habe die Kommandos nicht mehr genau im Kopf, aber wenn ich mich recht erinnere, wird ein bestimmter Befehl gesendet um rauszufinden, obs MMC ist. Fällt die Antwort der Karte negativ aus, kann angenommen werden, dass MMC nicht vorliegt und die Initialisierung von SD kommt zum Zug. Auch hier der Ordnung halber auf korrekte Antwort abfragen. Die verschiedenen Modi (MMC ODER SD) werden erst danach betreten. SD ist soweit ichs verstanden hab, nur eine Erweiterung der MMC karte und erlaubt z.B. einen erweiterten Befehlssatz, die MMC nicht kennt. Meine aber, dass schreib- und lesebefehle gleich sind.
Christian J. wrote: > Hallo, > > ja, das habe ich auch, nur ist der Code eher "kryptisch", sehr stark auf > das Keil Board zugeschnitten und baut ebenso auf Keil Routinen auf, die > bei GNU nicht durchcompilieren, zB ist dort ein .s File mit Assembler, > was Preprozessor Anweisungen enthält, die nur der Keil Compiler kennt. Auf was bezieht sich das "ja". In dem von tuppes genannten Link findet man Beispiel von Chan für FAT inkl. Treiber LPC23xx/24xx MCI. Mein Gebastel (nicht efsl sondern LPC23xx MCI mit Chan-FAT) ist ein Kombination aus Chans FAT-Code und MCI Treiber-Code von NXP. Beides ist für Anwendung mit GNU-Tools gemacht. > Keine Ahnung wie ich das in Gnu einbinden soll. Es liest den Fifo aus. Eine Portierung des FIFO-Assembler-Codes aus dem NXP-Beispiel ist in meinem Gebastel enthalten. Chans Hilfsfunktionen in Assembler sind für schnelles kopieren von Blocks w.r.e von/zum USB-RAM ins "normale RAM" wegen der Seltsamheit dieser Controller, DMA nur in bestimmten Speicherbereichen zu bieten. Das kann man allerdings umgehen, indem man die Pufferspeicher der FFAT-structs (sector-buffer/dir-buffer) mittels section-attribut direkt im passendem RAM-Bereich ablegt. Wie auch immer, genanntes ist für GNU as, also nicht im Realview Assembler Syntax. > Werde ich wohl in C umschreiben schreiben müssen. Ich habe ein Problem > damit Code zu benutzen, den ich nicht ansatzweise durchschaue. Es gibt noch eine Dokumentation von ARM für das LPC23xx/24xx MCI, PL190 wenn richtig erinnert. Ist aber auch nicht wirklich informativ, sehr ähnlich dem LPC User-Manual. Mglw. informativ ist auch noch der Code aus dem Mass-Storage Beispiel aus der USB-Library von ST für STM32 mit SD-Card Host-Interface. Beim kurzen Überfliegen scheint es so, als sei die verwendete "Macrozelle" in den damit ausgestatteten STM32 ähnlich der in den LPC23xx/24xx. > Daher habe ich angefangen die Kernroutinen selbst zu schreiben, bzw. > den Keil Code einzudeutschen, abzuspecken und lesbarer zu machen. Eindeutschen, nun denn, wer's braucht. Bei der Portierung von Code für RV oder IAR auf "vergessene" volatiles achten. Kommt ziemlich oft vor, mglw. erkenne diese Compiler irgendwie delay-loops und in ISRs mitgenutzte Variablen und optimieren das dann nicht "weg", anders kaum zu erklären, technisch falsch ist es dennoch. > Die Chat FAT > selbst ist absolut unübersichtlich und man kann nur hoffen, dass da > alles stimmt. 93kb Quelltext am Stück für die mit langen Dateinamen sind > nicht jedermanns Sache. LFN in Chan's FAT - Danke für die Information, noch gar nicht gesehen. Chans Code ist schon o.k. habe den inzwischen ein paarmal auf verschiedenen Plattformen erfolgreich eingesetzt, nicht nur für Gebastel sondern auch im Produktiveinsatz (allerdings nicht mit LPC23xx). Keine Probleme finden können, die auf den FAT-Code zurückzuführen waren. libfat auf devkitpro mag dem Bedürfnis nach mehr Quellcodedateien näher kommen. > Jedenfalls habe ich erstmal die Uart am Laufen, so dass ich mit hterm > (sehr schönes Programm) sehenn kann was er von sich gibt.
Hallo, danke für die ausführliche Antwort. Ich habe recht viel Erfahrung mit MMC Karten, zumindest habe ich die mit einem PIC ans Laufen bekommen aber ohne FAT sondern nur quasi 1000 Files mit fester Länge drüber gelegt, lassen sich auch vom PC nicht lesen. Der 2368 abstrahiert die Abstraktion der MMC nun wieder, was nicht ganz einfach zu verstehen ist, mit SPI war das einfacher. Die efsl habe ich auch ans Laufen gekriegt auf dem 2138. DMA und den Schnickschnack brauche ich nicht, ISRs nur wo nötig. Die Portierung des Fifo finde ich leider nicht, sorry Thomas aber durch Deinen Code blicke ich nicht durch. Ich programmiere zwar seit 20 Jahren, auch sehr grosse Projekte aber die wachsen dann eben auf meinem Mist, Fremdcode ist immer ein Alptraum, wenn der nicht sauber strukturiert und kommentiert ist bzw zb ein Struktugramm Auskunft gibt, wie die Module zusammen arbeiten. Werde mich mal morgen dran machen die Keil Funktionen auf der unteren Ebene einfach nur ans Laufen zu kriegen, Init, Sektor lesen, Sektor schreiben und freuen wenn wenigstens das schon mal funktioniert. Gruss, Christian
Und das hier liest bzw beschreibt wirklich nur den Hardware Fifo? Kann man das stupide in ein .c File packen und dem GNU CC anbieten oder muss man dafür ein paar Verrenkungen machen? Was ich bei Keil auch noch nicht verstehe ist, diese 4-Bit Sache. Meine SD karten haben alle nur einen Datenpin. Es gibt welche mit mehr Pins aber ich habe nur die mit 8 Pins. Wieso also 4 Bit Mode? Zitat Keil Code. ACMD6, SET_BUS_WIDTH, if it's SD card, we can use the 4-bit bus instead of 1-bit.
1 | AREA MCIFIFO, CODE, READONLY |
2 | |
3 | EXPORT MCI_ReadFifo |
4 | EXPORT MCI_WriteFifo |
5 | |
6 | ; int MCI_ReadFifo(unsigned int * dest); |
7 | ; int MCI_WriteFifo(unsigned int * src); |
8 | src RN 4 |
9 | dst RN 5 |
10 | |
11 | MCI_ReadFifo
|
12 | STMFD sp!,{src,dst,r12,lr} |
13 | LDR src, mci_fifo |
14 | MOV dst, r0 |
15 | LDMIA src, {r0-r3} |
16 | STMIA dst!, {r0-r3} |
17 | LDMIA src, {r0-r3} |
18 | STMIA dst!, {r0-r3} |
19 | MOV r0, dst |
20 | LDMFD sp!,{src,dst,r12,pc} |
21 | |
22 | MCI_WriteFifo
|
23 | STMFD sp!,{src,dst, r12,lr} |
24 | LDR dst, mci_fifo |
25 | MOV src, r0 |
26 | LDMIA src!, {r0-r3} |
27 | STMIA dst, {r0-r3} |
28 | LDMIA src!, {r0-r3} |
29 | STMIA dst, {r0-r3} |
30 | MOV r0, src |
31 | LDMFD sp!,{src,dst,r12 ,pc} |
32 | |
33 | mci_fifo
|
34 | DCD 0xE008C080 |
35 | END
|
8 Pins? ich kenn SD mit 9 Pins, wobei 2 Pins direkt aneinander sind (Data0 und Data1), und MMC mit 7 Pins. SD mit 9 Pins haben 4 Datenleitungen, die man dann nutzen kann. Anschaulich hier: http://elm-chan.org/docs/mmc/mmc_e.html
Hallo, hast recht, benutzt habe ich immer nur einen beim PIC. Immerhin kompiliert der Keil Code jetzt einwandfrei durch, wobei ich die Assemblerroutinen durch Leerroutinen ersetzt habe. Ein paar dumme Fragen (aber ich bin halt Anfänger mit dem ARM7) Ist das so richtig für den GNU? Eine beliebige Routine zur ISR deklarieren, damit er den richtigen Code dafür erzeugt? (abgeschrieben aus einem beispiel) void _attribute_ ((interrupt("IRQ"))) MCI_IRQHandler (void) Andere Frage, speziell an Martin: Was machen die Fifo Routinen oben genau, damit ich die in C schreiben kann? Gruss, Christian
Hi Hier noch ein anderer Code zu MMC und SD-Card. Unterstützt auch SDHC. http://arm.hsz-t.ch Gruss, Daniel
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.