MTK (android 开机)Android开机流程解析

//平台相关早期初始化,如获取板级信息,初始化时钟、中断、定时器等
/*
      平台硬件早期初始化,包括irq、timer,wdt,uart,led,pmic(电压管理芯片),i2c,gpio等,
       初始化平台硬件,建立lk基本运行环境。
    */

1.  void platform_early_init(void)

{

    /* initialize the uart */
    uart_init_early();
    platform_init_interrupts();
    platform_early_init_timer();
    mt_gpio_set_default();


     mtk_wdt_init();
    #ifdef LK_PROFILING
    dprintf(INFO,"[PROFILE] ------- WDT Init  takes %d ms -------- \n", (int)get_timer(time_wdt_early_init));


    g_fb_size = mt_disp_get_vram_size();
    g_fb_base = memory_size() - g_fb_size + DRAM_PHY_ADDR;

    dprintf(INFO, "FB base = 0x%x, FB size = %d\n", g_fb_base, g_fb_size);



    //FIXME: Disable for MT6582 FPGA Ealry Porting
    #ifndef DISABLE_DISPLAY_IN_LK_FOR_82_BRINGUP
    if (!(lcm_params->type==LCM_TYPE_DSI && lcm_params->dsi.mode ==CMD_MODE))
        {printf("tony:will  mt_disp_init...000\n");
        mt_disp_init((void *)g_fb_base);
        }
     #endif



}



/*
包括nand/emmc,显现相关驱动,启动模式选择,加载logo资源 检测是否DA模式,
检测分区中是否有KE信息,如果就KE信息,就从分区load 到DRAM, 点亮背光,
显示logo,禁止I/D-cache和MMU,跳转到DA(??),配置二级cache的size 获取bat电压,
判断是否低电量是否显示充电logo等
*/

2.void platform_init(void)
{

    #ifdef MTK_EMMC_SUPPORT
    mmc_legacy_init(1);
    #else
    #ifndef MACH_FPGA
    nand_init();
    nand_driver_test();



      #ifdef MTK_KERNEL_POWER_OFF_CHARGING  ///关机充电模式
       if((g_boot_arg->boot_reason == BR_USB) && (upmu_is_chr_det() == KAL_FALSE))
       {
        printf("[%s] Unplugged Charger/Usb between Pre-loader and Uboot in Kernel Charging Mode, Power Off \n",  

       __func__);
        mt6575_power_off();
       }
       #endif


        env_init();
        print_env();





       mboot_common_load_logo((unsigned long)mt_get_logo_db_addr(), "logo");///加载logo

       mt_disp_fill_rect(0, 0, CFG_DISPLAY_WIDTH, CFG_DISPLAY_HEIGHT, 0x0);//0->f///显示背景图片
       mt_disp_power(TRUE);
       mt_disp_update(0, 0, CFG_DISPLAY_WIDTH, CFG_DISPLAY_HEIGHT);
       mt_disp_wait_idle();
       mt_disp_update(0, 0, CFG_DISPLAY_WIDTH, CFG_DISPLAY_HEIGHT);
       mt_disp_wait_idle();
       mt_disp_power(1);           //power on display related modules 

       mt65xx_backlight_on();    ///delete by tony    /打开背光


       boot_mode_select();//选择启动模式!!!--很重要



       if (g_boot_arg->boot_mode == DOWNLOAD_BOOT)///若是DOWNLOAD_BOOT模式

     {
    printf("[LK] boot mode is DOWNLOAD_BOOT\n");

      #ifdef MTK_SECURITY_SW_SUPPORT
       /* verify da before jumping to da*/
       if (sec_usbdl_enabled()) {
        u8  *da_addr = (u8 *)g_boot_arg->da_info.addr;
        u32 da_len   = g_boot_arg->da_info.len;
        u32 sig_len  = g_boot_arg->da_info.sig_len;
        u8  *sig_addr = (unsigned char *)da_addr + (da_len - sig_len);

        if (da_len == 0 || sig_len == 0) {
        printf("[LK] da argument is invalid\n");
        printf("da_addr = 0x%x\n", da_addr);
        printf("da_len  = 0x%x\n", da_len);
        printf("sig_len = 0x%x\n", sig_len);
        }

        if (sec_usbdl_verify_da(da_addr, (da_len - sig_len), sig_addr, sig_len)) {
        /* da verify fail */
                video_printf(" => Not authenticated tool, download stop...\n");
        while(1); /* fix me, should not be infinite loop in lk */
        }
    }
    else
#endif
    {
        printf(" DA verification disabled...\n");
    }
        mt_disp_show_boot_logo();
        video_printf(" => Downloading...\n");
        mt65xx_backlight_on();
        mtk_wdt_disable();//Disable wdt before jump to DA
        platform_uninit();
#ifdef HAVE_CACHE_PL310
        l2_disable();
#endif

#ifdef ENABLE_L2_SHARING
        config_shared_SRAM_size();
#endif
        arch_disable_cache(UCACHE);
        arch_disable_mmu();
        jump_da(g_boot_arg->da_info.addr, g_boot_arg->da_info.arg1, g_boot_arg->da_info.arg2);
    }

}

   


       mt65xx_bat_init();  //电池初始化




       if(kernel_charging_boot() == 1)///若是DOWNLOAD_BOOT模式

       {
#ifdef MTK_BATLOWV_NO_PANEL_ON_EARLY
        CHARGER_TYPE CHR_Type_num = CHARGER_UNKNOWN;
        charging_get_charger_type(&CHR_Type_num);
        if ((g_boot_mode != LOW_POWER_OFF_CHARGING_BOOT) ||
        ((CHR_Type_num != STANDARD_HOST) && (CHR_Type_num != NONSTANDARD_CHARGER)))
        {
            dprintf(INFO, "[PROFILE] ------- g_boot_mode = %d -------- \n", g_boot_mode);
#endif
        mt_disp_power(TRUE);
        mt_disp_show_low_battery();
        mt_disp_wait_idle();
        mt65xx_leds_brightness_set(6, 110);
#ifdef MTK_BATLOWV_NO_PANEL_ON_EARLY
        }
#endif
    }




           if(kernel_charging_boot() == 1)   ///若是关机充电模式
    {
#ifdef MTK_BATLOWV_NO_PANEL_ON_EARLY
        CHARGER_TYPE CHR_Type_num = CHARGER_UNKNOWN;
        charging_get_charger_type(&CHR_Type_num);
        if ((g_boot_mode != LOW_POWER_OFF_CHARGING_BOOT) ||
        ((CHR_Type_num != STANDARD_HOST) && (CHR_Type_num != NONSTANDARD_CHARGER)))
        {
            dprintf(INFO, "[PROFILE] ------- g_boot_mode = %d -------- \n", g_boot_mode);
#endif
        mt_disp_power(TRUE);
        mt_disp_show_low_battery();
        mt_disp_wait_idle();
        mt65xx_leds_brightness_set(6, 110);
#ifdef MTK_BATLOWV_NO_PANEL_ON_EARLY
        }
#endif
    }



       else if(g_boot_mode != KERNEL_POWER_OFF_CHARGING_BOOT && g_boot_mode != LOW_POWER_OFF_CHARGING_BOOT)     ///若是正常的模式
    {
#ifndef DISABLE_DISPLAY_IN_LK_FOR_82_BRINGUP
        if (g_boot_mode != ALARM_BOOT && (g_boot_mode != FASTBOOT))
        {      
                printf("tony:in 2222:will mt_disp_show_boot_logo\n");
            mt_disp_show_boot_logo();
        }
#endif
    }


      #else    ///若是其他的模式
#ifndef DISABLE_DISPLAY_IN_LK_FOR_82_BRINGUP
    if (g_boot_mode != ALARM_BOOT && (g_boot_mode != FASTBOOT))
    {      //printf("tony:in 3333:will mt_disp_show_boot_logo \n");
        mt_disp_show_boot_logo();
    }
#endif
#endif



     printf("tony:will invoke sw_env( )\n");打印出各种启动模式:normal mode,fastboot mode,meta mode,etc
     sw_env(); ====>>>>具体实现:

      #ifndef USER_BUILD
      switch (g_boot_mode)
                                                                 {
      case META_BOOT:
          video_printf(" => META MODE\n");
          break;
      case FACTORY_BOOT:
          video_printf(" => FACTORY MODE\n");
          break;
      case RECOVERY_BOOT:
          video_printf(" => RECOVERY MODE\n");
          break;
      case SW_REBOOT:
          //video_printf(" => SW RESET\n");
          break;
      case NORMAL_BOOT:
          printf("tony:in  sw_env( )==>> case NORMAL_BOOT.... \n");
          //if(g_boot_arg->boot_reason != BR_RTC && get_env("hibboot") != NULL && atoi(get_env("hibboot")) == 1)
          if(get_env("hibboot") != NULL && atoi(get_env("hibboot")) == 1)
              video_printf(" => HIBERNATION BOOT\n");
          else
              video_printf(" => NORMAL BOOT\n");
          break;
      case ADVMETA_BOOT:
          video_printf(" => ADVANCED META MODE\n");
          break;
      case ATE_FACTORY_BOOT:
          video_printf(" => ATE FACTORY MODE\n");
          break;
#if defined (MTK_KERNEL_POWER_OFF_CHARGING)
    case KERNEL_POWER_OFF_CHARGING_BOOT:
        video_printf(" => POWER OFF CHARGING MODE\n");
        break;
    case LOW_POWER_OFF_CHARGING_BOOT:
        video_printf(" => LOW POWER OFF CHARGING MODE\n");
        break;
#endif
      case ALARM_BOOT:
          video_printf(" => ALARM BOOT\n");
          break;
      case FASTBOOT:
          video_printf(" => FASTBOOT mode...\n");
          break;
      default:
          video_printf(" => UNKNOWN BOOT\n");
    }
    return;
#endif

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值