博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android recover 系统代码分析 -- 选择进入
阅读量:6574 次
发布时间:2019-06-24

本文共 1643 字,大约阅读时间需要 5 分钟。

最近做Recovery的规范及操作指导文档,花了一些时间将流程搞清。

Android利用Recovery模式,进行恢复出厂设置,OTA升级,patch升级及firmware升级。而在进入Recover前面其实还有升级检测,数据下载,启动检查等等操作。系列文章将会将整个流程梳理清楚。

1、Android启动流程

简要的流程图示,升级到新的版本或指定版本:

系统上电时的详细检测流程图:

下面我们从代码的情况简略分析一下:

机顶盒上电一般都是从地址 0x00000000 处开始启动,此时启动的程序叫 boot ,在linux上使用最多一般是 Uboot ,我们找到main函数:

Start.s文件:

.globl _start

_start:
b reset

做一些 bootstrap_check --> bootstrap --> check_boot_mode  etc 

最后:

ldr pc, _start_armboot  @ jump to C code 

跳转到C代码,类似就是main函数

void start_armboot (void)   首先做一些各种各式的硬件初始化,如 arch_cpu_init 、 board_init、interrupt_init、env_init 等

然后做一些开机启动的画面显示(开机动画也可以在此做)--> load_recovery() 这里就是决定是进行 Recovery 还是进行 Normal 的开机流程最重要入口函数

void load_recovery(void){

if (!strcmp(boot_select(), "kernel"))   // 进入检测参数ng

return;

check_buttom_recovery(&keycode)

        if(keycode == RECOVERY_KEY){  // 确认有长按键强制升级

              load_recovery_image();

        }

}

如何检测参数呢?参考的信息从哪里来,这里就有必要引入分区概念了。这里使用的都是 NAND FLASH ,对于其管理可以参考如下文章:

下列给出一个常用的android上分区表图:(常见的分区表,可根据项目另行修改大小及分区情况)

需要注意的是: NAND Flash 分区占用必须以 block size 为单位,并且要考虑分区的差错,坏块,建议容错块 30%,最小2个容错块。所以如果定义访问者有多个用户情况下,读取与写数据保持一致情况下,定义数据结构,预留30%分区空间,进行整个分区的读和写,这样子可以省去关注坏区情况,简化上层逻辑操作。

对于如何选择是启动正常的 "kernel "还是 "recovery",就是读取 misc 分区中的内容根据情况决定启动哪个。核心代码如下:

const char *boot_select(void)

{

HI_Flash_OpenByName("MISC");

        HI_Flash_Read(h,offset,buf,len);

        memcmp(buf,"boot-recovery",..); 还是 memcmp(buf,"kernel",..);

return "kernel" / "recovery";

}

另个一种模式就是长按键强制选择:

static int check_buttom_recovery( HI_U32 *keyvalue)

{

       HI_KEYLED_Open()

        HI_KEYLED_GetValue(&u32PressStatus, &u32KeyValue);

        while(u32KeyValue == RECOVERY_KEY){

                  udelay(1000);

                  if (s32Cnt >= MAX_KEY_PRESS_COUNT)

break;

                  s32Cnt++;

        }

ok, 开机启动选择进入的模式流程基本搞定。下一遍进行 Recovery 代码继续分析。

 

你可能感兴趣的文章
会动的Tabbar
查看>>
完全卸载VS2013的方法
查看>>
十分钟学会Charles抓包(iOS的http/https请求)
查看>>
zoj2676 Network Wars(0-1分数规划,最大流模板)
查看>>
存储器的保护(三)——《x86汇编语言:从实模式到保护模式》读书笔记20
查看>>
Datatables js 复杂表头 合并单元格
查看>>
互联网科普贴-阿里巴巴国际站是什么
查看>>
Live555研究之中的一个 源码编译
查看>>
cocos2d JS-(JavaScript) cc.each循环遍历对象
查看>>
PDF如何自动滚动阅读
查看>>
leetcode ----Trie/stack专题
查看>>
label文字居中
查看>>
在SpringMVC中使用Jackson并格式化时间
查看>>
lk进kernel
查看>>
Android开发之监听发出的短信
查看>>
Android调用系统自带的文件管理器进行文件选择
查看>>
Data source rejected establishment of connection, message from server: "Too many connections"
查看>>
Java编程介绍
查看>>
OpenHaptics编程环境搭建
查看>>
ubuntu 14.04为/检查磁盘时发生严重错误的解决方法
查看>>