设备树和驱动是嵌入式 Linux 的核心内容之一。很多外设问题不是驱动代码错了,而是设备树、引脚复用、电源、时钟、复位脚或硬件连接出了问题。入门时要先理解“设备树描述硬件,驱动使用这些描述”。
一、设备树解决什么问题
Linux 内核需要知道板子上有哪些设备,以及它们如何连接。
设备树描述:
- 设备地址。
- 中断号。
- GPIO。
- 时钟。
- 电源。
- 引脚复用。
- compatible 字符串。
示例:
1 | &i2c1 { |
这里表示 I2C1 总线上有一个地址为 0x48 的传感器。
二、compatible 很关键
驱动通过 compatible 匹配设备。
驱动中通常有:
1 | static const struct of_device_id sensor_of_match[] = { |
设备树里的 compatible 必须和驱动匹配,否则 probe 不会执行。
三、probe 是驱动入口
平台驱动常见结构:
1 | static int sensor_probe(struct platform_device *pdev) |
如果 dmesg 里看不到 probe 日志,先查:
- 驱动是否编进内核或加载模块。
- compatible 是否一致。
- 设备树节点 status 是否为 okay。
- 总线控制器是否启用。
- 内核日志级别是否过滤。
四、从用户态验证外设
I2C 外设:
1 | i2cdetect -y 1 |
GPIO:
1 | ls /sys/class/gpio |
中断:
1 | cat /proc/interrupts |
驱动节点:
1 | ls -l /dev |
用户态验证能帮助判断问题是在硬件、设备树、驱动还是应用层。
五、常见问题
设备完全不响应:
- 地址错。
- 电源没开。
- 复位脚没释放。
- 引脚复用错。
- 总线没有启用。
probe 不执行:
- compatible 不匹配。
- 驱动没编译。
- 设备树没被实际加载。
- 节点 status 是 disabled。
读写失败:
- 寄存器地址错。
- 时序不满足。
- 设备处于低功耗。
- 总线速率不合适。
中断不触发:
- 中断 GPIO 配错。
- 上升沿/下降沿配置错。
- pinctrl 没配。
- 硬件没有拉高或拉低。
六、学习顺序
建议顺序:
- 看懂设备树节点。
- 修改一个 GPIO LED。
- 调通一个 I2C 设备。
- 看懂 probe 流程。
- 增加 sysfs 或字符设备接口。
- 再学习中断、DMA、电源管理。
驱动入门不要急着写复杂框架。先把设备树、probe、用户态验证和 dmesg 日志链路跑通,后面的内容才有基础。
- 本文链接: https://blog.hansong.icu/2026/06/26/Embedded_Linux_Series_08_Device_Tree_Driver/
- 版权声明: 本博客所有文章除特别声明外,均默认采用 CC BY-NC-SA 4.0 许可协议。