1. Linux设备树开发概述
第一次接触设备树是在2015年调试一块定制开发板时。当时面对满屏的arch/arm/mach-xxx目录下密密麻麻的板级文件,我完全找不到北。直到同事扔给我一个.dts文件说:"用这个吧,新内核都这么玩。"从此打开了设备树开发的大门。
设备树(Device Tree)本质上是一种描述硬件配置的数据结构,它采用文本格式(.dts/.dtsi)定义硬件组件及其连接关系,通过编译器(dtc)生成二进制格式(.dtb)供内核解析。这种机制完美解决了ARM架构下"一个内核支持多款硬件"的需求痛点。
经验之谈:设备树不是Linux内核的发明,它最早出现在1994年的Open Firmware标准中。Linux在2011年(3.x版本)开始全面采用设备树机制替代传统的板级文件(board file)。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 设备树核心语法精要
2.1 基础结构解析
一个标准的设备树文件就像乐高说明书:
dts复制/dts-v1/; // 版本声明
/ { // 根节点
model = "MyBoard";
compatible = "vendor,myboard";
cpus {
#address-cells = <1>;
#size-cells = <0>;
cpu@0 {
compatible = "arm,cortex-a53";
reg = <0>;
};
};
memory@80000000 {
device_type = "memory";
reg = <0x80000000 0x40000000>;
};
};
关键元素解析:
compatible:驱动匹配的"身份证",格式为"厂商,型号"reg:寄存器地址范围,需配合#address-cells和#size-cells解读phandle:节点引用标识符(相当于指针)
2.2 属性操作技巧
设备树中的属性就像硬件参数的键值对:
dts复制/* 标准属性 */
interrupts = <15 IRQ_TYPE_LEVEL_HIGH>; // 中断号+触发方式
clock-frequency = <50000000>; // 50MHz时钟
/* 自定义属性 */
vendor,special-config = "fast-mode"; // 厂商扩展属性
调试技巧:
- 使用
/proc/device-tree查看解析后的属性 dtc -I dtb -O dts -o recon.dts /sys/firmware/devicetree/base/dt.dtb可反编译运行中的dtb
3. 驱动匹配全流程实战
3.1 设备树编写规范
以GPIO控制器为例:
dts复制gpio: gpio-controller@ff730000 {
compatible = "vendor,gpio-ctrl";
reg = <0xff730000 0x1000>;
#gpio-cells = <2>;
interrupt-controller;
#interrupt-cells = <2>;
clocks = <&clk_peri>;
status = "okay";
};
关键点说明:
#gpio-cells定义GPIO描述符的单元数(通常为2:引脚号+标志)interrupt-controller声明该设备是中断控制器status控制设备启用状态("okay"/"disabled")
3.2 驱动匹配机制
驱动匹配的核心是compatible字符串的舞蹈:
c复制// 驱动代码
static const struct of_device_id my_driver_ids[] = {
{ .compatible = "vendor,gpio-ctrl" },
{ /* sentinel */ }
};
static struct platform_driver my_driver = {
.probe = my_probe,
.driver = {
.name = "my-gpio-driver",
.of_match_table = my_driver_ids,
},
};
匹配流程:
- 内核扫描
.dtb中所有节点的compatible属性 - 与所有已注册驱动的
of_match_table对比 - 匹配成功后调用
probe()函数
避坑指南:当驱动未加载时,先检查
/sys/firmware/devicetree/base下对应节点是否存在,再用of_find_compatible_node(NULL, NULL, "vendor,gpio-ctrl")验证内核是否能找到节点。
4. 高级调试技巧
4.1 设备树覆盖(Overlay)
动态修改设备
