高通安卓设备DIAG端口启用指南

背景与目的

对于玩转高通平台安卓设备刷机的朋友来说,在刷写新固件前,备份基带(Baseband)或射频分区是必不可少的安全操作。这一步通常需要依赖高通的诊断(DIAG)端口才能完成。

然而,在很多设备上,尤其是刷写了第三方自定义 ROM(如 LineageOS)后,启用这个 DIAG 端口可能会遇到麻烦。标准方法往往失效,让人无从下手。

本文的目的很明确:第一,系统性地介绍在高通设备上启用 DIAG 端口的常规方法;第二,也是更重要的,当你在自定义 ROM 下发现标准方法失灵时,提供一个经过验证的、手动修复的解决方案

标准方法:如何通常启用 DIAG 端口

在绝大多数搭载原生或官方系统的高通安卓设备上,启用 DIAG 端口是一个相对简单的过程。核心思路是通过 ADB 命令,修改系统的一个属性值,告诉系统:"请在 USB 连接时,同时提供诊断端口。"

具体的命令如下:

bash 复制代码
adb root
adb shell setprop sys.usb.config adb
# 或
adb shell setprop sys.usb.config diag,adb

执行成功后,除了熟悉的"Android ADB Interface",还应该会多出一个名为 "Qualcomm HS-USB Diagnostics" 的端口(具体型号可能略有不同)。

问题与分析:为什么我的设备不行?

当你兴冲冲的在设备上输入上述命令后,很可能发现毫无反应------设备管理器里依然只有 ADB 端口,期待的 DIAG 端口并未出现。

以我自己的设备为例:小米6(刷入 LineageOS 22),就遇到了这个问题。

初步排查:首先可以排除内核驱动缺失的可能性。我们可以通过 ADB Shell 并切换到 Root 用户,查看系统底层的 USB 功能目录:

bash 复制代码
sagit:/ # ls -l /config/usb_gadget/g1/functions/
total 0
drwxr-xr-x 2 root root 0 1970-01-08 20:07 accessory.gs2
drwxr-xr-x 2 root root 0 1970-01-08 20:07 audio_source.gs3
drwxr-xr-x 2 root root 0 1970-01-08 20:07 cser.dun.0
drwxr-xr-x 2 root root 0 1970-01-08 20:07 cser.nmea.1
drwxr-xr-x 2 root root 0 1970-01-08 20:07 diag.diag
drwxr-xr-x 2 root root 0 1970-01-08 20:07 ffs.adb
drwxr-xr-x 2 root root 0 1970-01-08 20:07 gsi.rmnet
drwxr-xr-x 2 root root 0 1970-01-08 20:07 gsi.rndis
drwxr-xr-x 3 root root 0 1970-01-08 20:07 mass_storage.0
drwxr-xr-x 2 root root 0 1970-01-08 20:07 midi.gs5
drwxr-xr-x 3 root root 0 1970-01-08 20:07 mtp.gs0
drwxr-xr-x 3 root root 0 1970-01-08 20:07 ptp.gs1
drwxr-xr-x 2 root root 0 1970-01-08 20:07 qdss.qdss

在这个目录下,你通常能看到 diag.diagffs.adbmtp.gs0 等一系列文件夹。只要 diag.diag 存在,就证明内核提供了诊断功能所需的"零件"

问题根源 :那么,"零件"都在,为什么组装不起来呢?关键在于系统的"组装说明书"丢了

这个"说明书"就是 /vendor/etc/init/hw/init.qcom.usb.rc 这个配置文件。它里面预定义了系统支持哪些 USB 功能组合(比如 adbmtp,adbdiag,adb 等),以及每种组合对应如何配置底层驱动。

许多基于 AOSP 源码构建的第三方 ROM,为了追求纯净、通用或稳定性,往往会精简掉高通专属的、特别是用于工程模式的配置 。其中就包括 diagdiag,adb 的配置段落。因此,当你执行 setprop sys.usb.config=diag,adb 时,系统在"说明书"里查不到对应的步骤,于是就不做任何事,导致端口启用失败。

解决方案:手动补全"组装说明书"

既然根本原因是配置缺失,而核心驱动还在,最直接的解决办法就是:我们自己把缺失的配置章节,重新写回"说明书"里。

第一步:理解关键参数(VID & PID)

在添加上下文前,需要了解两个关键 ID:

  • VID (Vendor ID) :高通公司的 VID 通常是 0x05C6

  • PID (Product ID):这个 ID 用来告诉电脑当前是什么类型的设备。对于 DIAG 端口,有两个常用 PID:

    • 0x900E:用于 "纯 DIAG" 模式。在此模式下,ADB 功能会被断开。

    • 0x901D:用于 "DIAG + ADB"复合 模式。这是我们最推荐的模式,因为你可以在使用诊断工具的同时,保留 ADB 命令行访问能力。

bash 复制代码
  1448,29: QcomDevice90180 = "Qualcomm HS-USB Android DIAG 9018"
  1454,29: QcomDevice90200 = "Qualcomm HS-USB Android DIAG 9020"
  1456,29: QcomDevice90210 = "Qualcomm HS-USB Android DIAG 9021"
  1457,29: QcomDevice90220 = "Qualcomm HS-USB Android DIAG 9022"
  1458,29: QcomDevice901D0 = "Qualcomm HS-USB Android DIAG 901D"
  1459,29: QcomDevice901F0 = "Qualcomm HS-USB Android DIAG 901F"
  1468,29: QcomDevice902C2 = "Qualcomm HS-USB Android DIAG 902C"
  1469,29: QcomDevice902D2 = "Qualcomm HS-USB Android DIAG 902D"

第二步:编辑配置文件

我们将直接在设备的 init.qcom.usb.rc 文件末尾,添加处理 diag,adbdiag 两种模式的配置代码。

  1. 获取 Root 权限并挂载分区可写
bash 复制代码
adb shell
su
mount -o remount,rw /vendor

编辑配置文件 :使用 vicat 命令,将以下配置块追加/vendor/etc/init/hw/init.qcom.usb.rc 文件的末尾。

bash 复制代码
on property:sys.usb.config=diag,adb && property:sys.usb.configfs=1
    start adbd

on property:sys.usb.ffs.ready=1 && property:sys.usb.config=diag,adb && property:sys.usb.configfs=1
    write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "diag_adb"
    rm /config/usb_gadget/g1/configs/b.1/f1
    rm /config/usb_gadget/g1/configs/b.1/f2
    rm /config/usb_gadget/g1/configs/b.1/f3
    rm /config/usb_gadget/g1/configs/b.1/f4
    rm /config/usb_gadget/g1/configs/b.1/f5
    rm /config/usb_gadget/g1/configs/b.1/f6
    rm /config/usb_gadget/g1/configs/b.1/f7
    rm /config/usb_gadget/g1/configs/b.1/f8
    rm /config/usb_gadget/g1/configs/b.1/f9
    symlink /config/usb_gadget/g1/configs/b.1 /config/usb_gadget/g1/os_desc/b.1
    write /config/usb_gadget/g1/idVendor 0x05C6
    write /config/usb_gadget/g1/idProduct 0x901D
    write /config/usb_gadget/g1/functions/diag.diag/pid 0x901d
    symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f1
    symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f2
    write /config/usb_gadget/g1/UDC ${sys.usb.controller}
    setprop sys.usb.state ${sys.usb.config}

on property:sys.usb.config=diag && property:sys.usb.configfs=1
    write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "diag"
    rm /config/usb_gadget/g1/configs/b.1/f1
    rm /config/usb_gadget/g1/configs/b.1/f2
    rm /config/usb_gadget/g1/configs/b.1/f3
    rm /config/usb_gadget/g1/configs/b.1/f4
    rm /config/usb_gadget/g1/configs/b.1/f5
    rm /config/usb_gadget/g1/configs/b.1/f6
    rm /config/usb_gadget/g1/configs/b.1/f7
    rm /config/usb_gadget/g1/configs/b.1/f8
    rm /config/usb_gadget/g1/configs/b.1/f9
    write /config/usb_gadget/g1/idVendor 0x05C6
    write /config/usb_gadget/g1/idProduct 0x900E
    write /config/usb_gadget/g1/functions/diag.diag/pid 0x900e
    symlink /config/usb_gadget/g1/functions/diag.diag /config/usb_gadget/g1/configs/b.1/f1
    write /config/usb_gadget/g1/UDC ${sys.usb.controller}
    setprop sys.usb.state ${sys.usb.config}

保存并重启:保存文件后,将分区改回只读以防误操作,然后重启

bash 复制代码
mount -o remount,ro /vendor
reboot

第三步:验证成果

设备重启后,就可以进行测试了。

  • 测试 DIAG+ADB 复合模式
bash 复制代码
adb shell setprop sys.usb.config diag,adb

成功的话,电脑会识别出两个设备:一个是原来的 ADB 接口,另一个就是 Qualcomm HS-USB Android DIAG 901D。现在,你可以同时使用 QPST 等诊断工具和 ADB 了。

测试纯 DIAG 模式

bash 复制代码
adb shell setprop sys.usb.config diag

执行后,ADB 连接会断开。此时电脑上应只出现一个 Qualcomm HS-USB Android DIAG 900E 端口。这种模式常用于某些严格的射频校准或特定的固件刷写场景。要切回 ADB,可能需要重启设备或执行 setprop sys.usb.config adb

总结与最后提醒

总而言之,在第三方 ROM 上启用 DIAG 端口的本质,就是一次针对系统 USB 配置的"打补丁"操作。只要内核驱动还在 (diag.diag),我们通过手动编辑 init.qcom.usb.rc 配置文件,就能重新建立属性命令与底层功能的联系。

这个方法成功解决了我在 LineageOS 22 上的问题,也为你在其他自定义 ROM 上遭遇类似困境提供了清晰的解决思路。一旦 DIAG 端口成功启用,后续使用 QPST、QXDM 等工具进行基带备份、恢复或深度刷机操作的大门就敞开了。

重要提醒

  • 修改系统文件存在一定风险,操作前请确保重要数据已备份。

  • 不同设备、不同 ROM 的配置文件路径和内容可能略有差异,请根据实际情况灵活调整。

  • 修改时务必谨慎,错误的语法可能导致 USB 功能完全失效。修改文件时谨慎一些总是好的。

相关推荐
华章酱2 小时前
MySQL EXPLAIN 完全解读:从执行计划到索引优化
android·数据库·mysql
2501_915921432 小时前
Fastlane 结合 AppUploader 来实现 CI 集成自动化上架
android·运维·ci/cd·小程序·uni-app·自动化·iphone
贤泽2 小时前
Android 15 AOSP Notification分析
android
特立独行的猫a3 小时前
腾讯Kuikly多端框架(KMP)实战:轮播图的完整实现
android·harmonyos·轮播图·jetpack compose·kuikly
2501_915921433 小时前
iOS 抓包怎么绕过 SSL Pinning 证书限制,抓取app上的包
android·网络协议·ios·小程序·uni-app·iphone·ssl
陈健平3 小时前
用 Kimi 2.5 Agent 从 0 搭建「宇宙吞噬,ps:和球球大作战这种差不多」对抗小游戏(Canvas 粒子特效 + AI Bot + 排行榜)
android·人工智能·agent·kimi2.5
hewence13 小时前
重构千行Callback:Android异步回调无损迁移协程Suspend完全指南
android·重构·kotlin
我命由我123453 小时前
Android多进程开发 - AIDL 参数方向、AIDL 传递自定义对象、AIDL 传递自定义对象(参数方向)
android·java·java-ee·kotlin·android studio·android jetpack·android-studio
龚礼鹏3 小时前
android 13 Launcher中应用列表数量,大小如何控制的?
android