zoukankan      html  css  js  c++  java
  • [RK3288][Android6.0] U-boot 启动流程小结【转】

    本文转载自:http://blog.csdn.net/kris_fei/article/details/52536093

    Platform: RK3288
    OS: Android 6.0
    Version: v2014.10


    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_ctr_parse_dt    //获取power相关参数
                                    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的做法了.                 

  • 相关阅读:
    iOS 字典实现原理
    IOS中armv7,armv7s,arm64以及i386和x86_64讲解
    SDWebImage源码解析
    iOS Runtime的消息转发机制
    二叉树的遍历
    LINUX 常用命令 ps 详解
    LINUX 文件权限详解
    LINUX查看内存使用情况 free
    PHP isset() empty() isnull() 的区别
    PHP unset()函数销毁变量 但没有实现释放内存
  • 原文地址:https://www.cnblogs.com/zzb-Dream-90Time/p/7655740.html
Copyright © 2011-2022 走看看