RK3288 uboot啟動流程


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/             


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM