做车载高通平台的这几年,被问得最多的一句话是:“板子变砖了,还有救吗?”尤其是 SA8838、8155、8295 这几颗 SoC,只要摸过的人,几乎都经历过这样一个循环:下载完固件,开 QFIL,连上 USB,突然卡在 9008;或者刷到一半报错;又或者刷完开机后,IMEI 变成一长串 000000。这篇文章我想把这几年在 EDL、QCN、9008 短接、ABL/AIS 这些环节里踩过的坑,以及真正能解决问题的操作流程全部整理出来。你如果天天跟高通车载平台打交道,这份清单大概率能帮你少熬几个夜。
1. 平台调试的整体思路:先搞懂 EDL 和 QCN 这对“命门”
车载高通平台的调试,绕不开两个概念:EDL 模式和 QCN 备份。很多人刚接触时,一看到“9008”“EDL”就紧张,以为设备已经变砖、只能返厂;一看到“QCN”又不知道它到底存了什么,等到真正丢失时才追悔莫及。所以我想先从这两个最基础也最要命的概念讲起。
1.1 EDL 不是“砖”,是进入高通底层下载固件的大门
EDL 全称 Emergency Download Mode,是高通基带平台里一个非常特殊的底层下载模式。设备进入 EDL 后,主控不做普通启动,而是通过 USB 枚举成一个 Qualcomm HS-USB QDLoader 9008 设备,等待上位机通过 Firehose 协议下发引导代码和刷写指令。很多人一看到设备管理器里的黄色叹号,或者屏幕黑屏不亮,就以为 SoC 报废了。实际上这是调试里最好的一扇门:只要芯片本身没烧毁,EDL 模式几乎总能把你从“变砖”里捞回来。
进入 EDL 有三种常用方式。第一种是软件触发:在 fastboot 下执行fastboot oem edl,或者在某些平台上敲adb reboot edl,前提是 ABL 和内核还能跑。第二种是按键组合或 test point:工程板通常有专门的 EDL 测试点,通过短接两个 test point 触发。第三种是 9008 短接,这属于最粗暴也最通用的方法,但并不是随便找两根线都可以,后面我会单独讲。对于 SA8838、8155、8295 这几代平台,EDL 模式下的下载逻辑是相通的,都依赖 xbl、abl、tz 等分区表结构,也依赖同一套 Firehose 交互协议,只是不同硬件平台对应的 prog_firehose_ddr 引导文件不一样,不能拿一套包通刷所有板子。
1.2 QCN 比固件更值钱:先想清楚“身份证”怎么备份
QCN 是 Qualcomm Calibration Network 的配置集合,通俗点说就是基带侧的“身份证 + 病历本”。它里面不仅有 IMEI、MEID、Wi-Fi MAC、蓝牙地址,还有很多射频校准参数和 NV 项,比如 PA 增益、天线切换阈值、CA 组合、TDD/FDD band 支持。丢失 QCN 之后最直观的表现就是设置里看不到基带,拨号盘输*#06#没反应,系统提示“IMEI 未知”。
在 EDL 刷机过程中如果直接整片擦除 modst、fsg 或者 persist 等分区,而此前没有做过 QCN 备份,那基本只能回原厂返修,普通工具很难补回出厂级校准数据。所以我的第一个建议永远是:拿到任何一块新板子,第一件事不是急着刷最新的工程固件,而是通过 QXDM 或者 QCAlgo 把 QCN 完整备份一份,然后放到版本管理库里。你可能觉得这不过是一个几十 KB 的小文件,但在关键时刻,它就是设备唯一能证明“我是我”的东西。
2. 环境准备:USB 驱动、刷机工具、分区表全流程梳理
真正开始刷机之前,环境准备做得对不对,决定了后面会不会折腾到半夜。很多初学者把大量时间浪费在“驱动装不上”“工具连不上”上,其实大部分都是可以在五分钟内解决的问题。我把我常用的环境搭建顺序和选型思路放在这里。
2.1 高通 9008 驱动装上又消失?先从设备管理器的三条线索查起
驱动装不上,基本是每个接触高通平台的人遇到的第一个“劝退点”。常见的现象有:设备管理器里出现带黄色叹号的 Qualcomm HS-USB QDLoader 9008;端口能枚举出来,下一秒又消失;装驱动时提示“哈希数据错误”“拒绝访问”。
实际上,这往往不是驱动本身的问题,而是三个细节没注意到。第一,要选择与系统环境匹配的驱动。Qualcomm 的驱动版本很多,Win10/Win11 上建议装带 WHQL 签名的新版 QDLoader 9008 驱动。如果你用的是老版本,在 Win11 的强制签名机制下会出现装不上或一重启就掉回未知设备。第二,安装时要以管理员身份运行,并且处理好驱动签名。最简单可靠的流程是:关机,按“高级启动 -> 疑难解答 -> 启动设置 -> 重启”,在启动设置里选 7 进入“禁用驱动程序强制签名”,再开机安装。装完后建议不要马上拔线,等系统把端口识别成 Qualcomm QDLoader 9008 (COMxx) 再操作。第三,有些 USB 口是直连 Hub 的,前面板口很容易在 9008 模式下掉线,尽量用主机背板的 USB 2.0 口,避免设备反复枚举。
“高通烧录工具的 usb 驱动”,本质就是这套 QDLoader 驱动加上对应版本的 QPST 组件。不要只装 QPST 就以为驱动已经装好,这两个是两码事,驱动要单独装。
2.2 工具链选型:QFIL、QDL、fastboot 与 edl.py 各管一段
接触高通调试,绕不开几套工具。QPST/QFIL 是官方图形化工具,支持 EDL 模式下的整包刷写,上手门槛最低,适合标准量产包和救砖。QDL 是命令行风格的下载工具,适合脚本化批量操作。fastboot 是进入 ABL 后的官方刷机通道,刷 boot、dtbo、vendor_boot 都很快,也支持fastboot oem edl切回 EDL。edl.py 是开源工具,适合灵活加载自定义 firehose 文件,对分区级烧写和备份非常有帮助。
我个人在调试阶段最常用 QFIL 加 edl.py 的组合。QFIL 负责整包或手工分区刷写,edl.py 用来自定义备份、小范围写入。这里要提醒一句:firehose 文件与 SoC、DDR 配置强相关,SA8838 的 prog_firehose_ddr 不能硬塞给 8155,否则会直接报 Sahara protocol error。
2.3 分区表与 Firehose XML:为什么同一个刷机包会刷挂一块板子
高通平台刷机包的核心是 rawprogram0.xml 和 patch0.xml。前者定义了要下发的分区镜像路径和起始地址,后者是针对特定存储设备的补丁项。很多“刷一半失败”“刷完不开机”的实际原因,不是包不对,而是包和分区表不匹配。
比如 8155 平台和 8295 平台的 UFS 分区布局可能不同,它们的 xbl、abl、tz、hyp、aop、devcfg 等分区的起始扇区如果错位,写入后固件虽然还在,但启动链找不到对应镜像,自然开不了机。所以拿到一个新固件包时,先做一件事:用文本编辑器打开 rawprogram0.xml,核对里面的分区数量和名称,不要直接盲刷。再就是注意 patch0.xml,特别是涉及 deviceprogrammer 或者 storage 参数时,一字之差就能把整块板刷成“无法识别出分区表”的状态。真遇到这种问题,往往只能通过 9008 短接重新触发 EDL,再从头刷。
3. 完整实操:EDL 刷机与 QCN 备份恢复的关键流程
前面讲了原理和工具,这一节直接上操作。我会把 EDL 刷机和 QCN 恢复两条线分开,每一步都尽量说清楚“为什么这么做”。
3.1 EDL 刷机完整流程:从短接 9008 到验证开机
这里我以一块 8155 工程板为例,记录我常用的流程。假设板子已经完全变砖,连 ABL 都进不去:
第一步,先断开 USB,拆开外壳,找到主板上的 EDL 测试点或 9008 短接点。这里先强调一点:9008 短接“哪两根线能通用”是个伪命题,不同 SoC、不同硬件设计没有统一答案。安全的方法是查原理图,找 GND 和 USB 控制器附近的测试点,或者用厂家调试文档中标注的 EDL pad。拿镊子短接后保持住,插上 USB,等设备管理器出现 9008 设备。
第二步,安装 9008 驱动,确认端口号。注意看系统是否把它识别为 COM 口,而不是未知设备。
第三步,打开 QFIL,在 Select Build Type 里选择 Flat Build,点击 Browse 加载对应的 rawprogram0.xml、patch0.xml 和 prog_firehose_ddr.elf。
第四步,点击 Download。QDL 会先通过 Sahara 协议把 firehose 加载到内存,再开始逐个分区下发。
第五步,刷写过程中不要断电,不要乱碰 USB 线。如果笔记本支持,尽量插适配器。
第六步,全部完成后 QFIL 会提示 Download Success。这时不要急着强制重启,先断开 USB 和 UART 日志线,再正常上电。
第七步,如果能看到 Splash 或进入 ABL,基本算救回来了;如果还是黑屏,优先看 UART 日志,看卡在 xbl 还是 abl。
这套流程适用于 8155、8295、SA8838 等大部分高通车载平台,差异只在镜像路径和引导文件。
3.2 QCN 备份与恢复:不要等 IMEI 变成 000000 再后悔
QCN 备份我通常用 QXDM 来做,也可以用 QCAlgo 脚本自动化。打开 QXDM,把设备连好,确认端口是 DM 口,然后在命令行执行:
QCDM> QCDM_NV_READ_ALL如果工具支持,可以直接使用 NV Browser 里的 Backup 功能生成 QCN 文件。备份出来的 QCN 文件要保留原始的 partition 信息,不要手动删减。
恢复 QCN 的路径是在 QPST 里用 Software Download 的 QCN Back-up/Restore 工具,也可以再次用 QXDM 执行:
QCDM> QCDM_NV_WRITE_ALL但这里有一个隐含的危险:恢复 QCN 如果版本不匹配,会导致 NV 项缺失。所以恢复前一定要先确认 QCN 来自同型号板卡以及同一基带版本。实际调试中更稳妥的做法是把 QCN 备份拆成两部分看:第一部分是出厂校准类数据,包含 IMEI、射频校准、CA 组合,这些基本只在首次量产或维修场景需要;第二部分是日常开发配置,像 LTE 增强开关、band 配置、天线切换参数,这些会随着调试频繁改动,需要单独在 NV 管理工具里做快照。
3.3 ABL 和 AIS:最容易在刷机时被忽略的“安全锁”
ABL 是高通平台的 UEFI 应用引导加载器,它负责在 XBL 之后加载并校验 Linux 内核或 QNX Image,同时提供 fastboot 模式。8155/8295 里的 ABL 还集成了很多板级初始化逻辑,包括 DDR 频率配置、显示输出初始化。AIS 是 Automotive Image Security,高通车载平台对启动镜像做了签名校验。如果你刷入的是未签名或者签名失效的 boot、dtbo、vendor_boot,AIS 在校验失败后会直接拒绝加载,现象就是 fastboot 能识别设备,但fastboot boot boot.img后重启又回 fastboot。
所以遇到“fastboot 一闪而过”或者“看起来刷成功但一直进不了系统”时,优先怀疑 AIS 校验,而不是内核本身。工程板通常可以通过fastboot oem disable-verity或者关闭 secure boot,但量产的 SA8838 车机不要随意关,容易触发更严格的安全策略,后续想恢复会非常麻烦。
4. 十六个实战问题逐项拆解与排查技巧
下面进入全文最核心的部分。我把十六个问题按照设备枚举、刷写、基带、BSP、硬件信号五类来拆,先给出一张速查总表,后面的小节再展开细讲。
| 编号 | 问题现象 | 一句话快解 |
|---|---|---|
| 1 | 设备管理器只有 Unknown Device | 重新装带签名的 QDLoader 9008 驱动,换 USB 2.0 背板口 |
| 2 | 9008 设备反复消失 | 检查短接点接触和供电,关闭 USB 自动挂起 |
| 3 | 不知道 9008 短接点在哪 | 查原理图 EDL pad,不同板卡无通用短接线位 |
| 4 | Sahara protocol error | 换匹配 SoC 和 DDR 的 prog_firehose_ddr.elf |
| 5 | rawprogram0.xml 刷一半失败 | 检查分区表与板卡存储类型是否匹配 |
| 6 | 刷完黑屏,UART 卡在 xbl | 确认 xbl 和 DDR 频率配置,烧错包的概率大 |
| 7 | IMEI 变成 000000 | QCN 丢失,回退此前备份或送校准站 |
| 8 | 恢复 QCN 后 Wi-Fi MAC 异常 | 重新写入对应 NV 项后重启,确认文件版本 |
| 9 | LTE 掉网,CA 组合不生效 | 检查增强型 4G LTE 模式开关与 MCFG 配置 |
| 10 | 8155 的 QNX 引导失败 | 确认 hypervisor 分区与 fastboot 下发的 boot 链匹配 |
| 11 | AIS 校验失败导致无法启动 | 刷签名镜像,或工程板临时关闭安全启动 |
| 12 | CAF kernel 编译不过、设备树不匹配 | 按 tag 同步 vendor 分支,核对 dtsi 差异 |
| 13 | chi-cdk 摄像头预览初始化失败 | 看 camera 节点权限,检查 sensor 驱动与 CHI override |
| 14 | x62 模块固件升级后 USB 不枚举 | 重新安装模块驱动,擦除 modemst1/2 后重新配置 |
| 15 | 音频底噪大于预期、信号干扰大 | 在硬件和驱动层检查低通/带通/带阻滤波配置 |
| 16 | UFS/eMMC 颗粒差异导致识别异常 | 刷对应存储类型的 deviceprogrammer,不要混用 |
4.1 枚举类问题:驱动叹号、端口反复识别、短接点迷路
先说问题1、2、3,这三个基本都是设备无法稳定进入 EDL。
问题3“不知道 9008 短接点在哪”,很多新手在网上搜“9008短接哪两根线可以通用”,希望找到一个万能答案。这里必须说清楚:不存在一个通用位置。同一颗 SoC 在不同车厂、不同硬件设计上的 EDL test point 都可能不同。常见设计是在核心板底部留两个圆形 pad,附近丝印有 EDL 或 BOOT_DL 字样。查找方式有三种:查硬件原理图中的 EDL 网络名;用万用表量到 GND 的短接点,但前提是先确认不是电源脚;有的板子在 USB 座附近有 CLK 脚或调试串口号,不能乱短。
问题2“9008 设备反复消失”,很多时候是因为短接点接触不稳定。9008 模式下设备耗电很小,但对时序要求高,如果短接弹开,USB 会立刻断开。所以操作时最好用镊子夹稳,或者使用带锁扣的飞线。另外,Windows 的 USB 自动挂起设置偶尔也会干扰枚举,可以在电源选项里把 USB 选择性暂停关闭。
问题1“驱动叹号”,除了前面 2.1 节说的安装方法,还有一个容易被忽略的点:端口被其它调试工具占用。比如你同时开着 QXDM 和串口助手,边刷边抓日志,某些老版本 QXDM 会抢占 DM 口,导致 QFIL 读不到端口。建议刷机时把所有内部的 modem 日志工具全部关掉,只保留 QFIL 或一次一个工具。
4.2 刷写类问题:固件包不匹配、分区表错误、刷完反复重启
这里对应问题4、5、6。
问题4“Sahara protocol error”,最常见的例子是 QFIL 加载 prog_firehose_ddr.elf 时返回 Sahara protocol error 7。原因一般是引导文件和 CPU/DDR 不匹配。SA8838 与 8155 的 firehose 引导文件不能混用,即便都是高通平台,DDR 初始化代码可能不同。解决办法就是找对应的刷机包,把里面自带的 firehose 文件拿来用,不要自己从别的包里提取替换。
问题5“rawprogram0.xml 刷一半失败”,很大概率是分区表与板子的存储设备不匹配。例如同一个工程目录下有两个 rawprogram0.xml,一个对应 UFS,一个对应 eMMC,如果你选错,写到一半就可能遇到扇区越界。稳妥做法是打开 XML 搜索 xbl、abl 等分区名,看它们指向的物理扇区是否在存储设备的容量范围内。
问题6“刷完黑屏,UART 卡在 xbl”,这种情况基本确定是 xbl 镜像有问题。UART 卡在 xbl 的原因通常是:xbl 内部加载了 DDR 初始化配置,而配置与板上的 DDR 颗粒不一致,或者 xbl 的存储驱动与 UFS/eMMC 版本不一致。这时候不要反复重刷同一个包,先确认固件版本对应的是硬件 pre-silicon 还是量产硬件。还有可能只是 xbl 刷写不完整,重新在 EDL 下单独刷 xbl 分区即可。
4.3 基带类问题:LTE 增强开关、IMEI 丢失、MAC 地址异常
这里对应问题7、8、9。
问题7“IMEI 变成 000000”,说明 EFS/NV 已经清空或损坏。最有效的方法是恢复 QCN,而不是重新烧一个 modem 分区,因为 IMEI 和校准数据不在 modem 分区里。如果没有任何备份,只能从同批次同硬件版本的板卡读取参考 QCN,但这样恢复出来的校准数据可能不是最优的,生产级校准数据只有校准站能补。另外,恢复后必须重启设备再验证,不能只在 QXDM 里看 NV 项,要拨一次*#06#确认。
问题8“恢复 QCN 后 Wi-Fi MAC 异常”,通常是因为 QCN 文件来自不同板卡,Wi-Fi MAC 和蓝牙地址也是 NV 项的一部分,恢复后直接覆盖成了来源板卡的地址。处理方式是在 QXDM 中找到对应的 MAC 地址 NV 项,手动改回设备标签上的出厂地址。如果设备外壳没有地址标签,可以在原厂系统的设置页里提前截图保存。
问题9“LTE 掉网,CA 组合不生效”,这就要说到“增强型 4G LTE 模式开关代码”。在 Android 车载系统里,设置中会有一个“增强型 4G LTE 模式”开关,它主要控制 VoLTE 和 LTE-Advanced 相关能力。上层切换的代码一般在packages/services/Telephony或CarrierConfig中,通过类似这样的方式写入:
// 示意代码:在车载设置中切换增强型 4G LTE 模式 Settings.Global.putInt(context.getContentResolver(), "enhanced_4g_mode_enabled", enabled ? 1 : 0);但底层 modem 是否真正开启 CA,还要看 NV 项和 MCFG 配置。实际项目里,如果发现 CA 组合不生效,第一步不是改 Java 层,而是先用 QXDM 导出 RF 相关 NV 项,确认 CA band 组合是否使能。很多车机为了过认证,量产包默认关闭了部分 CA 组合,这属于策略配置,不是代码 bug。
4.4 BSP 类问题:CAF kernel、8155 QNX、chi-cdk 与 x62 模块
这里对应问题10到14,是 BSP 工程师最常接触的部分。
问题10“8155 的 QNX 引导失败”,主要出现在带 Hypervisor 的仪表方案里。8155 上 QNX 跑在虚拟机侧,EDL 刷机时涉及 hyp、tz、xbl、abl、vbmeta 等分区,如果这些分区本身没问题,但 QNX 镜像启动失败,多半是 fastboot 把内核刷错到了 HLOS 分区。务必区分 HLOS 与 QNX 镜像的分区映射。比如某些软件版本用 vendor_boot 承载 QNX 启动链,另一些版本则独立命名 qnx、qnx_cdsp 分区,刷之前一定要对照分区表确认。
问题11“AIS 校验失败”,我在 3.3 节已经提过。这里补充一个技巧:如何在 fastboot 下快速判断是不是 AIS 问题。执行fastboot getvar all,如果能看到off-mode-charge: 0这类正常变量,但fastboot boot xxx.img后立刻回到 fastboot,大概率就是签名校验不通过。工程板在进入 fastboot 后执行fastboot oem disable-verity只能关闭 dm-verity,不一定能关闭 AIS,需要找厂商的工程版 abl 才能彻底绕过。
问题12“CAF kernel 编译不过、设备树不匹配”。高通 CAF kernel 的问题集中在版本分支和 device tree。SA8838、8155、8295 对应的 vendor 分支不同,直接用同一条内核代码去编不同平台,最典型的问题是 dtsi 节点 mismatch,比如 GPU 频率表、display 节点、camera 节点对不上。调试时不要只看编译错误,先检查arch/arm64/boot/dts/vendor/qcom/下的 dtsi 注释和分支 tag。常见操作:
# 查看当前分支和最近提交 git log --oneline -20 # 对比两个平台内核配置 make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- defconfig如果两个平台共用一套代码,务必确认 CONFIG 里打开了对应 SoC 的 config fragment。
问题13“chi-cdk 摄像头预览初始化失败”。chi-cdk 是骁龙平台相机 HAL 的配置开发套件,在 SA8838 上调试摄像头时,最常遇到 sensor 节点权限不足,SELinux 拒绝访问 i2c 总线。处理路径是:先用adb shell dmesg | grep -i cam确认错误,再用adb shell setenforce 0临时验证,如果临时关闭后正常,就说明是 sepolicy 问题,再去补 allow 规则。Camera 架构涉及 CamX、CHI、usecase、pipeline,改动一个 usecase 往往需要重新生成对应的 binary,不是简单改 XML 就能生效。另外,/vendor/etc/camera/下的配置目录如果和板级 sensor 型号不一致,初始化也会失败,要先核对 sensor ID。
问题14“x62 模块固件升级后 USB 不枚举”。x62 是高通骁龙 X62 5G 调制解调器,常见于车联网模组。固件升级后 USB 不枚举,通常是因为升级过程中把模块内置的 boot 索引刷坏了,或者 USB VID/PID 变化后上位机驱动没匹配。处理方式是:插入模块,看系统是否识别到 Qualcomm HS-USB 设备;如果没有,就用模块厂商的紧急下载工具重新进入 download mode,再刷一次正式固件。同时要留意 modemst1/modemst2 分区,升级前后最好各做一次单独备份,因为这两个分区保存了模块侧的 NV 状态。
4.5 硬件与信号类问题:滤波配置、UFS/eMMC 差异和供电波动
这里对应问题15和16,以及一些表面上“软件能解决”,实际必须回到硬件层面的坑。
问题15“音频底噪大、信号干扰大”。很多人在软件上排查很久,结果是滤波电路没匹配好。高通平台在射频前端会按频段区分低通、带通、带阻滤波器,用来滤除带外杂散。调试时要注意:低通滤波器的截止频率不能低于当前 band 的发射频段上沿,否则会衰减主信号;带通滤波器要关注带宽和插损,插损太大会直接影响传导功率;带阻滤波器多用于抑制 TDD 杂散和 GPS 二次谐波,位置如果放错,抑制效果会打折扣。如果硬件已经改版,软件层面能做的有限;但如果只是配置问题,可以在 modem 配置里调整天线开关的 MIPI 参数。还有一个容易被忽略的点:车载平台的音频 Codec 到功放之间,如果功放供电纹波大,底噪问题会特别明显,这时候换滤波电容比改 DSP 参数更有效。
问题16“UFS/eMMC 颗粒差异导致识别异常”。SA8838/8295 大多用 UFS,8155 有些低配板是 eMMC,对应的 rawprogram0.xml 和 deviceprogrammer 需要一致。用 eMMC 的包刷到 UFS 板子上,可能不会立即报错,但刷完 xbl 起来后就是反复黑屏。所以每次拿到新固件包,先确认包名里的 storage 标识。另外,同是 UFS,不同厂商颗粒对 xbl 里的 DeviceProgrammer 也有兼容性要求,极少数情况下需要厂商提供针对某颗粒的补丁包。
供电波动在 9008 模式同样不可忽视。有些笔记本的 USB 口在枚举瞬间掉压,9008 设备就会反复消失。建议用一个带外置供电的 USB Hub,单独给设备供电。这个操作看起来很简单,但实际救过我好几次。
5. 一次真实事故复盘:9008 短接救砖到 QCN 恢复的全过程
前面的内容偏方法,这一节我讲一个真实发生过的事故复盘。这样的案例比任何教程都有说服力,也能让你看到 9008 和 QCN 在实战里到底是怎么配合的。
5.1 事故经过:误刷工程固件引发的基带全没
有一块 8295 核心板,原本跑着正常版本。由于现场需要验证一个新的 camera 驱动,同事从厂商 FTP 下载了一个“latest engineering image”,直接在 fastboot 下把 boot、dtbo、vendor_boot 刷了。随后发现串口日志停在 ABL,再来一次 fastboot 都进不去,而且手头没有提前做 QCN 备份。
上电后设备管理器偶尔弹一下 9008 又消失,能确定 SoC 还有救,但需要 9008 短接稳住。我们在核心板背面找到两个标注 EDL 的测试 pad,用镊子短接,插上 USB,这次总算正确枚举到了 Qualcomm QDLoader 9008 的 COM 口。
5.2 恢复过程:从 9008 短接到 QCN 恢复的完整记录
由于没有 QCN 备份,只能先把系统救回来。操作流程是这样的:
- 在 9008 模式下用 QFIL 重新刷入完整量产分区表。
- 刷完后设备能进 ABL,fastboot devices 能看到设备。
- 再用 fastboot 分别刷入 vbmeta、boot、dtbo、vendor_boot。
- 重启后系统正常,但基带状态变成未知,
*#06#无响应。 - 从另一台同批次、同版本的板子上备份 QCN,作为临时参考。
- 用 QPST 的 QCN Restore 恢复后,IMEI 恢复,但 Wi-Fi MAC 与出厂值不一致。
- 最后通过修改对应 NV 项,把 Wi-Fi MAC 改回出厂标签值。
这次事故最大的教训是:刷任何固件之前,一定先备份 QCN;同批次板卡可以作为临时恢复来源,但不能保证完全一致。如果不是同批次,IMEI 和校准数据会直接写错,比不恢复还要麻烦。
5.3 复盘:哪些步骤本来可以做得更稳妥
把这次失误总结成三条。第一条,下载新固件后不应直接全量刷入,应先解包检查版本号和分区表,尤其要确认不是 pre-silicon 工程包。第二条,工程板长期调试时,应该建立“板卡档案”,包括 QCN、分区表、驱动版本、固件版本,每次硬件改动前都记录快照。第三条,对于带安全校验的板子,临时关闭 AIS 之前要确认后续能恢复,不要为了省事把安全启动关掉后忘记重新打开。
6. 建立一套能救命的调试习惯与工具管理方法
技术问题可以靠查资料熬过去,但习惯不好,会反复踩同一个坑。最后这部分聊一些更长期有效的方法论。
6.1 先备份、再动手:一条铁律
我见过太多工程师拿到新板子直接刷工程包,刷挂了到处找救砖工具。真正最省时间的做法,是把“备份 QCN、备份全部分区镜像、备份分区表”作为拿到新板子后的第一天任务。具体备份方法很简单:进入 EDL 模式后,用 edl.py 读全部分区,把 rawprogram0.xml 和分区镜像存到网盘或代码仓库;再通过 QXDM 备份 QCN。整个过程不超半小时,但能在未来几个月里省下大量返修时间。
6.2 日志和 NV 工程文件归档:让问题可回溯
调试高通平台时,日志特别多。如果不做归档,出了问题根本不知道是哪个版本引入的。我自己习惯用日期加板卡编号命名 UART 日志,例如8295_BOARD03_20250101_boot_fail.log。修改 NV 之前,先导出一份当前 NV 项的快照,修改后再导一份,用 diff 工具比较差异。这样即使后来发现某个功能异常,也能快速定位是不是某次 NV 修改导致。
6.3 工具链版本锁定:多人协作时不因环境差异翻车
多人协作时,最怕 A 同事电脑上是 QPST 2.7,B 同事电脑上是 QPST 2.8,同一块板卡刷出来的结果完全不同。建议在项目组里固定一套工具链:统一 QPST 版本、驱动版本、Firehose 版本、edl.py 版本,并把版本号写进项目文档。遇到奇怪问题时,第一步先确认对方用的工具版本是否与项目一致,往往能排除很多干扰。
另外,工具箱里永远放一把好的镊子、一根独立供电的 USB Hub、一块预先格式化好的备份盘。这些看上去很不起眼的东西,往往比一堆调试软件更能救命。