1、设备树(Device Tree)基本概念及作用

在内核源码中,存在大量对板级细节信息描述的代码。这些代码充斥在/arch/arm/plat->xxx和/arch/arm/mach-xxx目录,对内核而言,这些platform设备、resource、I2C_board_info、spi_board_info以及各种硬件的platform_data绝大多数纯属垃圾冗余代码。为了解决这一问题,ARM内核版本3.x之后引入了原先在Power PC等其他体系架构已经使用的Flattened Device Tree. 
“A data structure by which bootloaders pass hardware layout to linux in a device-independent manner,simplifying hardware probing.”开源文档中对设备树的描述是,一种描述硬件资源的数据结构,它通过BootLoader将硬件资源传给内核,使得内核和硬件资源描述相对独立。 
Device Tree可以描述的信息包括CPU的数量和类别、内存基地址和大小、总线和桥、外设连接、中断控制器和中断使用情况,GPIO控制器和GPIO使用情况、Clock控制器和Clock使用情况。 
另外,设备树对于可热插拔的设备不进行具体描述,它只描述用于控制该热插拔设备的控制器。 
设备树的主要优势:对于同一SOC的不同主板,只需要更换设备树文件.dtb即可实现不同主板的无差异支持,而无需更换内核文件。 
注:要使得3.x之后的内核支持使用设备树,除了内核编译时需要打开相对应的选项外,BootLoader也需要支持将设备树的数据结构传给内核。

2、设备树的组成和使用

设备树包括DTC(device tree compiler),DTS(device tree source和DTB(device tree blob)。其对应关系如图1-1所示 
DTS、DTSI由DTC转化成DTB。

2.1 DTS和DTSI(源文件)

.dts文件是一种ASCII文本对Device Tree的描述,放置在内核的/arch/arm/boot/dts目录。一般而言,一个.dts文件对应一个ARM的machine。 
由于一个SOC可能有多个不同电路板,而每个电路板拥有一个.dts。这些dts势必会存在许多共同部分,为了减少代码的冗余,设备树讲这些共同部分提炼保存在.dtsi文件中,供不同的dts共同使用。.dtsi的使用方法,类似于C语言的头文件,在dts文件中需要进行include .dtsi文件。当然,dtsi本身也支持include另一个dtsi文件。

2.2 DTC(编译工具)

DTC为编译工具,它可以将.dts文件编译成.dtb文件。DTC的源码位于内核的scripts/dtc目录下,内核选中CONFIG_OF,编译内核的时候,主机可执行程序DTC就会被编译出来。即scripts/dtc/Makefile中

  1. hostprogs-y:=dtc
  2. always:=$(hostprogs-y) 
    在内核的arch/arm/boot/dts/Makefile中,若选中某种SOC,则与其对应相关的所有dtb文件都将被编译出来。在Linux下,make dtbs可单独编译dtb.以下截取了TEGRA平台的一部分。
  3. ifeq($(CONFIG_OF),y)
  4. dtb-$(CONFIG_ARCH_TEGRA)+=tegra20-harmony.dtb\
  5. tegra30-beaver.dtb\
  6. tegra114-dalmore.dtb\
  7. tegra124-ardbeg.dtb

2.3 DTB(二进制文件)

DTC编译.dts生成的二进制文件(.dtb),bootloader在引到内核时,会预先读取.dtb到内存,进而由内核解析。

2.4 BootLoader(bootloader支持)

Bootloader需要将设备树在内存中的地址传给内核。在ARM中通过bootm或bootz命令来进行传递。 
bootm [kernel_addr] [initrd_address][dtb_address],其中kernel_addr为内核镜像的地址,init.rd为initrd的地址,dtb_address为dtb所在的地址。若initrd_address为空,则用“-”来代替。 
DTS的基本语法范例,如图3-1 所示。

它包括一系列节点,以及描述节点的属性。“/”为root节点。在一个.dts文件中,有且仅有一个root节点;在root节点下有“node1”,“node2”子节点,称root为“node1”和“node2”的parent节点,除了root节点外,每个节点有且仅有一个parent;其中子节点node1下还存在子节点“child-nodel1”和“child-node2”。
  • 1
  • 2
  • 3
  • 4

注:如果看过内核/arch/arm/boot/dts目录的读者看到这可能有一个疑问。在每个.dsti和.dts中都会存在一个“/”根节点,那么如果在一个设备树文件中include一个.dtsi文件,那么岂不是存在多个“/”根节点了么。其实不然,编译器DTC在对.dts进行编译生成dtb时,会对node进行合并操作,最终生成的dtb只有一个root node。Dtc会进行合并操作这一点从属性上也可以得到验证。这个稍后做讲解。 
在节点的{}里面是描述该节点的属性(property),即设备的特性,它的值是多样化的:

  1. 它可以是string,
  2. 它也可以是32 bit unsigned integres
  3. 他也可以是binary data
  4. 他也可能是空 
    BootLoader引导内核时,ARM寄存器R2会将.tdb的首地址传给内核,内核根据该地址,接卸.dtb中根节点的compatible属性,将该属性与内核中预先定义machine_desc机构体的dt_compat成员做匹配,得到最匹配的一个machine_desc。

DTB加载解析过程

先从uboot里的do_bootm出发,根据之前描述,DTB在内存中的地址通过bootm命令进行传递。在bootm中,它会根据所传进来的DTB所在内存做一系列操作,为内核解析DTB提供保证。

注:lmb为uboot下的一种内存管理机制,全称为logical memory blocks。用于管理镜像的内存。lmv所记录的内存信息最终会传递给kernel。

作为uboot到kernel中DTS DTSI DTB等关系相关推荐

  1. IMX7 通过Linux使用SDCard烧录UBOOT、kernel、dtb、rootfs详解

    开发板使用的是NXP官网的开发板,芯片信号是:MCIMX7D7DVM10SC Linux版本:Ubuntu14.04 SDCard大小:2G(最小使用2G,因为根文件系统比较大) 通过VM虚拟机进行的 ...

  2. uboot引导kernel - 1 - Flash的分区

    uboot启动Linux内核过程分为4大步骤: 问题1:Flash的分区相关问题 在 上述步骤1/2/4 中都提到了从启动介质(iNand/SD)中读取uboot/kernel到SRAM/DDR中,那 ...

  3. uboot环境下mmc操作_【记录】将Uboot 2011.06中mmc驱动移植到uboot 1.1.6的过程

    [记录]将Uboot 2011.06中mmc驱动移植到uboot 1.1.6的过程 时间:2011-8-14 作者:crifan 联系方式:green-waste (at) 163.com 附上代码: ...

  4. uboot修改linux源码中参数,将自定义参数从uboot传入kernel的并读取的方法【转】

    希望朋友们多多指点,好的技术或心得一起分享: uboot向kernel传参机制以及kernel如何解析cmdline参数大家可以参考其他前辈的博文,这方面的讲解十分详尽. 在这里我总结以下自己在ubo ...

  5. 第一季6:海思方案中uboot、kernel和rootfs的烧写方法

    以下内容源于朱有鹏课程的学习,以及海思方案的学习资料整理.如有侵权,请告知删除. 这里主要讲"使用tftp,烧写映像文件(uboot.kernel.rootfs)到SPI Flash&quo ...

  6. Linux系统之Uboot、Kernel、Busybox思考之四

    目录 三 内核的运行 9 设备树: 1) 设备树产生缘由 2) 设备树方案的流程 3) 有了上述概念,为了支撑整个设备树的工程实现,内核实现以下内容 4) 内核解析设备树 5) 入口分析 6) 解析处 ...

  7. 设备树dts/dtsi格式

    说明:后续的博文参考自韦东山老师的设备树视屏,老师用的是2440的开发板,我用的是s5pv210的开发板.原理一样 一.前言 简单的说,如果要使用Device Tree,首先用户要了解自己的硬件配置和 ...

  8. linux kernel中的cmdline的详细介绍

    cmdline 1.向linux kernel添加cmdline的四种方式 (1). 在dts中的bootargs中添加 (2).在BoardConfig中添加 (3).在uboot中添加 (4).在 ...

  9. 香蕉派,修改 uboot 和 kernel 串口波特率

    环境 硬件:bananapi m1 软件:buildroot(uboot-2018.07 + linux-4.18.12) 默认波特率 编译 $ make bananapi_m1_defconfig ...

最新文章

  1. 微服务场景下的数据一致性解决方案
  2. Could not open ServletContext resource [/WEB-INF/springmvc-servlet.xml]【解决方案】
  3. Outlook应用指南(1)——数据备份还原技巧
  4. 《MySQL实战45讲》实践篇 24-29 学习笔记 (主备篇)
  5. c++ 如何将输入的内容输出到文本文件 要建立文本文件嘛_python如何学习
  6. Netty : 臭名昭著的JDK的NIO bug(空轮询bug)
  7. 王道机试指南读后总结-2
  8. Vue3 小菠萝 Pinia使用
  9. Mysql添加报错 MySqlException: Incorrect string value: ‘\xE5\xAF\xBC\xE5\x85\xA5...‘ for
  10. AWS中联网Amazon VPC相关概念
  11. 不可错过的 7 个JS 小技巧,一定要进来瞧瞧哦
  12. mysql 聚集函数与group by,聚集函数可以和where一起用吗 聚合函数如何与group by函数一起使用...
  13. CoreDNS篇9-kubernetes插件
  14. C++打印之字形矩阵
  15. JavaScript进阶(二)-- DOM基础
  16. 数据结构与算法课程设计大作业
  17. 好工作需要这么多而充足的准备,你还在浪费时间吗 行动吧?
  18. Day206.课程分类【导入功能】前端实现、 课程分类列表【显示功能】、课程管理【模块需求、添加课程功能】 -谷粒学院
  19. 虚幻引擎5新手使用方法(1)
  20. 15款国内移动应用开发者都必须知道的小而美SDK

热门文章

  1. Siamese network
  2. 2021全球与中国显微镜载玻片市场现状及未来发展趋势
  3. 【软件测试】全网火爆,实战Web项目前后台的bug定位(超详细)
  4. 用Python实现给图片变换颜色
  5. iOS 小游戏项目——你话我猜升级版
  6. 如何在Bootstrap中使用iconMoon字体图标
  7. java 短信软件_Java 发送短信工具类
  8. Calcite JavaCC简单介绍及使用
  9. 【独家直播】2010 跨界实践 绿色增长 第五届中国互联网站长年会
  10. 使用速腾16线激光雷达与IMU 实现Cartographer 3D建图