VS-RK3288嵌入式板卡 U-boot 啟動流程小結
bl board_init_f -> crt0.S
initcall_run_list(init_sequence_f) -> board_f.c
arch_cpu_init ->
rk_get_chiptype //獲取chip type (rk31xx, rk32xx等)
timer_init
env_init
init_baud_rate
serial_init
print_cpuinfo //dump cpu/pll info
dram_init //獲取size以及end address
setup_dram_config ->
dram_init_banksize
show_dram_config
ldr pc, =board_init_r -> crt0.S
board_init_r -> board_r.c
init_sequence_r //調用init_sequence_r中的各個函數。
board_init rk32xx.c //設置machine type以及boot param起始地址,kernel要用到。
initr_serial -> board_r.c //初始化串口。
serial_initialize
initr_rk_storage -> //初始化storage
board_storage_init -> rk32xx.c
StorageInit -> storage.c //初始化eMMC.
memFunTab[memdev]->Init //調用emmcFunOp的SdmmcInit()
SdmmcInit sdmmcBoot.c 這里還會根據sd里存的信息來區分是要boot還是update.
StorageReadFlashInfo ->
gpMemFun->ReadInfo ->
SdmmcReadFlashInfo sdmmcBoot.c
initr_env //初始化u-boot中的環境變量
stdio_add_devices -> //不做什么。
console_init_r //作為device來管理。
board_late_init -> rk32xx.c
board_init_adjust_env //初始化bootdelay, bootcmd這些env.
load_disk_partitions ->
GetParam
ParseParam -> //解析parameter文件
ParseLine -> //獲取各個參數選項,如machine model, cmdline等。
parse_cmdline ->
mtdpart_parse //獲取分區表信息
rkimage_prepare_fdt rkimage.c //從boot或者resource image讀取fdt地址,resource會覆蓋boot.img的fdt.
key_init //各種key init
pmic_init -> power_rockchip.c //多個型號pmic的init,如rk808, rk818,一旦匹配到成功的就不再嘗試其他的了。
pmic_act8846_init //sdk board用的是此IC。
pmic_rk808_init -> pmic_rk808.c //后續項目要替換成這顆。
rk808_parse_dt ->
fdt_device_is_available //status為disabled就沒必要解析了。
fdt_get_i2c_info //獲取i2c address, number,
rk808_i2c_probe //detect pmic.
fdt_get_regulator_node //獲取pmic regulator信息
fdt_regulator_match //獲取regulator初始化數據
rk808_set_regulator_init //設置各regulator初始化電壓
fdtdec_decode_gpios //獲取gpio內容, pwr_hold
charger_init
i2c_init
pmic_rk818_init
pwm_regulator_init -> //pwm init.
pwm_regulator_parse_dt
fg_init //gauge init.
SecureBootCheck
board_fbt_preboot ->
fbt_fastboot_init
board_fbt_get_reboot_type //讀取reboot flag
board_fbt_key_pressed //再次檢查key有沒有按下來決定進入哪種模式。
board_fbt_low_power_check //電量檢查,過低就充電,如果失敗就直接關機.
fdtdec_get_int //讀取u-boot是否顯示logo值
drv_lcd_init -> lcd.c
lcd_init ->
lcd_ctrl_init -> rockchip_fb.c
rk_fb_parse_dt -> //從dts中解析出lcd的參數。
rk_fb_pwr_enable //上電
rkclk_lcdc_clk_set //設置clock
rk_lcdc_init //lcdc控制器初始化
rk_lcdc_load_screen //根據不同的接口設置不同的配置到控制器
lcd_clear ->
lcd_logo -> //show logo
bitmap_plot ->
rk_bitmap_from_resource ->
show_resource_image -> //name是logo.bmp
get_content ->
get_base_offset //先從resoure分區獲取,失敗的話從boot分區獲取.
lcd_display_bitmap_center
board_fbt_low_power_off //如果是低電量而且沒在充電,那就顯示fail的logo,1s后關機.
lcd_standby
rk_backlight_ctrl
board_fbt_run_recovery //進recovery的情況
board_fbt_run_recovery_wipe_data //wipe data的情況,也是進recovery
board_fbt_request_start_fastboot //進fastboot mode
rkloader_run_misc_cmd //其他情況
run_main_loop ->
main_loop //啟動kernel
do_bootrk -> cmd_bootrk.c
rk_load_image_from_storage ->
rkimage_load_image //先嘗試從boot.img讀取內核以及ramdisk
StorageReadLba //如果boot.img沒有內核則從kernel中讀取
rkimage_load_fdt //從resource分區中讀取fdt.
rk_load_kernel_logo -> //加載kernel logo
get_content //圖片存在resource 分區
rk_commandline_setenv
do_bootm_linux //加載kernel,這里就是標准u-boot的做法了.
轉載注明:http://bbs.videostrong.com/