一、设备树dts的基本知识

Linux内核从3.x开始引入设备树的概念,用于实现驱动代码与设备信息相分离。在设备树出现以前,所有关于设备的具体信息都要写在驱动里,一旦外围设备变化,驱动代码就要重写。

引入了设备树之后,驱动代码只负责处理驱动的逻辑,而关于设备的具体信息存放到设备树文件中,这样,如果只是硬件接口信息的变化而没有驱动逻辑的变化,驱动开发者只需要修改设备树文件信息,不需要改写驱动代码。比如在ARM Linux内,一个.dts(device tree source)文件对应一个ARM的machine,一般放置在内核的"arch/arm/boot/dts/"目录内,引入Device Tree,许多硬件的细节可以直接透过它传递给Linux,而不再需要在kernel中进行大量的冗余编码。

本质上,Device Tree改变了原来用code方式将HW配置信息嵌入到内核代码的方法,改用bootloader传递一个DB的形式。对于嵌入式系统,在系统启动阶段,bootloader会加载内核并将控制权转交给内核。
在devie tree中,可描述的信息包括:

1、CPU的数量和类别
2、内存基地址和大小
3、总线和桥
4、外设连接
5、中断控制器和中断的使用情况
6、GPIO控制器和GPIO使用情况
7、clock控制器和clock使用情况

它基本就是一棵电路板上的CPU、总线、设备组成的树,Bootloader会将这棵树传递给内核,然后内核来识别这棵树,并根据它展开出Linux内核中的platform_device、i2c_client、spi_device等设备,而这些设备用到的内存、IRQ等资源,也被传递给内核,内核会将这些资源绑定给展开的相应设备。

二、设备树dts的相关文件

通常由.dts文件以文本方式对系统设备树资源进行描述,经过Device Tree Compiler(dtc)将dts文件转换成二进制文件binary device tree blob(dtb),.dtb文件可由Linux内核解析,
有了device tree就可以在不改动Linux内核的情况下,对不同的平台实现无差异的支持,只需更换相应的dts文件即可。

除了设备树(DTS)外,还有dtsi文件,就像c代码里的头文件一样,是不同设备树共有的设备文件,我一般把它们分别叫做主设备树(dts)和子设备树(dtsi)。这不难理解,
但是值得注意的是如果dts和dtsi里都对某个属性进行定义的话,dts的定义会覆盖dtsi的定义。假如你要调试一个内核工程,工程里有很多模块是已经存在的,这样就可以直接像包含头文件
一样把共性的dtsi文件包含(#include)进来,大大减少工作量,后期也可以对类似模块再次利用。

内核中与设备树相关的文件包括以下几个:

1.1 dts
硬件的相应信息都会写在.dts为后缀的文件中,每一款硬件可以单独写一份xxxx.dts,一般在Linux源码中存在大量的dts文件,对于arm架构可以在arch/arm/boot/dts找到相应的dts,一个dts文件对应一个ARM的machie。

1.2 dtsi
值得一提的是,对于一些相同的dts配置可以抽象到dtsi文件中,然后类似于C语言的方式可以include到dts文件中,类似于C语言头文件,对于同一个节点的设置情况,dts中的配置会覆盖dtsi中的配置;

1.3 dtc
dtc是编译dts的工具,可以在Ubuntu系统上通过指令apt-get install device-tree-compiler安装dtc工具,不过在内核源码scripts/dtc路径下已经包含了dtc工具;

1.4 dtb
dtb(Device Tree Blob),dts经过dtc编译之后会得到dtb文件,dtb文件是二进制格式的, dtb通过Bootloader引导程序加载到内核。所以Bootloader需要支持设备树才行;Kernel也需要加入设备树的支持;

三、设备树dts的结构框架

/dts-v1/;
/ {node1 {a-string-property = "A string";a-string-list-property = "first string", "second string";// hex is implied in byte arrays. no '0x' prefix is requireda-byte-data-property = [01 23 34 56];child-node1 {first-child-property;second-child-property = <1>;a-string-property = "Hello, world";};child-node2 {};};node2 {an-empty-property;a-cell-property = <1 2 3 4>; /* each number (cell) is a uint32 */child-node1 {};};
};

device tree的基本单元是node。这些node被组织成树状结构,除了root node,每个node都只有一个parent。一个device tree文件中只能有一个root node。
每个node中包含了若干的property/value来描述该node的一些特性。每个node用节点名字(node name)标识,节点名字的格式是node-name@unit-address。
如果该node没有reg属性(后面会描述这个property),那么该节点名字中必须不能包括@和unit-address。unit-address的具体格式是和设备挂在那个bus上相关。
例如对于cpu,其unit-address就是从0开始编址,以此加一。而具体的设备,例如以太网控制器,其unit-address就是寄存器地址。root node的node name是确定的,必须是“/”。
也就是说设备树源文件的结构为:

1个root节点”/”;
root节点下面含一系列子节点,“node1” and “node2”
节点node1和下又含有一系列子节点,“child-node1” and “child-node2”
各个节点都有一系列属性
这些属性可能为空,如an-empty-property
可能为字符串,如a-string-property
可能为字符串树组,如a-string-list-property
可能为Cells(由u32整数组成),如second-child-property

可以直接打开一个(rk3288)dts文件来看一下。

四、设备树dts的基本语法

在dts文件中,一个node被定义成:

[label:] node-name[@unit-address] {[properties definitions][child nodes]
}

“[]”表示option,因此可以定义一个只有node name的空节点,label方便在dts文件中引用
基本数据类型:

text string(以null结束),以双引号括起来,如:
string-property = “a string”
cells 是32位无符号整形数,以尖括号括起来,如
cell-property = <0xbeef 123 0xabcd1234>
binary data 以方括号括起来,如:
binary-property = [0x01 0x23 0x45 0x67];
不同类型数据可以在同一个属性中存在,以逗号分格,如:
mixed-property = “a string”, [0x01 0x23 0x45 0x67], <0x12345678>;
多个字符串组成的列表也使用逗号分格,如:
string-list = “red fish”,“blue fish”;

想了解更多设备树dts详情请到我的课程去看看《蔡工linux设备树dts入门详解》

浅析Linux设备树dts相关知识相关推荐

  1. linux 设备树(.dts)实战解析

    文章目录 前言 设备树 DTS语法内容 标准属性 向节点追加或修改内容 设备树在目录中的体现 Linux 内核解析 DTB 文件 帮助文档信息 设备树节点的操作函数 1.查找节点的 of 函数 2.查 ...

  2. i.MX6ULL终结者Linux设备树DTS设备树语法结构

    文章目录 1 dtsi头文件 2 设备节点信息 3 设备节点及label的命名 4 标准属性 5 根节点compatible属性 6 在设备节点中添加或修改内容 一般情况下,我们不会从头编写一个完整的 ...

  3. linux 设备树dts基础

    ​ ​ 活动地址:CSDN21天学习挑战赛 学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩:迟一天就多一天平庸的困扰.各位小伙伴,如果您: 想系统/深入学习某技术知识点- 一个人摸索学习很难坚持 ...

  4. linux设备树dts文件详解

    1.什么是设备树? (1)设备树(dt:device tree)是linux内核采用的参数表示和传递技术,在系统引导启动阶段进行设备初始化的时候,将设备树中描述的硬件信息传递给操作系统: (2)dts ...

  5. Linux设备驱动程序——PCI相关知识的学习

    PCI相关的知识的学习 一.首先了解一下PCI相关的一些基础知识: PCI总线的结构: PCI总线结构是一种层次型的体系结构,在这个结构体中PCI桥设备占据重要的地位.将父总线和子总线连接在一起,使得 ...

  6. linux设备树DTS到是是啥玩意

    一直想搞明白,自从linux开始使用设备树后,从哪里开始加载和bootloadt kenel之间怎么关联,然后总线驱动如何将这些设备挂上去的. 下周开始总结. 先转载一些基本概念: 简介 dts 硬件 ...

  7. Linux 设备树 DTS 语法

    DTS 语法 .dtsi 头文件 设备树支持头文件,设备树的头文件扩展名为.dtsi //linux-5.5.4\linux-5.5.4\arch\arm\boot\dts\s5pv210-smdkv ...

  8. 奇小葩讲设备树(1/5)-- Linux设备树详解(一) 基础知识

    关于设备树,之前就经过详细的系统培训,但是本着会用就行的原则,对各个知识点都没有进行系统的总结.都是用到哪里学哪里,时间长了,基本也忘记了.所以对于后期知识各个知识点进行总结,本章主要讨论一下内容,能 ...

  9. linux dts 语法格式,设备树DTS格式解析

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 宿主机: ubuntu16.04 开发板: tq-imx6ull 内核版本: linux-4.1.15 用实例讲解下设备 ...

  10. Linux设备树 .dtb文件,查看“第二课:设备树的规范(dts和dtb)”的源代码

    因为以下原因,您没有权限编辑本页: 您所请求的操作仅限于该用户组的用户使用:用户 您可以查看与复制此页面的源代码.= 第01节_DTS格式= dts文件通过编译生成dtb格式文件 [[File:ldd ...

最新文章

  1. 都是程序员,凭什么他能站在鄙视链的顶端?
  2. linux共享文件丢失,【干货分享】linux平台下数据文件被误删后,如何及时得知并进行恢复...
  3. 三种编程命名规则(匈牙利法,小驼峰法,大驼峰法)
  4. 目标和—leetcode494
  5. Chrome 控制台指南
  6. golang 读取文件最后一行_测试用例是开发人员最后一块遮羞布
  7. isight参数优化理论与实例详解_案例1(ISIGHT集成ADAMS CAR方法实现)
  8. echo中使用逗号和句号的区别
  9. 每日算法系列【LeetCode 357】计算各个位数不同的数字个数
  10. Dreamweaver8 V8.0.0.2766
  11. 基于SSM框架的公交车调度管理系统
  12. 曲线绕y轴旋转一周所得旋转体体积_求下列曲线绕指定轴旋转一周所围成的旋转体的体积...
  13. 神经网络控制的基本原理,神经网络技术及其应用
  14. matlab计算一元四次方程,一元四次方程解法
  15. 在计算机网络中url的含义是,计算机中URL是指什么
  16. Ardence公司PHAR-LAP ETS 简介
  17. 修改tomcat的临时文件夹_解决:tomcat重新部署会删除临时文件以及临时文件夹
  18. 年终报告:通过3个维度,回看2022全球电商市场的“多样性”
  19. Matter Commissioning
  20. 猿创征文 |汇编语言基础知识

热门文章

  1. 双重释放漏洞(来自漏洞战争一书)
  2. J2EE项目中异常处理
  3. 利用pt-table-checksum校验数据一致性
  4. HDU 1269 裸奔的强联通分量
  5. XML1_XML基础
  6. 初识dokuwiki
  7. 窗口拖动后,还原窗口位置
  8. WWW'22 | 信息检索方向值得一读的3篇论文详解
  9. 【ACL2020论文尝鲜】如何以低成本的数据构建高效NER模型?
  10. 【论文笔记】中文词向量论文综述(二)