bootloader通常stage1和stage2两步骤,u-boot也不例外。
Stage1:依赖于CPU体系结构的代码(如设备初始化代码等)通常都放在这个程序段,且可以用汇编语言来实现;
stage2:通常用C语言来实现,这样可以实现复杂的功能,而且有更好的可读性和移植性。
<F:\FileRecv\Uboot中start.S源码的指令级的详尽解析+v1.6.pdf>
<F:\Clear_up_0.0.0_20180710_Don\Spec\计算机语言\GasARMRef.pdf>
<F:\Clear_up_0.0.0_20180710_Don\Spec\计算机语言\常用ARM指令集及汇编.pdf>
<F:\Clear_up_0.0.0_20180710_Don\Spec\计算机语言\u-boot向linux内核传递启动参数(详细).pdf>
"https://blog.csdn.net/dddd0216/article/details/51142333"
* _main execution sequence is:
*
* 1. Set up initial environment for calling board_init_f().
* This environment only provides a stack and a place to store
* the GD ('global data') structure, both located in some readily
* available RAM (SRAM, locked cache...). 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 from system RAM (DRAM, DDR...) As system RAM may not
* be available yet, , board_init_f() must use the current GD to
* store any data which must be passed on to later stages. These
* data include the relocation destination, the future stack, and
* the future GD location.
*
* (the following applies only to non-SPL builds)
*
* 3. Set up intermediate environment where the stack and GD are the
* ones allocated by 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 relocation destination computed by
* board_init_f().
*
* 5. Set up final environment for calling board_init_r(). This
* environment has BSS (initialized to 0), initialized non-const
* data (initialized to their intended value), and stack in system
* RAM. GD has retained values set by board_init_f(). Some CPUs
* have some work left to do at this point regarding memory, so
* call c_runtime_cpu_setup.
*
* 6. Branch to board_init_r().
include/configs/sp9820e_2h10.h
(UART0)
u-boot15\board\spreadtrum\sp9820e_2h10\u-boot.lds
ENTRY(_start)
arch/arm/cpu/armv7/start.S(??? _start)
reset
save_boot_params_ret
cpu_init_cp15
arch/arm/lib/crt0.S
_main
bl board_init_f
arch\arm\lib\board.c
for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr)
serial_init
console_init_f
display_banner
init_func_i2c
dram_init
debug("relocation Offset is: %08lx\n", gd->reloc_off);
arch\arm\lib\crt0.S
b relocate_code
arch\arm\lib\relocate.S(https://blog.csdn.net/skyflying2012/article/details/37660265)
bl relocate_vectors
arch\arm\lib\relocate.S
bl c_runtime_cpu_setup
arch\arm\cpu\armv7\start.S
ldr pc, =board_init_r
u-boot15\arch\arm\lib\board.c
enable_caches();
board_init();
board\spreadtrum\sp9820e_2h10\sp9820e_2h10.c
misc_init();
arch\arm\cpu\armv7\sharkle\misc.c
pmic_misc_init();
ANA_REG_GET(ANA_REG_GLB_POR_OFF_FLAG))
regulator_pmic_init();
sprd_get_chipid(NULL, NULL);
regulator_init();
power_on_voltage_init();
regulator_set_voltage("vddsim2",2800);(????)
dcdc_set_voltage
ldo_set_trimming
pmic_adc_Init();
sprd_small_scale_adc_efuse_get
sprd_bat_scale_adc_efuse_get
pin_init();
sprd_eic_init();
sprd_gpio_init();
sprd_pmu_lowpower_init();
enable_global_clocks();
serial_initialize();
serial_assign(default_serial_console()->name);
/*
* #define serial_initfunc(name) \
* void name(void) \
* __attribute__((weak, alias("serial_null")));
*
* serial_initfunc(sprd_uart_initialize);
*/
drivers\serial\serial_sprd.c
sprd_serial_drv
sprd_serial_init
sprd_apb_eb(CONSOLE_PORT);
port[1]
(UART1)
debug("Now running in RAM - U-Boot at: %08lx\n", dest_addr);
arch\arm\lib\board.c
mem_malloc_init (malloc_start, TOTAL_MALLOC_LEN);
nand_init();
drivers\mtd\nand_sprd\sprd_nand.c
_getGlobeResource(this);
nand_set_timing_config(this, &default_timing, SPRD_NAND_CLOCK);
__reset(this);
__readId(this);
ret = _param_init(this);
ret = __param_init_nandHWInfo(this);
SprdGetNandParam
__PrintNandInfo
__SprdCheckNancParam
nand_set_timing_config
_init_reg_state1(this);
_init_nfc_base(&nfc_base, this);
nfc_base_register(&nfc_base);
mmc_initialize(gd->bd);
should_load_env()
fdtdec_get_config_int(gd->fdt_blob, "load-environment", 1);
config_node = fdt_path_offset(blob, "/config");
set_default_env(NULL);
himport_r
while ((dp < data + size) && *dp)
fdt_fixup_memory_region(gd->fdt_blob, NULL);
common\loader\sprd_fdt_memory.c
stdio_init()
stdio_init_tables();
stdio_add_devices();
i2c_init_all();
i2c_set_bus_num
i2c_init_bus
I2C_ADAP->init(I2C_ADAP, speed, slaveaddr);
drivers\i2c\sprd_i2c_v2.c
sprd_i2c_init
drv_system_init ()
serial_stdio_init ();
console_init_r();
stdio_print_current_devices();
setenv(stdio_names[i], stdio_devices[i]->name);
print_pre_console_buffer
interrupt_init();
enable_interrupts();
board_late_init();
boot_pwr_check();
if (!power_button_pressed())
eic_value = sprd_eic_get(EIC_PBINT);
nand_ubi_dev_init();
ret = mtdparts_init();
common\sprd_common_rw.c
if (parse_mtdids(ids) != 0) {
if (mtd_device_validate(type, num, &size) != 0)
if (parse_mtdparts(parts) != 0)
current_save();
ret = ubi_init();
dev_num = _boot_ubi_attach_mtd(UBIPAC_PART);
ret = find_dev_and_part(mtdpart, &dev, &pnum, &part);
battery_init();
sprdchg_common_cfg();
sprdchg_2721_init
sprdbat_init
sprdbat_help_init();
sprdbat_get_vbatauxadc_caldata();
ret = read_adc_calibration_data((char *)adc_data, 48);
if (!sprd_get_adc_bat_cal(adc_data)) {
sprdfgu_init();
sprdfgu_cal_from_chip();
sprdfgu_cal_init
if (charger_connected()) {
if (!sprdbat_is_battery_connected()) {
sprdfgu_late_init();
board_keypad_init();
init_write_log();
main_loop();
(main)
common\main.c
void main_loop(void)
cli_init();(u-boot shell)
run_preboot_environment_command();
p = getenv("preboot");
s = bootdelay_process();
common\main.c
fdtdec_get_config_int
process_fdt_options(gd->fdt_blob);
fdtdec_get_config_int
autoboot_command(s);