安卓手机高通芯片刷机我的分析理解高通芯片手机是市面上比较流行的手机系列,例如:小米系列大部分机型,三星系列部分高端机型,中兴努比亚系列,联想手机高端机型,一加手机全部机型,还有华为手机一小部分等等吧。刷高通芯片手机必须知道高通手机的引导过程,而高通芯片手机引导过程相对复杂,我经过一周的学习和思考基本掌握了高通芯片手机的引导过程,我的理解可能有错误之处,希望看到这篇文章的同学给我意见和建议。
我先从总体说一下引导过程:PBL-SBL1-LK-BOOT(安卓引导镜像)-Android
第一阶段. :PBL-SBL1 阶段。手机上电也就是开机,手机先从PBL(Application Primary Boot Loader主引导加载程序)它位于主板的ROM中,(线刷包中没有这部分程序代码,他是固化到ROM中的,出厂就有的无法改变,甚至厂商也不知道具体代码是高通私有的部分)CPU先把它加载到SDRAM中开始执行PBL引导程序,主要是硬件特别是CPU初始化,让CPU正确工作。这一步还加载了系统的下一项SBL1启动的镜像。启动完了之后把控制权交给SBL1.
PBL:对刷机的作用是他有一个紧急下载模式(EDL :emergent download)它有两个特点:
一是它有emmc的驱动程序也就是它能访问emmc。
二是它支持USB模式也就是高通的Qdownload 9008模式 通过 firehouse协议与电脑连接并能够下载数据到emmc,也就是通过刷机软件刷机。
在这种模式下比较典型的刷机软件有两个:高通的QPST软件的QFIL(Qualcomm Flash Image Loader)和小米的刷机软件MiFlash.
说一下这两个软件利用高通9008模式软件的运行原理:它们都需要加载刷机包里的prog_emmc_firehose_8976_ddr.mbn文件,( 8976也可以是其它高通芯片型号)它被称为镜像烧写器,也就是这个文件被刷机程序加载后运行在电脑端,他负责通过firehouse协议与连接了9008模式的手机的PBL程序进行沟通。把镜像文件根据在刷机包里的文件rawprogram0.XML(刷机包的镜像文件在手机里加载的路径)和patch0.xml(补充分区相关的路径)下载到手机端。也就是刷机过程
补充几点说明:
- SBL1阶段启动了按键驱动之后通过监听手机用户的按键方法来进入PBL模式。
- Sbl1还会模拟出9006端口,并且会加载mass storage(U盘)此时电脑端可以管理手机emmc,比如分区等操作。当然也可以进行crash RAM dump(崩溃时内存转储)工作。分析手机启动时的崩溃原因。例如利用adb工具命令adb erase aboot或fastboot erase sbl1命令来来让系统崩溃(无法发现aboot)SBL1自动转入普通下载模式通过Sahara协议进行下载或刷机。电脑端显示Diagnostics 9006端口和mass storage(U盘)两个条目。
- qh-Qdownload9008(comx),9008这个端口号是手机端PBL虚拟出来的,也就是电脑端通过自己comx端口与手机端的9008端口通信,9008端口数据指向PBL引导程序。PBL通过9008端口接受电脑数据通过自己的emmc驱动把数据写到emmc(或flash)中。 2. 高通紧急下载模式(EDL)优点是手机系统不论如何被破坏都能被刷好,因为它不需要 emmc的任何数据。缺点也明显就是这种模式太过强暴把emmc都刷了容易丢失 IMEI号。需要QCN备份数据。如果刷错包很容易变真砖的。
3.进入紧急下载模式方法:
方法一:抠掉电池(可以不抠电池),长按 音量下键 + 音量上键,再插入USB线
方法二:将主板上的紧急下载测试点与地相连(需要拆机并且下载测试点不好找),再 插入USB线。
方法三:在进入fastboot模式后,利用fastboot erase sbl1,此后插入USB线。
此方法原理是:PBL引导程序发现二次引导程序sbl1丢失,引导失败所以就自动 进入 急下载模式的过程 ,用紧 急下载模式进行修复。
方法四:在手机正常开机情况下,利用QFIL下载软件时,会有从正常模式转换到 紧
急下载模式的过程
方法五:工厂空的PCBA的板子,在插入USB后,也会进入紧急下载模式
方法六:利用小米的工程线进入。原理是利用USB D+ 接地线(拆开USB线的绿色和黑色短接)
方法七:能正常开机,利用ADB命令进入EDL模式。
方法八:给手机一个硬件gpio下拉,现在还不太明白什么意思(应该是emmc的测试点加1.8v接触也就是短接法救黑砖)。
最后说明一下手机启动到这一步系统还没有初始化显示系统,也就是黑屏状态。但是已经加载了手机按键的驱动,所以手机按键是能够被启动系统感知,和利用的。
用途:在fastboot模式进入不了时,是唯一的刷机方法。
第二阶段. LK阶段。 手机通过第一阶段的PBL初始化硬件,给第二阶段SBL1做好硬件准备,并且PBL加载SBL1镜像(在刷机包里是sbl1.mbn)到CPU的二级缓存L2,SBL1在L2执行,此时并没有初始化DDR(系统内存),所以不能加载主内存中运行。此时SBL1主要工作是初始化系统主内存,主板时钟,arm架构,emmc,按键,等手机硬件。此时系统的硬件处于基本可用状态。此时SBL1还负责加载电源管理模块的PBL初始化电源模块,把相关的硬件初始化,把电源模块的pbl加载到电源的SRAM去执行。把相关的参数放到share模块,供系统调用。最后把lk(高通默认引导程序,最出名的是u-boot但高通没用)引导主程序(在刷机包里是emmc_appsboot.mbn文件)镜像加载到DDR
由于系统加载了硬件驱动了,所以此时可以调用硬件了。故系统引导程序可以扫描手机按键组合来进入PBL的EDL模式(通过一个宏来调用PBL的EDL模式)。但是此时不能进入fastboot和recovery因为没有fastboot协议,也没有进入recovery的所需硬件环境。
SBL1的第一阶段加载QHEE(高通安全执行环境)到系统主内存,SBL1加载到主内存后,把控制权交给QHEE来执行,QHEE是高通特有的环境把安全相关的东西交给它处理,比如密码等问题等。此后引导程序把控制权交给lk(emmc_appsboot.mbn)此时真正进入了引导程序,手机各个硬件都能真正使用了包括显示相关的硬件。手机根据你的按键组合来调用fastboot协议(这是lk中的内置程序fastboot协议,由lk通过USB接口与电脑沟通,此时会虚拟一个端口可能是9008,与EDL不同)和recovery镜像(刷机包里的recovery.img)。
如果没有按键,则系统正常启动加载系统真正内核boot.img,此时如果没有发现boot.img镜像,LK会crash(崩溃),进行内存转储到emmc(Crash ram dump)LK会此时虚拟出9006端口,调用函数boot_sahara_init初始化sahara协议,枚举usb com口及mass storage。通过USB与电脑沟通,电脑端会有mass storage和9006端口出现。把手机emmc当做手机的一个移动盘来操作。此时手机会通过Sahara协议与电脑沟通。下载转储文件。当然我们也可以通过这种方法来刷机,用高通的emmc software download或小米的刷机工具MiFlash来下载刷机。(手机端显示什么我不知道,因为没用过)当然也可以用这种方法给手机emmc分区。
如果有按键组合则进入不同模式:fastboot模式和recovery模式
1.进入fastboot模式方法:
方法一:长按 电源键+音量下键
方法二:抠掉电池,然后长按音量下键,再插入USB线
方法三:进入adb模式,在adb里输入 adb reboot bootloader(PS:必须可以正常开机)
用途:刷整个系统或者刷某个分区
Fastboot模式是手机和电脑通过fastboot协议进行交互的,手机端接受电脑端fastboot命令然后手机端执行命令完成操作。此时由于系统已经加载显示驱动,所以手机端能够显示fastboot模式的画面。(手机端有完整的fastboot模式的命令和协议内容)
2.recovery模式:
方法一:长按 电源键 + 音量上键
方法二:手机正常开机情况下,利用adb reboot recovery
用途:可以备份或者恢复系统(卡刷模式),高级recovery(第三方如CM)还可以root系统,挂载sd卡等操作。
Recovery模式是手机端的recovery镜像也就是刷机包里的(recovery.img)镜像,其实它就是一个微型的Linux系统,和boot.img系统镜像一样的东西。所不同点是recovery只是启动后功能弱。Boot.img包含系统内核负责引导Android系统。此时经过系统不断加载初始化硬件已经可以启动系统了。所以所有硬件都可以调用了。系统进入了真正启动阶段。
前面部分可以看做系统BIOS阶段下面是系统启动阶段。
第三阶段:boot阶段系统启动。lk加载系统内核镜像把控制权交给boot.img真正的引导系统。此时如果处于一些原因,系统可能会进入ffmb模式系统测试模式,(测试硬件如:听筒,话筒,wifi,屏幕,摄像头等等)。当然如果不进入测试模式,则引导系统进入Android世界。这些不是所讨论的内容了。
FFBM模式:
方法一:利用QFIL软件
刷机后,第一次开机会进入该模式,在点击该模式中finish后,此后再次开机不会进入该模式,同样通过fastboot erase misc也可以达到不用进入该模式的作用。
用途:该模式不是Android本身的模式,而是高通的,它的主要作用是用于快速测试手机的一些基本功能。
第三阶段补充说明:当我们关机充电时,手机的充电画面是从boot.img文件里的,说明手机能进入充电模式,系统已经启动到内核模式了。只是没有再向后加载而已。
最后我分析一下通过手机出现画面来判断手机启动进程:
1.手机黑砖模式(不能启动不能连接电脑)不能启动说明手机只能到PBL或者到达SBL1启动emmc-appsbl之前阶段在这阶段我们只能有一种刷机模式EDL进EDL模式的方法只有这么几种:
emmc是空的(出厂),或你人为擦除掉SBL1(不能连电脑无法擦除,行不通这个方法)因为PBL没有检测到SBL1,运行异常所以能自动进入EDL.再就是用小米工程线来进入(原理USB D+ 接地)。再或者拆开手机主板短接emmc测试点接地(电池负极)也就是网上传的短接发(原理是PBL检测emmc异常)。以上都是高通9008模式。
2.手机出现厂商logo此时手机运行在appsbl阶段,加载了lk(emmc-appsbl.mbn)因为手机能显出logo说明手机硬件基本初始化完成。所以手机应该能进如fastboot,recovery,也能引导系统。此时手机通过按不同按键组合可以进入相应的模式如:音量上下键进入9008模式等。(手机硬件初始化完成所以所有硬件都能被检查到的)。
3.手机引导boot(有开机logo)阶段时可能崩溃此,此时手机会虚拟9006端口和mass storage挂载为U盘模式。进行刷机。
3. 当我们关机充电时,手机能充电且充电画面显示在手机上。手机的充电画面是从boot.img文件里的,说明手机能进入充电模式,系统已经启动到内核模式了。只是没有再向后加载而已。此时以上刷机方法都适用。
4.手机有启动动画(注意是动画),说明手机进入Android启动过程了。手机adb模式也可以用了。(adb模式是手机与电脑通讯的协议,当然手机端自己也可以用必须用busybox软件也就是Android壳。大名鼎鼎的Linux的bash壳)。
附注几种协议:firehouse协议pbl用。
Fastboot 协议 aboot用
Sahara 协议 sbl1用
Mass storage 大容量存储协议U盘模式。
MTP(Mass transmission protocol)大容量传输议。
手机刷坏emmc控制器但flash没坏的理解方法:
我的手机刷机之后,启动的logo页面自动关机。现在能有9008模式,能进fastboot不能进recovery。系统刷机没问题能刷进各种刷机包。但就是不能启动。用fastboot earse Cache命令fail。不能访问emmc控制的flash。
分析:
手机能启动到logo页面说明手机基本的硬件没有坏。也能充电,但是没有充电动画显示。说明手机能启动pbl sbl1 aboot。因为手机的logo和fastboot命令都在aboot程序里面所有手机能启动到aboot,手机为什么能启动到aboot因为手机访问emmc flash有两条通道一条是emmc协议,一条是sd卡协议。刷机能刷进的原因是flash没有损坏并且sd协议是有pbl的firehouse协议控制的。刷机时firehouse协议通过sd IC通道与flash交互并没有通过emmc通道,所以手机能刷进系统包。
手机启动到logo界面,说明手机启动到aboot阶段。那么手机是如何启动到aboot阶段的。首先pbl加载sbl1(通过sd卡通道加载,不通过emmc通道,因为此时还没初始化emmc通道)到缓存。Sbl1(通过sd卡通道加载,不过emmc通道,因为此时还没初始化emmc通道)加载aboot到内存,此时aboot初始化emmc,emmc通道可用。Aboot加载boot.img到内存(此时emmc通道可用),经过分析emmc控制器损坏所以aboot加载boot.img时出现错误(此时emmc可用但是emmc控制器损坏),手机不能启动。并且aboot加载recovery镜像时出错(此时emmc可用但是emmc控制器损坏)。此时手机不能再用sd卡通道了,因为这个通道比较慢。并且内存与emmc flash通过emmc协议通信的。此时emmc损坏不能与内存通信,会加载错误。包括fastboot earse Cache命令fail,也是在内存中执行会与emmc通道通信,所以也出现错误。
通过以上分析手机emmc 控制器损坏,但flash没坏。就会启动到logo界面。不能加载recovery不能加载boot.img。但是能通过pbl的firehouse通过SD卡协议与flash通信,能刷进成功但是不能够启动系统。