banner
NEWS LETTER

嵌入式 Linux 系列 08:设备树和驱动入门

Scroll down

设备树和驱动是嵌入式 Linux 的核心内容之一。很多外设问题不是驱动代码错了,而是设备树、引脚复用、电源、时钟、复位脚或硬件连接出了问题。入门时要先理解“设备树描述硬件,驱动使用这些描述”。

一、设备树解决什么问题

Linux 内核需要知道板子上有哪些设备,以及它们如何连接。

设备树描述:

  • 设备地址。
  • 中断号。
  • GPIO。
  • 时钟。
  • 电源。
  • 引脚复用。
  • compatible 字符串。

示例:

1
2
3
4
5
6
7
8
&i2c1 {
status = "okay";

sensor@48 {
compatible = "vendor,temp-sensor";
reg = <0x48>;
};
};

这里表示 I2C1 总线上有一个地址为 0x48 的传感器。

二、compatible 很关键

驱动通过 compatible 匹配设备。

驱动中通常有:

1
2
3
4
5
static const struct of_device_id sensor_of_match[] = {
{ .compatible = "vendor,temp-sensor" },
{ }
};
MODULE_DEVICE_TABLE(of, sensor_of_match);

设备树里的 compatible 必须和驱动匹配,否则 probe 不会执行。

三、probe 是驱动入口

平台驱动常见结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
static int sensor_probe(struct platform_device *pdev)
{
dev_info(&pdev->dev, "sensor probe\n");
return 0;
}

static struct platform_driver sensor_driver = {
.probe = sensor_probe,
.driver = {
.name = "temp_sensor",
.of_match_table = sensor_of_match,
},
};

module_platform_driver(sensor_driver);

如果 dmesg 里看不到 probe 日志,先查:

  • 驱动是否编进内核或加载模块。
  • compatible 是否一致。
  • 设备树节点 status 是否为 okay。
  • 总线控制器是否启用。
  • 内核日志级别是否过滤。

四、从用户态验证外设

I2C 外设:

1
2
i2cdetect -y 1
i2cget -y 1 0x48 0x00

GPIO:

1
ls /sys/class/gpio

中断:

1
cat /proc/interrupts

驱动节点:

1
2
ls -l /dev
ls /sys/class

用户态验证能帮助判断问题是在硬件、设备树、驱动还是应用层。

五、常见问题

设备完全不响应:

  • 地址错。
  • 电源没开。
  • 复位脚没释放。
  • 引脚复用错。
  • 总线没有启用。

probe 不执行:

  • compatible 不匹配。
  • 驱动没编译。
  • 设备树没被实际加载。
  • 节点 status 是 disabled。

读写失败:

  • 寄存器地址错。
  • 时序不满足。
  • 设备处于低功耗。
  • 总线速率不合适。

中断不触发:

  • 中断 GPIO 配错。
  • 上升沿/下降沿配置错。
  • pinctrl 没配。
  • 硬件没有拉高或拉低。

六、学习顺序

建议顺序:

  1. 看懂设备树节点。
  2. 修改一个 GPIO LED。
  3. 调通一个 I2C 设备。
  4. 看懂 probe 流程。
  5. 增加 sysfs 或字符设备接口。
  6. 再学习中断、DMA、电源管理。

驱动入门不要急着写复杂框架。先把设备树、probe、用户态验证和 dmesg 日志链路跑通,后面的内容才有基础。

其他文章
目录导航 置顶
  1. 1. 一、设备树解决什么问题
  2. 2. 二、compatible 很关键
  3. 3. 三、probe 是驱动入口
  4. 4. 四、从用户态验证外设
  5. 5. 五、常见问题
  6. 6. 六、学习顺序
请输入关键词进行搜索