启动位置判断:
首先判断启动位置(NandFlash, NorFlash, RAM),
如果是从NandFlash启动,则将代码从NandFlash读入RAM中,再运行(重点)。

    ldr     r0, =BWSCON
    ldr     r0, [r0]
    ands    r0, r0, #6          ;OM[1:0] != 0, NOR FLash boot
    bne     copy_proc_beg       ;do not read nand flash
    adr     r0, ResetEntry      ;OM[1:0] == 0, NAND FLash boot
    cmp     r0, #0              ;if use Multi-ice, 
    bne     copy_proc_beg       ;do not read nand flash for boot

代码搬移:

nand_boot_beg
    mov    r0, #0
    ldr    r1, =ResetEntry
    mov    r2, #0x40000
    
    [ {TRUE}
        bl    RdNF2SDRAM
    ]
    ldr    pc, =copy_proc_beg
/*
 * 功能描述: 将Flash中的内容读至RAM中
 * 参数列表: addr(r0) - 源地址(Flash)
 *           dest(r1) - 目标地址
 *           size(r2) - 数据长度
 * 注意事项:
 * 1. 通过芯片ID来确定芯片容量(分页值),并调用不同的时序;
 * 2. 汇编调用时,参数依次分别从r0,r1,r2传入;
 */
void RdNF2SDRAM(int addr, char* dest, int size)
{
    U32 i;
    unsigned char * to = (unsigned char *)dest;
    rNF_Init();
    switch(rNF_ReadID())
    {
        case 0x76:
        {
            for(i = (addr >> 9); size > 0; )
            {
                rSB_ReadPage(i, to);
                size -= 512;
                to   += 512;
                i++;
            }
            break;
        }
        case 0xf1:
        case 0xda:
        case 0xdc:
        case 0xd3:
        {
            for(i = (addr >> 11); size > 0; )
            {
                rLB_ReadPage(i, to);
                size -= 2048;
                to   += 2048;
                i++;
            }
            break;
        }
    }
}   

注意事项:
RdNF2SDRAM函数为C语言函数,入口共有3个参数,分别通过r0,r1,r2来传递(规定);
第1个参数为源地址,指数据在NandFlash中的起始地址;
第2个参数为目标地址,指将数据搬入RAM中的位置;
第3个参数为数据长度;