SDRAM-Initialisierungsproblem (Freescale iMX31)

10

Ich versuche, eine vorhandene Init-Sequenz (Low-Level-Init des SDRAM) zu ändern, um einer Änderung der Hardwarekonfiguration Rechnung zu tragen: Ein vorhandenes SDRAM auf meinem iMX31 wurde durch eine andere Größe ersetzt, ansonsten derselbe Typ / Hersteller / Layout / Pins / Timings. . nach Angaben.

Kurzes Setup-Szenario und Fehlerverhalten: Ich habe es geschafft, das Board zu booten (die Reihenfolge ist wie folgt: Bootloader von NAND ausführen, 'step2 bootloader' in RAM kopieren, 'step2 bootloader' von RAM ausführen). Aber ich scheine einige Einstellungen falsch zu haben, da die Ausführung aus dem RAM (nach dem Sprung zu Schritt 2) konsistent fehlschlägt.

Ich habe viele eingehende Tests durchgeführt, um falsche Parameter zu identifizieren. Meine Ergebnisse sind folgende: - Einzelbyte / Wort-Lese- / Schreibvorgänge funktionieren, wenn sie von NAND oder JTAG ausgeführt werden - Blockweise / Burst-Schreibvorgänge scheinen zu funktionieren, wenn sie von NAND ausgeführt werden ( JTAG auch) Das Interessante: - Nach blockweisen Schreibvorgängen muss eine SDRAM-Adresse mehrfach gelesen werden, um ein korrektes Byte / Wort (!) Zu lesen. - Wenn ich meine Spalteneinstellungen so ändere, dass NUR die höhere Menge (+1) von verwendet wird Spalten für "Lademodus", aber nicht für Vorladen / Aktualisieren, dann funktioniert es, aber inkonsistent (meiner Theorie nach funktioniert es zuverlässig für den unteren Adressbereich, in dem die fehlende Spalte keine Rolle spielt).

Um sich ein Bild von meiner Konfiguration zu machen: Die Einstellungen aus dem RAM sind fast identisch mit denen in dieser Frage. Dies ist nicht überraschend, da sie neben RAM-Timings von Freescale bereitgestellt werden: Wie kann ich auf Freescale iMX31 die SDRAM-Adresse in die CPU-Adresse übersetzen? Meine ursprüngliche Einstellung ist identisch (auch 64 MB SDRAM wie im Link), mein neuer RAM ist 128 MB. Alle Referenzkarten werden entweder mit 64 MB oder 128 MB geliefert, daher werden beide Werte von iMX31 und Derivaten unterstützt.

Die Änderung, die ich vornehmen muss (Achtung: Annahme!), Ist nur in der COLUMN-Konfiguration (es ist eine weitere Spalte) des RAM. Der RAM ist doppelt so groß, aber ansonsten beansprucht die Spezifikation genau die gleichen Timings usw. Da er nur eine weitere Spalte enthält (siehe Link oben), ändern sich meine Register für den Vorlade-, Aktualisierungs- und Lademodus für den neuen RAM von 0x92100000 auf 0x92200000 - zum Beispiel ) nichts anderes wird geändert.

Frage 1: Ist meine Annahme sinnvoll, dass eine Änderung der Spaltenanzahl "lokal" sein kann (ohne Auswirkungen auf andere Einstellungen), wenn alle Timings und physikalischen Chip-Eigenschaften (die die Laufwerksstärke, das Timing und den Stromverbrauch beeinflussen) ähnlich sind? Interessanterweise habe ich meine Einstellungen mit vielen anderen online verfügbaren Einstellungen verglichen (U-Boot, Red-Boot mit 128 MB) und neben den spezifischen Einstellungen der Karte, wie z. B. der Laufwerksstärke, sehe ich keine Unterschiede.

Frage 2: Mein Fehlerverhalten oben (schreibt Arbeit, liest nur teilweise) ist wahrscheinlich nur für eine bestimmte ungültige Einstellung des RAM gültig. Kann mir jemand einen Rat geben, welche Einstellung ich mir genauer ansehen soll? Es könnte auch möglich sein, "sichere" Parameter so einzustellen, dass das System es mir ermöglicht, den Schuldigen selbst bei verminderter Leistung einzugrenzen.

Peter Branforn
quelle
Sind Sie sich ziemlich sicher, dass das Problem nicht mit dem Hardware-Design zusammenhängt (schlechte ICs, Layoutfehler, schlechte Signalintegrität, unzureichende Leistung ...)?
Jbarlow

Antworten:

1

Beginnen Sie für 2 mit den Einstellungen einer iMX31-Demokarte. Ändern Sie sie dann nach Bedarf für Ihr Teil (hauptsächlich Geschwindigkeit und Größe). Insbesondere haben Sie wahrscheinlich die falsche Anzahl von Wartezuständen beim Lesen.

Brian Carlton
quelle