watt(DCD) 刷机实操踩坑实录

2026-07-17 在 Linux + 公司 corplink 环境实操刷 watt 台架(ab876012,非熔丝 unlocked,user-root .D 包)的全过程。本机最终未刷成——卡在 edl V1.6 工具固有 bug + 公司网络阻断 github,但全部 7 道墙已定位到根因。下次换 Windows QFIL / 个人机 bkerler 可直接成功。

0. 环境与 ROM

  • 设备:ab876012,watt / DCD / Qualcomm SA8295,非熔丝ro.boot.secboot=0)、unlockedro.boot.flash.locked=0device_state=unlockedverifiedbootstate=orange
  • ROM:watt_M_26.07.17.S.CN.D_1479_..._12_Uroot_IMAGES.zip(user-root,debug 签名,.D 包)
  • 解压后 watt_images/ufs0/ + ufs1/(双 UFS)+ edl.sh / flashfastdual.sh / rawprogram_all.xml / patch_all.xml / prog_firehose_ddr.elf
  • 主机:Ubuntu + 公司 corplink(edlp 数据防泄漏)+ 公司网络(阻断 github)

1. 正确路径(官方,DCD/XCD刷机教程)

watt(8295) 只能走 EDL(9008)

  1. 金手指进 EDL + 关心跳:关台架电源 → 按住金手指按钮 → 上电 → 保持 5s+ 松开 → 设备进 05c6:9008 + MCU 自动关闭心跳(40 分钟窗口)
  2. lsusb05c6:9008 → 进 watt_images/sudo ./edl.sh -f(刷 ufs0 + ufs1)
  3. 断电重新上电

2. 踩坑实录(按遇到顺序)

坑 1:fastboot 路完全不可行(8295 心跳)

  • 想走 flashfastdual.sh(fastboot 双UFS),但 8295 心跳只能金手指关setprop persist.soc_heartbeat_switch false 设了 reboot 后 prop 丢失(8295 不认这个 prop,那是 8650/XCD 的)
  • release MCU 心跳 60s 超时 → 刷 system_la.img.sparse(916MB)中途 MCU 重启 SoC → 刷失败/变砖
  • 依据:SOC心跳超时60秒方案评估.md 明确”reset -f/fastboot 刷机会失败”
  • 结论:8295/watt 别想 fastboot,老老实实 EDL

坑 2:sudo: ./edl.sh:找不到命令

  • ROM 解压后 edl.sh 权限 -rw-rw-r--(丢了 +x)
  • sudo 对无执行权限的命令报”找不到命令”(误导)
  • 解法chmod +x edl.sh flashfastdual.sh

坑 3:/dev/bus/usb 节点文件名与 devnum 错位

  • 多次 adb/fastboot/9008 切换让 devnum 累积,udev 残留旧节点:/dev/bus/usb/001/019(minor=18)占着文件名 019,真 9008(devnum19,minor19)被迫待在 020
  • edl 按 devnum 标准路径 /dev/bus/usb/001/019 open → 开到残留 devnum18 → device not found
  • 部分解法sudo mknod -m 660 /dev/bus/usb/001/019 c 189 19(覆盖残留)。但重新金手指(设备重新上电枚举)更干净

坑 4:edl V1.6 搜索 bug(致命,工具固有)

  • strace 实锤:edlopenat(/sys/bus/usb/devices/1-12/idProduct)(读到 9008),没读 idVendor、没 open 任何 /dev/bus/usb,直接 device not found
  • 重新金手指(USB 全新枚举)+ claim 干净(pyusb 能 claim)+ 单设备 都不解决 → 证明是 edl V1.6 二进制里的 9008 搜索逻辑 bug,与设备/环境无关
  • 修不了(二进制),只能换工具

坑 5:内核驱动占 interface 0(USBError 16 Resource busy)

  • pyusb claim_interface(dev,0) 报 busy,root 也不行,authorized 重置不清
  • is_kernel_driver_active(0)=Truedetach_kernel_driver(0) 后 claim OK
  • 奇怪点:/sys/bus/usb/devices/1-12/1-12:1.0/driver 显示”无”(内核 quirk,驱动绑了但符号链接没建)
  • 解法:重新金手指(设备重新上电)清掉了这个占用;代码里 detach_kernel_driver 绕过
  • claim busy 时怀疑 corplink edlp 拦 USB(DLP 特征:lsusb 能读描述符但 claim/bulk 被拦)
  • 停 corplink(systemctl stop + pkill corplink-uc)后 claim 还 busy → corplink 清白(真元凶是坑 5 的内核驱动)
  • 副作用:corplink 停了断了公司网络认证 → pip 连不上 PyPI → 启回 corplink 恢复
  • 教训:corplink 和 USB claim 无关,别轻易停(停了断网 + 合规风险)

坑 7:bkerler/edl 装不上(github 公司阻断)

  • 想换开源 bkerler/edl(自动 detach kernel driver + claim + firehose,专为高通 9008)
  • pip install edl-client → PyPI No matching distribution(bkerler/edl 不在 PyPI)
  • git clone github.com/bkerler/edl(含 —depth 1)→ 70s 超时 → 公司网络阻断 github
  • 结论:本机装不了 bkerler/edl

3. 本机刷不通的根本原因(一句话)

USB 硬件完全 OK(claim 干净),纯粹卡在 Linux 工具链:edl V1.6 固有搜索 bug(二进制修不了)+ 公司网络阻断 github(bkerler 装不上)= 没有能用的刷机工具。

4. 下次怎么成功

按推荐度排序:

  1. Windows QFIL + 小米汽车 PC 刷机鉴权工具(官方推荐,绕过所有 Linux 坑)
    • DCD与XCD刷机教程.md Windows 节 + 小米座舱PC刷机鉴权工具v2.0-使用说明.md
    • 要先申请账号权限(小米汽车PC刷机鉴权工具-账号权限申请.md
  2. 个人机 / 无 corplink 无公司网络的机器pip install git+https://github.com/bkerler/edl.git 能装上 → edl --firehose prog_firehose_ddr.elf flash ...(本机已证 USB claim OK,bkerler 能 open 9008)
  3. 离线 bkerler:在能联网的机器上 pip download edl-client(或 clone bkerler/edl + 依赖 wheel),打包拷到本机 pip install --no-index --find-links=./wheels edl-client
  4. 修 edl V1.6:逆向定位搜索 bug(读 idProduct 后没读 idVendor / 没算 devnum→节点路径),patch 二进制;或向上游反馈要新版

5. 关键命令备查

# 非熔丝/unlocked 判断(8295 用 secboot)
adb shell getprop ro.boot.secboot      # =0 非熔丝
adb shell getprop ro.boot.flash.locked # =0 unlocked
 
# 进 EDL(金手指物理):关电→按住金手指→上电5s+→松开
lsusb | grep 9008                      # 见 05c6:9008 = 进 EDL
 
# 刷机(edl.sh 自带 TOPDIR,会自己 cd ufs0/ufs1)
cd watt_images && sudo ./edl.sh -f
 
# USB 可访问性验证(pyusb,判断是工具bug还是USB问题)
python3 -c "import usb.core,usb.util; d=usb.core.find(idVendor=0x05c6,idProduct=0x9008); \
  print('found',d is not None); usb.util.claim_interface(d,0); print('claim OK')"
 
# 节点错位排查(文件名应==minor==devnum)
ls -la /dev/bus/usb/001/
 
# claim busy 时 detach 内核驱动
python3 -c "import usb.core; d=usb.core.find(idVendor=0x05c6,idProduct=0x9008); \
  d.detach_kernel_driver(0) if d.is_kernel_driver_active(0) else None"

6. 给刷机工具改造的输入(car_rom_worker.py)

当前工具只认 flash_all.sh(XCD/ampere/newton),watt/DCD 双UFS 包没有。改造要点:

  • 识别 DCD/watt 包:检测 watt_images/edl.sh + flashfastdual.sh + ufs0/ufs1
  • 分流到 EDL 流程:金手指进 9008(提示用户物理操作)→ sudo ./edl.sh -f
  • 不能套用 fastboot 流程(关心跳→adb reboot bootloader→flash_all.sh),8295 走不通
  • 8295 心跳:金手指进 EDL 自动关,工具只需提示”40 分钟窗口”
  • 节点错位 / kernel driver 占用:工具内 detach_kernel_driver 或提示重新上电