Linux驱动与BSP调试方法论
星球 05 板块的精华是一批来自量产一线的调试案例。本文按"设备树 → 总线级 → 屏幕/触摸 → 摄像头 → 启动与崩溃 → 通用手段"的顺序,把这些案例里可复用的方法论抽出来。
一、设备树:先看"实际生效的",再看源码
dts/dtsi 多层 include 互相覆盖,看源码永远分不清最终值。反编译当前实际加载的 dtb(dtc -I dtb -O dts)拿到合并后的真实配置,是驱动 probe 失败时的第一手段;反编译产物只用于阅读,不能回编。见 设备树反编译调试(Jason)。
I2C 时钟延展案例进一步验证了这条原则:波形半高电平异常,纠结上拉电阻半天无果,最后把运行时设备树捞出来才发现该 I2C 引脚被附加配置成了推挽(push-pull)而非开漏。见 嵌入式Linux调试iic(Jack)。
同类坑还有:compatible 完全匹配但 probe 不执行——根因是父总线节点 pinctrl 初始化失败,really_probe 在调用驱动 probe 之前就返回了;尤其是引脚被安全域/TF-A 预留时,dmesg 连 "already requested" 都不打,隐蔽性极高。见 Linux 驱动踩坑案例:compatible 匹配上(Jason)。
二、总线与外设:i2cdetect 是起点
GT911 触控调试速查给出了标准动作序列:i2cdetect 确认芯片在位 → /proc/interrupts 看中断来不来(0=硬件问题,疯涨=触发方式错)→ gpio debug 看复位/中断脚 → /sys/bus/i2c 看 driver 软链接 → getevent/evtest 看上报 → Android 侧 dumpsys input。见 Linux Android GT911触控调试(Jason)。
电容多点触摸驱动开发的核心提醒:触摸 IC 的 I2C 读写会睡眠,中断必须线程化;多指乱跳/触点不消失通常是 Type-B 协议没有遍历全部 slot 置失效;休眠唤醒失效要补 suspend/resume 流程。见 Linux 电容多点触摸驱动开(Jason)。
三、MIPI CSI 摄像头:链路级排错
两篇互为表里的干货:RK3566 全流程(准备 → DTS/media graph 校验 → STREAMON 出帧 → IQ 调优 → 稳定性验收)见 RK3566 MIPI-CSI移植;按故障现象分类的速查(probe 失败 / media 链路断 / 抓图超时 / CRC-ECC 报错 / 偏色 / 全黑)见 RK平台MIPI CSI问题排查(均 Jason)。电源是共同的前置知识点:AVDD/DVDD/IOVDD 三路电 + 严格上下电时序,时序不对会"能读寄存器但不出图"。见 我们做 MIPI CSI 摄像头驱动移植,其中有个重要的知识点是电源(Jason)。
关键排错思想:降速、减 lane 二分法 + sensor test pattern 区分"sensor 没出数据"还是"后端收不到";ECC/CRC 报错优先怀疑硬件(排线、PHY 时序、电源纹波)。
四、启动与崩溃定位
- 开机慢:uart 全程日志 + bootchartd 可视化,按 bootrom → bootloader → kernel → rootfs 四段各自优化(时钟拉满、LZO 换 gzip、精简 initcall、裁剪自启服务)。见 开机速度优化方法论 开机速(Jason)。
- 日志缺失:先查
/proc/cmdline的loglevel=1 quiet与/proc/sys/kernel/printk四个数字。见 最近遇到的问题,Linux 驱动的 compatible 和设备树是匹配(Jason)。 - 死机后无日志:开 Pstore/RAMOOPS,
/sys/fs/pstore/里捞 dmesg-ramoops;JTAG 挂起 CPU 是备选(成本高,适合必现问题当场抓)。替换国产 DDR/eMMC 后内核崩溃的完整排查见 DDR替换后内核崩溃排查(🌶)。 - Android 崩溃:tombstone 墓碑文件 +
addr2line定位到源码行,配合dumpsys meminfo、pstore 三手段收敛内存泄露。见 Android Native崩溃定位(🌶)。 - 量产 coredump:离线调试是常态——寄存器、bus 状态、DDR 快照、backtrace 打包回传,用原厂工具 + symbol 还原;量产看 DPPM,1/1000 概率都不接受。见 很多刚接触 Linux : Android 的同学(Jason)。
- PCIe:LTSSM 四阶段排查(Detect/Polling/Config/Recovery)+ MMIO/AER/L1SS/休眠唤醒分类定位。见 PCIe调试与问题排查(Jason)。
五、通用手段与工程流程
内核侧工具箱一览:printk 与日志等级、动态打印(CONFIG_DYNAMIC_DEBUG + debugfs)、ftrace、BUG_ON/WARN_ON、dump_stack、devmem、coredump 解析。见 Linux 调试手段,涵盖 printk 使用、动态打印、trace(Jason)。
把单点技巧升级为流程,是企业 BSP 的分水岭:稳定复现 → 分层定位(应用/内核子系统/驱动/设备树/硬件时序/寄存器)→ 本地验证 → 产线压测 → 规范 commit → 合入发布。业余开发修到"问题好了"为止,企业 BSP 要做到可复现、可解释、可追溯、可迭代、可量产。见 Linux BSP问题闭环流程(Jason)。
编译视角也是调试武器:用 .o 文件时间戳确认"改的代码是否真的编进了内核",再反向定位 Makefile 调用链。见 Linux编译视角调试方法(🌶)。
来源笔记
- 设备树反编译调试 — Jason
- 嵌入式Linux调试iic — Jack
- Linux 驱动踩坑案例:compatible 匹配上 — Jason
- Linux Android GT911触控调试 — Jason
- Linux 电容多点触摸驱动开 — Jason
- RK3566 MIPI-CSI移植 — Jason
- RK平台MIPI CSI问题排查 — Jason
- 我们做 MIPI CSI 摄像头驱动移植,其中有个重要的知识点是电源 — Jason
- 开机速度优化方法论 开机速 — Jason
- 最近遇到的问题,Linux 驱动的 compatible 和设备树是匹配 — Jason
- DDR替换后内核崩溃排查 — 🌶
- Android Native崩溃定位 — 🌶
- 很多刚接触 Linux : Android 的同学 — Jason
- PCIe调试与问题排查 — Jason
- Linux 调试手段,涵盖 printk 使用、动态打印、trace — Jason
- Linux BSP问题闭环流程 — Jason
- Linux编译视角调试方法 — 🌶