linux 设备树的由来与使用
Posted 东皇※太一
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux 设备树的由来与使用相关的知识,希望对你有一定的参考价值。
活动地址:CSDN21天学习挑战赛
设备树的由来
早在2011年,linus回了一封发飙的邮件:https://lkml.org/lkml/2011/3/17/492
这封邮件的核心内容就是说某个开发者提的pull request中有很多代码重复,很多垃圾代码,建议ARM社区也使用设备树方式去描述板级结构,因为在这之前,这种方式就已经在PowerPC上使用,由于其结构看起来似树形,所以叫设备树,如下图所示(图片来源于网络):
就如linus邮件中说的,内核源码中包含了大量的对扳级细节信息描述的代码,尤其ARM芯片广泛的应用,重复的垃圾代码越来越多,维护变的越来越困难,引入设备树可以解决这些问题。
设备树的作用
设备树改变了原来用hardcode方式讲HW配置信息嵌入到内核代码的方法,改用bootloader传递一个DB的形式,对于基于ARM CPU的嵌入式系统我们习惯于针对每一个platform进行内核的编译,但是随着ARM的各种产品的广泛应用,我们期望其能够像X86那样用kernel image来支持多个platform,这种情况下,kernel中需将框架信息抽象出来,作为一个黑盒,接受外部参数,那么输入参数应该包括:
- 识别的platform的信息
- runtime的配置参数
- 设备的拓扑结构以及特性
图片来源:RK3399平台开发系列讲解(内核设备树篇)3.2、图解Kernel Device Tree(设备树)的使用_内核笔记的博客-CSDN博客
对于嵌入式系统,在系统启动阶段,bootloader会加载内核并将控制权转交给内核,此外,还需要把上述的三个参数信息传递给kernel,以便kernel可以有较大的灵活性。在linux kernel中,Device Tree的设计目的就是如此。
设备树包含的硬件信息有哪些?
设备树并不描述所有的硬件信息,因为有些硬件设备是可以探测到的,如USB device。再比如在计算机系统中,PCI device可以被动态探测到,不需要再device tree中描述,但是PCI bridge不能被探测,则需要描述。设备树种一般需要描述的内容包括:
CPUs
Memory
Buses
Peripheral connections
Interrupt Controllers
GPIO controllers
Clock controllers
总之,那些无法动态识别的就需要在device tree中描述,反之则不需要。
设备树的语法结构
Device Tree 由两种元素组成:Node、Property,即节点与属性。
Device tree的基本单元是node。系统中的每个设备用一个node来描述。
除了root node,每个node都只有一个parent。
一个Device tree文件中只能有一个root node。
每个node用节点名字标识,节点名字的格式是:
[label:] node-name[@unit-address]
[properties definitions]
[child nodes]
“[]”标识option,因此可以订阅一个只有node name的空节点。Label方便在dts文件中引用。Child node的格式和node是完全一样,因此,一个dts文件中就是若干嵌套组成的node,property以及child note、child note、property描述。
如下(图片来源于RK3399平台开发系列讲解(内核设备树篇)3.2、图解Kernel Device Tree(设备树)的使用_内核笔记的博客-CSDN博客)
以上是关于linux 设备树的由来与使用的主要内容,如果未能解决你的问题,请参考以下文章