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

Omap138内存分配总图
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

board_init_f函数分析

该函数位于/uboot/arch/arm/lib目录下:

1.分析该函数在内存中的位置

起始位置:c1080000

调用位置:c1081258

2.在da850sdi.h中,它的与系统相关的配置是以CONFIG_SYS开头的,与板子相关的配置是以CONFIG开头的。

3.#define CONFIG_SYS_SDRAM_BASE 0xc0000000



gd是一个全局变量,它存储在寄存器r8中,

gd = (gd_t *)((CONFIG_SYS_INIT_SP_ADDR) & ~0x07);

->

#define CONFIG_SYS_INIT_SP_ADDR         (CONFIG_SYS_SDRAM_BASE
+ 0x1000 - GENERATED_GBL_DATA_SIZE)           /*Fix this */

->

#define GENERAGTED_GBL_DATA_SIZE(128)    /*(sizeof(struct global_data)+15)&~15*/

->

0xc0000000+0x1000-0x0080=0xc0000F80


4.uboot链接镜像结构分析

   .text代码段

   __image_copy_end:代码的镜像部分结束了

   *(.dynsym):放了动态符号的内容,加载一些库,elf的时候用

   *(./mmutable):动态内存管理的单元都是以4K为单元对齐的

   *(.bss)段就是可变换的数据

在这里插入图片描述
在这里插入图片描述

  1. 初始化函数的运行(位于/uboot/arch/arm/lib/board.c)

init_sequence中存放了初始化函数的指针



(1)     
arch_cpu_init():由于在da850sdi.h中,CONFIG_ARCH_CPU_INIT没有定义,所以该函数不运行。类似的board_early_init_f(), fdtdec_check_fdt()也不运行。

(2)     
timer_init():(位于:\uboot\arch\arm\cpu\arm926ejs\davinci)用来初始化时钟,使用的模式如下:

/*using timer34 in unchained 32-bit mode,full speed */

(3)     
 env_init():(位于:\uboot\common)  /* 初始化环境,使用默认的环境*/

使用default_environment[0].

里面包括:CONFIG_BOOTARGS,CONFIG_ETHADDR、CONFIG_SERVERIP、CONFIG_NETMASK等变量。 

(4)     
init_baudrate();(位于/uboot/arch/arm/lib/board.c)

->getenv_ulong("baudrate",10, CONFIG_BAUDRATE);

/*取名称为“baudrate”的环境变量,如果取不到,就设置为以十进制表示的CONFIG_BAUDRATE的值。*/

这个定义在default_environment[ ]中找不到,但是在da850sdi.h中可以找到CONFIG_BAUDRATE的定义。

#define CONFIG_BAUDRATE                115200

(5)     
serial_init()和console_init_f()这两个初始化函数完成之后,就可以通过串口和uboot之间进行命令的交互了。

serial_init():(位于/uboot/common)

->

get_current()->init();

->

__weak struct serial_device*default_serial_console(void)

__weak的意思是如果在别的地方已经定义了,那么此处的定义失效。

->

INIT_ESERIAL_STRUCTURE(port, name)

->{

   eserial0,\

   eserial0_init,\

   NULL,\

   eserial0__setbrg,\

   eserial0__getc,\

   eserial0__tstc,\

   eserial0__putc,\

          eserial0__puts,
}

console_init_f():(位于\uboot\common)用于显示终端的初始化

(6)display_banner();用来打印版本号

(7)dram_init():(位于\uboot\arch\arm\cpu\arm926ejs\davinci)

确定可用的DDR大小为512M。

->get_ram_size()

                            /*

 * Check memory range for
valid RAM. A simple memory test determines

 * the actually available RAM
size between addresses `base' and

 * `base + maxsize'.

 */


猜你喜欢

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