本文以arm926ejs为例,分析了整个uboot代码的启动过程。
/cpu/arm926ejs/start.S //设置堆栈,申请中断,开辟内存空间
-> _armboot_start()
/lib_arm/board.c //flash,网卡,内存,波特率,显示等功能初始化
-> cpu_init() //初始化所依赖的cpu
/cpu/arm926ejs/cpu.c
-> board_init()
/board/atmel/at91sam9261ek/at91sam9261ek.c //ARM底层寄存器设置(lcd、端口、网卡、ram、串口、spi总线)
-> console_init_f()
/common/console.c //串口终端控制(输入、输出方式、指令处理)
-> interrupt_init()
/cup/arm926ejs/at91sam926x/interrupts.c //中断(9261未定义)
-> reset_timer_masked()
/cup/arm926ejs/at91sam926x/interrupts.c
-> env_init()
/common/env_dataflash.c
<- 取决于env保存位置(9261:#define CFG_ENV_IS_IN_DATAFLASH 1)
-> init_baudrate()
/lib_arm/board.c
-> simple_strtoul() //解析字符串中的8,10,16进制数
/lib_generic/vsprintf.c //解析输入的字符串
-> serial_init()
/cpu/arm926ejs/at91sam926x/serial.c //串口
-> console_init_f()
/common/console.c //
-> display_banner()
/lib_arm/board.c
-> (X) print_cpuinfo()
/cpu/arm926ejs/cupinfo.c //cpu information
-> (X) checkboard()
-> dram_init() //RAM初始化
/board/atmel/at91sam9261ek/at91sam9261ek.c
-> display_dram_config()
/lib_arm/board.c
-> (X) flash_init()
-> (X) display_flash_config()
/lib_arm/board.c
-> lcd_setmem()
/common/lcd.c //设置对应的板级LCD的驱动
-> mem_malloc_init() //开辟内存空间
/lib_arm/board.c
-> puts()
/common/console.c
-> nand_init()
/drivers/nand/nand.c
-> nand_init_chip()
/drivers/nand/nand.c
-> board_nand_init()
/board/atmel/at91sam9261ek/at91sam9261ek.c
-> nand_scan()
/drivers/nand/nand_base.c
<- 获取nand的参数,根据/include/linux/mtd/nand_ids.h识别(CFG_NAND_LEGACY模式)
<- 获取nand的参数,根据/drivers/nand/nand_ids.c识别(非CFG_NAND_LEGACY模式)
-> AT91F_DataflashInit()
/drivers/dataflash.c
-> AT91F_SpiInit()
/cup/arm926ejs/at91sam926x/spi.c
-> AT91F_DataflashProbe()
/drivers/at45.c //设置DataFlash
-> dataflash_print_info()
/drivers/dataflash.c
-> env_relocate()
/common/env_common.c
-> getenv_IPaddr()
-> devices_init()
/common/devices.c
-> drv_lcd_init()
/commom/lcd.c
-> lcd_init()
/commom/lcd.c
-> lcd_ctrl_init()
/cup/arm926ejs/at91sam926x/lcd.c
-> lcd_clear()
/commom/lcd.c
-> lcd_initcolregs()
-> lcd_setcolreg()
/cup/arm926ejs/at91sam926x/lcd.c
-> lcd_enable()
/cup/arm926ejs/at91sam926x/lcd.c
-> device_register()
/common/devices.c
-> drv_system_init()
/common/devices.c
<- 主要是初始化了serial,如果不用软件FIFO,则将/cpu/arm926ejs/at91sam926x/serial.c中的方法引入
-> device_register()
/common/devices.c
-> jumptable_init()
/common/exports.c
-> console_init_r()
/common/console.c
-> board_late_init()
/board/atmel/at91sam9261ek/at91sam9261ek.c
-> at91sam9261ek_dm9000_init()
/board/atmel/at91sam9261ek/at91sam9261ek.c
-> eth_init()
/drivers/dm9000x.c
/cpu/arm926ejs/at91sam926x/ether.c
-> eth_initialize()
/net/eth.c
-> main_loop()
/common/main.c
-> getenv()
/common/cmd_nvedit.c
-> run_command()
/common/main.c
-> readline()
/common/main.c
-> run_command()
/common/main.c
-> process_macros()
/common/main.c
-> parse_line()
/common/main.c
-> find_cmd()
/common/command.c