[Este es un re-post de http://stackoverflow.com/q/5346225/69172]
Soy nuevo en el iMX31 y sistemas embebidos, por favor me ayudan a entender la traducción de SDRAM dirección a la CPU ARM de dirección, especialmente en los "especiales" dos modos de comando de la SDRAM controlador.
Aquí está la SDRAM código de inicialización 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 RAM que tengo es de Micras LPDDR MT46H64M32LF, y este código sigue el procedimiento de inicialización muy bien, pero en PRECARGA de paso, donde es la dirección 0x80000F00
proviene?
De iMX31 manual de referencia me enteré de que durante la PRECARGA de paso, tengo que crear SDRAM pin A10
a lo ALTO, que será, por tanto, resultado de una PRECARGA de TODOS. Aquí está el texto en PRECARGA de RM:
...Mientras esté en este modo, un acceso (lectura o escritura) a la SDRAM/LPDDR espacio de direcciones generará un comando de precarga del ciclo. SDRAM/LPDDR dirección de bit A10 determina si un solo banco, o todos los bancos, son precargado por el comando. El acceso a una dirección de la SDRAM/LPDDR dirección A10 baja precarga sólo el banco seleccionado por el banco de direcciones, como se ilustra en la Figura 19-75. Por el contrario, los accesos con A10 alto de precarga de todos los bancos, independientemente de la dirección del banco, ...tenga en cuenta que el A10 es la SDRAM pin, no la A10 poco el BRAZO bus de direcciones. Traducción de la SDRAM A10 a la correspondiente BRAZO de dirección depende de la configuración de la memoria.
Y aquí hay otro texto en el multiplexado bus de direcciones durante el "período especial" modo:
Durante el "período especial", por ejemplo, de precarga de modo (SMODE=1) o modo de carga de los registros (SMODE=3) no hay ninguna dirección de desplazamiento, significa que la CPU de direcciones A0 es mapeado en MA0 en la memoria de todos ancho. Por ejemplo, en orden a la unidad de MA10 bits (para la precarga de todos los comandos) la CPU A10 bit debe ser establecido (para ambos de 16 o 32 bits con dispositivos externos). La misma lógica es válida para el modo de carga registro de comandos, como se puede ver en la rutina de inicialización de ejemplo en la Sección 19.5.4.1, "SDRAM de Inicialización."
Según el texto anterior y suponiendo que A0 es el primer bit de 0x80000000
, ajuste de la A10 a 1 debe dar 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 el DDR. Para SDRAM, que en realidad se utiliza 0x80000400
en PRECARGA.
¿Hay algo relacionado con las características de DDR? Y ¿cómo puedo obtener la traducción correcta entre SDRAM pines y el BRAZO de la CPU de la dirección?