这里使用基于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_KEY, &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=/initroot=/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模式。
分享到:
相关推荐
Android系统Recovery模式的工作原理,摘录自网页
android recovery模式下可用的较大的字体,直接将此头文件放到bootable\recovery\minui目录下,修改graphics.cpp中对原字体头文件的引用为本文件即可。
通过按下某个按键,使android进入recovery模式,是很好的参考资料
Android系统Recovery模式的工作原理 在使用update.zip包升级时怎样从主系统(main system)重启进入Recovery模式,进入Recovery模式后怎样判断做何种操作,以及怎样...一、Recovery模式中的三个部分 ................
Android recovery原理讲解,讲解Android recovery启动模式的解析及升级过程。
Android手机Recovery模式取证方法研究.pdf
关于Android Recovery模式的介绍,包括流程图,对于了解OTA升级应该是很有用的
非常全面的介绍详解android Recovery模式,以及相关的OTA升级,update.zip制作,和刷机基础。
Android Recovery模式下选择关机,实际是重启,修改为关机
为了方便客户日后的固件升级,本周研究了一下android的recovery模式。...在一些系统启动必要的初始完成之后,将判断是否要进入recovery模式,从图1中可以看出,进入recovery模式有两种情况。一种是
安卓_Recovery_恢复模式_中文说明
解决Android手机刷机失败 无法进入Recovery模式 无法开机
Android11 修复user版本,按电源键+音量减键进入recovery模式会进入no command 界面问题.patch
recovery触摸支持代码,触摸代码在ui.cpp的touch_handle_input()方法中,可以借鉴下
文档详细介绍了Android系统上进入到Recovery模式的路径,实例化的代码和流程框图让阅读者更加容易理解。
这是Google官方发布的一款工具,用来合成recovery模式下文本本地化显示的工具,我已经编译成功,源码也一起上传了,有兴趣的同学可以下载下来研究一下!
Android利用Recovery模式,进行恢复出厂设置,OTA升级,patch升级及firmware升级
Android系统的三种启动模式 ... 无论将升级包放在什么位置,在使用update.zip更新时都会重启并进入Recovery模式,然后启动recovery服务(/sbin/recovery)来安装我们的update.zip包。 ............
Vibosoft Data Recovery是一款数据恢复工具,内置多种恢复模式:反删除恢复、格式化后恢复、分区恢复以及RAW恢复式。删除恢复可以恢复所有被删除的文件,包括照片,视频,音频等,从分区和可移动磁盘。格式化恢复...