OK6410 uboot1.1.16的board.c相關函數分析(init_sequence)

init_fnc_t *init_sequence[] = {
 cpu_init,  /* basic cpu dependent setup */
 board_init,  /* basic board dependent setup */
 interrupt_init,  /* set up exceptions */
 env_init,  /* initialize environment */
 init_baudrate,  /* initialze baudrate settings */
 serial_init,  /* serial communications setup */
 console_init_f,  /* stage 1 init of console */
 display_banner,  /* say that we are here */
#if defined(CONFIG_DISPLAY_CPUINFO)
 print_cpuinfo,  /* display cpu info (and speed) */
#endif
#if defined(CONFIG_DISPLAY_BOARDINFO)
 checkboard,  /* display board info */
#endif
 dram_init,  /* configure available RAM banks */
 display_dram_config,
 NULL,
};

init_fnc_t類型如下定義

typedef int (init_fnc_t) (void);

如何調用

在接下來的start_armboot函數中

 for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
  if ((*init_fnc_ptr)() != 0) {
   hang ();
  }
 }

順序調用該類型的各個函數依次初始化

具體調用,依靠make xxx_config時指定體系結構和處理器類型, 編譯時就去指定的目錄下去編譯。

cpu_init()定義在uboot1.1.16/cpu/s3c64xx/cpu.c中,定義中斷棧和快速中斷棧空間的地址

board_init定義在uboot1.1.16/board/samsung/smdk6410/smdk6410.c中,cs8900相關初始化以及全局變量gd中bd的兩個成員初始化

interrupt_init定義在uboot1.1.16/cpu/s3c64xx/interupts.c中,PWM Timer的相關初始化

env_init環境初始化,目前不知道在哪裏定義

init_baudrate初始化波特率,並寫進gd->bd->bi_baudrate中,定義在uboot1.1.16/lib.arm/board.c函數中

serial_init串口初始化,定義uboot1.1.16/cpu/s3c64xx/serial.c

console_init_f重定位之前調用,初始化gd相關成員

display_banner,全是打印信息,打印uboot相關變量,定義在uboot1.1.16/lib.arm/board.c函數中

print_cpuinfo,打印CPU相關信息,uboot1.1.16/cpu/s3c64xx/speed.c

checkboard,打印開發板信息,Board:   SMDK6410,定義uboot1.1.16/board/samsung/smdk6410/smdk6410.c

dram_init,DRAM的初始化,這裏只是對gd中的 bi_dram結構中的兩個成員賦值,也即BANK的起始地址和大小,定義uboot1.1.16/board/samsung/smdk6410/smdk6410.c

display_dram_config,打印DRAM的相關信息

NULL,表示數組結束

硬件相關的初始化函數到此結束

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章