安卓设备底层刷机教程

底层刷机,顾名思义,这是一种从底层刷写手机字库的方式,与正常的程序相比,这种方式更为彻底,无视所有软件层面的权限,例如BL锁。可以将其理解为往单片机的Flash里烧写程序。

底层刷机模式常用于使用卡刷(Recovery下以及一系列使用ADB刷机方式的统称)或者线刷(Bootloader下使用Bootloader命令刷机的方式)刷成砖后救砖的场景下。按照主流处理器,高通为9008刷机模式,MTK为MTK PreLoader模式,海思麒麟为eRecovery模式(类rec操作)和eDownload模式。

高通9008底层刷机模式

高通的QPST线刷模式,因联机之后端口名字叫Qualcomm HS-USB QDLoader 9008 (COMx)而得名。该模式下,用户可通过QPST及其衍生工具(本质为QPST命令行调用)直接对手机的Flash芯片进行读写操作,而不需要解锁Bootloader。常见刷机工具有QPST,MiFlash(Pro)等工具,刷机包中一般会有一个分区表xml文件。以及一个eif文件。XML文件命名一般为Rawprogram(数字).XML和Patch(数字).XML,EIF文件一般命名为prog_存储芯片类型(比如UFS和EMMC)firehose(SOC型号,比如MSM8998或者SDM855)_(内存类型,一般是DDR).eif,只要带有这两个文件的,一般都是高通支持9008的刷机包。 进入9008模式,高通略为麻烦。MSM8994及以前的SoC,可以通过Fastboot命令直接进入9008模式,命令如下

ADB方式

1
$ adb reboot edl

Fastboot方式

1
2
$ fastboot oem edl
$ fastboot reboot emergency

手机会重启到一个完全黑屏的状态。电脑上设备管理器出Qualcomm HS-USB QDLoader 9008 (COMx),则证明9008模式进入成功。

MSM8996 SoC,可以通过制作工程线来进入9008 工程线原理为短接GND(黑线),USB+(绿线),具体原理图定义可以百度。

SDM845 以上SoC,仅可以通过短接对应触点来进入9008。具体会在下次更新放入短接图。(咕?) 短接之后即可使用工具刷入。

联发科MTK PreLoader模式

联发科的底层刷机模式没有高通那么麻烦。该模式在MTK内部被称为MTK in-house developed loader。MTK的该模式与高通略有不同,该模式具有帮助系统寻找Uboot的功能。该模式除了具有启动功能之外,还具有下载功能。首先还是需要明确的是mtk芯片都有一个boot rom,如果没有这个rom,那么程序是无法被下载到Nand Flash中的,然后此时的Flash上是为空的,没有任何数据的。系统在上电之后它会检测是启动模式还是下载模式,如果是下载模式,它会初始化一个usb的串口,将Preloader加载到内部的SRAM中,跳转到Preloader中去执行,初始化好Flash和外部RAM之后,依次将preloader、lk、kernel、android下载到nand flash中去。

(附MTK MT6589启动部分代码)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void platform_init(void)
{
mtk_wdt_init();  --看门狗初始化
set_kpd_pmic_mode(); --keypad pmic mode support
g_boot_reason = reason = platform_boot_status(); --检测启动状态
if (reason == BR_RTC || reason == BR_POWER_KEY || reason == BR_USB || reason == BR_WDT || reason == BR_WDT_BY_PASS_PWK || reason == BR_2SEC_REBOOT)
rtc_bbpu_power_on(); --bbpu指baseband power-up,调用该函数锁存RTC的PWBB来保持设备的一直供电,power键抬起也不会关机
mt_mem_init(); --内存初始化
init_dram_buffer(); --DRAM 缓冲区
ram_console_init(); --Ram控制初始化
ret = boot_device_init(); --EMMC初始化
mt_usb_phy_init(); --USB初始化
mt_usb11_phy_savecurrent();
bootarg.dram_rank_num = get_dram_rank_nr(); --保存DRAM信息到bootarg中
get_dram_rank_size(bootarg.dram_rank_size);
get_orig_dram_rank_info(&bootarg.orig_dram_info);
setup_mblock_info(&bootarg.mblock_info, &bootarg.orig_dram_info, &bootarg.lca_reserved_mem);
}

根据MTK官方说明文档,MTK判断启动模式和下载模式,是通过电池是否插上,以及Flash芯片是否包含启动数据。(所以字库(就是Flash芯片)坏了也会进入这个模式)。

刷机工具是SP Flash Tools ,需要验证的对应的DA文件。

(咕了,刷机工具部分资料不齐/Awsl)

/找时间更海思麒麟/