Skip to main content
针对使用 Qualcomm® Linux 内核时最常见故障的定向诊断步骤和修复方法。

启动失败

内核无法启动,黑屏或无串行输出

首先检查:
  1. 确认已配置串行控制台(内核命令行中包含 console=ttyMSM0,115200n8)。
  2. 通过重新运行 fastboot flash efi efi.bin 验证 efi.bin 已成功刷写,并检查 OKAY 响应。
  3. 如果携带 EFI 变量的 RPMB 区域持久状态已损坏或错位,请擦除该区域:
  1. 在内核命令行中添加 earlycon,以便在 UART 驱动初始化之前获得输出。
有关串行控制台设置,请参阅内核日志

启动时内核 panic

启动期间的内核 panic 会在串行控制台上产生调用栈。捕获它并确定出错的函数:
Qualcomm Linux 上的常见原因:

设备树问题

DTB 认证失败

UEFI 固件在将 DTB 传递给内核之前会对其进行认证。认证失败会导致内核无法接收任何设备树。 日志特征:
修复: 刷写与设备上当前配置的签名密钥匹配的、正确签名的 dtb.bin。确保 efi.bindtb.bin 来自同一构建。

未找到 DTB

修复:
  1. 验证 DTB 已包含在打包的 dtb.bin 中: 如果使用传统的拼接式 dtb 打包:
    如果使用基于 FIT 的打包:
  2. 检查开发板 DTS 文件已列在 Yocto 机器配置的 KERNEL_DEVICETREE 中。
  3. 重新刷写 dtb.bin

在运行时验证加载了哪个 DTB

成功启动后,确认加载了正确的设备树:

启动期间的 DTB 识别

有关设备树识别的更多信息,请参阅常见 DTB 问题

模块加载失败

Invalid module format 显示 vermagic 不匹配

原因: 模块是针对与运行内核不同的内核版本、配置或编译器构建的。嵌入在 .ko 文件中的 vermagic 字符串不匹配。 诊断:
修复: 针对生成运行内核镜像的完全相同的内核源代码树(相同的 KERNEL_SRC、相同的 defconfig 和片段)重新构建模块。如果使用 Yocto,请通过 bitbake qcom-multimedia-image 重新构建,以保持模块和内核同步。

缺少 .ko 文件

诊断:
修复: 确保模块已构建(Makefile 中包含 obj-m += my_driver.o)并已安装(通过 make modules_install 或 Yocto module 类)。

未找到模块且 modules.dep 中缺失

修复: 在安装新模块后运行 depmod 以重建模块依赖映射:

模块可加载但不工作

insmod 后立即检查 dmesg 中的探测错误:
常见模式: 对于延迟探测,检查哪些设备仍处于待处理状态:

串行控制台不工作

如果刷写新内核后串行控制台没有输出:
  1. 验证 Kconfig:
  2. 验证内核命令行:
  3. 获取早期启动消息: 在内核命令行中添加 earlycon。这样可以在 UART 驱动完全初始化之前启用输出。
  4. 检查线缆和波特率: 确认设备和主机终端均为 115200 波特、8N1、无硬件流控。

Remoteproc 故障

固件加载失败

修复: 确保所有必需的固件文件都存在于 /lib/firmware/qcom/<SoC>/ 中:

子系统崩溃时捕获日志

为防止 remoteproc 驱动自动恢复崩溃的子系统(这会清除崩溃日志),请在复现崩溃之前禁用恢复:
崩溃日志示例:
启用 coredump 以捕获内存快照用于离线分析:
.elf 文件传输到主机,并使用 Qualcomm Crash Analysis Portal(QCAP)进行分析。有关更多详情,请参阅配置远程处理器子系统