[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 A10
auf 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 0x80000F00
im Code. Warum???
Das hier gezeigte Code-Snippet soll mit DDR funktionieren. Für SDRAM wird es tatsächlich 0x80000400
in 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?
Antworten:
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.
quelle
F
zum 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ürPRECHARGE ALL
lautet0x80000400
!