//平台相关早期初始化,如获取板级信息,初始化时钟、中断、定时器等
/*
平台硬件早期初始化,包括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(); ====>>>>具体实现:
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