1.bootloader功能:
分为2个阶段。第一阶段是初始化硬件相关的一些配置,如时钟初始化,关闭看门狗,设置栈,初始化SDRAM,链接脚本配置。第二阶段是从Nand Flash 或 Nor Flash 读出内核,设置启动参数,跳到加载地址启动内核(需要实现Nand 和Nor的初始化操作和读写功能)。
2.遇到的问题:
把自己写的bootloader烧到nor(内核已经烧在nand上了)上电执行时出现
出现这个问题的原因是nand中有坏块
void nand_read(unsigned int addr, unsigned char *buf,unsigned int len)
{
int col = addr %2048;
int i = 0;
while(i < len)
{
/* 1.选中 */
nand_select();
/* 2.发出读命令00h */
nand_cmd(0x00);
/* 3.发出地址 (分5步发出) */
nand_addr(addr);
/* 4.发出读命令30h */
nand_cmd(0x30);
/* 5.等待就绪,判断状态 */
nand_wait_ready();
/* 6.读数据 */
for(; (col < 2048) && (i < len); col++)
{
buf[i] = nand_data();
i++;
addr++;
}
col = 0;
/* 7.取消选中 */
nand_deselect();
}
}
加入读坏块的判断之后成功读出内核
void nand_read(unsigned int addr, unsigned char *buf,unsigned int len)
{
int col = addr %2048;
int i = 0;
while(i < len)
{
if (!(addr & 0x1FFFF) && nand_bad(addr)) /* 一个block只判断一次 */
{
addr += (128*1024); /* 跳过当前block */
continue;
}
/* 1.选中 */
nand_select();
/* 2.发出读命令00h */
nand_cmd(0x00);
/* 3.发出地址 (分5步发出) */
nand_addr(addr);
/* 4.发出读命令30h */
nand_cmd(0x30);
/* 5.等待就绪,判断状态 */
nand_wait_ready();
/* 6.读数据 */
for(; (col < 2048) && (i < len); col++)
{
buf[i] = nand_data();
i++;
addr++;
}
col = 0;
/* 7.取消选中 */
nand_deselect();
}
}