http://www.eechina.com/thread-6690-1-1.html
http://wenku.baidu.com/view/c6c5fad049649b6648d74745.html
U-BOOT 编写流程
Bootloader的两部分:
1、NANFLASH 前4KB 一开机就会被复制到RAM中,然后跳到RAM 去运行。(第一部分IPL)
2、如果bootloader 大于4KB,则利用前4KB的代码将NANFLASH上大于4KB部分的bootloader复制到RAM中去继续运行。(第二部分SPL)
IPL:关闭看门狗、中断à设置CPU频率à初始化化SDRAMà将NADFLASH上的代码拷贝到SDRAM上—>跳到代码入口执行代码。
1、 WDT
#define main_addr 0x0
Start.S
Void start_main() //低级别的main
{
WTCON=0x0; //关闭看门狗
__asm__ __volatile( //关闭中断
“mrs r0,cpsr\n”
“orr r0,r0,#0xc0\n”
“msr cpsr,r0\n”
: : :”r0”
);
//----------------设置CPU频率-----------//
MPLLCON=0X7F021; //405Mhz
CAMDIVN=0;
CLKDIVN=1|(2<<1); //FCLK:HCLK:PCLK=8:2:1
//---初始化UART0,用于输出信息--//
GPHCON&=~(0xf<<8);
GPHCON|=(0x0a<<8);
//------初始化协处理器CP15------//
__asm__ __volatile(
“mcr p15,0,0%,c1,c0,0\n”
:
:“r”((1<<1)|(0xf<<3)|(1<<12)|(3<<30))
);
//---------------初始化SDRAM-----------//
BWSCON=(2<<24);
BANKCON6=(3<<15)|1;
REFRESH=(1269)|(1<<18)|(1<<23);
BANKSIZE=1|(1<<5)|(1<<7);
MRSRB6=(3<<4);
//------------拷贝第二部分代码至SDRAM------//
nand_read(0x33000000, 0,100);
//-----------跳到SDRAM中的第2部分运行---------//
__asm__ __volatile(
“ldr r0,=main \n”
“mov lr,pc\n”
“mov pc,r0\n”
:
:
:”r0”
);
}
Void main() //第二部分的mian
{
}
//拷贝代码,一页一页的去拷贝
Void nand_read(unsigned char *buf, unsigned long nand_addr,int page_cnt)
{
Int I,j;
NFCONF=(3<<8);
//enable flash
NFCONT=1;
For(j=0;j< page_cnt;j++, nand_addr+=512)
{
NFCMMD=0X00;
NFADDR=nand_addr&0xff;
NFADDR=( nand_addr>>9)&0xff;
NFADDR=( nand_addr>>17)&0xff;
NFADDR=( nand_addr>>25)&1;
}
While(!(NFSTAT&1))
;
For(i=0;i<512;i++){
*buf=NFDATA;
Buf++;
}
//disable flash
NFCONT=(1<<1);
Return 0;
}
一、Boot Loader 的概念和功能
1、嵌入式Linux 软件结构与分布在一般情况下嵌入式Linux 系统中的软件主要分为以下及部分:
(1)引导加载程序:其中包括内部ROM 中的固化启动代码和Boot Loader 两部分。
而这个内部固化ROM 是厂家在芯片生产时候固化的,作用基本上是引导Boot Loader。有的芯片比较复
杂,比如Omap3,他在flash 中没有代码的时候有许多启动方式:USB、UART 或以太网等等。而S3C24x0 则很
简单,只有Norboot 和Nandboot。
(2)Linux kernel 和drivers。
(3)文件系统。包括根文件系统和建立于Flash 内存设备之上的文件系统(EXT4、UBI、CRAMFS 等等)。
它是提供管理系统的各种配置文件以及系统执行用户应用程序的良好运行环境的载体。
(4)应用程序。用户自定义的应用程序,存放于文件系统之中。
在Flash 存储器中,他们的一般分布如下:
2、在嵌入式Linux 中为什么要有BootLoader在linux 内核的启动运行除了内核映像必须在主存的适当位置,CPU 还必须具备一定的条件:
1. CPU 寄存器的设置:R0=0;
R1=Machine ID
(即Machine Type Number,定义在linux/arch/arm/tools/mach‐types);
R2=内核启动参数在 RAM 中起始基地址;
2. CPU 模式:必须禁止中断(IRQs 和FIQs);
CPU 必须 SVC 模式;
3. Cache 和 MMU 的设置:MMU 必须关闭;
指令 Cache 可以打开也可以关闭;
数据 Cache 必须关闭;
但是在CPU 刚上电启动的时候,一般连内存控制器都没有配置过,根本无法在内存中运行程序,更不可
能处在Linux 内核的启动环境中。为了初始化CPU 及其他外设,使得Linux 内核可以在系统主存中跑起来,并
让系统符合Linux 内核启动的必备条件,必