Omap138开发板下以uboot2012.04.01为例分析uboot执行(七)

继续分析主流程:

(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

猜你喜欢

转载自blog.csdn.net/qq_40788950/article/details/83957315