uboot之board.c

来源:互联网 发布:淘宝鸿星尔克优惠券 编辑:程序博客网 时间:2024/06/04 19:39

第一阶段:跳转到board.c 。执行start_armboot函数。

void start_armboot (void)
{
    DECLARE_GLOBAL_DATA_PTR;

    ulong size;
    gd_t gd_data;
    bd_t bd_data;
    init_fnc_t **init_fnc_ptr; //这个是函数的指针,指向一些硬件初始化的函数,见下面
   
                    //init_fnc_t *init_sequence[] = {
                        //    cpu_init,        /* basic cpu dependent setup */
                        //    board_init,        /* basic board dependent setup */
                        //    interrupt_init,        /* set up exceptions */
                        //    env_init,        /* initialize environment */
                        //    init_baudrate,        /* initialze baudrate settings */
                       //     serial_init,        /* serial communications setup */
                       //     display_banner,
                       //     dram_init,        /* configure available RAM banks */
                       //     display_dram_config,
                       //     NULL,
                       //     };

    //printf("**********Start *************\n");
    /* Pointer is writable since we allocated a register for it */
    gd = &gd_data;
    memset (gd, 0, sizeof (gd_t));//初始化为0
    gd->bd = &bd_data;
    memset (gd->bd, 0, sizeof (bd_t));//初始化为0

//注意,下面的循环是依次调用各个硬件初始化函数,顺序见上面的的数组,我们在下一篇中依次解释每种硬//件的初始化,第六个就是串口的初始化,这时候我们就可以通过串口输出信息了
    for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
        if ((*init_fnc_ptr)() != 0) {
            hang ();      //如果不成功的话,就“输出信息,然后就进入死循环”
        }
    }

    /* configure available FLASH banks */
    size = flash_init ();  //flash的初始化
    display_flash_config (size);//打印flash的配置信息

    /* initialize environment */
    env_relocate ();//环境的初始化,代码在common\env_common.c中

    /* IP Address */
    bd_data.bi_ip_addr = getenv_IPaddr ("ipaddr");//读取IP地址,保存到bd_t数据结构中

    /* MAC Address */ //MAC地址的初始化
    {
        int i;
        ulong reg;
        char *s, *e;
        uchar tmp[64];

        i = getenv_r ("ethaddr", tmp, sizeof (tmp));
        s = (i > 0) ? tmp : NULL;

        for (reg = 0; reg < 6; ++reg) {
            bd_data.bi_enetaddr[reg] = s ? simple_strtoul (s, &e, 16) : 0;
            if (s)
                s = (*e) ? e + 1 : e;
        }
    }


    /* enable exceptions */  //允许中断
    enable_interrupts ();

#ifdef CONFIG_DRIVER_CS8900  //配置网卡
    if (!getenv ("ethaddr")) {
        cs8900_get_enetaddr (gd->bd->bi_enetaddr);
    } 
#endif

//直接进入main_loop 该函数在common\main.c中,至此,硬件初始化完成
    /* main_loop() can return to retry autoboot, if so just run it again. */
    for (;;) {
        main_loop ()
    }

    /* NOTREACHED - no way out of command loop except booting */
}

0 0
原创粉丝点击