记一次展讯CPU安卓手机刷成砖后的救砖记录

手里有3个设备使用展锐的CPU,分别是 中兴u30air,海信a7cc,天翼一号2022
最近想把它们root,u30成功了,正得意,到了海信a7cc和天翼一号2022的时候,直接一键成砖了,
折腾了十几小时,查遍资料,终于救回了一个a7cc,写下此文,希望能帮到遇到同样问题的人.

我对解锁 刷机 root 这方面了解其实不多,并不是这方面大佬,以下很多内容只是个人粗浅的理解,并不一定完全正确,有很多操作,我并不清除详细的原理.如果有大佬发现我的理解有错,请务必告知,或者有可以补充的,也请说一下.
本文可能比较啰嗦,为了确保不出差错,一定要认真阅读完全文再操作,确保自己知道每一步在做什么,会有什么后果,再认真考虑要怎么操作,不要无脑复制指令去执行.

下载的工具

SPD驱动: https://androiddatahost.com/dsa6h
解锁工具包(这工具包能解锁也能救砖请看准机型下载): https://github.com/TomKing062/CVE-2022-38694_unlock_bootloader/releases

展锐的刷机模式(SPD U2S DIAG)和成砖的原因

*警告: 使用这个指令会大概率成砖,很难救回,一定要看完全文,做好充足准备,再来考虑要不要执行
展锐的CPU有个刷机模式,在打开ADB以后,执行 adb reboot autodloader 这个指令就能进入.
*警告: 使用这个指令会大概率成砖,很难救回,一定要看完全文,做好充足准备,再来考虑要不要执行

展锐的分区表,有个分区叫做 splloader ,这个分区用于引导设备开机,如果被擦除,开机就会就会进入SPD模式,无论怎么重启都会进入这个模式
这个模式需要安装SPD驱动,才能被电脑识别,识别后在设备管理器的 端口COM 分支之下应该有一个设备 "SPRD U2S DIAG",这个模式有时候会卡住,需要插着数据线 长按 电源+音量上键 或者 电源+音量下 或者三个键都按 对SPD进行复位,才能恢复
有些机型,一旦执行了上面的指令,就会自动擦除 splloader (好沙雕的设计,很多设备的成砖原因) 对于这种机型,可以先按着音量下键和电源键10秒重启,如果成功,可能可以不删splloader进入SPD模式

如果你只进行了这一步,也许可以尝试这么救: 有些设备可能有一个 splloader_bak 分区,可以尝试进行导出 覆盖到splloader
*注: 这只是个人猜测,我不确定能不能成,如果有人用了这招,希望能给个反馈,告诉我这行不行

但是,有些人可能在尝试解锁的时候,把这个splloader_bak也给刷没了,那就用不了这招了.比如我这就是这样,使用了一些"一键解锁BL.bat" "unlock.bat" 之类的脚本,这些脚本并没有进行解释每一步都做了啥,也没有很明显的中文警告,说明这个操作多危险.
很多自动解锁脚本一上来就把splloader splloader_bak分区都给清空了(因为刷机过程需要反复重启N次,他们需要在重启后自动进入SPD模式),脚本可能会自动备份,但并没有明确的中文提醒用的人这备份文件非常重要,不能弄丢,很多人就把备份文件弄丢了(一错再错的悲剧).

关于存储器

展锐刷机有关的几个存储器(这一段是个人理解,仅供参考):
CPU内部有一片只读区域IROM,只读区域有一些基本的程序可以调用,这些基本程序应该是同款CPU都有的,不管什么机型同款CPU都有一样的程序
CPU内部有一片缓存(IRAM),这部分空间通常很小,在连接电脑后,电脑会在这刷入一些简单程序用来控制主板上其他芯片, 一个例子就是同款CPU可能使用不同型号 不同容量 不同速度 的内存DDR芯片,而这部分刷入的程序就可以对DDR进行配置
CPU之外有内存(DDR),DDR内存比较大,在刷机或者救砖的时候,如果需要在设备上进行一些复杂操作,会往这刷一个比较大的文件,然后调用.
持久化存储器:emmc或者ufs之类的.各种分区和分区表都在这里面.刷这部分应当慎重不要出差错.

上面几个存储器不管做了什么操作复位了就恢复了,而持久化这部分,你做的操作,即使复位了重启了也还是存在的,一定要小心!

工具包文件介绍

上面的链接里面有个工具包,找到自己机型对应的文件下载,里面的文件介绍
如果你的机型没有对应的工具包,那后面的内容帮不了你了,我暂时只会用这个工具包处理.

文件 介绍
spd_dump 这是用来连接展锐CPU的刷机工具
fdl1-dl.bin 这个文件刷入CPU内部的缓存区域(IRAM),它是一个很短的程序,用于一些简单的读刷操作
fdl2-dl.bin 这个文件通常比较大,刷入DDR才能用,这个提供更多刷写功能,可以有更多高级操作,比如初始化持久化存储器等.(有的机型没有这个文件,比如我的A7CC就没有,但有其他的)
其他文件 功能不明,但似乎和fdl2-dl.bin有一定相似性,是一些复杂的刷写功能实现程序
unlock.bat 这是进行解锁的脚本,如果你是来救砖的,随便执行这个有可能会导致更糟糕的结果!

注意: fdl1-dl.binfdl2-dl.bin 等文件,对于每一个型号的设备都不同的,刷入地址也不同,一定要找到适合自己设备的文件和地址!!

连接设备

*不要复制我的指令去执行,每个机型不一样的!
对于我的A7CC手机,使用这个指令连接上设备:

spd_dump --wait 300 exec_addr 0x3f28 fdl fdl1-dl.bin 0x5500 fdl uboot-mod.bin 0x9efffe00 exec

参数解析

参数 说明
--wait 300 等待设备连接,等待300秒(如果连不上可以基于前面说的组合键复位一下SPD看看)
exec_addr 0x3f28 将 customexec_no_verify_addr.bin 发送到指定的内存地址,以绕过brom对 splloader/fdl1 的签名验证
fdl fdl1-dl.bin 0x5500 fdl指令是发送文件,这里把fdl1-dl.bin文件发送到iram的0x5500地址,发送完会自动运行,进行DDR的初始化
fdl uboot-mod.bin 0x9efffe00 exec 把第二个文件发送到DDR,然后执行

你应该参考,你的unlock.bat里面第一行指令,可以得知你的设备需要刷什么文件,以及刷到什么地址,但请不要完全复制这第一行指令,因为它可能会改变持久化的存储器.救砖要慎重!
如果你此前已经执行过unlock.bat,文件夹内会生成不少文件,一定要复制一份做好备份,有些文件第二次执行指令就会破坏.

我的手机执行这条指令的结果(仅供参考):

branch:main, sha1:fa0becf5e3f026b3b99103c65de6eb9a8348b27c
Successfully connected to port: 14
CHECK_BAUD bootrom
BSL_REP_VER: "SPRD3\0"
CMD_CONNECT bootrom
current exec_addr is 0x3f28
SEND fdl1-dl.bin to 0x5500
SEND custom_exec_no_verify_3f28.bin to 0x3f28
EXEC FDL1
CHECK_BAUD FAIL
CHECK_BAUD FDL1
BSL_REP_VER: "Spreadtrum Boot Block version 1.1\0"
CMD_CONNECT FDL1
CHANGE_BAUD FDL1 to 921600
KEEP_CHARGE FDL1
SEND uboot-mod.bin to 0x9efffe00
FDL2: incompatible partition
EXEC FDL2
DISABLE_TRANSCODE
Reading Partition List
[=====                                   ] 12.5%
[==========                              ] 25.0%
[===============                         ] 37.5%
[====================                    ] 50.0%
[=========================               ] 62.5%
[==============================          ] 75.0%
[===================================     ] 87.5%
[========================================] 100.0%
Read Part Done: user_partition+0x0, target: 0x8000, read: 0x80000                            splloader     256KB1                             miscdata       5MB2                                 misc       1MB3                            nr_fixnv1       8MB4                            nr_fixnv2       8MB5                               prodnv      10MB6                        nr_runtimenv1      10MB7                        nr_runtimenv2      10MB8                             recovery      40MB9                              trustos       6MB10                          trustos_bak       6MB11                                  sml       1MB12                              sml_bak       1MB13                                uboot       1MB14                            uboot_bak       1MB15                            uboot_log       4MB16                                 logo       7MB17                            fbootlogo       7MB18                              l_pmsys       1MB19                              l_agdsp       6MB20                            gnssmodem       1MB21                             wcnmodem      10MB22                              persist       2MB23                               nr_spl       1MB24                               nr_sml       1MB25                             nr_uboot       1MB26                              nr_boot      35MB27                             nr_pmsys       1MB28                             nr_agdsp       6MB29                             nr_modem      40MB30                             nr_v3phy       8MB31                             nr_nrphy       8MB32                            nr_nrdsp1       5MB33                            nr_nrdsp2       5MB34                           nr_deltanv       2MB35                               teecfg       1MB36                           teecfg_bak       1MB37                                 boot      35MB38                                 dtbo       8MB39                                 flag       1MB40                                 diag       1MB41                                  tpf       8MB42                             phonelog     100MB43                           kdebuginfo     200MB44                           databackup      50MB45                            prospecfg       1MB46                              reserve      10MB47                               kdebug      10MB48                                super    9216MB49                                cache     256MB50                                socko      75MB51                                odmko      25MB52                               vbmeta       1MB53                           vbmeta_bak       1MB54                             metadata      16MB55                            sysdumpdb      10MB56                        vbmeta_system       1MB57                        vbmeta_vendor       1MB58                             userdata  108991MB
standard gpt table saved to pgpt.bin
skip saving sprd partition list packet
partition list saved to partition_1755088422.xml
Total number of partitions: 58
Storage is emmc
Device is not using VAB

一番输出后,如果没意外,应该可以进入SPD的命令行模式.

查看分区

输入 p 可以输出持久化区域的分区表.(如同上面)
如果这一步失败了,没有分区表,那我的文章可能解决不了你的问题了,我后面的操作都基于有分区表的前提.

读取分区进行备份

使用 r 分区名称 可以读取分区文件进行备份.
如果使用 r all 指令可以备份所有分区,但这会很慢,而且不一定成功,建议一个个分区进行备份.
备份过程如果突然出错,卡住,可以试试上面的组合键恢复.

先检查下成砖原因吧
先把 splloader读出来,用r splloader指令,然后你就会在工具目录下看到一个splloader.bin文件,用你熟悉的hex编辑器打开看看,不出意外得话,全是00,这就是你的设备成砖原因,和我的情况一样.

检查下splloader_bak分区是否有数据,这是个隐藏的分区,不在上面的分区表里,如果读出来里面不是全00.那这个也许可以把这个刷到splloader分区,然后重启,从而实现救砖(我并没有试过这个,因为在我的手机上,这个分区已经被清空了,如果你用这个方法救机成功,务必说一声,让我知道!)

救砖

以上如果两个都是全00,那只能在网上找这个设备对应的刷机包,从里面提取.
对于我的设备a7cc来说,官方就提供了一个完整的zip包,很坑的一点是,splloader分区的镜像被改名叫做u-boot-spl-16k.bin在刷机包里,而且大小也不同,导致我一时没认出来,花了十几个小时查资料,最后在一个老外的帖子里才知道u-boot-spl-16k.bin就是我要找的splloader镜像.
于是从刷机包里提取出来,刷入了上面俩分区.然后用reset指令重启,终于手机活了!
指令:

w splloader u-boot-spl-16k.bin
w splloader_bak u-boot-spl-16k.bin
reset

对于一些特别小众的品牌,甚至全网找不到刷机包的情况.这种非常头疼,如果无论如何想救机器,可以考虑找个二手的同款机器,提取里面的文件...(我没试过,可行性未知)

一些分区定义

prodnv 开机后系统中的 productinfo 分区,保存 adc 校准参数、eng.db 数据库。
Miscdata 保存 ota、recovery 时的一些数据
recovery 存放 recovery.img,恢复出厂设置
misc 保存杂项数据,如系统关闭开关上的 窗体中的设置相关。
trustos 存放 tos-sign.bin
Trustos_bak trustos 的备份,防止 trustos 破坏导致 系统无法开机。
sml 安全世界和非安全世界切换,即 Android 和 TOS 之间的切换、源管理功能、核上下电、睡眠等
Sml_bak sml 的备份,防止 sml 破坏导致系统 无法开机。
uboot 存放 ubootloader img。
Uboot_bak ubootloader img 的备份,防止 sml 破 坏导致系统无法开机。
Uboot_log 存放 uboot log。
logo 存放开机 logo 图片。
fbootlogo 存放 fastboot 模式的 logo 图片
L_fixnv1 存放 pubcp_nvitem.bin,射频参数相
L_fixnv2 fixnv1 的备份,防止 fixnv 破坏导致系 统无法开机。
L_runtimenv1 运行时由 modem 生成,是 fixnv 的一 份复制。
L_runtimenv2 L_runtimenv1 的备份,起到掉电保护 的作用。
boot 存放 boot.img,Kernel 驱动相关
dtbo 存放 dtbo.img。
super 存放 SUPER.img,Android 系统相 关。
cache 存放 cache.img,在 CTS 测试,恢复 出厂设置是需要使用。
Pm_sys 存放 cm4.bin。
L_modem 存放 pubcp_modem.dat,通信协议栈 相关。
vbmeta 存放 vbmeta-sign.img。
Uboot_a 存放 ubootloader img。
Boot_a 存放 boot.img,kernel 驱动相关。

资料引用

https://www.cnblogs.com/aiwanit/p/18133465
https://blog.csdn.net/linux12121/article/details/75579152
https://www.bilibili.com/opus/1050100039095943188
https://blog.csdn.net/z920981023/article/details/134633890
https://github.com/haropng/spd_dump/blob/main/README_zh.md