S3C2440启动代码分析
启动位置判断:
首先判断启动位置(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个参数为数据长度;