当前位置:   article > 正文

Qualcomm checksparse和ptool工具的使用小结

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的内容对应下载。
尝试用meta build版本下载,主要是AP+BP的代码的整合,然后选择匹配的content.xml,最后是需要QFIL直接访问代码编译目录.

2.flat_build下载
flat build还是比较推荐的,我们后面提到的check_sparse和ptool都是基于flat build下载而匹配的工具,下载方式此处不展开,基本高通平台都类似,
主要是针对以下文件做文章
prog_firehose_ddr.elf ------ firehose下载协议
partition.xml ------ 分区表
rawprogram0.xml ------ QFIL下载image的指向表
patch0.xml ------ 刷机软件根据手机服务端返回的具体磁盘大小打上最后一个分区的补丁、完成分区表头校验的配置文件,没有正确的 patch0.xml分区表头就不能通过校验,手机也启动不了
rawprogram0_WIPE_PARTITIONS.xml ------ 擦除分区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

  • 1
  • 2
  • 3
  • 4

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)
...
...
        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")
...
...

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

CreateErasingRawProgramFiles调用的CreateFileOfZeros函数

def CreateFileOfZeros(filename,num_sectors):

    try:
        opfile = open(filename, "w+b")
...
    temp = [0]*(SECTOR_SIZE_IN_BYTES*num_sectors)
    zeros = struct.pack("%iB"%(SECTOR_SIZE_IN_BYTES*num_sectors),*temp)
    try:
        opfile.write(zeros)
...
...
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

open(filename,mode):打开文件,mode可以为:w,r,a,若想同时读写,则加上+,若想以二进制读写,则加上b.

解决实际问题
问题点1:采用metadata加密userdata之后,出现刷机完成重启之后,拔电池重启会因metadata分区加密Key损坏或者与keymaster不匹配而导致无法正常进入主Launcer,一直停在动画界面.
解决方法,每次QFIL下载时用zeros_33sectors.bin填充metadata分区下载,每次下载即擦除metadata分区,来防止掉电引发的开机问题.

问题点2:
开启secureboot之后,我们的fastboot模式下刷入非签名的分区,导致开机进9008,eg. 下图中apdp.mbn,此分区image是调试相关的,secureboot不会针对此做签名,同样通过zeros_33sectors.bin擦除,即可保证正常开机.

生成的擦除镜像的配置rawprogram0_WIPE_PARTITIONS.xml
在这里插入图片描述
问题点3:
擦除下载userdata可以实现不同rom大小的flash的兼容,通常客户的需求会有不同的Ram/Rom组合,当然Ram的兼容不需要对刷机固件做改动,但是Rom,因为涉及不同的userdata的大小配置,这样做兼容就恰到好处了.
直接擦除下载userdate,用zeros_33sectors.bin填充userdate下载的filename.
另外,需要强调的是一点不要忘记我们fstab上,挂载userdata的参数需要加上check,formattable,否则,出现的问题是,因为在启动挂在userdata时找不到可挂载分区,而直接进入recovery擦除userdata,才能正常启动.

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/寸_铁/article/detail/805780
推荐阅读
相关标签
  

闽ICP备14008679号