BOOL is_force_boot(void) { if (rtc_boot_check(true)) { printf("[%s] Bypass Kernel Power off charging mode and enter Alarm Boot\n", __func__); return TRUE; } else if (meta_mode_check()) { printf("[%s] Bypass Kernel Power off charging mode and enter Meta Boot\n", __func__); return TRUE; } #ifdef RTC_2SEC_REBOOT_ENABLE else if (pmic_detect_powerkey() || mtk_wdt_boot_check()==WDT_BY_PASS_PWK_REBOOT || rtc_2sec_boot_check_kpoc() == RTC_2SEC_BOOT_NORMAL) #else else if (pmic_detect_powerkey() || mtk_wdt_boot_check()==WDT_BY_PASS_PWK_REBOOT) #endif { printf("[%s] Bypass Kernel Power off charging mode and enter Normal Boot\n", __func__); g_boot_mode = NORMAL_BOOT; return TRUE; } return FALSE; }
static boot_reason_t platform_boot_status(void) { #if defined (MTK_KERNEL_POWER_OFF_CHARGING) ulong begin = get_timer(0); do { if (rtc_boot_check()) { print("%s RTC boot!\n", MOD); return BR_RTC; } if(!kpoc_flag) break; } while (get_timer(begin) < 1000 && kpoc_flag); #else if (rtc_boot_check()) { print("%s RTC boot!\n", MOD); return BR_RTC; } #endif if (mtk_wdt_boot_check() == WDT_NORMAL_REBOOT) { print("%s WDT normal boot!\n", MOD); return BR_WDT; } else if (mtk_wdt_boot_check() == WDT_BY_PASS_PWK_REBOOT){ print("%s WDT reboot bypass power key!\n", MOD); return BR_WDT_BY_PASS_PWK; } #if !CFG_FPGA_PLATFORM /* check power key */ if (mtk_detect_key(8)) { print("%s Power key boot!\n", MOD); rtc_mark_bypass_pwrkey(); return BR_POWER_KEY; } #endif #ifndef CFG_EVB_PLATFORM if (usb_accessory_in()) { print("%s USB/charger boot!\n", MOD); return BR_USB; } #ifdef RTC_2SEC_REBOOT_ENABLE //need to unlock rtc PROT //check after rtc_boot_check() initial finish. if (rtc_2sec_reboot_check()) { print("%s 2sec reboot!\n", MOD); return BR_2SEC_REBOOT; } #endif //#ifdef RTC_2SEC_REBOOT_ENABLE print("%s Unknown boot!\n", MOD); pl_power_off(); /* should nerver be reached */ #endif print("%s Power key boot!\n", MOD); return BR_POWER_KEY; }
static void mtk_wdt_check_trig_reboot_reason(void) { unsigned int interval_val = DRV_Reg32(MTK_WDT_INTERVAL); reboot_from = RE_BOOT_FROM_UNKNOW; /* 1. Get reboot reason */ if(0 != mtk_wdt_check_status()){ /* Enter here means this reset is triggered by RGU(WDT) */ print("PL RGU RST: "); switch(interval_val&MAGIC_NUM_MASK) { case PRE_LOADER_MAGIC: reboot_from = RE_BOOT_FROM_PRE_LOADER; print("P\n"); break; case U_BOOT_MAGIC: reboot_from = RE_BOOT_FROM_U_BOOT; print("U\n"); break; case KERNEL_MAGIC: reboot_from = RE_BOOT_FROM_KERNEL; print("K\n"); break; default: print("??\n"); // RGU reset, but not pr-loader, u-boot, kernel, from where??? break; } }else{ /* Enter here means reset may triggered by power off power on */ if( (interval_val&MAGIC_NUM_MASK) == POWER_OFF_ON_MAGIC ){ reboot_from = RE_BOOT_FROM_POWER_ON; print("PL P ON\n"); }else{ print("PL ?!\n"); // Not RGU trigger reset, and not defautl value, why? } } /* 2. Update interval register value and set reboot flag for u-boot */ interval_val &= ~(RGU_TRIGGER_RESET_MASK|MAGIC_NUM_MASK); interval_val |= PRE_LOADER_MAGIC; if(reboot_from == RE_BOOT_FROM_POWER_ON) interval_val |= IS_POWER_ON_RESET; // bit2==0 means RGU reset DRV_WriteReg32(MTK_WDT_INTERVAL, interval_val); /* 3. By pass power key info */ if (mtk_wdt_boot_check() == WDT_BY_PASS_PWK_REBOOT) { print("Find bypass powerkey flag\n"); } else if (mtk_wdt_boot_check() == WDT_NORMAL_REBOOT) { print("No bypass powerkey flag\n"); } else { print("WDT does not trigger reboot\n"); } }
void platform_usb_auto_detect_flow() { print("USB DL Flag is %d when enter preloader \n",g_usbdl_flag); /*usb download flag haven't set */ if(g_usbdl_flag == 0){ /*set up usbdl flag*/ platform_safe_mode(1,CFG_USB_AUTO_DETECT_TIMEOUT_MS); print("Preloader going reset and trigger BROM usb auto detectiton!!\n"); /* WDT by pass powerkey reboot */ /* keep the previous status, pass it into reset function */ if (WDT_BY_PASS_PWK_REBOOT == mtk_wdt_boot_check()) mtk_arch_reset(1); else mtk_arch_reset(0); }else{ /*usb download flag have been set*/ } }
static boot_reason_t platform_boot_status(void) { #if defined (MTK_KERNEL_POWER_OFF_CHARGING) ulong begin = get_timer(0); do { if (rtc_boot_check()) { print("%s RTC boot!\n", MOD); return BR_RTC; } if(!kpoc_flag) break; } while (get_timer(begin) < 1000 && kpoc_flag); #else if (rtc_boot_check()) { print("%s RTC boot!\n", MOD); return BR_RTC; } #endif if (mtk_wdt_boot_check() == WDT_NORMAL_REBOOT) { print("%s WDT normal boot!\n", MOD); return BR_WDT; } else if (mtk_wdt_boot_check() == WDT_BY_PASS_PWK_REBOOT){ print("%s WDT reboot bypass power key!\n", MOD); return BR_WDT_BY_PASS_PWK; } #if !CFG_FPGA_PLATFORM #ifdef LENOVO_BOOT_TIME_DELAY /* check power key */ int iLoop=0; int iCheck_num=3; int iInterval=250; int iRet=0; for(iLoop=0; iLoop < iCheck_num; iLoop++ ) { iRet = mtk_detect_key(8); if(false == iRet ) break; mdelay(iInterval); } if (iRet) { print("%s Power key boot!\n", MOD); rtc_mark_bypass_pwrkey(); return BR_POWER_KEY; } #else /* check power key */ if (mtk_detect_key(8)) { print("%s Power key boot!\n", MOD); rtc_mark_bypass_pwrkey(); return BR_POWER_KEY; } #endif #endif #ifndef EVB_PLATFORM if (usb_accessory_in()) { print("%s USB/charger boot!\n", MOD); return BR_USB; } print("%s Unknown boot!\n", MOD); pl_power_off(); /* should nerver be reached */ #endif print("%s Power key boot!\n", MOD); return BR_POWER_KEY; }