IT评测·应用市场-qidao123.com技术社区

标题: [Linux实战] Linux设备树原理与应用详解 [打印本页]

作者: 大连全瓷种植牙齿制作中心    时间: 2025-4-2 11:10
标题: [Linux实战] Linux设备树原理与应用详解
Linux设备树原理与应用详解

一、设备树概述

1.1 什么是设备树

设备树(Device Tree,简称DT)是一种形貌硬件资源的数据结构,它通过一种树状结构来形貌系统硬件设置,包罗CPU、内存、总线、外设等硬件信息。设备树最初在PowerPC架构中利用,厥后被ARM等架构广泛接纳,成为Linux内核中形貌非可发现硬件(non-discoverable hardware)的标准方式。
1.2 设备树的发展历史

设备树的概念并非Linux首创,它劈头于Open Firmware标准(IEEE 1275),重要用于PowerPC和SPARC架构。随着ARM架构在嵌入式范畴的普及,Linux社区面临着大量ARM芯片和板级的支持需求。传统的"board file"方式导致内核中充斥着大量板级特定代码,维护困难。
2006年,设备树被引入到ARM架构的Linux支持中,并逐渐成为ARM Linux的标准硬件形貌方式。设备树的接纳解决了以下问题:

1.3 设备树的优势

与传统硬编码硬件信息的方式相比,设备树具有以下优势:
二、设备树原理

2.1 设备树的基本结构

设备树接纳树状结构形貌硬件,重要包罗以下组成部分:
一个简单的设备树示例:
  1. /dts-v1/;
  2. / {
  3.     model = "My Board";
  4.     compatible = "myvendor,myboard";
  5.    
  6.     cpus {
  7.         #address-cells = <1>;
  8.         #size-cells = <0>;
  9.         
  10.         cpu@0 {
  11.             compatible = "arm,cortex-a9";
  12.             reg = <0>;
  13.         };
  14.     };
  15.    
  16.     memory@80000000 {
  17.         device_type = "memory";
  18.         reg = <0x80000000 0x10000000>;
  19.     };
  20.    
  21.     serial@101f0000 {
  22.         compatible = "arm,pl011";
  23.         reg = <0x101f0000 0x1000>;
  24.         interrupts = <0 12 4>;
  25.     };
  26. };
复制代码
2.2 设备树源文件格式

设备树源文件重要有两种格式:
这些源文件必要通过设备树编译器(DTC)编译成二进制格式:
2.3 设备树编译流程

设备树的编译流程如下:
编译下令示例:
  1. dtc -I dts -O dtb -o myboard.dtb myboard.dts
复制代码
2.4 设备树绑定(Bindings)

设备树绑定是形貌特定设备节点应包罗哪些属性和值的规范文档。这些绑定文档通常位于内核源码的Documentation/devicetree/bindings目录下,为设备树编写者提供指导。
绑定文档通常包罗:

三、设备树语法详解

3.1 设备树节点

设备树节点是形貌硬件的基本单位,语法如下:
  1. [label:] node-name[@unit-address] {
  2.     [properties]
  3.     [child-nodes]
  4. };
复制代码

3.2 常用属性

3.3 特殊节点

3.4 设备树包罗机制

类似于C语言的#include,设备树利用/include/或#include指令包罗其他文件:
  1. #include "common.dtsi"
复制代码
或者
  1. /include/ "common.dtsi"
复制代码
四、设备树在Linux中的应用

4.1 内核如何解析设备树

Linux内核在启动过程中解析设备树的流程:
4.2 设备树与驱动程序的匹配

驱动程序通过of_match_table声明支持的设备树兼容性字符串:
  1. static const struct of_device_id my_driver_ids[] = {
  2.     { .compatible = "vendor,device" },
  3.     { /* sentinel */ }
  4. };
  5. MODULE_DEVICE_TABLE(of, my_driver_ids);
  6. static struct platform_driver my_driver = {
  7.     .probe = my_probe,
  8.     .driver = {
  9.         .name = "my-device",
  10.         .of_match_table = my_driver_ids,
  11.     },
  12. };
复制代码
当设备树节点的compatible属性与驱动程序的of_match_table中的条目匹配时,内核会调用驱动程序的probe函数。
4.3 从设备树获取硬件信息

驱动程序可以从设备树节点中获取各种硬件信息:
4.4 设备树覆盖(Overlay)

设备树覆盖是一种动态修改设备树的技能,重要用于支持运行时硬件设置变化,常见于嵌入式Linux系统:
五、设备树调试本领

5.1 检察设备树

5.2 调试工具

5.3 常见问题排查

六、设备树实践示例

6.1 添加一个GPIO设备

设备树形貌:
  1. gpio_keys {
  2.     compatible = "gpio-keys";
  3.     button {
  4.         label = "User Button";
  5.         gpios = <&gpio0 23 GPIO_ACTIVE_LOW>;
  6.         linux,code = <KEY_ENTER>;
  7.     };
  8. };
复制代码
驱动程序:
  1. static int gpio_keys_probe(struct platform_device *pdev)
  2. {
  3.     struct device *dev = &pdev->dev;
  4.     struct gpio_keys_button *button;
  5.    
  6.     button = devm_kzalloc(dev, sizeof(*button), GFP_KERNEL);
  7.     if (!button)
  8.         return -ENOMEM;
  9.    
  10.     button->gpio = of_get_named_gpio(dev->of_node, "gpios", 0);
  11.     button->code = KEY_ENTER;
  12.    
  13.     // 注册输入设备...
  14.     return 0;
  15. }
复制代码
6.2 添加一个I2C设备

设备树形貌:
  1. &i2c1 {
  2.     status = "okay";
  3.     clock-frequency = <100000>;
  4.    
  5.     temperature-sensor@48 {
  6.         compatible = "ti,tmp75";
  7.         reg = <0x48>;
  8.     };
  9. };
复制代码
驱动程序:
  1. static int tmp75_probe(struct i2c_client *client,
  2.                       const struct i2c_device_id *id)
  3. {
  4.     struct device *dev = &client->dev;
  5.     // 初始化温度传感器...
  6.     return 0;
  7. }
  8. static const struct of_device_id tmp75_of_match[] = {
  9.     { .compatible = "ti,tmp75" },
  10.     { }
  11. };
  12. MODULE_DEVICE_TABLE(of, tmp75_of_match);
复制代码
七、设备树最佳实践

八、总结

设备树作为现代Linux系统中形貌硬件设置的标准方式,已经广泛应用于ARM、PowerPC等架构。它通过将硬件形貌与内核分离,提高了系统的可移植性和可维护性。把握设备树的原理和应用,对于嵌入式Linux开辟者和内核驱动开辟者来说是一项必备技能。
随着Linux内核和设备树标准的不断发展,设备树的功能也在不断增强,如动态设备树覆盖、设备树单元测试等新特性的加入,使得设备树能够更好地满意复杂嵌入式系统的需求。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com技术社区 (https://dis.qidao123.com/) Powered by Discuz! X3.4