Inicialización SDRAM

He estado tratando de estudiar cómo funciona el gestor de arranque ARM, pero la inicialización de SDRAM sigue siendo un misterio para mí. Por ejemplo, AT91 Bootstrap usa la siguiente función para la inicialización. Creo que entiendo la mayoría de los pasos, pero ¿por qué se necesita el paso 7 (8 ciclos de actualización automática)?

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;
}

Respuestas (2)

Esto depende principalmente de la SDRAM que esté utilizando. Por ejemplo, eche un vistazo a la Nota de aplicación TN-46-08: Secuencia de inicialización para DDR SDRAM .

Además, descubrí que la secuencia de inicialización no es tan estricta. Por lo general, se apegará a lo que ya se proporciona y lo modificará de acuerdo con sus necesidades específicas. Si aún no funciona, es posible que desee entrar en detalles y consultar la hoja de datos del fabricante de su SDRAM.

ARM también brinda una secuencia de inicialización de ejemplo para varias arquitecturas, pero las considera un "punto de partida".

El enlace está muerto.

Tenga en cuenta que hay dos inicializaciones separadas con SDRAM, pero sus pasos a menudo deben intercalarse. Por un lado, debe inicializar el controlador SDRAM dentro del chip ARM y configurarlo para la conectividad específica y los parámetros de temporización de los chips SDRAM que está utilizando. Por otro lado, también necesita configurar los chips SDRAM y ponerlos a través de sus secuencias de inicialización, haciendo que el controlador ejecute ciclos de comando especiales en el bus de memoria.

El paso 7 es un ejemplo de esto último: es parte de los requisitos de inicio para el propio chip SDRAM.