RedBoot无法从DDR运行

时间:2011-03-31 22:56:07

标签: assembly embedded arm

我正在开发一款基于iMX31平台的新主板,这款主板有一个 Micron的单芯片256MB LPDDR(MT46H64M32LFCM-6)和我使用NAND来实现 启动电路板(BOOT [4:0] = 00001)。

我们知道,一旦RedBoot开始运行,它将首先初始化系统,然后复制 其代码的第一个2KB从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中的相同,PC的价值也是正确的。

请帮助,谢谢!

1 个答案:

答案 0 :(得分:1)

ARM并没有停止,因此确定执行实际继续的位置会很有用。它将是两个地方之一:

  1. 您写入电脑的PC值。这可能是也可能不是您期望的。如果可能的话,使用调试器来验证R0& R1实际上是您期望的SDRAM中的位置。
  2. 异常,可能是预取异常等中止异常。这意味着存储在PC上的指令位于由于MMU权限或配置问题(SDRAM?)而无法访问的内存位置。
  3. 我会在中断向量上设置'陷阱',使它们循环到自己。通过这种方式,您可以在“挂起”之后看到PC指向的任何地方将告诉您发生了什么。

    在装配中它看起来像这样:

    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权限。如果它挂在其他地方那么加载PC的代码有问题,可能是用错误的地址加载它。

    希望有所帮助!