Linux中驱动有问题如何排查(一)

张开发
2026/4/11 3:11:50 15 分钟阅读

分享文章

Linux中驱动有问题如何排查(一)
Linux 驱动排查「从开机到运行」逐步骤万能排查法我给你一套最实用、最通用、嵌入式 / 开发板都能用的驱动排查流程一步一步跟着走99% 问题都能定位。你不用猜按顺序查每一步都有明确判断依据。概览0 先记住一句话Linux 驱动是否正常 3 件事驱动被加载了吗insmod / 内核内置设备被匹配了吗device tree /platform 匹配probe 函数执行成功了吗最关键下面就是逐步骤验证。第 1 步看驱动有没有被内核识别 / 加载1.1 如果你是 模块.kolsmod | grep 你的驱动名有输出 → 加载成功无输出 → 没加载如果没加载insmod xxx.ko # 或者 modprobe xxx再dmesg看有没有报错1.2 如果你是 内核内置驱动built-in直接看日志前提是驱动里要有对应的日志dmesg | grep xxx只要驱动有pr_info()就会出来。第 2 步看设备是否存在设备树 / 平台设备2.1 看设备树节点有没有被解析ls /sys/firmware/devicetree/base/your_node有 → 设备树加载正常无 → DTB 没更新 / 设备树写错2.2 看平台设备是否被注册ls /sys/devices/platform/ | grep 你的设备名有就说明设备存在。第 3 步最关键驱动和设备有没有匹配match驱动正常的标志驱动的 compatible 必须和设备树 compatible 一致查看匹配是否成功dmesg | grep of_device_id dmesg | grep platform看到类似platform xxx probed就说明匹配成功。如果看不到就是compatible 写错设备树没生效驱动没编译进内核第 4 步看 probe 函数是否执行成功probe 成功 驱动真正启动成功查看dmesg | grep probe如果看到xxx probe successfully✅驱动完全正常启动如果看到probe failed -xxx❌ 驱动硬件没找到 / 资源错误第 5 步看驱动是否在 sysfs 创建设备ls /sys/class/你的类/ ls /dev/xxx/dev/xxx存在 → 字符设备注册成功/sys/class/xxx存在 → 设备被注册这是用户态可以使用驱动的标志。第 6 步查看中断、寄存器、pinctrl 等硬件资源非常实用6.1 中断是否注册成功cat /proc/interrupts | grep 你的设备有 - 中断注册成功6.2 引脚配置是否正确你之前用的cat /sys/kernel/debug/pinctrl/*/pinconf-pins引脚配置对 → 硬件基本没问题6.3 时钟是否开启cat /sys/kernel/debug/clk/clk_summary时钟 rate 不为 0 → 时钟正常第 7 步用 debugfs 看驱动内部状态cat /sys/kernel/debug/你的驱动/xxx几乎所有子系统都在这里暴露状态pinctrlclkgpioregulatori2cspipwm第 8 步最终判断驱动是否正常工作驱动正常的 4 个标志dmesg显示probe success/sys/devices/platform/xxx存在/dev/xxx设备节点存在读写 /dev/xxx 不报错✅全部满足 → 驱动 100% 正常DebugfsSysfs 下的 DebugDebugfs内核调试的 “万能遥控器”我给你用最直白、工程化的方式讲清楚。它是什么、怎么用、能干嘛以及你怎么用它排查红外、驱动、引脚等问题。一、Debugfs 到底是什么一句话/sys/kernel/debug 是内核专门给驱动 / 子系统用来暴露调试信息的虚拟文件系统。它不是 sysfs而是debugfs但挂载在 /sys/kernel/debug 下所以你习惯把它叫「sysfs 下的 debug」。它的核心特点虚拟文件系统不占磁盘实时读取内核内部状态驱动可以自己创建文件 / 目录大多是只读但也可写内核模块、子系统都用它来暴露调试接口你之前看到的/sys/kernel/debug/pinctrl/.../pinconf-pins就是 pinctrl 子系统自己创建的调试文件。二、Debugfs 怎么用分 2 个角度1. 用户态怎么用最常用直接cat读里面的文件即可。常用命令cd /sys/kernel/debug① 查看 pinctrl 引脚状态你之前用的cat pinctrl/xxx/pinconf-pins看红外、GPIO、PWM 是否配置正确、驱动强度是否够。② 查看时钟cat clk/clk_summary看红外控制器、GPIO 控制器时钟是否打开、频率是否正确。③ 查看 GPIOcat gpio看红外引脚是否被占用、方向、电平。④ 查看 I2C/SPIcat i2c/xxx⑤ 查看你的驱动如果它注册了 debugfscat my_driver/debug_file⑥ 实时跟踪新日志tail -f /sys/kernel/debug/xxx/log2. 内核驱动怎么自己用 debugfs可选如果你写驱动也可以自己创建 debug 接口#include linux/debugfs.h static struct dentry *dir; static int __init ir_init(void) { // 创建目录 /sys/kernel/debug/ir_drv dir debugfs_create_dir(ir_drv, NULL); // 创建可读文件 debugfs_create_u32(ir_status, 0444, dir, ir_status); // 创建可写文件用于调试控制 debugfs_create_bool(ir_carrier_en, 0644, dir, ir_carrier_en); return 0; }用户态就能读cat /sys/kernel/debug/ir_drv/ir_status echo 1 /sys/kernel/debug/ir_drv/ir_carrier_en三、Debugfs 能干嘛总结 5 大用途1. 查看硬件真实状态比如引脚是不是 GPIO有没有被复用时钟开没开rate 是多少GPIO 电平、方向、有没有被占用电源 regulator 是否输出你之前的红外驱动弱、电压低、驱动能力不足就是靠pinctrlclkgpio这些 debugfs 文件来排查的。2. 驱动调试驱动可以暴露统计信息内部状态缓冲区调试开关你可以直接读来判断驱动是否正常。3. 控制调试行为部分 debugfs 文件可写echo 1 trigger_dump触发驱动打印调试信息。4. 替代 printk不污染日志不用到处 dmesg直接读一次 debug 文件就能拿到内部状态。5. 轻量级、不影响性能只读操作几乎无开销。四、如何确认 debugfs 是否挂载mount | grep debugfs没有输出就挂载mount -t debugfs none /sys/kernel/debug五、你现在应该记住的一句话/sys/kernel/debug 内核实时状态查看器。你想知道硬件到底怎么了就来这里读。

更多文章