首先列出搬移操作的代码:
int CopyCode2Ram(unsigned long start_addr, unsigned char *buf, int size)
{
unsigned int *pdwDest;
unsigned int *pdwSrc;
int i;
if (bBootFrmNORFlash())
{
pdwDest = (unsigned int *)buf;
pdwSrc = (unsigned int *)start_addr;
/* 浠?NOR Flash鍚姩 */
for (i = 0; i < size / 4; i++)
{
pdwDest[i] = pdwSrc[i];
}
return 0;
}
else
{
/* 鍒濆鍖朜AND Flash */
nand_init_ll();
/* 浠?NAND Flash鍚姩 */
if (NF_ReadID() == 0x76 )
nand_read_ll(buf, start_addr, (size + NAND_BLOCK_MASK)&~(NAND_BLOCK_MASK));
else
nand_read_ll_lp(buf, start_addr, (size + NAND_BLOCK_MASK_LP)&~(NAND_BLOCK_MASK_LP));
return 0;
}
}
对于为什么要搬移代码到sdram和如何判断是nand启动还是nor启动的方法,可以参考前面文章:
下面只是分析nand启动的话,是如何对硬件进行操作的。
一、nand_init_ll分析:
void nand_init_ll(void)
{
S3C2440_NAND * s3c2440nand = (S3C2440_NAND *)0x4e000000;
#define TACLS 0
#define TWRPH0 3
#define TWRPH1 0
/* 璁剧疆鏃跺簭 */
s3c2440nand->NFCONF = (TACLS<<12)|(TWRPH0<<8)|(TWRPH1<<4);
/* 浣胯兘NAND Flash鎺у埗鍣? 鍒濆鍖朎CC, 绂佹鐗囬€?*/
s3c2440nand->NFCONT = (1<<4)|(1<<1)|(1<<0);
/* 澶嶄綅NAND Flash */
nand_reset();
}