关于uboot 中nand_spl 启动

来源:互联网 发布:ipad 传输软件 编辑:程序博客网 时间:2024/06/16 13:52

最近有碰到uboot 中nand_spl启动,说说我的理解!

写在前面。

1.从名字上来看,他肯定和nand有关系的。spl是什么,我网查了一下,没找到,姑且理解为second process level。

2.u-boot-spl.bin这个文件执行完毕后,就会跳转到u-boot.bin这里。其实,一般情况下,我们的arm板的bootloader只需要一个就可以了,为什么会出现两个bin文件呢?

我是这样理解的。大牛可路过,欢迎批评。u-boot-spl这个文件的主要作用是将nand初始化,然后将u-boot.bin这个文件搬运到sdram里面。u-boot-spl村子的原因可能是

现在得u-boot集成的功能越来越多,俨然就是一个缩小版的linux操作系统。编译后文件远超过4k大小,达到400k左右,一般的soc板级内存只有4k,这就造成u-boot装不下。nand-spl

这个文件很小,他的大小只有不到4k,他可以将u-boot这个文件搬运到sdram里面。然后u-boot再去搬运linux kernel。

上代码:


uboot版本: 2013-04-r2

一个文件是start_nand_spl.S,位于nand_spl/board/$(BOARD)/下面。

这个文件编译后会创建一个链接文件start.S 指向start_nand_spl.S

前面不用看,看关键:

......


进入管理模式

reset:
/*
* set the cpu to SVC32 mode
*/
mrs r0,cpsr
bic r0,r0,#0x1f
orr r0,r0,#0xd3
msr cpsr,r0

/* 设置栈,这个是片内的。方便调到c函数。board_init_f */

call_board_init_f:
#ifdef CONFIG_NAND_SPL /* deprecated, use instead CONFIG_SPL_BUILD */
ldr sp, =(CONFIG_SYS_INIT_SP_ADDR)
#else
#ifdef CONFIG_SPL_BUILD
ldr sp, =(CONFIG_SPL_STACK)
#else
ldr sp, =(CONFIG_SYS_INIT_SP_ADDR)
#endif
#endif
bic sp, sp, #7 /* 8-byte alignment for ABI compliance */
ldr r0,=0x00000000
bl board_init_f


board_init_f这个是开启串口时钟,这里使用的是外部晶振。初始化串口。然后调到nand_boot();

void board_init_f(unsigned long bootflag)
{


    //mem_malloc_init (0xa00000, 0x100000);


    writel(readl(REG_PCLKEN0) | 0x10000, REG_PCLKEN0);   // UART clk
    writel(readl(REG_PCLKEN0) | 0x100, REG_PCLKEN0);   // Timer clk


    nuc970_serial_initialize();
    nuc970_serial_init();


    printf("nand_boot\n");


    nand_boot();
    //relocate_code(CONFIG_SYS_TEXT_BASE - TOTAL_MALLOC_LEN, NULL,
                        //CONFIG_SYS_TEXT_BASE);
}


nand_boot主要是nand的初始化,加载u-boot文件,跳转

void nand_boot(void)

{

...

board_nand_init(&nand_chip);

...

nand_load(...



/*
* Jump to U-Boot image
*/

uboot = (void *)CONFIG_SYS_NAND_U_BOOT_START;
(*uboot)();

}


2 0