android系统重启流程分析

原创 2016年05月31日 09:40:46

1.reboot命令实现

./kernel/arch/alpha/kernel/setup.c:
void __init setup_arch(char **cmdline_p){
...
if (mdesc->restart_mode)
        reboot_setup(&mdesc->restart_mode);
...
if (mdesc->restart)
        arm_pm_restart = mdesc->restart;
...
}
./mediatek/platform/mt6572/kernel/core/core.c:
MACHINE_START(MT6572, "MT6572")
    .atag_offset    = 0x00000100,
    .map_io         = mt_map_io,
    .init_irq       = mt_init_irq,
    .timer          = &mt6572_timer,
    .init_machine   = mt_init,
    .fixup          = mt_fixup,
    .restart        = arm_machine_restart,
    .reserve        = mt_reserve,
MACHINE_END
./kernel/arch/arm/kernel/process.c:
void arm_machine_restart(char mode, const char *cmd){
...
arch_reset(mode, cmd);
...
}
./mediatek/kernel/kernel/system.c:
void arch_reset(char mode, const char *cmd)
{
    char reboot = 0;
    int res=0;
    struct wd_api*wd_api = NULL;

    res = get_wd_api(&wd_api);
    printk("arch_reset: cmd = %s\n", cmd ? : "NULL");

    if (cmd && !strcmp(cmd, "charger")) {
        /* do nothing */
    } else if (cmd && !strcmp(cmd, "recovery")) {
        rtc_mark_recovery();
    } else if (cmd && !strcmp(cmd, "bootloader")){
            rtc_mark_fast();    
    } 
#ifdef MTK_KERNEL_POWER_OFF_CHARGING
    else if (cmd && !strcmp(cmd, "kpoc")){
        rtc_mark_kpoc();
    }
#endif
    else {
        reboot = 1;
        //printk("rtc_mark_powerkey\n");//zhanglei add
        //rtc_mark_powerkey();//zhanglei add

    }

    if(res){
        printk("arch_reset, get wd api error %d\n",res);
    } else {
        wd_api->wd_sw_reset(reboot);
    }
}
arch_reset根据上层传的命令执行不同的动作,最后执行wd_sw_reset(reboot)。
./mediatek/kernel/drivers/wdk/wd_api.c:
static int wd_sw_reset(int type)
{
   wdt_arch_reset(type);
   return 0;
}
./mediatek/platform/mt6572/kernel/drivers/wdt/mtk_wdt.c:
void wdt_arch_reset(char mode)
{
...
DRV_WriteReg32(MTK_WDT_RESTART, MTK_WDT_RESTART_KEY);
...
}
从上可以产出系统重启动作是通过看门狗完成的,如果关闭IPO(快速开关机功能)后,系统重启动作会导致系统完全掉电,内核关闭,看门狗无法正常工作,从而导致系统无法重启。

2.开机boot_mode_check

preloader:
./mediatek/platform/mt6572/preloader/src/drivers/platform.c:
void platform_init(void)
{
...
g_boot_reason = reason = platform_boot_status();
...
}
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
...
}
./mediatek/platform/mt6572/preloader/src/drivers/mt_rtc.c:
bool rtc_boot_check(void)
{
...
if ((pdn1 & 0x0030) == 0x0010) {    /* factory data reset */
        /* keep bit 4 set until rtc_boot_check() in U-Boot */
        return true;
    }
    //zhanglei add
    if (pdn1 & 0x0080) {    /*  power on  time */
        /* keep bit 7 set until rtc_boot_check() in U-Boot */
        return true;
    }
#if defined (MTK_KERNEL_POWER_OFF_CHARGING)
    if ((pdn1 & 0x4000) == 0x4000) {   
        kpoc_flag = true;
        return false;
    }
#endif

    return false;
}
通过判断pdn1寄存器的标志位返回是否是真正的启动状态。
lk:
./mediatek/platform/mt6572/lk/platform.c:
void platform_init(void)
{
...
#ifndef CFG_POWER_CHARGING
    /* NOTE: if define CFG_POWER_CHARGING, will rtc_boot_check() in mt65xx_bat_init() */
    rtc_boot_check(false);
#endif
...
}
./mediatek/platform/mt6572/lk/mt_rtc.c:
bool rtc_boot_check(bool can_alarm_boot)
{
...
    if ((pdn1 & RTC_PDN1_RECOVERY_MASK) == RTC_PDN1_FAC_RESET) {    /* factory data reset */
        RTC_Write(RTC_PDN1, pdn1 & ~RTC_PDN1_FAC_RESET);
        rtc_write_trigger();
        return true;
    }

    if (pdn1 & 0x0040) {    /* bypass power key detection */
        RTC_Write(RTC_PDN1, pdn1 & ~0x0040);
        rtc_write_trigger();
        return true;
    }
    //zhanglei add
    if (pdn1 & 0x0080) {    /*  power on  time */
        /* keep bit 7 set until rtc_boot_check() in U-Boot */
        return true;
    }

    return false;
...
}
原理同preloader层。
版权声明:本文为博主原创文章,未经博主允许不得转载。

Android系统启动流程(一)解析init进程启动过程

作为“Android框架层”这个大系列中的第一个系列,我们首先要了解的是Android系统启动流程,在这个流程中会涉及到很多重要的知识点,这个系列我们就来一一讲解它们,这一篇我们就来学习init进程。...
  • itachi85
  • itachi85
  • 2017年02月07日 11:29
  • 7655

如何快速对android系统重启问题进行分析归类

当手机发生系统重启,即导致kernel重启的异常时,会在手机中的/data/aee_exp目录下保存异常重启的db。工程师可以通过GAT的bug report功能,或者直接通过adb pull,把对应...
  • sssheiye
  • sssheiye
  • 2015年12月07日 14:04
  • 3195

android usb adb流程,Android系统关机或重启的几种实现方式

Android KitKat 4.4平台开发-添加USB ADB和MTP功能支持 点击打开链接
  • xuwuhao
  • xuwuhao
  • 2015年05月21日 14:27
  • 1806

如何快速对android系统重启问题进行分析归类

当手机发生系统重启,即导致kernel重启的异常时,会在手机中的/data/aee_exp目录下保存异常重启的db。工程师可以通过GAT的bug report功能,或者直接通过adb pull,把对应...
  • sssheiye
  • sssheiye
  • 2015年12月07日 14:04
  • 3195

x86平台下Android系统的Linux部分的重启分析

----------------------------------------------------------------------- 本文系本站原创,欢迎转载! 转载请注明出处:http...
  • sdvch
  • sdvch
  • 2015年05月22日 22:00
  • 1080

Android系统循环重启测试DEMO

  • 2017年10月31日 10:02
  • 2.46MB
  • 下载

android 系统重启关机流程分析

1.5 android 系统重启关机流程分析 1.5.1 c语言中调用 reboot 函数 bionic/libc/unistd/reboot.c:33: int reboot (int mod...
  • melody157398
  • melody157398
  • 2012年12月02日 19:43
  • 3841

android 系统重启关机流程分析

android 系统重启关机流程分析  分类: kernel 2012-07-20 17:27 981人阅读 评论(0) 收藏 举报  1.5 android 系统重启关机流程分析 1....
  • autumn20080101
  • autumn20080101
  • 2012年12月31日 14:12
  • 835

MTK平台相关总结#########[FAQ18279]开机时间慢分析 android 系统重启关机流程分析

ooooooooooooooo
  • ffmxnjm
  • ffmxnjm
  • 2017年07月31日 15:09
  • 353

为Android系统定制重启功能

按计划每周更新一篇技术博文,第二篇:《为Android系统定制重启功能》 一、Android系统重启的实现方式 1、广播方式 之前的博文介绍过这种方式《使用广播实现的Android关机及...
  • zzp16
  • zzp16
  • 2012年08月03日 23:32
  • 12629
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android系统重启流程分析
举报原因:
原因补充:

(最多只允许输入30个字)