U-BOOT启动流程分析

时间:2022-08-21 16:46:33

Uboot

Include\configs\am335x_evm.h

存储空间关键宏定义

CONFIG_SPL_TEXT_BASE                0x402F0400

CONFIG_SPL_MAX_SIZE                  (101 * 1024)                   

CONFIG_SPL_BSS_START_ADDR   0x80000000

CONFIG_SPL_BSS_MAX_SIZE          0x80000           /* 512 KB */

 

CONFIG_SPL_STACK

CONFIG_SYS_INIT_SP_ADDR

Arch\arm\cpu\armv7\am33xx\u-boot-spl.lds

链接脚本

MEMORY { .sram : ORIGIN =CONFIG_SPL_TEXT_BASE,\

                                LENGTH= CONFIG_SPL_MAX_SIZE }

MEMORY { .sdram : ORIGIN =CONFIG_SPL_BSS_START_ADDR, \

                                LENGTH= CONFIG_SPL_BSS_MAX_SIZE }

                Text>.sram

                                *(.vectors)

                                arch/arm/cpu/armv7/start.o

                                *(.text*)

                Rodata>.sram

                                *(SORT_BY_ALIGNMENT(.rodata*))

                Data>.sram

                                *(SORT_BY_ALIGNMENT(.data*))

                u_boot_list>.sram

                                KEEP(*(SORT(.u_boot_list*)))

                __image_copy_end= .

                End>.sram

                Bss> sdram

                                __bss_start= .;

                                *(.bss*)

                                __bss_end= .;

流程

reset(arch\arm\cpu\armv7\start.S)

禁止中断,设置CPU为SVC32模式

禁用MMU

设置中断vector    (_start )                                 arch\arm\lib\vector.S定义的

cpu_init_cp15                                                       TLB/MMU/Cache设置

cpu_init_crit                                                          pll,mux,memory设置

                lowlevel_init                                            spl(arch\arm\cpu\armv7\lowlevel_init.S???)      

                 * Setup a temporary stack.Global data is not available yet.

                 * Set up global data for boardsthat still need it. This will be removed soon.

                                Gdata在哪里定义的?

                *s_init  do only the absolute bare minimumto get started                         

                                s_init      (arch\arm\ cpu\armv7\am33xx\board.c)       serial port?

                                                rtc_only                                    rtc寄存器(0x44E3E000)操作

                                                                sdram_init

                                                watchdog_disable                   禁止watchdog(0x44E35000)

                                                set_uart_mux_conf                串口uart引脚初始化

                                                setup_clocks_for_console    cmwkup寄存器操作(uart时钟使能)

_main                                (arch\arm\lib\crt0.S)

* 1. Set upinitial environment for calling board_init_f().This environment only providesa stack and a place tostore the GD ('global data')structure, both located in some readily available RAM (SRAM, lockedcache...). In this context, VARIABLE global data, initialized or not (BSS), are UNAVAILABLE; only  CONSTANT initialized data are available.

 * 2. Call board_init_f(). This function prepares the hardware for  execution fromsystem RAM (DRAM, DDR...) As system RAM may not  be available yet, , board_init_f() must usethe current GD to store any data which must be passed on to later stages. Thesedata include the relocation destination, the future stack, and  the future GD location.

board_init_f                                                     spl        (spl\arch\arm\lib\spl.c)

uboot (arch\arm\ cpu\armv7\am33xx\board.c)

                prcm_init                                 时钟初始化

                enable_basic_clocks();

                scale_vcores();

                setup_dplls();

set_mux_conf_regs                引脚初始化

                enable_board_pin_mux(header);

sdram_init                                根据板类型初始化ddr

 * (the following applies only tonon-SPL builds)

* 3. Set up intermediate environment where the stack and GD are the ones allocatedby board_init_f() in system RAM, but BSS and initialized non-const data are still not available.

 * 4. Call relocate_code().This function relocates U-Boot from its current location into the relocationdestination computed by board_init_f().

relocate_code                                                (arch\arm\lib\relocate.S)

relocate_vectors

* 5. Set up final environment for callingboard_init_r(). This environment has BSS (initialized to 0), initializednon-const data (initialized to their intended value), and stack in system  RAM. GD has retained values set byboard_init_f(). Some CPUs have some work left to do at this point regardingmemory, so  call c_runtime_cpu_setup.

c_runtime_cpu_setup                                   (arch\arm\cpu\armv7\start.S)

                spl_relocate_stack_gd                                  (spl\common\spl\spl.c)

 * 6. Branch to board_init_r().

                board_init_r   spl                                             (spl\common\spl\spl.c)

                                spl_board_init            (arch\arm\cpu\armv7\omap-common\boot-common.c)

                                                save_omap_boot_params

preloader_console_init

am33xx_spl_board_init

                                spl_boot_device         (arch\arm\cpu\armv7\omap-common\boot-common.c)

                board_init_r        uboot                                  (common\board_r.o)

                                initcall_run_list(init_sequence_r)

 

Uboot启动打印

//preloader_console_init

U-Boot SPL 2015.01-00001-gb2412df (Jan 29 2015 - 15:01:06)

 

//board_init_f

//display_banner

U-Boot 2015.01-00001-gb2412df (Jan 29 2015 - 15:01:06),Build: jenkins-github_Bootloader-Builder-105

 

       Watchdogenabled(init_func_watchdog_init         common/board_f.c)

//init_func_i2c

I2C:   ready

//display_dram_config

DRAM:  512 MiB

//board_init_r

MMC:   OMAP SD/MMC: 0,OMAP SD/MMC: 1

//set_default_env

Using default environment

 

Net:   <ethaddr>not set. Validating first E-fuse MAC

cpsw

Hit any key to stop autoboot:  0

U-Boot#