Chinaunix首页 | 论坛 | 博客
  • 博客访问: 655730
  • 博文数量: 516
  • 博客积分: 4119
  • 博客等级: 上校
  • 技术积分: 4288
  • 用 户 组: 普通用户
  • 注册时间: 2012-10-30 17:29
文章分类

全部博文(516)

文章存档

2014年(4)

2013年(160)

2012年(352)

分类:

2013-01-04 17:12:38

原文地址:x-load的启动选择 作者:chenxibing008

x-load的启动选择:

见lib/board.c

初始化顺序,如果配置了CFG_CMD_MMC,则直接从MMC卡启动,否则初始化NAND FLASH。

init_fnc_t *init_sequence[] = {
        cpu_init, /* basic cpu dependent setup */
        board_init, /* basic board dependent setup */
#ifdef CFG_PRINTF
        serial_init, /* serial communications setup */
        print_info,
#endif
#ifdef CFG_CMD_MMC
        mmc_boot,
#endif
        nand_init, /* board specific nand init */
        NULL,
};



/cpu/omap3/start.S文件中:
  ldr     pc, _start_armboot      /* jump to C code     */

_start_armboot: .word start_armboot

跳转到C代码start_armboot。


start_armboot,还是在lib/board.c文件中实现:

void start_armboot (void)
{
        init_fnc_t **init_fnc_ptr;
        int i;
        uchar *buf;

        for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
                if ((*init_fnc_ptr)() != 0) {
                        hang ();
                }
        }

        buf = (uchar*) CFG_LOADADDR;

#ifdef CFG_ONENAND
        for (i = ONENAND_START_BLOCK; i < ONENAND_END_BLOCK; i++){
                if (!onenand_read_block(buf, i))
                        buf += ONENAND_BLOCK_SIZE;
        }
#else
        for (i = NAND_UBOOT_START; i < NAND_UBOOT_END; i+= NAND_BLOCK_SIZE){
                if (!nand_read_block(buf, i))
                        buf += NAND_BLOCK_SIZE; /* advance buf ptr */
        }
#endif
        if (buf == (uchar *)CFG_LOADADDR)
                hang();

        /* go run U-Boot and never return */
        printf("Starting OS Bootloader...\n");
        ((init_fnc_t *)CFG_LOADADDR)();

        /* should never come here */
}


首先根据预定的初始化顺序进行初始化(其中,如果遇到MMC卡可用,配置了CFG_CMD_MMC,即从MMC卡启动),然后根据用户选择的是onenand还是nand,并从其中存放u-boot的地方读取u-boot,然后运行U-Boot。

如何选择就是配置CFG_CMD_MMC与否:
/* For X-loader to be flashed on to NAND disable the below macro */
//#define CFG_CMD_MMC              1
//#define CFG_CMD_FAT              1
//#define CONFIG_MMC               1
//#define CFG_MMC_BASE             0xF0000000

如果不注释上述定义,就从MMC卡启动,注释之后就可以从NAND FLASH启动了。
当然,要保证NAND FLASH驱动可用。

阅读(451) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~