android中的recovery模式

來源:互聯網
上載者:User

http://booktree.zhou.blog.163.com/blog/static/12418921720112995017844/

這裡使用基於freescale的imx_r9.2 patch的android源碼分析.

android中的recovery模式,作為android的開發人員或者使用者都應該清楚和瞭解。android利用recovery模式完成整個系統的升級和恢復出廠預設值。

這裡先講講怎麼進入recovery模式,這個工作是由bootloader完成。freescale使用的uboot.

bootloader每次啟動的時候都要執行./lib_arm/board.c的代碼:

   464    #ifdef CONFIG_ANDROID_RECOVERY
   465        check_recovery_mode();
   466    #endif

該函數位於./board/freescale/common/recovery.c,代碼如下:

    98    /* export to lib_arm/board.c */
    99    void check_recovery_mode(void)
   100    {
   101        if (check_key_pressing())
   102            setup_recovery_env();
   103        else if (check_recovery_cmd_file()) {
   104            puts("Recovery command file founded!\n");
   105            setup_recovery_env();
   106        }
   107    }

line 101和line 103指出有兩種方式可以執行setup_recovery_env()進入recovery模式。

我們接下來看看這三個函數到底幹了些什麼,

check_key_pressing也在board/freescale/common/recovery.c中,

    32    int check_key_pressing(void)
    33    {
...
    38   
    39        puts("Detecting HOME+POWER key for recovery ...\n");
...
    45   
    46        for (i = 0; i < keys; i++) {
    47            if (test_key(CONFIG_POWER_KEY , &key_info[i]))
    48                state |= PRESSED_HOME;
    49            else if (test_key(CONFIG_HOME_KE Y, &key_info[i]))
    50                state |= PRESSED_POWER;
    51        }
...
    55        if ((state & RECOVERY_KEY_MASK) == RECOVERY_KEY_MASK)
    56            return 1;
    57   
    58        return 0;
    59    }
該函數用於探測HOME+POWER鍵,若同步選取,函數返回1,進入recovery模式。

   893    int check_recovery_cmd_file(void)
   894    {
...

   938                filelen = ext2fs_open(CONFIG_ANDROID_RECOVERY_CMD_FILE );

...

   955        return (filelen > 0) ? 1 : 0;

   956   
   957    }

 該函數探測宏CONFIG_ANDROID_RECOVERY_CMD_FILE,表示的檔案是否存在,若存在返回1,進入recovery模式。

該宏定義在./include/configs/mx51_bbg_android.h

  115    #define CONFIG_ANDROID_RECOVERY_CMD_FILE "/recovery/command"

接下來看看setup_recovery_env()函數,做了些什麼事情。

    70    void setup_recovery_env(void)
    71    {
    72        char *env, *boot_args, *boot_cmd;
    73        int bootdev = get_boot_device();
    74   
    75        boot_cmd = supported_reco_envs[bootdev].cmd;
    76        boot_args = supported_reco_envs[bootdev].args;
    77   
    78        if (boot_cmd == NULL) {
    79            printf("Unsupported bootup device for recovery\n");
    80            return;
    81        }
    82   
    83        printf("setup env for recovery..\n");
    84   
    85        env = getenv("bootargs_android_recovery");
    86        /* Set env to recovery mode */
    87        /* Only set recovery env when these env not exist, give user a
    88         * chance to change their recovery env */
    89        if (!env)
    90            setenv("bootargs_android_recovery", boot_args);
    91   
    92        env = getenv("bootcmd_android_recovery");
    93        if (!env)
    94            setenv("bootcmd_android_recovery", boot_cmd);
    95        setenv("bootcmd", "run bootcmd_android_recovery");
    96    }
該函數主要用來設定bootargs_android_recovery和bootcmd_android_recovery環境變數,我們看看這兩個環境變數到底設定成了什麼,

請看代碼:board/freescale/mx51_bbg/mx51_bbg.c

   878    struct reco_envs supported_reco_envs[BOOT_DEV_NUM] = {
...
   888         .cmd = CONFIG_ANDROID_RECOVERY_BOOTCMD_MMC ,
   889         .args = CONFIG_ANDROID_RECOVERY_BOOTARGS_MMC,
...
   891    };
上面line 888和line 889的宏定義在include/configs/mx51_bbg_android.h:

   109    #define CONFIG_ANDROID_RECOVERY_BOOTARGS_MMC \
   110        "setenv bootargs ${bootargs} init=/init root=/dev/mmcblk0p4 " \
   111        "rootfs=ext4 di1_primary"
   112    #define CONFIG_ANDROID_RECOVERY_BOOTCMD_MMC  \
   113        "run bootargs_base bootargs_android_recovery ;"    \
   114        "mmc read 0 ${loadaddr} 0x800 0x1800;bootm"
看到這裡終於瞭解了,到底怎麼進入recovery模式,實際上就是通過bootloader傳遞參數給核心,讓kernel掛載recovery分區便啟動了recovery模式。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.