1. 程式人生 > >[RK3399][Android7.1] Uboot啟動過程小結

[RK3399][Android7.1] Uboot啟動過程小結

整個過程和rk3288平臺的uboot(v2014.10)載入流程類似,可參考
[RK3288][Android6.0] U-boot 啟動流程小結

blboard_init_f -> crt0_64.S //初始化環境安裝
  board_init_f -> board_f.c
    initcall_run_list -> //依次執行init_sequence_f陣列中的函式
      setup_fdt //如果有的話,允許環境變數fdtcontroladdr地址中的dts覆蓋系統的那份
      arch_cpu_init  -> cpu.c
        rkclk_set_pll //設定pll
        rk_get_chiptype //獲取chip type,當前是CONFIG_RK3399
      env_init env_rk.c //環境變數初始化, 使用那個env_rk.c的編譯由CONFIG_ENV_IS_IN_RK_STORAGE控制開啟
      init_baud_rate//獲取預設波特率設定, 在rk3399_deconfig中已經定義了為1500000
      serial_init //初始化當前使用的串列埠
      print_cpuinfo //列印cpu以及版本還有clock資訊
      show_board_info ->
        checkboard  rk33xx.c //列印board資訊
      dram_init ->
        get_ram_size //獲取ram size,程式碼中先固定CONFIG_SYS_SDRAM_SIZE為128M
      reserve_lcd //預留lcd記憶體空間,其他模組預留的形式都是以reserve_xxx開頭的
      setup_dram_config //ram配置資訊放到全域性變數中管理
      show_dram_config //列印ddr資訊
bboard_init_r -> crt0_64.S //後期環境配置
  board_init_r -> board_r.S
    initcall_run_list ->  //依次執行init_sequence_r陣列中的函式
      board_init  -> rk33xx.c //設定machine type以及boot params地址
      initr_serial //選擇當前使用的串列埠終端
 arch_early_init_r //中斷,dma初始化
 initr_rk_storage ->
   board_storage_init ->
     StorageInit ->
       memFunTab[memdev]->Init //根據當前flash type來選擇其中一個初始化, 支援sd,emmc. ums和nand的巨集在rk33plat.h中被undef.
         SdhciInit sdhciBoot.c //讀取儲存資訊及大小
 initr_env //環境變數初始化
 board_late_init -> rk33xx.c
   board_init_adjust_env //設定bootdelay,bootcmd這幾個環境變數
   load_disk_partitions -> //載入eMMC中的分割槽資訊
     GetParam ->
       StorageReadLba ->
         gpMemFun->ReadLba ->
           SdhciBootReadLBA
     ParseParam
   rkimage_prepare_fdt //優先從boot分割槽去載入fdt,如果找不到,就從resource分割槽載入
   key_init //按鍵初始化,包括rockusb, fastboot, recovery這幾個主要key的初始化
   pmic_init -> power_rockchip.c //板子用的是rk808
     pmic_rk808_init
   pwm_regulator_init //初始化pwm相關的regulator,這裡用的是另一路pwm,用於控制DCDC,和backlight無關。
   fg_init  //fuel gauge初始化
   board_fbt_preboot -> fastboot.c 即使不進入fastboot模式,有些變數也是需要配置的
     fbt_fastboot_init //判斷當前device是否處於locked狀態
     board_fbt_get_reboot_type //獲取當前reboot type, fastboot, rockusb, normal這些
     board_fbt_low_power_check //低電量時處於充電狀態時要充電,否則直接關機
     rockchip_display_init //display部分初始化
     board_fbt_low_power_off //如果處於低電量而且沒在充電時,降低背光並且顯示警告logo,1S後關機
     rockchip_show_logo -> //優先顯示uboot logo,沒有則顯示kernel logo。
       load_bmp_logo
run_main_loop ->
  main_loop ->
    bootdelay_process //延時處理,並且獲取bootcmd引數用於後面開機進入kernel處理
    autoboot_command ->
      do_bootrk  //進入kernel