首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

基于Nandflash的Bootloader的设计与实现(2)

基于Nandflash的Bootloader的设计与实现(2)

void ReadImageFromNandflash(void)
{
U8 Image_Buf[512];
U32 Sram_Space=0;
U32 j,k, numberblock;
static U32 i, SECTOR_SIZE=512;
static U8 isbad;
volatile U32 IMAGE_BASE=0x30200000; //内核在sdram中运行开始地址
rINTMSK = BIT_ALLMSK; //屏蔽所有中断
i=2; //从第2个block开始拷贝内核,第0个用于存储本文bootloader,第1个没用到
numberblock=2047; //拷贝多少个block到sdram中,视内核大小设置此值
while(1)
{
nextblock:
isbad=0;
isbad=NF_IsBadBlock(i); //判断正在拷贝block是否是坏block
if (isbad) //是坏block,就进行相应处理;否则就忽略此处,进行下面拷贝
{
i=i 1; //调整,指向下一个block
isbad=0;
if(i>= numberblock) //判断是否拷贝完了所需block
{
Launch(JumpAddr); //拷贝完了所需block,就跳到sdram中内核开始处
}
goto nextblock;
}
for(k=0;k<32;k ) //1 block=32 pages
{ // FMD_ReadSector()函数实现从Nandflash存储器中读取数据到数据缓冲区中
FMD_ReadSector(i, (U8 *)&Image_Buf, k);
for (j=0;j
{ //从数据缓冲区中拷贝到sdram中
*((U8 *)(IMAGE_BASE Sram_Space j))=Image_Buf[j];
}
Sram_Space=Sram_Space SECTOR_SIZE; //调整sdram中偏移地址
}
i=i 1; //调整,指向下一个block
if(i>= numberblock) //判断是否拷贝完了所需block
{
Launch(JumpAddr); //拷贝完了所需block,就跳到sdram中内核开始处
}
}
}
4 试验结果
由于三星公司S3C2410集成了Nandflash控制器,它通过硬件逻辑把Nandflash前4KB内容,即把Bootloader复制到片内 sram中,并被映射到地址0x0处。通过跳线设置默认从nandflash启动,那么,系统每次上电或复位后,首先开始运行就是Bootloader。使用ADS1.2集成开发环境建立Bootloader应用工程,添加必需文件并设置好编译环境,如BootloaderRO_Base设置为 0x0,RW_Base设置为0x33ff0000等,调试并最后生成可执行二进制文件,通过JTAG接口把Bootloader烧写到 Nandflash第0个block地址开始处,通过usb下载工具把操作系统烧写到第2个block地址开始处,复位启动系统运行后结果如图4所示,该程序用于基于uCOS操作系统图像采集系统引导。用同样方法烧写不同操作系统内核应用程序,试验结果每一次表明:Bootloader运行良好,启动加载内核快,且简单、实用、可靠。

5 结论
Bootloader设计与实现是一个非常复杂过程,因此要根据具体硬件和软件需求分析来进行移植或设计。本文设计Bootloader完成主要功能包括:试验板硬件初始化、串口初始化、时钟频率修改以及从Nandflash复制操作系统到SDRAM中运行等,并通过PC机上超级终端显示了正确启动运行信息,且可执行代码只有3K左右。因此,本文所详细描述Bootloader启动运行全过程,对理解、设计和移植Bootloader具有一定参考意义。
返回列表