SDRAM-Initialisierung

Ich habe versucht zu untersuchen, wie der ARM-Bootloader funktioniert, aber die Initialisierung von SDRAM ist mir immer noch ein Rätsel. Beispielsweise verwendet AT91 Bootstrap die folgende Funktion zur Initialisierung. Ich glaube, ich verstehe die meisten Schritte, aber warum ist Schritt Nr. 7 (8 automatische Aktualisierungszyklen) erforderlich?

int sdramc_initialize(struct sdramc_register *sdramc_config,
                unsigned int sdram_address)
{
unsigned int i;

/* Step#1 SDRAM feature must be in the configuration register */
sdramc_writel(SDRAMC_CR, sdramc_config->cr);

/* Step#2 For mobile SDRAM, temperature-compensated self refresh(TCSR),... */

/* Step#3 The SDRAM memory type must be set in the Memory Device Register */
sdramc_writel(SDRAMC_MDR, sdramc_config->mdr);

/* Step#4 The minimum pause of 200 us is provided to precede any single toggle */
for (i = 0; i < 1000; i++) ;

/* Step#5 A NOP command is issued to the SDRAM devices */
sdramc_writel(SDRAMC_MR, AT91C_SDRAMC_MODE_NOP);
writel(0x00000000, sdram_address);

/* Step#6 An All Banks Precharge command is issued to the SDRAM devices */
sdramc_writel(SDRAMC_MR, AT91C_SDRAMC_MODE_PRECHARGE);
writel(0x00000000, sdram_address);

for (i = 0; i < 10000; i++) ;

/* Step#7 Eight auto-refresh cycles are provided */
for (i = 0; i < 8; i++) {
        sdramc_writel(SDRAMC_MR, AT91C_SDRAMC_MODE_AUTO_REFRESH);
        writel(0x00000001 + i, sdram_address + 4 + 4 * i);
}

/* Step#8 A Mode Register set (MRS) cyscle is issued to program the SDRAM parameters(TCSR, PASR, DS) */
sdramc_writel(SDRAMC_MR, AT91C_SDRAMC_MODE_LOAD_MODE);
writel(0xcafedede, sdram_address + 0x24);

/* Step#9 For mobile SDRAM initialization, an Extended Mode Register set cycle is issued to ... */

/* Step#10 The application must go into Normal Mode, setting Mode to 0 in the Mode Register
 and perform a write access at any location in the SDRAM. */
sdramc_writel(SDRAMC_MR, AT91C_SDRAMC_MODE_NORMAL);        // Set Normal mode
writel(0x00000000, sdram_address);        // Perform Normal mode

/* Step#11 Write the refresh rate into the count field in the SDRAMC Refresh Timer Rgister. */
sdramc_writel(SDRAMC_TR, sdramc_config->tr);

return 0;
}

Antworten (2)

Dies hängt hauptsächlich vom verwendeten SDRAM ab. Sehen Sie sich zum Beispiel die Application Note TN-46-08: Initialization Sequence for DDR SDRAM an .

Außerdem habe ich festgestellt, dass die Initialisierungssequenz nicht so streng ist. Normalerweise bleiben Sie bei dem, was bereits bereitgestellt wird, und ändern es entsprechend Ihren spezifischen Anforderungen. Wenn es noch nicht funktioniert, sollten Sie ins Detail gehen und das Datenblatt Ihres SDRAM-Herstellers überprüfen

ARM gibt auch eine beispielhafte Initialisierungssequenz für verschiedene Architekturen an, betrachtet sie jedoch als "Startpunkt".

Der Link ist tot.

Beachten Sie, dass beim SDRAM zwei separate Initialisierungen stattfinden, deren Schritte jedoch häufig verschachtelt werden müssen. Einerseits müssen Sie den SDRAM- Controller im ARM-Chip initialisieren und ihn für die spezifischen Konnektivitäts- und Timing-Parameter der von Ihnen verwendeten SDRAM-Chips konfigurieren. Andererseits müssen Sie auch die SDRAM-Chips konfigurieren und sie durch ihre Initialisierungssequenzen führen, indem Sie den Controller veranlassen, spezielle Befehlszyklen auf dem Speicherbus auszuführen.

Schritt Nr. 7 ist ein Beispiel für Letzteres – er ist Teil der Startvoraussetzungen für den SDRAM-Chip selbst.