RedBoot не может работать с DDR - PullRequest
2 голосов
/ 01 апреля 2011

Я работаю над новой платой на платформе iMX31, эта плата имеет однокристальный 256 МБ LPDDR от Micron (MT46H64M32LFCM-6), и я использую NAND для загрузите доску (BOOT [4: 0] = 00001).

Мы знаем, что как только RedBoot начнет работать, он сначала инициализирует систему, затем скопирует первые 2 КБ своего кода от NAND до DDR, затем перейдите в область памяти DDR и запустить код оттуда. Но в моем случае переход на программный счетчик просто превращает мою доску в тихий кирпич Ниже приведен фрагмент кода, о котором я говорю о:

1:  ldmia r0!, {r3-r10}
    stmia r1!, {r3-r10}
    cmp r0, r2
    blo 1b

    /* Jump to SDRAM */
    ldr r1, CONST_0x0FFF
    and r0, pc, r1     /* offset of pc */
    ldr r1, MXC_REDBOOT_ROM_START
    add r1, r1, #0x10
    add pc, r0, r1
    nop
    nop
    nop
    nop
    ...

Как только add pc, r0, r1 исполняется, все останавливается. Я проверил мой DDR инициализация правильная (все параметры синхронизации, ROW = 14, COL = 10 и шина данных size = x32), и я провел несколько тестов памяти без сбоев, так что я довольно уверен, что контроллер и сам чип памяти в порядке. В RedBoot все выглядит и работает хорошо, пока я не должен вручную установить значение счетчика программы на где-то в диапазоне карты памяти DDR.

Я застрял здесь на несколько дней, я дважды проверил данные, скопированные в DDR было идентично данным в NAND, и значение ПК также было правильным.

Пожалуйста, помогите, спасибо!

1 Ответ

1 голос
/ 25 июня 2011

ARM не просто остановился, поэтому будет полезно определить, где на самом деле продолжается выполнение. Это будет одно из двух мест:

  1. Значение ПК, которое вы записали на ПК. Это может быть или не быть там, где вы ожидаете. если возможно, используйте отладчик, чтобы убедиться, что R0 & R1 действительно является тем местом в SDRAM, которое вы ожидаете.
  2. Исключение, возможно, исключение при прерывании, например, при прерывании предварительной выборки. Это означает, что инструкция, хранящаяся на ПК, находилась в памяти, которая была недоступна из-за разрешений для MMU или из-за проблемы конфигурации (SDRAM?).

Я бы установил «ловушки» для векторов прерываний, которые заставляют их зацикливаться на себе. Таким образом, вы можете видеть, куда указывает ПК после того, как «зависание» скажет вам, что произошло.

В сборке это выглядит так:

B   _reset  /* Reset */
B   .   /* Undefined Instruction */
B   .   /* Software Interrupt*/
B   .   /* Prefetch Abort*/
B   .   /* Data Abort*/
B   .   /* Reserved*/
B   .   /* IRQ*/
B   .   /* FIQ*/

Просто найдите этот код в начале памяти (0x00000000) и перезапустите программу. Если он зависает при 0x0000000C (прерывание предварительной выборки) или 0x000000010 (прерывание данных), то это, вероятно, конфигурация SDRAM или разрешения MMU. Если он зависает где-то еще, то это проблема с кодом, загружающим ПК, возможно, он загружается с неправильным адресом.

Надеюсь, это поможет!

...