博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Omap138开发板下以uboot2012.04.01为例分析uboot执行(七)
阅读量:3892 次
发布时间:2019-05-23

本文共 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/

你可能感兴趣的文章
linux修改ssh端口和禁止root远程登陆设置
查看>>
What really happens when you navigate to a URL
查看>>
偶遇with ties
查看>>
linux 编译指定库、头文件的路径问题
查看>>
使用gdb调试运行时的程序小技巧
查看>>
linux后端服务程序之信号处理
查看>>
Padding也要小心
查看>>
linux异步IO编程实例分析
查看>>
小组开发环境搭建: apache+ftp+cvs+samba
查看>>
Learning C with gdb
查看>>
不可不知的json库
查看>>
JSON格式解析和libjson使用简介
查看>>
关于Json格式的理解
查看>>
c语言解析json数据
查看>>
json-c API总结
查看>>
freeBSD queue.c--定时器
查看>>
一个C实现的记日志的函数库
查看>>
C语言简单实现日志功能的的题目
查看>>
C 实现的 日志模块
查看>>
C语言实现简单的分级别写日志程序
查看>>