本文共 2624 字,大约阅读时间需要 8 分钟。
继续分析主流程:
(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_versiongd->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 desiredconsole functions */console_init_r()-> /* Scan deviceslooking 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
转载地址:http://cpohn.baihongyu.com/