Qualcomm checksparse和ptool工具的使用小结

前言
本文记录的目的,一方面是对相关问题的记录,另一方面介绍下在调试过程中,通过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
Qualcomm checksparse和ptool工具的使用小结

上一篇:FLINK-connectors-写入ES6


下一篇:ROS2机器人笔记20-12-04