深入解析 Linux 内核如何解析和获取设备树属性

Linux设备树详解 基本数据类型:1)text string(以null结束),以双引号括起来,如:string-property=“a string”;2)cells是无符号32位无符号整型数,以括号括起来,如cell-proerty=;3)binary data 以方括号括起来,如:binary-property = [0x01 0x23 0x45 0x67]; 阅读详情
AI摘要

本文深入探讨了Linux内核如何解析设备树属性,包括设备树的基本概念、内核解析机制、设备驱动中的属性解析方法,以及一个完整的字符设备驱动注册示例。通过标准内核模块代码和设备树配置,文章详细解释了关键技术点,并提供了设备树加载与测试的步骤。

1. 引言

设备树(Device Tree, DT)是 Linux 内核用于描述硬件的平台抽象方式。设备树中的 属性(Properties) 存储了设备的配置信息,Linux 内核通过特定的 API 解析和读取这些属性,以正确初始化设备驱动。

本篇文章将详细讲解 Linux 内核如何解析设备树属性,并提供一个 标准内核模块代码 以及 对应的设备树配置,帮助你理解关键技术点。


在这里插入图片描述

2. 内核解析设备树的基本机制

Linux 内核解析设备树时,主要依赖 Flattened Device Tree (FDT) 解析框架,其核心组件包括:

  • drivers/of/ 文件夹:存放设备树解析代码。
  • of.h 头文件:定义了设备树 API。
  • of_device.h 头文件:定义了 struct device_node 结构体。

2.1 设备树解析核心数据结构

(1)设备节点 struct device_node
struct device_node {
    const char *name;                // 设备节点名称
    struct property *properties;     // 指向该节点的属性列表
    struct device_node *parent;      // 父节点
    struct device_node *child;       // 子节点
    struct device_node *sibling;     // 兄弟节点
};
(2)设备树属性 struct property
struct property {
    char *name;      // 属性名
    int length;      // 属性值长度
    void *value;     // 指向属性值的指针
};

3. 如何在 Linux 设备驱动中解析设备树属性

Linux 提供了一系列 API 来解析设备树中的属性信息。常用 API 如下:

API 函数作用
of_find_node_by_path()通过路径查找设备树节点
of_find_node_by_name()通过名称查找设备树节点
of_property_read_u32()读取 32-bit 数值类型属性
of_property_read_string()读取字符串属性
of_property_read_bool()读取布尔值属性(存在即为 true)

示例 1:解析 compatible 属性

struct device_node *np;
const char *compat;
np = of_find_node_by_path("/soc/i2c@40066000");
if (np) {
    if (of_property_read_string(np, "compatible", &compat) == 0) {
        pr_info("Compatible: %s\n", compat);
    }
}

说明:

  • 通过路径 /soc/i2c@40066000 查找 I2C 设备节点。
  • 读取 compatible 属性并打印。

4. 完整示例:解析设备树信息并注册字符设备驱动

4.1 设备树节点 (example.dts)

/example {
    compatible = "mydevice,example";
    example_device: example@0 {
        compatible = "myvendor,mydevice";
        reg = <0x1000 0x100>;
        example-property = <42>;
        example-string = "Hello, Device Tree";
    };
};

解析:

  • compatible = "myvendor,mydevice";:用于驱动匹配。
  • reg = <0x1000 0x100>;:设备寄存器信息。
  • example-property = <42>;:自定义数值属性。
  • example-string = "Hello, Device Tree";:自定义字符串属性。

4.2 内核驱动 (example_driver.c)

#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/of.h>

static int example_probe(struct platform_device *pdev) {
    struct device_node *np = pdev->dev.of_node;
    u32 example_value;
    const char *example_str;
    
    if (!np)
        return -EINVAL;
    
    if (of_property_read_u32(np, "example-property", &example_value) == 0)
        pr_info("example-property: %d\n", example_value);
    
    if (of_property_read_string(np, "example-string", &example_str) == 0)
        pr_info("example-string: %s\n", example_str);
    
    return 0;
}

static const struct of_device_id example_of_match[] = {
    { .compatible = "myvendor,mydevice" },
    {},
};
MODULE_DEVICE_TABLE(of, example_of_match);

static struct platform_driver example_driver = {
    .probe = example_probe,
    .driver = {
        .name = "example_driver",
        .of_match_table = example_of_match,
    },
};
module_platform_driver(example_driver);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Embedded Dev");
MODULE_DESCRIPTION("Example Device Tree Driver");

解析:

  • example_probe():驱动探测函数,解析设备树属性。
  • of_property_read_u32() 和 of_property_read_string():分别解析 example-property 和 example-string。
  • example_of_match:设备树 compatible 匹配表。

4.3 设备树加载与测试

  1. 编译设备树
    dtc -I dts -O dtb -o example.dtb example.dts
    
  2. 加载设备树
    sudo cp example.dtb /boot/
    
  3. 编译并加载驱动
    make -C /lib/modules/$(uname -r)/build M=$(pwd) modules
    sudo insmod example_driver.ko
    dmesg | grep example
    

5. 总结

  • Linux 通过 struct device_node 解析设备树结构。
  • 常用 API 如 of_property_read_u32() 读取设备树属性。
  • 设备树 compatible 用于匹配驱动,驱动必须注册 of_match_table。
  • 完整示例展示了如何编写标准内核模块并解析设备树信息。

这篇文章提供了一套完整、准确的 Linux 设备树解析方案,希望能帮助你深入理解 Linux 内核如何解析设备树属性!

Linux Driver | 设备树开发之初识设备树 开发固件设备树可以描述的信息包括CPU的数量和类别、内存基地址和大小、总线和桥、外设连接、中断控制器和中断使用情况、GPIO控制器和GPIO使用情况、Clock控制器和Clock使用情况。设备树信息被保存在一个ASCII文本文件中,适合人类的阅读习惯,类似于xml文件,在ARM Linux中,一个.dts文件对应一个ARM的machine放置在内核的目录设备树是一种数据结构,用于描述设备信息的语言,具体而言,是用于操作系统中描述硬件,使得不需要对设备的信息进行硬编码由一系列被命名的结点(node。 阅读详情

相关推荐

Linux驱动:dts设备树详解

文章目录一、什么是设备树?二、DTS、 DTB 和 DTC三、DTS 语法1.dtsi 头文件2.设备节点3.数据形式①、字符串②、32 位无符号整数③、字符串列表4.标准属性(1) compatible 属性(2) model 属性(3) status 属性(4) #address-cells 和#size-cells 属性(5) reg 属性(6) ranges 属性(7) name 属性(8) device_type 属性5.根节点 compatible 属性(1) 使用设备树之前设备匹配方法(2)

weixin_44498318的博客 3892

Linux设备树(device tree)

设备树(device tree)机制是Linux内核从linux-3.x版本开始引进的一种机制,目的是解决内核源码的arch/arm目录下代码混乱的问题:随着ARM生态的快速发展,在内核源码的arch/arm目录下,存放着几十种arm芯片和几百个开发板相关的源文件,很多开发板和处理器的中断、寄存器等相关硬件资源都在这个目录下以.c或.h的文件格式定义。而对于内核来说,与这些硬件耦合,会导致内核代码混乱不堪,每个开发板上运行的内核镜像都必须单独编译配置,无法通用。什么时候Linux内核能像Windows镜像那样,无论你的电脑什么配置,一个Windows安装包,都可以直接下载安装运行呢?设备树机制,实现了Linux内核和硬件平台的解耦:每个硬件平台的硬件资源使用一个设备树文件(xxx.dts)来描述,而不是在arch/arm下以.c 或 .h 文件来定义。Linux内核是一个通用的内核,在启动过程中,在通过解析设备树中的硬件资源来初始化某个具体的平台。 引入设备树后,很多和内核驱动开发的工作也发生了变化:以往驱动工程师关注的头文件宏定义、寄存器定义,现在这些基本上不用关注,关注的重点则转向了如何根据硬件平台去配置和修改设备树文件。很多驱动的编程接口也发生了变化,开始慢慢使用device tree提供的编程接口去开发驱动。本期课程主要面向嵌入式开发人员,分享Linux下驱动开发所需要的设备树知识和必备技能

设备树的解析和of函数介绍

然后,内核会调用of_flat_dt_begin和of_flat_dt_next_child函数来遍历设备树的节点,解析节点的属性并构建设备树数据结构。在上面的示例中,我们首先使用of_find_node_by_name函数找到名为"led"的设备树节点,然后使用of_get_gpio函数获取节点的gpio属性值,使用of_property_read_string函数获取节点的default-state属性值。注册设备:内核将解析得到的设备树数据结构传递给相应的设备驱动程序进行设备的注册。

server_api196的博客 266

linux内核启动阶段对设备树的解析

(2)本文对设备树的讲解是基于hi3516dv300芯片的uboot和kernel源码进行详解,uboot版本是2016.11,内核版本是4.9.37;(3)在dv300芯片用的uboot和内核中,uboot启动内核传参是传统tag方式,内核是采用的设备树技术,镜像构成是zImage+dtb;...

weixin_42031299的博客 3958

CentOS 7下Synopsys DC综合工具安装与配置全攻略(附常见报错解决方案)

本文详细介绍了在CentOS 7操作系统上安装与配置Synopsys Design Compiler(DC)综合工具的完整流程。内容涵盖从系统环境准备、软件安装、许可证配置到实战综合的全过程,并针对DC综合工具在安装和运行中常见的报错问题提供了具体的解决方案,帮助数字IC设计初学者快速搭建稳定的EDA学习环境。

weixin_29159441的博客 257

避坑指南:SAP成本中心分割结构配置常见错误及解决(含KA06/KL01前置步骤)

本文深入解析了SAP成本中心会计中分割结构配置的关键步骤与常见错误。重点强调了配置前必须通过KA06创建次级成本要素(类别42)和通过KL01创建活动类型这两个核心前置步骤,并详细剖析了在OKES中定义分割规则及版本时的高频报错原因与解决方案,帮助顾问和运维人员有效规避配置陷阱,确保成本分摊的准确性。

pear55的博客 865

深入探索Linux内核设备树(Device Tree):详细介绍与实践指南

深入探索Linux内核设备树(Device Tree):详细介绍与实践指南

深耕嵌入式领用多年, 致力于分享嵌入式领域技术! 3403

使用HFSS仿真分支波导耦合器

本文介绍了分支波导耦合器的HFSS仿真设计过程。首先给出了器件关键参数(t=0.365mm,l=1.600mm等),详细说明了建模步骤:包括创建中心分支、设置变量参数、镜像复制两侧分支、矩形波导端口设计等操作。重点阐述了激励端口设置方法,包括四个端口的积分线绘制,以及求解频率设定。最后展示了S参数、幅度平衡度和相位差等关键性能指标的仿真结果提取方法。整个设计过程体现了HFSS在微波器件仿真中的参数化建模和结果分析能力。

shao666888的博客 180

Linux驱动开发—设备树开发详解

Linux驱动开发—设备树开发详解

拉依达不拉跨的博客 3278

智驾域控制器硬件架构:从接口丛林到算力核心的工程解码

本文深入解析了智驾域控制器硬件架构的设计挑战与工程实践。面对复杂的接口丛林,文章详细探讨了如何高效融合摄像头、雷达等多源传感器数据,并构建以多SOC为核心的强大算力平台。同时,文章强调了电源、时钟、散热等最小系统及车规级可靠性设计的关键作用,为工程师提供了从接口驯服到算力核心协同的完整硬件解码指南。

happy2的博客 482

深入解析“PROJ: proj_create_from_database: Cannot find proj.db”错误:从环境配置到打包实战

本文深入解析了“PROJ: proj_create_from_database: Cannot find proj.db”错误的根源与解决方案,涵盖环境配置、PyInstaller打包及跨平台兼容性处理。通过详细分析PROJ库路径问题及GDAL依赖关系,提供动态路径设置、资源文件打包等实战技巧,帮助开发者高效解决地理数据处理中的常见错误。

weixin_29074409的博客 444

Linux设备树

Linux下设备树详解

qq_67915669的博客 1973

基于Jira与Confluence的企业知识库AI助手构建实战

检索增强生成(RAG)技术通过结合信息检索与大型语言模型,有效解决了AI在专业领域知识不足的问题。其核心原理是将外部知识库(如企业文档)进行向量化存储,在用户提问时进行语义检索,并将相关上下文注入提示词中,从而生成精准、有据可依的回答。这一技术架构在工程实践中价值显著,它无需重新训练模型即可让AI掌握特定领域的专业知识,大幅提升了回答的准确性与实用性。典型的应用场景包括智能客服、企业内部知识问答以及代码辅助等。本文以开源项目`dev-kostiuk/jira-confluence-ai-context`为例

weixin_42520448的博客 367

【Linux】设备树详解dts

在Linux3.x版本后,arch/arm/plat-xxx和arch/arm/mach-xxx中,描述板级细节的代码(比如platform_device、i2c_board_info等)被大量取消,取而代之的是设备树,其目录位于arch/arm/boot/dts 1. 设备树的组成 1个dts文件+n个dtsi文件,它们编译而成的dtb文件就是真正的设备树。 soc厂商会把soc公共的特性和多块开发板公用的特性提炼为dtsi,而dts则负责描述某个具体的产品(开发板)的特性。dts直接或间接的包含多个dt

houxiaoni01的博客 3900

MaxScript批量修改材质、贴图名称

MaxScript批量修改材质、贴图名称1 实现效果1.1 修改前材质、贴图名称1.2 修改后2 代码 1 实现效果 1.1 修改前材质、贴图名称 1.2 修改后 2 代码 prefixName = "prefiname" maxFile = "maxfilepath" makeDir "newBitmappath" mapsPath = newbitmappath + "\\" fn formatStr index = ( str = index as string newS

郑德帅 3241

【OCPP】ocpp1.6J协议框架说明

本文档的目的是为读者提供创建正确的可互操作 OCPP JSON 实现 (OCPP-J) 所需的信息。我们将根据我们自己的经验,尝试解释什么是强制性的、什么是良好做法以及什么是不应该做的。毫无疑问,误解或歧义仍然存在,但我们旨在通过本文件尽可能地防止它们。IANA:互联网数字分配机构(OCPP-J:使用JSON通过WebSocket进行OCPP通信。特定的OCPP版本应使用J扩展进行指示。OCPP1.5J表示我们正在讨论1.5版本的JSON/WebSocket实现。

qq_53871375的博客 1241

内核启动与如何获取设备树信息

问题:我们的内核程序好像没有main函数那他是这么自己跑起来的。问:driver又是怎么获取到设备树的信息的。​ 这段代码就是将修饰的函数放入。的函数在内核启动时就会调用。

ArrebolJiuZhou的博客 258

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

设备树和设备树语法

设备树,将这个词分开就是“设备”和“树”,描述设备树的文件叫做 DTS(Device Tree Source),这个 DTS 文件采用树形结构描述板级设备,也就是开发板上的硬件设备信息,比如CPU 数量、内存基地址、IIC 接口上接了哪些设备、SPI 接口上接了哪些设备等等。设备树文件的扩展名为 .dts,一个 .dts(device tree source)就文件对应一个开发板。该文件放置在内核的"arch/arm/boot/dts/"目录下,。

嘿嘿の博客 2037

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Linux内核中的设备树详解

设备树是一种描述硬件设备的数据结构,它使用树形结构来表示硬件设备的层次关系。

jiang_style的博客 4057

设备树的属性

设备树的属性

xie__jin__cheng的博客 504

43.驱动--内核对设备树的解析

43.驱动--内核对设备树的解析

LingLinTianShang的博客 1796

添加设备树节点,驱动读取设备树信息

添加设备树节点,驱动读取设备树信息 1、设备树常用 OF 操作函数 ①查找节点的 OF 函数 设备都是以节点的形式“挂”到设备树上的,因此要想获取这个设备的其他属性信息,必须先获取到这个设备的节点。Linux 内核使用 device_node 结构体来描述一个节点。 struct device_node { const char *name; /* 节点名字 */ const char *type; /* 设备类型 */ phandle phandle; const char *full_name;

qq_39236383的博客 1314

Linux 设备树

inux设备树

m0_69211839的博客 1364

Linux内核 -- Linux驱动从设备树dts文件中读取字符串信息的方法

在Linux内核中,从设备树(DTS)中读取字符串信息,通常使用内核提供的设备树解析API。这些API主要位于头文件中。

sz66cm 学习随笔 783

【Linux】设备树,驱动和硬件的桥梁

设备树(Device Tree)在嵌入式 Linux 系统中,确实扮演着角色。你可以把它想象成一份随主板一起交给 Linux 内核的“这份说明书用一种特定的文本格式(.dts文件)写成,详细描述了CPU、内存、总线、外设等所有硬件的关键信息,比如地址、中断号、时钟等。通过它,驱动代码无需为每一款硬件平台都写死配置,从而实现了,大大提升了代码的可重用性和可维护性。为了让你对内核处理设备树的完整流程有个直观的印象,我整理了下面的流程图,它概括了从源代码到驱动匹配的全过程。fill:#333;

撬动未来的支点的专栏 786

2.13作业【设备树解析,按自己理解】

作业

MisakaMikotto的博客 881
上一篇: 深入解析设备树(Device Tree)中的属性(Properties)
下一篇: 深入理解 Linux 内核模块:核心知识、注册机制与文件系统映射
嵌入式孙老师
博客等级 码龄7年 5687粉丝 902原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值