[Esta es una nueva publicación de enlace ]
Soy nuevo en iMX31 y en los sistemas integrados, ayúdeme a comprender la traducción de la dirección SDRAM a la dirección de CPU ARM, especialmente en los modos de comando "especiales" del controlador SDRAM.
Aquí está el código de inicialización SDRAM que tengo problema con:
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
La memoria RAM que tengo es Micron LPDDR MT46H64M32LF , y este código sigue muy bien el procedimiento de inicialización, pero en el paso PRECHARGE , ¿de dónde viene la dirección 0x80000F00
?
En el manual de referencia de iMX31, aprendí que durante el paso PRECHARGE , necesito configurar el pin de SDRAM A10
en ALTO, lo que dará como resultado un PRECHARGE ALL . Aquí está el texto en PRECHARGE de RM:
... Mientras se encuentra en este modo, un acceso (ya sea de lectura o escritura) al espacio de direcciones SDRAM / LPDDR generará un ciclo de comando de precarga. El bit A10 de dirección de SDRAM / LPDDR determina si el comando precarga un solo banco, o todos los bancos. El acceso a una dirección con la dirección A10 baja de SDRAM / LPDDR precargará solo el banco seleccionado por las direcciones bancarias, como se ilustra en la Figura 19-75. A la inversa, los accesos con A10 alto precargarán todos los bancos, independientemente de la dirección del banco ... Tenga en cuenta que A10 es el pin SDRAM, no el bus de direcciones ARM de A10 bits. La traducción de la SDRAM A10 a la dirección ARM correspondiente depende de la configuración de la memoria.
Y aquí hay otro texto en el bus de direcciones multiplexado durante el modo "especial":
Durante el modo "especial", por ejemplo, el modo de precarga (SMODE = 1) o los registros del modo de carga (SMODE = 3) no hay cambio de dirección, significa que la dirección de la CPU A0 se asigna en MA0 en todo el ancho de la memoria. Por ejemplo, para controlar el bit MA10 (para el comando de precarga de todos), se debe configurar el bit A10 de la CPU (para dispositivos externos de 16 o 32 bits). La misma lógica es válida para el comando de registro de modo de carga, como se puede ver en el ejemplo de rutina de inicialización en la Sección 19.5.4.1, "Inicialización de SDRAM".
De acuerdo con el texto anterior y asumiendo que A0 es el primer bit de 0x80000000
, la configuración de A10 en 1 debe dar la dirección 0x80000400
, no el 0x80000F00
en el código. ¿Por qué?
El fragmento de código que mostré aquí se supone que funciona con DDR. Para SDRAM, en realidad usa 0x80000400
en PRECHARGE .
¿Hay algo relacionado con las características de DDR? ¿Y cómo puedo obtener la traducción correcta entre los pines SDRAM y la dirección de la CPU ARM?