uboot第二階段啟動流程

2021-07-03 15:59:00 字數 2856 閱讀 5055

#include typedef unsigned long ulong;

typedef struct environment_s env_t;

typedef struct bd_info bi_dram[1];

} bd_t;

int main(int argc, const char *argv)

#include typedef	struct	global_data  gd_t;

int main()

typedef	struct environment_s  env_t;

typedef struct bd_info bi_dram[1];

} bd_t;

typedef struct global_data gd_t;

typedef int (init_fnc_t) (void);

register volatile gd_t *gd asm ("r8");

ulong monitor_flash_len;

init_fnc_t *init_sequence = ;

void start_armboot (void) }

//將堆區初始化為0

/* armboot_start is defined in the board-specific linker script */

mem_malloc_init (_armboot_start - config_sys_malloc_len,

config_sys_malloc_len);

puts ("nand: ");

//nand falsh 初始化

nand_init(); /* go init the nand */

/*讀取nand flash的環境變數,然後做crc校驗,如果錯誤則使用預設的環境變數*/

env_relocate ();

/*獲得ip 位址*/

gd->bd->bi_ip_addr = getenv_ipaddr ("ipaddr");

//初始化輸入、輸出裝置列表

stdio_init (); /* get the devices list going. */

jumptable_init ();

//初始化標準輸入、輸出、出錯

console_init_r (); /* fully init console as a device */

/* 使能irq異常 */

enable_interrupts ();

/* initialize from environment */

if ((s = getenv ("loadaddr")) != null)

//初始化網絡卡裝置

eth_initialize(gd->bd);

/* main_loop() can return to retry autoboot, if so just run it again. */

for (;;)

/* notreached - no way out of command loop except booting */

}void hang (void)

struct serial_device ;

static struct serial_device *serial_current = null;

struct serial_device *default_serial_console(void) __attribute__((weak, alias("__default_serial_console")));

int serial_init (void)

return serial_current->init ();

}struct serial_device *__default_serial_console (void)

int s5p_serial0_init(void)

void s5p_serial0_setbrg(void)

int s5p_serial0_getc(void)

int s5p_serial0_tstc(void)

void s5p_serial0_putc(const char c)

void s5p_serial0_puts(const char *s)

struct serial_device s5pc1xx_serial0_device = ;

/* * 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_dev(const int dev_index)

void serial_setbrg_dev(const int dev_index)

void main_loop (void)

static __inline__ int abortboot(int bootdelay)

} while ((bootdelay > 0) && (!abort))

udelay(10000);

} printf("\b\b\b%2d ", bootdelay);

} putc('\n');

return abort;

}

u boot第二階段分析(二)

接著上一章節的內容,繼續往下分析start armboot函式 1.for迴圈執行init sequence 如下 for init fnc ptr init sequence init fnc ptr init fnc ptr 分析 1 init fnc ptr二重指標指向了init sequen...

uboot啟動第二階段之x load分析

開發板 dm3730 虛擬機器 ubuntu 14.04 編譯器 arm none linux gnueabi x loader 這幾天小小的研究了一下linux的啟動機制 所裡這裡做個小小的總結吧 現在一般的晶元的linux啟動機制是這樣的 上電自執行romcode也就是在rom裡固化的 romc...

u boot第二階段分析(一)

一 start armboot函式簡介 start armboot函式是乙個長函式,在uboot lib arm board.c的第444 908行,其中也呼叫了其他函式,共同構成了u boot的第二階段。1.第二階段的主要工作 我們之前已經分析過了第一階段,主要是初始化了soc內部的一些部件和初始...