Wie kann ich auf Freescale iMX31 die SDRAM-Adresse in die CPU-Adresse übersetzen?

7

[Dies ist eine erneute Veröffentlichung von https://stackoverflow.com/q/5346225/69172 ]

Ich bin neu in iMX31 und eingebetteten Systemen. Bitte helfen Sie mir, die Übersetzung von der SDRAM-Adresse in die ARM-CPU-Adresse zu verstehen, insbesondere in den "speziellen" Befehlsmodi des SDRAM-Controllers.

Hier ist der SDRAM-Initialisierungscode, mit dem ich ein Problem habe:

    ldr r0, ESDCTL_BASE_W
    mov r2, #SDRAM_BASE_ADDR /* 0x80000000 */

    ldr r1, =0x92100000 /* Precharge */
    str r1, [r0]
    ldr r1, =0x0
    ldr r12, =0x80000F00
    str r1, [r12]

    ldr r1, =0xA2100000 /* Auto-refresh */
    str r1, [r0]
    ldr r1, =0x0
    str r1, [r2]

    ldr r1, SDRAM_0xB2100000 /* Load Mode Register */
    str r1, [r0]
    ldr r1, =0x0
    strb r1, [r2, #0x33]

    ldr r1, =0xFF
    ldr r12, =0x81000000

Der RAM, den ich habe, ist Micron LPDDR MT46H64M32LF , und dieser Code folgt dem Initialisierungsvorgang gut, aber woher kommt im PRECHARGE- Schritt die Adresse 0x80000F00?

Aus dem iMX31-Referenzhandbuch habe ich erfahren, dass ich während des PRECHARGE- Schritts den SDRAM-Pin A10auf HIGH setzen muss, was zu einem PRECHARGE ALL führt . Hier ist der Text zu PRECHARGE von RM:

... In diesem Modus erzeugt ein Zugriff (entweder Lesen oder Schreiben) auf den SDRAM / LPDDR-Adressraum einen Vorladebefehlszyklus. Das SDRAM / LPDDR-Adressbit A10 bestimmt, ob eine einzelne Bank oder alle Banken durch den Befehl vorgeladen werden. Wenn Sie auf eine Adresse mit niedriger SDRAM / LPDDR-Adresse A10 zugreifen, wird nur die von den Bankadressen ausgewählte Bank vorgeladen, wie in Abbildung 19-75 dargestellt. Umgekehrt werden bei Zugriffen mit hohem A10 alle Banken unabhängig von der Bankadresse vorgeladen. Beachten Sie, dass A10 der SDRAM-Pin und nicht der A10-Bit-ARM-Adressbus ist. Die Übersetzung des SDRAM A10 in die entsprechende ARM-Adresse ist abhängig von der Speicherkonfiguration.

Und hier ist ein weiterer Text auf dem gemultiplexten Adressbus im "speziellen" Modus:

Im "speziellen" Modus, beispielsweise im Vorlademodus (SMODE = 1) oder im Lademodusregister (SMODE = 3), erfolgt keine Adressverschiebung. Dies bedeutet, dass die CPU-Adresse A0 bei aller Speicherbreite auf MA0 abgebildet wird. Zum Ansteuern des MA10-Bits (für den Befehl zum Vorladen aller) sollte beispielsweise das CPU-A10-Bit gesetzt werden (für externe 16- oder 32-Bit-Geräte). Dieselbe Logik gilt für den Befehl zum Laden des Lademodus, wie im Beispiel der Initialisierungsroutine in Abschnitt 19.5.4.1, „SDRAM-Initialisierung“ zu sehen ist.

Gemäß dem obigen Text und unter der Annahme, dass A0 das erste Bit von ist 0x80000000, sollte das Setzen von A10 auf 1 die Adresse geben 0x80000400, nicht die 0x80000F00im Code. Warum???

Das hier gezeigte Code-Snippet soll mit DDR funktionieren. Für SDRAM wird es tatsächlich 0x80000400in PRECHARGE verwendet .

Gibt es irgendetwas im Zusammenhang mit den Eigenschaften von DDR? Und wie kann ich die richtige Übersetzung zwischen SDRAM-Pins und ARM-CPU-Adresse erhalten?

Ye Liu
quelle
Gute Frage! Leider bin ich in Bezug auf externen Arbeitsspeicher nicht sehr erfahren, aber ich habe eine Prämie auf Ihre Frage fallen lassen, in der Hoffnung, dass jemand anderes sie findet.
Kevin Vermeer
Diese beiden Abschnitte des Handbuchs sind widersprüchlich, es sei denn, ich verstehe das falsch. Ich neige dazu, Letzteres zu glauben. Die Adressbits (außer A10) kümmern sich möglicherweise nicht um PRECHARGE ALL, daher kann 0xF ein Versuch sein, A10 unabhängig von der Zuordnung zu setzen. Funktioniert der Speicher mit dieser Initialisierung nicht und wenn nicht, können Sie das Problem beschreiben? Oder möchten Sie verstehen, wie die Adresszuordnung im normalen Betrieb funktioniert?
Andy

Antworten:

6

Um Ihre Basisfrage zu beantworten und zur Adresse von Pin A10 des Speichers zu gelangen, müssen Sie sich die Speicherzuordnung für das ARM-Gerät ansehen ...

In diesem Fall wird die Speicherkarte betrachtet:

0x8000 0000 -> 0x8FFF FFFF wird CSD0 (SDRAM / DDR) zugeordnet.

und

0x9000 0000 -> 0x9FFF FFFF wird CSD1 (SDRAM / DDR) zugeordnet.

Sie müssen wissen, welche Chipauswahl im PCB-Design verwendet wurde, um Ihre Antwort darauf zu ermitteln, an welche Bank Ihre DDR angeschlossen ist.

Dies bedeutet, dass sich A10 entweder als 0x8000 0400 (wie bereits erwähnt) oder als 0x9000 0400 befindet.

Warum 0x8000 0F00 anstelle von 0x8000 0400 verwendet wurde ... das Lesen des Datenblattes für diesen Speicher impliziert, gibt jedoch nicht an, dass die anderen Adresspins A (n) sich nicht um diese Operation kümmern, so dass der Codierer wahrscheinlich nur dort ein F geworfen, anstatt herauszufinden, dass nur eine 4 benötigt wurde.

Ich finde auch nicht, dass diese beiden Abschnitte des Datenblattes einander widersprechen. Das erste ist im Grunde nur zu sagen, dass Sie auf die Speicherzuordnung des Geräts verweisen müssen, um die reale Adresse zu finden, an der der Speicher zugeordnet ist, damit Sie diese Adresse als Basis verwenden können.

Das zweite Anführungszeichen sagt Ihnen, dass Bit 0 der Adresse in diesem Modus dem Adress-Pin 0 im Speicher entspricht, was im normalen Betrieb möglicherweise nicht immer der Fall ist. Dies kann von der Daten- / Adressbreite des Speichers in Kombination mit Ausrichtungsproblemen für den Kern abhängen.

Kennzeichen
quelle
Vielen Dank, dass Sie die Dinge geklärt haben, und ich denke, wie das Fzum Leben erweckt wird, ist genau so, wie Sie es erwähnt haben. Ich habe einen weiteren DDR-Init-Code von Freescale, in dem die Adresse für PRECHARGE ALLlautet 0x80000400!
Ye Liu