正点原子----Linux设备树详解

2023-05-16

linux设备树

  • 1、什么是设备树
  • 2、DTS、DTB、DTC的关系
  • 3、如何编译设备树
  • 4、DTS基本结构
    • 4.1、语法
    • 4.2、设备树在系统中的体现
    • 4.3、尝试自己添加节点
    • 4.4、尝试对根节点追加信息
  • 5、设备树特殊节点
    • 5.1、chosen子节点
    • 5.2、aliases子节点
  • 6、设备树中标准属性
    • 6.1、compatilbe属性
    • 6.2、model属性
    • 6.3、status属性
    • 6.4、reg属性
    • 6.5、#address-cells和#size-cells
  • 7、OF操作函数
    • 7.1、OF函数查找节点
      • ① of_find_node_by_name
      • ② of_find_compatible_node
      • ③ of_find_node_by_path
    • 7.2、查找父子节点的OF函数
      • ① of_get_parent
      • ② of_get_next_child
    • 7.3、提取属性值的OF函数
      • ① of_find_property
      • ② of_property_read_u32_index
      • ③ of_property_read_u8_array
      • ④ of_property_read_u8

1、什么是设备树

        
        设备树DTS(Device Tree Source),DTS文件用树形结构描述板级设备,也就是开发板上的设备信息,比如CPU数量,内存基地址,IIC接口上接了哪些设备等等,如下图:

在这里插入图片描述

2、DTS、DTB、DTC的关系

        1、DTS是设备树的源文件
        2、DTB是DTS编译后得到的二进制文件
        3、DTC是DTS的编译工具,源码在内核的scripts/dtc目录下面,如下:

在这里插入图片描述

3、如何编译设备树

        1、make dtbs:编译所有的dts文件;
        2、make xxx.dts:编译指定的dts文件按;

4、DTS基本结构

        设备树也有头文件,扩展名为.dtsi

4.1、语法

        1、根节点:/
        2、从/根节点开始描述设备信息
        3、在/根节点外有一些&cpu0这样的语句是“追加”
        这里以imx6ull-alientek-emmc.dts为例,下图chosen,memor为子节点

/dts-v1/;

#include <dt-bindings/input/input.h>
#include "imx6ull.dtsi"

/ {
    model = "Freescale i.MX6 ULL 14x14 EVK Board";
    compatible = "fsl,imx6ull-14x14-evk", "fsl,imx6ull";

    chosen {
        stdout-path = &uart1;
    };

    memory {
        reg = <0x80000000 0x20000000>;
    };
    
&cpu0 {
     arm-supply = <&reg_arm>;
     soc-supply = <&reg_soc>;
     dc-supply = <&reg_gpio_dvfs>;
};

}

        4、节点名字完整的要求:node-name@unit-address,例如:

i2c4: i2c@021f8000 {
		#address-cells = <1>;
		#size-cells = <0>;
		compatible = "fsl,imx6ul-i2c", "fsl,imx21-i2c";
		reg = <0x021f8000 0x4000>;
		interrupts = <GIC_SPI 35 IRQ_TYPE_LEVEL_HIGH>;
		clocks = <&clks IMX6UL_CLK_I2C4>;
		status = "disabled";
	};

        后面0x021f8000为i2c4的起始地址。

        5、还可以为节点加标签,在设备树也是很常见的,例如:
        lable:node-name@unit-address
        lable为标签,后面node-name是名字。加lable的目的是为了后面访问追加时方便。

4.2、设备树在系统中的体现

        1、系统启动以后可以在根文件系统里面可以看到设备树节点信息,在/proc/device-tree/目录下存放着设备树信息,一级子节点。一级子节点内还有二级子节点。
在这里插入图片描述

4.3、尝试自己添加节点

        1、在imx6ull-alientek-emmc.dts根节点下添加如下内容
在这里插入图片描述
        2、make dtbs编译,拷贝到tftp目录下,重启开发板,进入到/proc/device-tree目录下即可看到添加的节点
在这里插入图片描述

4.4、尝试对根节点追加信息

        1、添加之前intc节点目录内容如下:
在这里插入图片描述
        2、在imx6ull-alientek-emmc.dts下加入如下内容
在这里插入图片描述
        3、编译、拷贝、重启开发板,追加节点信息如下:

在这里插入图片描述

5、设备树特殊节点

5.1、chosen子节点

        1、chosen并不是一个真实的节点,主要目的是将uboot里面的bootargs环境变量传递给linux内核,作为命令行参数。
        uboot里面的bootargs为:
在这里插入图片描述
        kernel中bootargs为:
在这里插入图片描述
        2、经过查看chosen节点中包含bootargs属性,但是我们在设备树里面并没有设置bootargs。
        3、这是因为在uboot过程中fdt_chosen函数会将bootargs传给内核,在uboot源码中common/fdt_support.c文件内,如下:
在这里插入图片描述

5.2、aliases子节点

        aliaese的意思是 “别名” ,给节点起另一个名字。
在这里插入图片描述

6、设备树中标准属性

6.1、compatilbe属性

        1、copatible属性叫做兼容性,值是一个字符串列表,compatible属性用来将设备和驱动绑定起来,其格式一般为“manufacturer,model”
        2、在驱动中of_device_id机构提匹配表,保存着一些compatible值,如果设备节点的compatible属性值和of匹配表中的任何一个值相等,就会调用probe函数。
在这里插入图片描述

6.2、model属性

        model属性值也是一个字符串,描述设备模块信息,比如名字:

model = "wm8960-audio";

6.3、status属性

状态
        okay:表示设备可操作
        disable:表示设备不可操作

6.4、reg属性

        reg属性值一般是(address,length),描述设备地址空间资源,一般都是某个外设的寄存器地址范围信息,如:

uart1: serial@02020000 {
	compatible = "fsl,imx6ul-uart","fsl,imx6q-uart", "fsl,imx21-uart";
	reg = <0x02020000 0x4000>;
	interrupts = <GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH>;
	clocks = <&clks IMX6UL_CLK_UART1_IPG>,
	<&clks IMX6UL_CLK_UART1_SERIAL>;
	clock-names = "ipg", "per";
	status = "disabled";
};

6.5、#address-cells和#size-cells

        1、这两个属性值都是无符号32位整形。address-cells属性绝对了子节点reg属性中地址信息所占用的字长,size-cells属性值决定了子节点reg属性中长度信息所占用的字长。如:

spi4 {
	compatible = "spi-gpio";
	#address-cells = <1>;
	#size-cells = <0>;

	gpio_spi: gpio_spi@0 {
		compatible = "fairchild,74hc595";
		reg = <0>;
	};
};

aips3: aips-bus@02200000 {
	compatible = "fsl,aips-bus", "simple-bus";
	#address-cells = <1>;
	#size-cells = <1>;

	dcp: dcp@02280000 {
		compatible = "fsl,imx6sl-dcp";
		reg = <0x02280000 0x4000>;
	};
};

        2、spi4的address=1,size=1,说明spi4的子节点reg属性中起始地址所占用字长为1,地址长度所占用字长位0
        3、gpio_spi: gpio_spi@0节点中的reg属性:reg = <0>,是因为父节点设置了address=1,size=0。
        aips3也同样理解。

7、OF操作函数

        1、在驱动中使用OF函数获取设备属性内容。设备都是以节点的形式挂到设备树上,因此要想获取这个设备的其他属性信息,必须先获取节点。
        2、Linux内核使用device_node结构体来描述一个节点,此结构体定义在include/linux/of.h中。

7.1、OF函数查找节点

① of_find_node_by_name

struct device_node *of_find_node_by_name(struct device_node *from,const char *name);

参数:
        1、form:开始查找的节点,如果为NULL表示从根节点开始查找整个设备树name:要查找的节点名字
        2、返回值:找到的节点,如果为NULL表示查找失败

② of_find_compatible_node

参数:
        1、from:开始查找的节点,如果为 NULL 表示从根节点开始查找整个设备树。
        2、type:要查找的节点对应的 type 字符串,也就是 device_type 属性值,可以为 NULL,表示忽略掉 device_type 属性。
        3、compatible: 要查找的节点所对应的 compatible 属性列表。
        4、返回值: 找到的节点,如果为 NULL 表示查找失败

③ of_find_node_by_path

参数:
        1、path:带有全路径的节点名,可以使用节点的别名,比如“/backlight”就是 backlight 这个节点的全路径。
        2、返回值: 找到的节点,如果为 NULL 表示查找失败

7.2、查找父子节点的OF函数

        参数就不介绍了,使用较少。

① of_get_parent

② of_get_next_child

7.3、提取属性值的OF函数

        节点的属性信息里面保存了驱动所需要的内容,Linux内核中使用结构体property表示属性,此结构体定义在of.h文件中,如下:

struct property {
	char *name; /* 属性名字 */
	int length; /* 属性长度 */
	void *value; /* 属性值 */
	struct property *next; /* 下一个属性 */
	unsigned long _flags;
	unsigned int unique_id;
	struct bin_attribute attr;
};

① of_find_property

        该函数用于查找指定的属性,函数原型:

property *of_find_property(const struct device_node *np,const char *name,int *lenp)

参数介绍:
        1、np:设备节点
        2、name:属性名字
        3、lenp:属性值的字节数
        4、返回值:找到的属性

② of_property_read_u32_index

        从属性中获取指定标号的u32类型数据值,函数原型如下:

int of_property_read_u32_index(const struct device_node *np,const char *propname,u32 index,u32 *out_value)

③ of_property_read_u8_array

        读取属性中u8类型的数组数据,也可以读u16、u32、u64类型的,函数原型如下:

int of_property_read_u8_array(const struct device_node *np,const char *propname,u8 *out_values,size_t sz)

④ of_property_read_u8

        读取之后一个整形值的属性,函数原型如下:

int of_property_read_u8(const struct device_node *np,const char *propname,u8 *out_value)

下篇使用OF函数获取设备树节点信息。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

正点原子----Linux设备树详解 的相关文章

  • Bash 方法的返回值总是模 256

    我有一个 bash 脚本方法 它返回输入值 然而 返回值始终是模 256 的值 我用 google 搜索了一段时间 发现this http www tldp org LDP abs html exitcodes html文章说它总是以 25
  • sleep 0 有特殊含义吗?

    我看到很多用法sleep 0在我的一个客户项目中 代码看起来像这样 while true sleep 0 end 阅读一些像这样的答案this https stackoverflow com questions 3727420 signif
  • 适用于 KDE 和 Gnome 的 Gui [重复]

    这个问题在这里已经有答案了 我想为一个现在是 CLI 的应用程序编写一个 gui 它需要在 KDE 和 Gnome DE 中 看起来不错 充分利用用户的外观设置 如果我选择 Qt 或 GTK 我能够做到这一点吗 它们与两个 DE 集成良好吗
  • 从多线程程序中调用 system()

    我们正在开发一个用 C 编写的多线程内存消耗应用程序 我们必须执行大量的 shellscript linux 命令 并获取返回码 读完之后article http www linuxprogrammingblog com threads a
  • Composer 安装要求

    我正在尝试将 Composer 安装到 Laravel 项目中 当我做的时候sudo composer install在项目目录中它显示了两个错误 Problem 1 Installation request for simplesoftw
  • Docker:处理 tar 文件时出错(退出状态 1):设置枢轴目录时出错:不是目录

    我是 Docker 新手 不知道是什么原因导致此错误或如何诊断它 任何有关此问题的具体帮助或有关首先检查何处以诊断此类问题的提示将不胜感激 我的 Dockerfile FROM java 8 Install maven RUN apt ge
  • PHP 致命错误:未找到“MongoClient”类

    我有一个使用 Apache 的网站 代码如下 当我尝试访问它时 我在 error log 中收到错误 PHP Fatal Error Class MongoClient not found 以下是可能错误的设置 但我认为没有错误 php i
  • 如何制作和应用SVN补丁?

    我想制作一个SVN类型的补丁文件httpd conf这样我就可以轻松地将其应用到其他主机上 If I do cd root diff Naur etc httpd conf httpd conf original etc httpd con
  • 嵌入式Linux poll()不断返回

    我有一个特别的问题 当我知道没有什么可读时 民意调查不断返回 因此设置如下 我有 2 个文件描述符 它们构成fd设置民意调查监视 一种用于引脚从高到低的变化 GPIO 另一个用于代理输入 代理输入出现问题 处理的顺序是 启动main函数 然
  • Godaddy 托管上的 CakePHP 控制台

    我一直在努力让我的 CakePHP 网站在 Godaddy 网格托管 帐户上运行 我的蛋糕应用程序设置是从帐户的子目录托管的 并且可以通过子域访问 我必须调整我的 htaccess 文件才能使其正常工作 现在我需要让 CakePHP 控制台
  • xsel -o 对于 OS X 等效项

    是否有一个等效的解决方案可以在 OS X 中抓取选定的文本 就像适用于 Linux 的 xsel o 一样 只需要当前的选择 这样我就可以在 shell 脚本中使用文本 干杯 埃里克 你也许可以安装xsel在 MacOS 上 更新 根据 A
  • Unix 命令列出包含字符串但*不*包含另一个字符串的文件

    如何递归查看包含一个字符串且不包含另一个字符串的文件列表 另外 我的意思是评估文件的文本 而不是文件名 结论 根据评论 我最终使用了 find name html exec grep lR base maps xargs grep L ba
  • bluetoothctl 到 hcitool 等效命令

    在 Linux 中 我曾经使用 hidd connect mmac 来连接 BT 设备 但自 Bluez5 以来 这种情况已经消失了 我可以使用 bluetoothctl 手动建立连接 但我需要从我的应用程序使用这些命令 并且使用 blue
  • 抑制 makefile 中命令调用的回显?

    我为一个作业编写了一个程序 该程序应该将其输出打印到标准输出 分配规范需要创建一个 Makefile 当调用它时make run gt outputFile应该运行该程序并将输出写入一个文件 该文件的 SHA1 指纹与规范中给出的指纹相同
  • 跟踪 Linux 程序中活跃使用的内存

    我想跟踪各种程序在特定状态下接触了多少内存 例如 假设我有一个图形程序 最小化时 它可能会使用更少的内存 因为它不会重新绘制窗口 这需要读取图像和字体并执行大量库函数 这些对象仍然可以在内存中访问 但实际上并没有被使用 类似的工具top它们
  • 使用 grep 查找包含所有搜索字符串的行

    我有一个文件 其中包含很多与此类似的行 id 2796 some model Profile message type MODEL SAVE fields account 14 address null modification times
  • 如何使用 xterm.js 创建基于 Web 的终端以 ssh 进入本地网络上的系统

    我偶然发现了这个很棒的图书馆xterm js https xtermjs org 这也是 Visual Studio Code 终端的基础 我有一个非常普遍的问题 我想通过基于网络的终端 不在网络中 可能位于 aws 服务器上 访问本地网络
  • 如何在 Linux 中编写文本模式 GUI? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 当我编写脚本 程序时 我经常想弹出一个简单的文本 gui 来提示输入 我该怎么做 例如 来自 Shel
  • nginx 上的多个网站和可用网站

    通过 nginx 的基本安装 您的sites available文件夹只有一个文件 default 怎么样sites available文件夹的工作原理以及如何使用它来托管多个 单独的 网站 只是为了添加另一种方法 您可以为您托管的每个虚拟
  • 为什么 Linux perf 使用事件 l1d.replacement 来处理 x86 上的“L1 dcache misses”?

    在英特尔 x86 上 Linux用途 https stackoverflow com a 52172985 149138事件l1d replacements来实施其L1 dcache load misses event 该事件定义如下 计数

随机推荐

  • qt设置小数点精度位数

    在Qt中 xff0c 我们可以使用QString number 函数将float类型转换为QString类型以便在界面上显示 该函数默认显示6位小数 xff0c 但我们也可以通过设置第二个参数来控制小数点位数 以下是示例代码 xff0c 将
  • 重写Qt中的Widget移动事件

    如果您想在Qt中重写Widget的移动事件 xff0c 可以通过以下步骤实现 xff1a 创建自定义Widget并继承QWdget类 重写QWidget的mousePressEvent mouseMoveEvent 和mouseReleas
  • 如何在Qt中实现子控件和父控件的同步移动

    在Qt中 xff0c 可以通过重写子控件的moveEvent 函数来实现子控件和父控件的同步移动 具体步骤如下 xff1a 子控件继承QWidget或其子类 xff0c 并重写moveEvent 函数 在moveEvent 函数中 xff0
  • 如何使用 QToolTip

    QToolTip 是 Qt 框架中的一个类 xff0c 它可以用于在鼠标悬停在控件上时显示提示信息 下面是使用 QToolTip 的步骤 xff1a 在需要显示提示信息的控件上 xff0c 设置 setToolTip 方法 例如 xff1a
  • DbgHelp的使用方法

    DbgHelp是一个Windows平台下的调试器辅助工具 xff0c 它提供了一些函数和数据类型 xff0c 可以帮助开发者在调试时获取更多的信息 以下是DbgHelp的使用方法 xff1a 1 引入DbgHelp库 在代码中使用DbgHe
  • QString转化为char*

    QByteArray temp ip span class token operator 61 span mqtt config span class token punctuation span ip span class token p
  • qt转换Xcode编译

    usr local Cellar qt 6 0 2 bin qmake QTForXcode pro spec macx xcode
  • Java学习路线总结(思维导图篇)

    x1f3c6 作者简介 xff1a 哪吒 xff0c CSDN2022博客之星Top1 CSDN2021博客之星Top2 多届新星计划导师 博客专家 x1f4aa xff0c 专注Java硬核干货分享 xff0c 立志做到Java赛道全网T
  • 刚毕业的表弟年薪40w......程序员薪资天花板?

    前不久 xff0c 腾讯2022校招 应届毕业生年薪 40 万 刷屏了 尽管互联网大厂的薪资高不算什么新鲜事儿 xff0c 但这个热搜仍然让我大受震撼 腾讯校招官网显示 xff0c 2022届腾讯校招开放技术 产品 设计等岗位共计 78 个
  • 运维面试题--Linux系统 启动过程

    简述 xff1a 1 开机BIOS自检 2 MBR引导 3 grub引导菜单 4 加载内核kernel 5 启动init进程 6 读取inittab文件 xff0c 执行rc sysinit rc等脚本 7 启动mingetty xff0c
  • Dockerfile中echo命令不能加 -e 选项

    以换源举例 xff1a span class token builtin class name export span span class token assign left variable CDN span span class to
  • jdbc环境配置及操作步骤

    文章目录 jdbc环境配置jdbc 操作步骤 jdbc 环境配置 jdbc开发 xff0c 需要提前先准备驱动包 下载一个mysql驱动包 xff09 及配置 xff08 项目配置引入这个驱动包 下载链接 xff1a mysql驱动包 注意
  • 在柱状图中找最大矩形——O(n)时间复杂度java实现

    最近在刷leetcode xff0c 又碰到了这道题 xff0c 想起来当时算法有些瑕疵 xff0c 所以将最新的AC代码更新在最上面做个对比 xff0c 具体思路见注释 public class Solution 思路 主要是使用一个栈来
  • 记一次Hive平台清洗数据

    场景 xff08 简化 xff09 现有文章表Article和评论表Comment xff1b 一篇文章可以有多个评论 xff1b 文章表Article主要字段 xff08 articleId xff09 xff1b 评论表Comment主
  • UART协议及串口回环

    UART协议及串口回环 一 异步通信的分类1 UART xff08 通用异步收发器 xff09 2 RS4223 RS4854 Modbus5 接口标准 二 UART协议要求1 空闲状态2 起始位3 数据位4 校验位5 停止位6 波特率7
  • 使用MapReduce实现遗传算法

    摘要 xff1a 遗传算法在大规模问题的求解中得到越来越多的应用 传统的基于MPI的并行遗传算法需要知道机器架构的细节 另一方面 xff0c 由Google提出的MapReduce可用于开发具有扩展性和容错能力的应用 xff0c 是一个强大
  • 2021-03-08

    解决大疆无人机电池电压不平衡出现电池错误提示无法起飞 一个简单的笨办法 xff0c 处理某块电芯偏低 xff0c 而另一块明显偏高 xff0c 经平衡和数据修正后 xff0c 在使用中反复 xff0c 说明各电芯之间容量发生物理不可逆的容量
  • 如何学习编程语言-API学习

    作为一个本科非计算机科班出身编程水平又很菜的我来说 xff0c 很多学习方法都需要我自己去总结摸索 xff0c 我的老师朋友可以帮我解决具体的问题 xff0c 给我提供足够的资源 xff0c 但是最关键的细节把握和吸收消化还是需要我自己去完
  • 49天精通Java,第9天,java final关键字

    nbsp 目录 一 final nbsp 1 修饰引用 nbsp 2 修饰方法 3 修饰类 二 Java中的对象析构与finalize方法
  • 正点原子----Linux设备树详解

    linux设备树 1 什么是设备树2 DTS DTB DTC的关系3 如何编译设备树4 DTS基本结构4 1 语法4 2 设备树在系统中的体现4 3 尝试自己添加节点4 4 尝试对根节点追加信息 5 设备树特殊节点5 1 chosen子节点