高通车载平台EDL刷机与QCN恢复实战:16个坑与解决方案
2026/9/12 11:12:07 网站建设 项目流程

车载高通平台调试是个细活,尤其是到了 SA8838/8155/8295 这一代,EDL 模式下刷错一个分区、QCN 备份漏了一个 NV 项,轻则重来一遍,重则直接变砖返厂。这篇文章把我自己踩过的坑、在群里看别人踩过的坑、以及帮别人远程救回来的砖,整理成 16 个实战问题,覆盖从 EDL 救砖到 QCN 恢复的完整链路。适合正在做车载平台驱动、BSP、系统集成或者售后支持的工程师,尤其是刚接手高通平台、对 Firehose 和 QCN 还不熟的朋友。内容全部来自真实调试现场,不是文档翻译,每一节都会说清楚“当时发生了什么、为什么会出现、最后怎么解的”,能帮你少走很多弯路。

1. 先建立整体认知:EDL 与 QCN 在调试链路中的位置

1.1 为什么车载平台比手机平台更容易“刷死”

很多人是从手机高通平台转到车载平台的,第一个感觉就是:这玩意怎么这么容易变砖?其实不是更容易变砖,而是车载平台的启动链路更复杂、分区更多、校验更严格,加上车厂往往有自定义的安全策略,导致同样一个误操作,在手机上可能只是重启一下就能恢复,在车机上直接卡在 EDL 或者干脆不识别。

以 8155 这一代为例,启动流程大致是:PBL -> SBL/XBL -> ABL -> UEFI -> QNX/Android。PBL 固化在芯片内部,一般刷不坏;但从 XBL 开始,每一级都有签名校验,而且校验链是逐级传递的。你如果在 EDL 模式下刷了一个不匹配的 XBL,下一级校验直接失败,系统就停在黑屏或者 9008 端口反复枚举。SA8838 和 8295 的校验策略更严格,部分项目还会加上 JTAG 熔断、secure boot 熔断,一旦熔断位被置上,想降级或者刷非官方镜像基本没戏。

QCN 的定位则完全不同。QCN 是高通平台的射频校准和 NV 配置备份文件,里面存的是 IMEI、MAC、射频校准参数、功率表、天线调谐配置等。QCN 不参与启动引导,但一旦丢了或者错了,最容易看到的现象就是:基带不识别、没信号、Wi-Fi/蓝牙打不开、校准不过。在车载场景里,QCN 恢复往往比刷系统更频繁,因为很多项目在产线上会做“整机备份”,售后维修换板后需要恢复 QCN,而这一步经常因为版本混用、端口占用、备份不完整而翻车。

1.2 先搞懂 PBL、XBL、ABL 的区别,再谈刷机

调试车载高通平台,如果连 PBL、XBL、ABL 的区别都没吃透,遇到问题根本无从下手。我见过太多人一上来就问“为什么我进不了 EDL”,结果发现是拿 ABL 当 XBL 刷了。

简单说,PBL(Primary Boot Loader)是芯片 ROM 里固化的第一段代码,上电后 CPU 最先执行它,它的主要工作就是初始化最基本的硬件,然后从存储介质里加载 XBL。PBL 本身不受 OTA 和刷机影响,所以它也是 EDL 模式得以存在的根基。XBL(eXtensible Boot Loader)是 PBL 之后加载的第二级引导,它负责初始化 DDR、存储、显示等,同时完成签名校验和可信链建立。ABL(Apps Boot Loader)则是在 XBL 之后运行在应用处理器侧的引导,主要负责加载系统内核或者引导 QNX/Android。

搞清楚这个链路之后,很多“刷完不开机”的问题就能快速定位层级。比如刷完黑屏、完全没有 log,大概率是 XBL 之前就挂了;能亮厂家 logo 但进不了系统,问题大概率在 ABL 或内核侧。EDL 模式下的分区烧写也是按这个链路来的,先烧 XBL,再烧 ABL,然后才是系统分区。顺序错了,砖的概率极高。

1.3 工具链选型:QFIL、QPM 还是命令行 Firehose

EDL 模式下最常用的工具是 QFIL,它是高通 Flash Image Loader 的 GUI 版本,对新手友好,点几下就能烧。但 QFIL 有两个问题:一是对分区表变化的项目支持不够灵活,二是出问题时报错信息非常隐晦,经常就是一句“ERROR: function: rx_data: rx data timeout”,让你完全不知道是线的问题、驱动的问题还是镜像的问题。

所以我自己在车载项目上更习惯直接调 firehose 命令,也就是用 qdl 或者自己写的 Python 脚本调用 firehose XML 接口。Firehose 是 XBL 里集成的一个协议层,运行在 EDL 模式下,通过 USB 或者 UART 接收主机的 XML 命令,完成擦除、写入、读取等操作。用命令行的好处是能精确控制每一步,出问题时能看到完整的 XML 请求和响应,而不是在 GUI 里干瞪眼。

工具选型我建议按这个原则来:新人和快速烧录用 QFIL,批量生产和自动化测试用命令行 firehose,涉及分区表修改或低层级调试建议直接用 qdl。不要指望一个工具通吃所有场景,尤其是在车载这种多配置、多分区、多安全策略的环境里,灵活性和可控性比界面友好更重要。

2. EDL 模式实战:从进不去到刷不对的五个高频坑

2.1 问题一:按键组合死活进不了 EDL,9008 端口不出现

这是最常见的开场问题。8155/8295 平台的 EDL 进入方式通常有三种:短接 EDL 测试点、组合按键、软件命令重启到 EDL。但车载平台因为硬件设计差异很大,很多板子的 EDL 测试点并没有引出来,组合按键也因为中控面板没有实体音量键而不可用。

我遇到过一个项目,硬件工程师在设计时把 EDL 测试点放在了核心板内部,根本没有对外引出,导致软件侧想进 EDL 只能靠 adb reboot edl 或者 fastboot oem edl。但问题是当时系统已经卡死在 XBL 阶段,ADB 根本起不来。最后只能拿镊子短接核心板上的两颗电阻,才勉强进入 EDL。所以拿到新平台,第一件事一定是找硬件要原理图,确认 EDL 测试点的位置、电平逻辑、是否有保护二极管,而不是等到变砖了再到处找。

排除硬件布局后,软件层面最常用的进 EDL 方法是:

  • 系统活着时:adb root 后执行 adb reboot edl
  • 系统挂了但 fastboot 能用:fastboot oem edl
  • 只剩串口时:在 UART console 里执行 reboot edl
  • 以上都不行:短接测试点强制进入

进 EDL 后,PC 端设备管理器里应出现 Qualcomm HS-USB QDLoader 9008 端口。如果插上没反应,优先检查 USB 线是否支持数据传输、驱动是否安装、是否被其他工具占用端口。注意车载调试中很多 USB 口是经过隔离芯片或者切换芯片的,电平不对也会导致枚举失败。

2.2 问题二:驱动不识别或者识别为 900E 而不是 9008

9008 和 900E 的区别是很多人忽略的。正常进入 EDL 后,设备应枚举为 9008。如果显示 900E,说明芯片没有完全进入 EDL,而是进入了某种受限模式,通常是 PBL 阶段加载不到 XBL 或者签名校验失败导致的。这种情况下,QFIL 能看到端口但无法正常连接,刷机必然失败。

900E 常见原因有三个:

  • EDL 模式下 PBL 尝试加载的 XBL 不存在或者被破坏了
  • 芯片已经熔断,不允许加载非授权镜像
  • 硬件上供电不稳定,导致 PBL 执行到一半异常

处理 900E 的思路是先区分是软件问题还是硬件问题。如果能确认之前刷过正常系统,且没有做过熔断操作,那大概率是 XBL 被破坏了。这个时候不要尝试刷整个分区,而是先用 firehose 的 fh.attrs 或者 QFIL 的 “Flat Build” 模式,只烧写 XBL 分区。烧完后重启,看端口是否变回 9008。如果端口还是 900E,那就需要考虑硬件链路了,比如供电、时钟、复位信号是否正常。

另有一个容易被忽视的点:部分平台在 EDL 模式下默认加载的是 UFS 或者 eMMC 的初始化代码,如果你的 UFS 固件版本和 XBL 不匹配,也会导致 PBL 卡住。这种问题在换过存储颗粒的板子上特别常见,排查起来很折腾。

2.3 问题三:Firehose 连接失败或者 XML 命令报错

QFIL 在烧录时提示 “Download Fail: Firehose device Not found” 或者 “Sahara Protocol Error”,这类报错通常不是设备坏了,而是 host 端和 target 端的协议握手出了问题。Sahara 是 PBL 阶段和 host 通信的图像传输协议,用于把 firehose 程序加载到内存中执行。如果 Sahara 阶段就断了,后面根本走不到 firehose 的 XML 交互。

排查路径可以这样走:

  • 确认 9008 端口稳定存在,如果端口反复消失,先解决枚举问题
  • 确认 QFIL 配置的 programmer 文件(即 firehose 的 .elf/.mbn)和当前平台匹配
  • 确认所用 rawprogram.xml 和 patch.xml 中的分区信息是否和目标板一致
  • 检查 host 侧是否安装了多个版本的 QPST,导致驱动和工具版本冲突

这里我要特别强调 programmer 文件的重要性。SA8838、8155、8295 的 firehose 镜像是不通用的,甚至同一颗芯片不同硬件版本、不同存储方案,对应的 programmer 都可能不同。比如 8155 用 UFS 和用 eMMC 的 programmer 就是两个文件。你把 eMMC 版本的 programmer 刷到 UFS 板子上,Sahara 阶段大概率就挂了。所以下载镜像时一定看清硬件配置,不要只是看芯片型号一样就直接开刷。

2.4 问题四:烧写过程中 USB 断开、超时、数据写错位

烧录进行到一半 USB 断开是最让人崩溃的。这种情况最常见的根因是供电不稳。EDL 模式下芯片虽然不跑完整系统,但 UFS 写入时电流波动很大,如果调试板的供电是从 USB 取的,很可能会出现瞬间压降,触发芯片复位或者 USB 控制器异常。车载调试建议全程用外部电源或者车机本身的电源供电,不要只靠 USB 供电。

另一个原因是 host 侧 USB 的电源管理策略,尤其是笔记本,Windows 会默认开启 USB 选择性暂停,烧录中设备断开后重新枚举,正好打断 firehose 的传输。进设备管理器把 USB Root Hub 的“允许计算机关闭此设备以节约电源”全部关掉,能明显降低断连概率。

还有一个更隐蔽的问题:烧写时分区表和数据不匹配。常见于项目改过 emmc 或者 UFS 的分区布局,但 rawprogram.xml 还是旧版本,烧到一半地址越界,抛出的错误往往不是“地址错误”,而是“data timeout”。这时候不要怀疑线材或者驱动,先检查分区表是否匹配。生产环境中我建议每次烧录前都对比 rawprogram.xml 里的分区起始地址和大小,以及当前系统的分区表,而不是直接沿用上一版配置文件。

2.5 问题五:刷完全新镜像后无法开机,反复进入 EDL

刷完镜像后依然反复进 EDL,说明启动链路没有建立起来。这个问题我排查过很多次,最后发现大多数是没按正确顺序烧写,或者漏烧了某个基础分区。比如有人先烧了 system 再烧 xbl,虽然每一步 QFIL 都提示成功,但因为签名校验或者依赖关系,最终启动就是失败。

正确的烧写顺序原则是从底层往上层烧:xbl、abl、tz、hyp、devcfg、rpm 这些 bootloader 和信任链相关分区必须在系统分区之前烧写。而且很多平台要求这几个分区在一个连续的烧写会话里完成,不能分多次。如果中途断了,第二次补烧时因为 boot 状态已经被上次的结果影响,就可能出问题。

还有一类特殊情况是 secure boot 已经开启,你刷的镜像必须带有效的数字签名。车载项目经常会有 lab 车和产线车的区别,lab 车可能关掉了 secure boot,产线车是开着的。你把 lab 车的镜像拿到产线车上刷,底层分区校验直接挂,表现出来就是反复进 EDL。遇到这种情况,先确认刷写机的版本是否带正确的签名镜像,而不是盲目换工具。

3. QCN 备份与恢复:比刷机更看基本功

3.1 问题六:备份出来的 QCN 是空文件或者大小明显不对

QCN 备份是 NV 和射频数据的导出,正常备份出来的文件大小应该在几十 KB 到几百 KB 之间,具体取决于平台和 NV 项数量。如果你备份出来的 QCN 只有几 KB 甚至 0KB,十有八九是备份时的通信链路不对。

最常见的错误是用 QPST 的 RF NV Manager 备份时,选择了错误的端口。8155/8295 平台上,除了 9008 这类诊断口,还有一个通过 USB 枚举出的 DM 口(通常名字是 Qualcomm HS-USB Diagnostics 或类似)。如果端口选错,工具虽然能打开,但读不到完整的 NV 数据,生成的文件自然不对。

另外需要注意,部分平台在 EDL 模式下无法进行 QCN 备份,因为 NV 访问依赖 DIAG 服务,而 DIAG 服务是在系统启动后才注册的。所以正确流程应该是:正常开机进入系统,确保 DIAG 端口出现,然后通过 QPST 或者 QXDM 连接该端口进行 NV 备份。只有在系统起不来、需要救回射频数据的时候,才考虑在 EDL 模式下配合特殊工具去读。

我强烈建议在建项目初期就规定“每台调试机首次点亮后立即备份 QCN”,把它写入 checklist。因为很多板子在研发早期 NV 数据是正常的,但经过多次刷机、崩溃、写操作之后,NV 可能已经被破坏。有一份早期干净备份,后面不管怎么折腾都有后悔药。

3.2 问题七:恢复 QCN 后没有信号,但 QCN 文件本身没问题

这种情况往往不是 QCN 文件的内容坏了,而是恢复时 NV 生效机制没走对。QCN 恢复后,很多 NV 项需要重新加载才能生效,尤其是校准参数和 IMEI。只恢复文件不重启,或者重启方式不对,都可能出现“QCN 文件检查没问题,但信号始终没有”的奇怪状态。

规范做法是恢复 QCN 之后,先重启系统完整开机,然后通过 *#06# 或者 AT+CGSN 确认 IMEI 是否恢复,再去设置里查看基带版本和信号强度。如果 IMEI 正常但无信号,则进入 NV 的 active 状态确认。有些平台需要单独写入一个“NV 激活标志”或者触发一次 RF 校准,否则恢复的参数不会生效。

另外,恢复 QCN 时要注意当前系统版本和 QCN 来源版本的匹配度。比如 QCN 是从 Android 版本抓的,但当前系统已经升级到了 QNX 版本,NV 项的索引和定义可能有差异。强行恢复轻则无信号,重则导致 NV 损坏。遇到这种版本跨度过大的情况,建议先做差分对比,只恢复关键的 IMEI、MAC 和射频校准项,而不是整个 QCN 盲刷。

还有一点容易被忽略:QCN 恢复时车机端在诊断模式下不能被其他软件占用。我遇到过一个人同时开了 QXDM 和 QPST 的 RF NV Manager,两边同时在写 NV,结果 QCN 恢复到一半被另一个工具的写操作打断,直接把某个 NV 项写残了。多开工具在 NV 操作上是高危行为,尤其是产线环境,一定要保证只有一台 PC 的一个工具在操作。

3.3 问题八:QCN 里有 IMEI 但恢复后 IMEI 变成 0 或者异常

IMEI 丢失或者恢复后变成 0,这几乎是售后返修里最常见的情况。QCN 恢复后 IMEI 不对,先别急着重新刷 QCN,要先确认是不是 NV 的写保护或者安全策略把 IMEI 拦了。

很多车载平台在量产阶段会开启 NV 安全保护,禁止用户态随意修改 IMEI。这种情况下,即使 QCN 里 IMEI 是正确的,恢复过程中写 NV 的操作也会被底层安全模块拒绝,表现出来就是恢复完成后 IMEI 变成 0 或者不生效。解决方式不是绕过保护,而是联系平台方或者安全团队,通过授权通道写入 IMEI。

另外,少部分情况是 QCN 文件本身 IMEI 就是错的。因为备份 QCN 时,如果板子已经被刷过或者 NV 已经被污染,备份出来的 IMEI 就可能已经是异常值。我之前就遇到过一块板子,备份 QCN 前 IMEI 显示正常,但备份出来的文件里 IMEI 却全是 0。后来发现是备份工具读取时和 DIAG 服务通信异常,读到的 NV 块是不完整的。所以在备份 QCN 后,一定再用工具单独读一遍 IMEI 确认文件内容正确,不要只看文件大小。

3.4 问题九:QCN 恢复时提示“端口被占用”或者“无法打开 NV”

NV 操作比普通刷机更依赖稳定的诊断链路,所以端口占用问题在 QCN 恢复时尤其突出。QFIL 和 QPST 不会一直占用端口,但某些版本的 QXDM 或者自定义的 NV 写入工具会在后台挂住端口不释放,导致下一个工具打不开。

排查方式很简单:打开设备管理器,看 DIAG 端口是否处于“已连接”状态;再打开任务管理器,把 QXDM、QPST Server、QMUX 相关的进程全部结束;必要时直接拔插 USB 重新枚举端口。如果拔插后端口号变了,而你的工具软件里配置了固定的端口号,需要同步更新。

比较隐蔽的是有些工具的“重启端口”机制,它会发送一个 NV 重启命令,让目标机的 DIAG 端口断开并重新枚举。这个过程中如果 host 端工具检测不到端口消失和重现,就会一直卡在“等待设备”的状态。这种情况不是故障,强行杀进程再重试就行,不用去动硬件。

还有一个生产环境要注意的:Windows 的资源管理器偶尔会抢 USB 设备的控制权,或者杀毒软件会拦截 QPST 创建的虚拟串口。产线工位建议提前做好 whitelist,把 QPST、QFIL 的安装目录和临时目录全部加入白名单,避免恢复 QCN 时杀毒软件突然介入导致中断。

3.5 问题十:QCN 恢复后天线校准失效,信号弱或者搜不到网

QCN 恢复后出现信号弱、搜不到网络的情况,可能是你恢复的 QCN 不包含该硬件版本的射频校准数据。因为不同批次的天线匹配、功放特性和板材参数是有差异的,产线在出厂前都会做一次射频校准,校准结果保存在 NV 中。如果你用另一台板子的 QCN 来恢复,虽然 IMEI 和基本 NV 项是好的,但射频校准参数不匹配,就会出现信号极差的问题。

这种问题在售后换板场景中几乎无法避免,因为换来的新板子 NV 可能是出厂默认值,没有本机的射频校准数据。正确做法是:恢复 QCN 后,必须到产线或者实验室做一次完整的射频校准(比如通过 CMW500 或者综测仪跑校准项),然后再验证信号强度。只靠 QCN 恢复是不可能替代硬件校准的。

另外,在实验阶段,如果只是需要点亮模组、验证功能,可以临时关闭自动校准项,用默认 NV 启动,但一定要清楚这只是临时方案。很多工程师图省事,恢复一个“万能 QCN”之后不发测试信号正常就归档了,结果后面量产时全部出问题。这里面的坑在于,实验室环境信号条件好,天线失配可能不明显,但装到整车上后,因为车体遮挡和天线位置变化,问题才会暴露出来。

4. 标准之外:SA8838 与 8295 平台的特殊问题

4.1 问题十一:SA8838 平台 EDL 下无法识别 UFS,命令报“storage not found”

SA8838 这一代平台我调试得比较多,它和 8155 的存储管理有一些差异。比较典型的一个问题是:EDL 模式下,firehose 无法识别 UFS 设备,烧写任何分区都报 “storage not found” 或者 “failed to find partition”。

这个问题常见的原因是 UFS 进入了低功耗模式或者掉电状态。EDL 模式下 XBL 虽然做了基本的存储初始化,但某些平台的 UFS 需要额外的电压或者使能信号。如果硬件设计上 UFS 的供电被某个 GPIO 控制,而该 GPIO 在 EDL 模式下不是默认有效电平,UFS 就不会正常工作。

这时最先要做的不是反复烧写,而是用示波器量 UFS 供电和使能引脚的时序。如果确认是供电时序问题,可以考虑修改 XBL 配置里的 GPIO 初始化,或者先短接/拉高对应 GPIO 再进入 EDL。不过这个改动需要重新编译 XBL,一般 BSP 团队才能操作。对于普通调试人员,我的建议是先从硬件侧确认 EDL 模式下 UFS 供电是否正常,因为很多时候只是原理图上的一颗负载开关没有打开。

另一个可能性是 UFS 的参考时钟没有起振。EDL 模式下 XBL 会初始化时钟树,如果参考时钟频率或者使能脚配置不对,UFS 同样无法识别。这种情况下,Sahara 阶段抓 log 通常能看到 UFS init 失败的详细原因,可以用 QFIL 的 “Dump Log” 或者串口 log 确认。

4.2 问题十二:8295 平台烧写 QNX 后 EDL 端口消失,设备管理器出现未知设备

8295 平台性能更强,但调试中遇到的一个典型问题是:烧写完 QNX 镜像后,设备管理器里 9008 端口消失,取而代之的是一个带黄色感叹号的未知设备。很多人都以为变砖了,其实不一定是。

原因在于 8295 平台的 USB 配置可能来自 QNX 侧加载的 USB 配置表。系统没起来时,USB 控制器处于默认状态,枚举出来的是一个 vendor 特定的 interface,需要在 PC 上安装对应驱动(通常是带的 USB driver)才能识别成 9008。这个驱动不是高通通用 QDLoader 驱动,而是平台特有的。

解决方法是:先看设备属性里的 VID/PID,如果是 05C6/9008 但显示“未知设备”,手动更新驱动指向 QPST 安装目录里的驱动文件即可。如果 VID/PID 都不对,那就不是驱动问题,而是硬件或者镜像的问题。

还有一个只有 8295 才会遇到的特殊情况:因为 8295 支持多个 Display 和多个 USB controller,某些项目会把 EDL 对应的 USB 口配置到车机后背板上一个不常用的口。你在调试时如果用错了 USB 口,会发现怎么插都没反应,但用另一个口一插就出 9008。拿到新平台必须确认 EDL 在硬件上走的是哪个 USB 口,不要想当然地以为只有 Type-C 调试口可以。

4.3 问题十三:CAF Kernel 改动后无法启动,日志停在 DDR 初始化失败

做平台调试难免要改 kernel,尤其是从 CodeAurora(现在叫 Qualcomm Innovation Center)拉下来的 CAF kernel。8295 和 8155 的 CAF 版本对编译器、DTS、ABL 传参都有严格要求。我遇到过内核编译没有任何 error,但启动到 XBL 加载 kernel 时直接卡死,log 显示 DDR 初始化失败。

这个问题的根源很多,不只是 kernel 本身。XBL 阶段会做 DDR training,training 参数是从设备树和 XBL 配置中读取的。如果你更新的 kernel 里 DTS 中的 DDR 配置和当前硬件版本不匹配,比如频率过高、时序参数不对,或者某个 PHY 的设置被意外覆盖,就会导致 DDR 初始化失败。解决方案是回退 DTS 中 DDR 相关的部分,不一定是整个 kernel 回退。

另外,编译工具链版本也可能导致问题。CAF 社区源码官方测试用的编译器版本是固定的,如果本地用了更高版本的 GCC 或者 Clang,生成的代码在 XBL 加载阶段可能因为 ABI 变化导致异常。遇到这种“代码没问题但跑不起来”的情况,先检查编译链版本是否和官方一致。车载平台上,稳定压倒一切,不要追求新编译器。

4.4 问题十四:QNX 侧日志抓不到,qcmd 和 pipe 工具不起作用

8155/8295 上了 QNX 之后,很多从 Android 转过来的工程师会不适应日志系统。Android 有 logcat,QNX 侧主要是 slogger 和 qcmd。调试 EDL 和系统启动问题时,QNX 侧的日志尤其重要,因为很多 kernel panic 和驱动异常只在 QNX 侧有 log。

qcmd 是通过诊断口和 QNX 侧服务通信的命令行工具,功能很强大,但在车载平台上经常因为权限问题或者服务未启动而无法使用。如果你输入 qcmd 后没有反应,先确认 QNX 侧的相关服务是否起来,比如 qmuxd、diag 服务。有些项目为了安全默认是不开 qcmd 的,需要在启动参数里手动加上。

常见替代方案是直接用串口连 QNX 的 serial console,在 shell 里执行 sloginfo 或者 tail 日志文件。这个在启动早期更可靠,因为 qcmd 依赖的 USB 诊断链路在系统没完全起来时也未必可用。踩了好几次坑之后,我现在默认方案是:只要涉及启动阶段问题,优先串口日志;只有系统起来后需要交互式查询,才用 qcmd。

4.5 问题十五:看门狗复位导致 EDL 烧写失败,烧到一半板子自动重启

看门狗(Watchdog)在车载平台上比手机上更严格。很多项目的 PMIC 里配置了硬件看门狗,如果系统没有及时喂狗,硬件直接断电重启。这在正常运行中是好事,但在 EDL 烧写过程中却可能导致灾难性问题:烧写到一半,板子因为看门狗超时断电,USB 连接断开,UFS 上的数据可能处于不一致状态,下次启动直接卡死。

如果你发现 EDL 烧写总是中途失败,并且板子上的电源灯闪了一下或者复位脚有毛刺,就要考虑看门狗的问题。解决方法有几个:

  • 从硬件上临时禁用或者延长看门狗的超时时间
  • 在 XBL 启动参数中配置“烧写模式”跳过看门狗初始化
  • 确保 EDL 模式下所有 GPIO 状态满足看门狗禁用条件

这个问题的麻烦之处在于,不同项目的看门狗策略是硬件和系统团队各自定义的,没有统一配置。我建议调试前先跟硬件确认:这款板的 PMIC watchdog 在 EDL 下是否生效?如果生效,超时时间是多少?很多硬件工程师自己也说不清,那就只能实测:进 EDL 不操作,看多久板子会自动重启。如果有自动重启,那就必须先解决看门狗再谈烧录。

4.6 问题十六:Secure Boot 熔断后无法回退到非安全镜像

最后一个问题也是最棘手的:Secure Boot 熔断后想回退到非安全镜像,这是不可能的。高通平台的熔断是一次性的,efuse 一旦熔断就不能恢复。所以任何回退思路都是错的,应该顺着安全启动链去适配。

熔断后能做的操作只有刷带正确签名的安全镜像,也就是所谓 secure 版本。如果手上没有匹配的签名镜像,唯一出路是联系平台方案商或者芯片原厂签署新镜像。这里要强调,不要尝试任何“绕过 secure boot”的破解方式,车载安全设计不是摆设,自己调试的板子搞坏了还可以换,但量产车辆的安全机制被破坏就是事故。

在项目开发阶段,我强烈建议把 lab 车和产线车严格分开,lab 车保持非熔断状态,所有未经签名的调试镜像只在 lab 车上使用。产线车不刷任何非安全版本。有些公司为了省事直接用产线车做开发,结果某次误刷非安全镜像后,整台车的控制器直接被锁死,这个教训希望你们不要重蹈覆辙。

5. 问题速查表与最后的实操建议

5.1 问题速查表

问题现象根因方向首选处理方案
进不了 EDL,无 9008 端口EDL 测试点未引出/按键不可用查原理图,确认 EDL 测试点和 USB 口位置
设备枚举为 900EXBL 被破坏或签名校验失败只重烧 XBL 分区,确认镜像版本匹配
Firehose 连接失败programmer 文件不匹配核对芯片+存储类型对应的 firehose 镜像
烧写中断开供电不稳/USB 省电策略外接电源,关闭 USB 选择性暂停
刷完反复进 EDL烧写顺序错误或镜像不匹配按底层到上层顺序重烧,确认 secure boot 状态
QCN 备份为空端口选择错误/DIAG 未就绪系统完全启动后再操作,选 DIAG 端口
恢复 QCN 后无信号NV 未生效或版本不匹配重启后确认 IMEI,必要时单独激活 NV
IMEI 恢复后为 0NV 写保护/QCN 本身异常走授权通道写 IMEI,回读备份验证有效性
QCN 端口被占用其他工具未释放端口杀进程、拔插 USB、更新工具端口配置
恢复后信号差射频校准数据不匹配做完整射频校准,不依赖 QCN 恢复校准
UFS 无法识别供电/时钟时序问题量 UFS 供电与参考时钟,核查 XBL 配置
6008 变未知设备驱动不匹配/USB 口不对手动更新驱动,核对硬件上 EDL 对应的 USB 口
DDR 初始化失败DTS 配置和硬件不匹配回退 DDR 相关 DTS,核对编译工具链
qcmd 无输出服务未启动或禁用用串口 console 替代,检查 QNX 服务配置
烧录中自动重启硬件看门狗生效确认看门狗策略,启用烧写模式跳过
Secure Boot 熔断后无法回退一次性熔断不可逆申请签名镜像,严格分离 lab/产线车环境

5.2 调试工作的两个底层习惯

最后分享一个我自己的经验:无论多急、多像“玄学”的问题,回到底层链路去排查永远比瞎试快。EDL 问题就回归启动链路,QCN 问题就回归 NV 生成和生效链路,把每一层的可能因素列出来逐个排除。很多问题看起来千奇百怪,实际就是某一层的配置和硬件不匹配。

另一个习惯是自动化记录每一步操作。把每次刷机、每次 QCN 恢复的命令行、工具版本、镜像 hash、执行时间全部记录下来。这样出了问题,翻记录就能快速定位是哪一步引入的,而不是靠记忆猜。这个习惯帮我省下来的时间,比任何一个调试工具都多。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询