u boot原始碼分析 啟動第二階段002

2021-04-19 18:43:35 字數 3729 閱讀 5786

我們先來看初始化函式表:

init_sequence

lib_arm/board.c:

typedef int (init_fnc_t) (void);

init_fnc_t *init_sequence = ;

這些初始化函式會依次執行,我們乙個個的來看

arm920t/cpu.c:

int cpu_init (void)

對於smdk2410來說這個巨集config_use_irq沒定義,實際上就是把irq_stack_start, fiq_stack_start指到ram中的irq stuff區域。

在看board_init:

board/smdk2410.c:

/*

* miscellaneous platform dependent initialisations

*/

int board_init (void)

這個函式是和特定板子相關的,因此一般都是自己新增的,使能cache很簡單,只要把協處理器15的相關位開啟就行了,**就不列出來了,可以參考datasheet。

接下來該看初始化函式: interrupt_init,我們的cpu是arm920t系列的s3c2410

cpu/arm920t/s3c24x0:

int interrupt_init (void)

/* load value for 10 ms timeout */

lastdec = timers->tcntb4 = timer_load_val;

/* auto load, manual update of timer 4 */

timers->tcon = (timers->tcon & ~0x0700000) | 0x600000;

/* auto load, start timer 4 */

timers->tcon = (timers->tcon & ~0x0700000) | 0x500000;

timestamp = 0;

return (0);

} 對著datasheet來看這個函式, 實際上這個函式使用timer 4來作為系統clock, 即時鐘滴答,10ms一次,到點就產生乙個中斷,但由於此時中斷還沒開啟所以這個中斷不會響應。

接著看env_init: 由於我們在inculde/configs/smdk2410.h下定義了cfg_env_is_in_flash,因此該函式位於common/env_flash.c下

common/env_flash.c:

intenv_init(void)

#ifdef config_omap2420h4

bad_flash:

#endif

gd->env_addr= (ulong)&default_environment[0];

gd->env_valid = 0;

return (0);

} 這個函式主要是在gd裡儲存環境變數的存放位址。一般使用預設的環境變數值即default_environment陣列,

uchar default_environment =

可見環境變數以如下的方式存放在陣列中

name=value

並且以」/0」結束, 而類似config_bootargs的巨集都定義在板子自己的配置檔案中即smdk2410.h裡。

接下來看init_baudrate

lib_arm/board.c:

static int init_baudrate (void)

該函式從上面剛初始化好的環境變數列表裡找波特率值,如果沒有就賦初始值為config_baudrate。

繼續往下看serial_init:

cpu/arm920t/s3c24x0:

/*

* initialise the serial port with the given baudrate. the settings

* are always 8 data bits, no parity, 1 stop bit, no start bits.

* */

int serial_init (void)

cpu/arm920t/s3c24x0:

void serial_setbrg (void)

上面這個函式對著datasheet看,無非是設定波特率,起始位,檢驗中斷型別等等。

接著看初始化函式:console_init_f

common/console.c:

/* called before relocation - use serial functions */

int console_init_f (void)

該函式初始化了幾個控制台相關的標記。

接著看display_banner:

lib_arm/board.c:

static int display_banner (void)

這個函式就是在控制台上列印一些系統資訊。

接著看dram_init:

board/smdk2410/smdk2410.c:

int dram_init (void)

ram的起始位址和大小都是和特定板子相關的,因此這兩個巨集都在smdk2410.h中根據實際情況定義的,

再看display_dram_config

lib_arm/board.c:/*

* warning: this code looks "cleaner" than the powerpc version, but

* has the disadvantage that you either get nothing, or everything.

* on powerpc, you might see "dram: " before the system hangs - which

* gives a ****** yet clear indication which part of the

* initialization if failing.

*/

static int display_dram_config (void)

return (0);

} 呵呵僅僅是列印系統ram的資訊。

接著說初始化函式, 對於smdk2410來說不存在checkboard這個函式,

這樣整個初始化函式表的函式都看完了,總結一下主要做了如下過程:

1.cpu, borad, interrupt

的初始化,包括cache等,這些都於特定板子的配置有關。

2.環境變數的初始化,

3.串列埠,控制台,ram的初始化,

4.在控制台上實時的顯示系統配置等相關引數。

最後需要說明的是,大部分的配置引數都是預先在include/configs/board_name.h下定義的,因此如果我們要移植我們自己的板子的話,這個檔案必不可少,它描述了我們板子的配置情況如cpu型號,ram大小等。

u boot原始碼分析 啟動第二階段002

我們先來看初始化函式表 init sequence lib arm board.c typedef int init fnc t void init fnc t init sequence 這些初始化函式會依次執行,我們乙個個的來看 arm920t cpu.c int cpu init void 對...

uboot原始碼分析2 啟動第二階段

注意 board init中除了網絡卡的初始化之外,剩下的2行用來初始化ddr。這裡的初始化ddr和彙編階段lowlevel init中初始化ddr是不同的。當時是硬體的初始化,目的是讓ddr可以開始工作。現在是軟體結構中一些ddr相關的屬性配置 位址設定的初始化,是純軟體層面的。注 這個函式只是對...

u boot第二階段原始碼分析

typedef int init fnc t void init fnc t init sequence void start armboot void 理解 1 init fnc t宣告為函式型別,這個函式型別的引數為空,函式返回值為int整型。2 init fnc t init sequence...