继续分析主流程:
(4)
malloc_start = dest_addr - TOTAL_MALLOC_LEN;
mem_malloc_init(malloc_start, TOTAL_MALLOC_LEN);
这个函数的主要作用是将malloc区域的首地址,尾地址和大小进行一下标记。
(5)初始化nandflash
nand_init();
(6)初始化SD卡
mmc_initialize(gd->bd);
(7)
void env_relocate(void)
使用默认的环境变量,用哈希表的形式来存放这些变量和板子没有关系。
(8)
/* IP Address */
gd->bd->bi_ip_addr= getenv_IPaddr(“ipaddr”);
(9)
stdio_init(); /*get the devices list going. */
它是标准输入输出和标准错误的初始化
1)
/* Initialize the list */
INIT_LIST_HEAD(&(devs.list));
->一开始初始化指向自己
2)
drv_system_init()
->
struct stdio_dev dev;
->
struct stdio_dev {
int flags; /*Device flags: input/output/system */
int ext; /*Supported extensions */
char name[16]; /* Device name */
/* GENERAL functions */
int (*start) (void); /* To start the device */
int (*stop) (void); /* To stop the device */
/* OUTPUT functions */
void (*putc) (const char c); /* To put a char */
void (*puts) (const char *s); /* To put a string (accelerator) */
/* INPUT functions */
int (*tstc) (void); /* To test if a char is ready... */
int (*getc) (void); /* To get that char */
/* Other functions */
void *priv; /* Private extensions */
struct list_head list;
};
->
调用dev.flags =
DEV_FLAGS_OUTPUT | DEV_FLAGS_INPUT | DEV_FLAGS_SYSTEM;
dev.putc =serial_putc;
等函数赋值后,dev的变量内容如下:
3)stdio_register (&dev);
目前这个局部变量在堆栈上面。随着函数运行完返回上级,这个堆栈会被清掉,所以必须把它放到全局静态的地址当中去,也就是前面空出来的1M左右TOTAL_MALLOC_LEN位置。
(10)
jumptable_init();
gd->jt = malloc(XF_MAX * sizeof(void *));
#include <_exports.h>
这个函数的作用是将uboot的命令保存在gd-jt[ ]里面,并且将这个变量的大小做好记录,以后调用这些命令的时候就会回到gd-jt[]这个结构里面。
下面列举几个命令:
gd->jt[XF_get_version]=(void*) get_version
gd->jt[XF_getc]=(void*)getc;
gd->jt[XF_tstc]=(void*)tsts;
gd->jt[XF_putc]=(void*)putc;
gd->jt[XF_puts]=(void*)puts;
gd->jt[XF_printf]
gd->jt[XF_install_hdlr]
gd->jt[XF_free_hdlr]
gd->jt[XF_malloc]=(void*)malloc;
gd->jt[XF_free]=(void*)free;
gd->jt[XF_udelay]=(void*)udelay;
gd->jt[XF_get_timer]=(void*)get_timer;
gd->jt[XF_setenv]=(void*)setenv;
gd->jt[XF_simple_strtoul]=(void*)simple_strtoul;
gd->jt[XF_simple_strtol]=(void*)simple_strtol;
gd->jt[XF_strcmp]=(void*)strcmp;
(11)
/* Called after the relocation - use desired
console functions */
console_init_r()
->
/* Scan devices
looking for input and output devices */
list_for_each(pos,
list);
->
console_devices[stdout][0] = outputdev;
console_devices[stderr][0]
= outputdev;
console_devices[stdin][0] = inputdev;
最后都指向串口0
初始化完之后,会在串口终端输出:
In:serial
Out: serial
err: serial