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中需将框架信息抽象出来,作为一个黑盒,接受外部参数,那么输入参数应该包括:

  1. 识别的platform的信息
  2. runtime的配置参数
  3. 设备的拓扑结构以及特性

图片来源: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 设备树的由来与使用的主要内容,如果未能解决你的问题,请参考以下文章

设备树基本概念-17

[架构之路-34]:目标系统 - 系统软件 - Linux OS硬件电路的文本描述:设备树的构成属性解析使用

7-24 树种统计

Linux的由来及组成

7-12 树种统计(25 分)

__Kernel专栏文章导航与优秀笔记整理(2021.08.14更新)