1. 程式人生 > >Omap138開發板下以uboot2012.04.01為例分析uboot執行(三)

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'.

 */