首页 > 其他分享 >设备树DTS简介及DTS基本语法

设备树DTS简介及DTS基本语法

时间:2024-03-23 20:12:41浏览次数:37  
标签:compatible 简介 cells reg 语法 DTS 设备 节点 属性

参考资料: https://www.bilibili.com/video/BV1fJ411i7PB?p=16&vd_source=432ba293ecfc949a4174ab91ccc526d6   在linux3.1版本引入设备树 设备树用来描述板级信息 0

编译设备树:

make all    // 全编译,包括内核镜像和dtb
make dtbs    // 编译所有的设备树文件
make imx6ull-14x14-emmc-4.3-800x480-c.dtb        // 编译单个dtb
 

dtc反编译出dts方法:

sudo apt install device-tree-compiler
通过安装device-tree-compiler工具,可以通过下面的命令进行将dtb反编译出dts:
fdtdump imx6ull-14x14-emmc-4.3-800x480-c.dtb > test.txt            或
dtc -I dtb -O dts -o test.dts imx6ull-14x14-emmc-4.3-800x480-c.dtb
 

DTS语法基本语法:

1、.dtsi头文件

和c语言一样,也有头文件的概念,举个例子: 为了适应不同的屏幕,其他的设备树内容都是一样的,那么就可以不同屏幕的设备创建不同分辨率的设备树dts文件 设备树不仅可以引用.dtsi头文件,也可以直接引用c语言的.h头文件,用来说明一些dts规范  

2、设备节点

如下截取设备树部分:
 {                    // 根节点,多个文件的根节点在dtc时会汇总为一个
         aliases {
                 can0 = &flexcan1;
        };
         cpus {
                 #address-cells = <1>;
                 #size-cells = <0>;

                 cpu0: cpu@0 {
                         compatible = "arm,cortex-a7";
                         device_type = "cpu";
                         reg = <0>;
                };
        };
         intc: interrupt-controller@00a01000 {
                 compatible = "arm,cortex-a7-gic";
                 #interrupt-cells = <3>;
                 interrupt-controller;
                 reg = <0x00a01000 0x1000>,
                       <0x00a02000 0x100>;
         };
}
节点命令格式:
label:    node-name@unit-address
label是个标签,label 的目的就是为了方便访问节点,可以直接通过&label 来访问这个节点,比如通过&cpu0 就可以访问“cpu@0”这个节点,而不需要输入完整的节点名字 node-name是节点名字,为 ASCII 字符串 unit-address是节点基地址  

基本节点属性:

compatible = "arm,cortex-a7";                                            // 字符串属性,compatible 属性的值为字符串“arm,cortex-a7
reg = <0>;                                                                // 32位无符号整数,reg属性的值为0
compatible = "fsl,imx6ull-gpmi-nand", "fsl, imx6ul-gpmi-nand";            // 属性值也可以为字符串列表,字符串和字符串之间采用“,”隔开,代码设置属性 compatible 的值为“fsl,imx6ull-gpmi-nand”
                                              和“fsl, imx6ul-gpmi-nand”。

 

 

3、标准属性

3.1 compatible属性

这个是跟驱动进行匹配的 一般驱动程序文件都会有一个 OF 匹配表,此 OF 匹配表保存着一些 compatible 值,如果设备节点的 compatible 属性值和 OF 匹配表中的任何一个值相等,那么就表示设备可以使用这个驱动  

3.2 status属性

status 属性看名字就知道是和设备状态有关的,status 属性值也是字符串 可选状态有:
okay        // 表示设备可以操作
disabled    // 表示设备当前不可操作
fail        // 表示设备不可操作,没用过
fail-sss    // 表示设备不可操作,也没用过
 

3.3 #address-cells 、#size-cells 属性和reg属性

这两个属性的值都是无符号 32 位整形,#address-cells 和#size-cells 这两个属性可以用在任何拥有子节点的设备中,用于描述子节点的地址信息。#address-cells 属性值决定了子节点 reg 属性中地址信息所占用的字长(32 位),#size-cells 属性值决定了子节点 reg 属性中长度信息所占的字长(32 位)。#address-cells 和#size-cells 表明了子节点应该如何编写 reg 属性值,一般 reg 属性都是和地址有关的内容,和地址相关的信息有两种:起始地址和地址长度,reg 属性的格式一为:
reg = <address1 length1 address2 length2 address3 length3……>
例如下面节点:
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>;
    };
};
子节点 dcp: dcp@02280000 的 reg 属性值为<0x02280000 0x4000>,因为父节点设置了#address-cells = <1>,#size-cells = <1>,address= 0x02280000,length= 0x4000,相当于设置了起始地址为 0x02280000,地址长度为 0x40000。  

3.4 追加设备节点

例如向i2c1追加mag3110设备,则可如下设置:
&i2c1 {
    clock-frequency = <100000>;
    pinctrl-names = "default";
    pinctrl-0 = <&pinctrl_i2c1>;
    status = "okay";
    
    mag3110@0e {
        compatible = "fsl,mag3110";
        reg = <0x0e>;
        position = <2>;
    };
};
这个就是向i2c1节点追加mag3110设备,重点就是通过&i2c1来访问节点,然后直接在里面编写要追加或者修改的内容。  

3.5 alias子节点

aliases {
        can0 = &flexcan1;
        can1 = &flexcan2;
        ethernet0 = &fec1;
        ethernet1 = &fec2;
        gpio0 = &gpio1;
        gpio1 = &gpio2;
        gpio2 = &gpio3;
        gpio3 = &gpio4;
        gpio4 = &gpio5;
...
        spi0 = &ecspi1;
        spi1 = &ecspi2;
        spi2 = &ecspi3;
        spi3 = &ecspi4;

};
aliases 节点的主要功能就是定义别名,定义别名的目的就是为了方便访问节点。不过我们一般会在节点命名的时候会加上 label,然后通过&label来访问节点,这样也很方便,而且设备树里面大量的使用&label 的形式来访问节点。  

3.6 chosen 子节点

chosen 并不是一个真实的设备,chosen 节点主要是为了 uboot 向 Linux 内核传递数据,重点是 bootargs 参数。 例如当前我的开发板的chosen节点下bootargs如下: 0 如何来的可见: 0   以上就是最基本的设备树基础语法

标签:compatible,简介,cells,reg,语法,DTS,设备,节点,属性
From: https://www.cnblogs.com/lethe1203/p/18091600

相关文章

  • VUE3.0(一):vue3.0简介
    Vue3入门指南什么是vueVue(发音为/vjuː/,类似view)是一款用于构建用户界面的JavaScript框架。它基于标准HTML、CSS和JavaScript构建,并提供了一套声明式的、组件化的编程模型,帮助你高效地开发用户界面。无论是简单还是复杂的界面,Vue都可以胜任。vue3官方文......
  • python基本概念及语法
    Python是一种高级、面向对象的编程语言,它具有简洁、易读的语法,适用于多种领域的应用开发。Python的基本概念包括:变量:用于存储数据的容器,可以是数字、字符串、列表等类型。在Python中,不需要事先声明变量的类型,可以直接赋值使用。示例:x=5#整数变量y="Hello"#字符......
  • JAVA阻塞IO(BIO)简介
    一、BIO编程传统的BIO编程网络编程的基本模型是C/S模型,即两个进程间的通信。服务端提供IP和监听端口,客户端通过连接操作想服务端监听的地址发起连接请求,通过三次握手连接,如果连接成功建立,双方就可以通过套接字进行通信。传统的同步阻塞模型开发中,ServerSocket负责绑定IP地址,启......
  • 深入理解 C++ 语法:从基础知识到高级应用
    C++语法让我们将以下代码分解以更好地理解它:示例#include<iostream>usingnamespacestd;intmain(){cout<<"HelloWorld!";return0;}示例解释第1行:#include<iostream>是一个头文件库,它让我们可以使用输入和输出对象,比如cout(在第5行使用)。头文件为......
  • 根文件系统简介与BusyBox构建根文件系统
    参考资料:https://www.bilibili.com/video/BV12E411h71h?p=43&vd_source=432ba293ecfc949a4174ab91ccc526d6 根文件系统简介:根文件系统也成为rootfs,fatfs这类的文件系统属于Linux内核的一部分,属于软件代码如果没根文件系统,内核会出现kernelpanic。根文件系统就是一堆文件,比......
  • Markdown常用语法备忘手册
    数学公式/LaTeX语法矩阵先来一份示例$$\left[\begin{array}{r:c:l}a0&b1&c2\\\hlined&e&f\end{array}\right]$$说明:1.首尾的$$换成$可以将矩阵改成行内显示,即不单独换行;2.'\left['和'\right]'表示左右分别用'[]'包裹,也支持用'()�......
  • 海思 SS927V100 HI3519AV200 简介
    海思SS927V100HI3519AV200简介HI3519AV200是一颗专业ultra-HDSmartIPCameraSOC。SS927V100(另称:22AP70、SD3402)功能以及封装与HI3519AV200完全一致,可以平替HI3519AV200。最高支持四路sensor输入,支持最高4K60的ISP图像处理能力,支持3FWDR、多级降噪、六轴......
  • 宽动态(WDR)简介
    WDR,全称WideDynamicRange,即宽动态范围。宽动态就是场景中特别亮的部位和特别暗的部位同时都能看得特别清楚。宽动态范围是图像能分辨最亮的亮度信号值与能分辨的最暗的亮光信号值的比值。 宽动态图像对比宽动态未开启:只能看清窗外的建筑物,房间内的人无法看清宽动态开启:无......
  • 【教程】高效数据加密混淆方法及实现简介
     背景在需要对数据进行传输或者表达时,通常要求数据加密的安全级别不高,但希望加解密时间复杂度尽可能低。这时使用传统的对称加密(如3DES、AES)或非对称加密(如RSA、ECC)显然不太适合。因为加密的安全级别和加解密时间复杂度之间存在矛盾。所以,我们需要寻找一种方法,在保证安全性的同......
  • Linux内核启动流程简介
    参考资料:https://www.bilibili.com/video/BV12E411h71h?p=38&vd_source=432ba293ecfc949a4174ab91ccc526d6 Linux内核链接脚本arch/arm/kernel/vmlinux.lds arch/arm/kernel/vmlinux.lds中OUTPUT_ARCH(arm)ENTRY(stext)//Linux内核入口,入口函数stextjiffies=......