前言
本文记录的目的,一方面是对相关问题的记录,另一方面介绍下在调试过程中,通过checksparse和ptool生成相关镜像解决的实际问题。虽然主题是生成Qualcomm Rom包的过程,就结果而言,通过工具将程序刷写进终端设备才是最终的目的.
下载工具之QFIL(Qualcomm Flash Image Loader)
本篇文章只是简单提到涉及和本文主题相关的QFIL的使用方面,更多的内容,鉴于QFIL工具的强大,后续可以考虑单独成篇.
1.meta_build 下载方式:
实话说,这种下载方式除了文档上列出,本人也只是停留与了解,主要是此种方式。需要整套的AP+BP的代码,代码下载及编译方式就要求工程师也要对BP也有一定的了解. 考虑到大部分公司开发,BP侧都是编译好的镜像直接在编译AP代码时做固定的拷贝动作,所以总体来说meta build的下载方式,开发效率可能需要打折扣。
镜像编译目录分布太散,编译生成image不直观,个人感觉容易出错,QFIL下载时,是按照content.xml的内容对应下载。
2.flat_build下载
flat build还是比较推荐的,我们后面提到的check_sparse和ptool都是基于flat build下载而匹配的工具,下载方式此处不展开,基本高通平台都类似,
主要是针对以下文件做文章
prog_firehose_ddr.elf ------ firehose下载协议
partition.xml ------ 分区表
rawprogram0.xml ------ QFIL下载image的指向表
patch0.xml ------
rawprogram0_WIPE_PARTITIONS.xml
ptool工具及打散checksparse工具的基本使用命令如下:
python ${IMAGE_RELSE_PATH}/ptool/ptool.py -x partition.xml
python ${IMAGE_RELSE_PATH}/ptool/checksparse.py -i rawprogram0.xml
cp rawprogram0.xml rawprogram_unsparse.xml
checksparse 和ptool工具的源码路径位于BP,由于和不同的芯片平台有关,下述仅供参考
Agatti.LA.1.0.1/common/config/storage/
因为遇到一个需要擦除分区的问题,此处提一下创建分区擦除镜像zeros_33sectors.bin函数
def CreateErasingRawProgramFiles():
CreateFileOfZeros("zeros_1sector.bin",1)
CreateFileOfZeros("zeros_%dsectors.bin" % BackupGPTNumLBAs,BackupGPTNumLBAs)
##import pdb; pdb.set_trace()
for i in range(8): # PHY partitions 0 to 7 exist (with 4,5,6,7 as GPPs)
if i==3:
continue # no such PHY partition as of Feb 23, 2012
temp = Element('data')
temp.append(Comment('NOTE: This is an ** Autogenerated file **'))
temp.append(Comment('NOTE: Sector size is %ibytes'%SECTOR_SIZE_IN_BYTES))
UpdateRawProgram(temp,0, 0.5, i, 0, 1, "zeros_33sectors.bin", "false", "Overwrite MBR sector")
UpdateRawProgram(temp,1, BackupGPTNumLBAs*SECTOR_SIZE_IN_BYTES/1024.0, i, 0, BackupGPTNumLBAs, "zeros_%dsectors.bin" % BackupGPTNumLBAs, "false", "Overwrite Primary GPT Sectors")
UpdateRawProgram(temp,-BackupGPTNumLBAs, BackupGPTNumLBAs*SECTOR_SIZE_IN_BYTES/1024.0, i, 0, BackupGPTNumLBAs, "zeros_%dsectors.bin" % BackupGPTNumLBAs, "false", "Overwrite Backup GPT Sectors")
RAW_PROGRAM = '%swipe_rawprogram_PHY%d.xml' % (OutputFolder,i)
opfile = open(RAW_PROGRAM, "w")
opfile.write( prettify(temp) )
opfile.close()
print "Created \"%s\"\t<-- Used to *wipe/erase* partition information" % RAW_PROGRAM
NumPartitions = 0
SizeOfPartitionArray= 0
CreateErasingRawProgramFiles调用的CreateFileOfZeros函数
def CreateFileOfZeros(filename,num_sectors):
try:
opfile = open(filename, "w+b")
except Exception, x:
print "ERROR: Could not create '%s', cwd=%s" % (filename,os.getcwd() )
print "REASON: %s" % (x)
sys.exit(1)
temp = [0]*(SECTOR_SIZE_IN_BYTES*num_sectors)
zeros = struct.pack("%iB"%(SECTOR_SIZE_IN_BYTES*num_sectors),*temp)
try:
opfile.write(zeros)
except Exception, x:
print "ERROR: Could not write zeros to '%s'\nREASON: %s" % (filename,x)
sys.exit(1)
try:
opfile.close()
except Exception, x:
print "\tWARNING: Could not close %s" % filename
print "REASON: %s" % (x)
print "Created \"%s\"\t\t<-- full of binary zeros - used by \"wipe\" rawprogram files" % filename
open(filename,mode):打开文件,mode可以为:w,r,a,若想同时读写,则加上+,若想以二进制读写,则加上b.
解决实际问题
问题点:采用metadata加密userdata之后,出现刷机完成重启之后,拔电池重启会因metadata分区加密Key损坏或者与keymaster不匹配而导致无法正常进入主Launcer,一直停在动画界面.
生成的擦除镜像的配置rawprogram0_WIPE_PARTITIONS.xml