En Freescale iMX31, ¿cómo puedo traducir la dirección SDRAM a la dirección de la CPU?

7

[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?

    
pregunta Ye Liu

1 respuesta

6

Para responder a su pregunta base, para obtener la dirección del pin A10 de la memoria que necesita para mirar el mapa de memoria del dispositivo ARM ...

En este caso, mirando el mapa de memoria:

0x8000 0000 - > 0x8FFF FFFF se asigna a CSD0 (SDRAM / DDR)

y

0x9000 0000 - > 0x9FFF FFFF se asigna a CSD1 (SDRAM / DDR)

Necesitaría saber qué chip de selección se usó en el diseño de PCB para determinar su respuesta a qué banco está conectado su DDR.

Esto implica que A10 se encuentra como 0x8000 0400 (como mencionaste) o 0x9000 0400.

En cuanto a por qué se usó 0x8000 0F00 en lugar de 0x8000 0400 ... la lectura de la hoja de datos para esa memoria implica, pero no indica que los otros pines de dirección, A (n) no se encarguen de esta operación, por lo que el programador probablemente acaba de lanzar una F allí en lugar de darse cuenta de que solo se necesitaba un 4.

Tampoco encuentro que esas 2 secciones de la hoja de datos se contradigan entre sí. Básicamente, lo primero es simplemente decir que necesitas hacer referencia al mapa de memoria del dispositivo para localizar la dirección real donde se asigna la memoria para que puedas usar esa dirección como base.

La segunda cita le dice que el bit 0 de la dirección corresponde al pin 0 de la dirección en la memoria en este modo, lo que puede no ser siempre el caso en el funcionamiento normal. Puede depender del ancho de datos / direcciones de la memoria combinada con problemas de alineación para el núcleo.

    
respondido por el Mark

Lea otras preguntas en las etiquetas