[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?