作为uboot到kernel中DTS DTSI DTB等关系
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中
- hostprogs-y:=dtc
- always:=$(hostprogs-y)
在内核的arch/arm/boot/dts/Makefile中,若选中某种SOC,则与其对应相关的所有dtb文件都将被编译出来。在Linux下,make dtbs可单独编译dtb.以下截取了TEGRA平台的一部分。 - ifeq($(CONFIG_OF),y)
- dtb-$(CONFIG_ARCH_TEGRA)+=tegra20-harmony.dtb\
- tegra30-beaver.dtb\
- tegra114-dalmore.dtb\
- 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),即设备的特性,它的值是多样化的:
- 它可以是string,
- 它也可以是32 bit unsigned integres
- 他也可以是binary data
- 他也可能是空
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等关系相关推荐
- IMX7 通过Linux使用SDCard烧录UBOOT、kernel、dtb、rootfs详解
开发板使用的是NXP官网的开发板,芯片信号是:MCIMX7D7DVM10SC Linux版本:Ubuntu14.04 SDCard大小:2G(最小使用2G,因为根文件系统比较大) 通过VM虚拟机进行的 ...
- uboot引导kernel - 1 - Flash的分区
uboot启动Linux内核过程分为4大步骤: 问题1:Flash的分区相关问题 在 上述步骤1/2/4 中都提到了从启动介质(iNand/SD)中读取uboot/kernel到SRAM/DDR中,那 ...
- 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 附上代码: ...
- uboot修改linux源码中参数,将自定义参数从uboot传入kernel的并读取的方法【转】
希望朋友们多多指点,好的技术或心得一起分享: uboot向kernel传参机制以及kernel如何解析cmdline参数大家可以参考其他前辈的博文,这方面的讲解十分详尽. 在这里我总结以下自己在ubo ...
- 第一季6:海思方案中uboot、kernel和rootfs的烧写方法
以下内容源于朱有鹏课程的学习,以及海思方案的学习资料整理.如有侵权,请告知删除. 这里主要讲"使用tftp,烧写映像文件(uboot.kernel.rootfs)到SPI Flash&quo ...
- Linux系统之Uboot、Kernel、Busybox思考之四
目录 三 内核的运行 9 设备树: 1) 设备树产生缘由 2) 设备树方案的流程 3) 有了上述概念,为了支撑整个设备树的工程实现,内核实现以下内容 4) 内核解析设备树 5) 入口分析 6) 解析处 ...
- 设备树dts/dtsi格式
说明:后续的博文参考自韦东山老师的设备树视屏,老师用的是2440的开发板,我用的是s5pv210的开发板.原理一样 一.前言 简单的说,如果要使用Device Tree,首先用户要了解自己的硬件配置和 ...
- linux kernel中的cmdline的详细介绍
cmdline 1.向linux kernel添加cmdline的四种方式 (1). 在dts中的bootargs中添加 (2).在BoardConfig中添加 (3).在uboot中添加 (4).在 ...
- 香蕉派,修改 uboot 和 kernel 串口波特率
环境 硬件:bananapi m1 软件:buildroot(uboot-2018.07 + linux-4.18.12) 默认波特率 编译 $ make bananapi_m1_defconfig ...
最新文章
- 微服务场景下的数据一致性解决方案
- Could not open ServletContext resource [/WEB-INF/springmvc-servlet.xml]【解决方案】
- Outlook应用指南(1)——数据备份还原技巧
- 《MySQL实战45讲》实践篇 24-29 学习笔记 (主备篇)
- c++ 如何将输入的内容输出到文本文件 要建立文本文件嘛_python如何学习
- Netty : 臭名昭著的JDK的NIO bug(空轮询bug)
- 王道机试指南读后总结-2
- Vue3 小菠萝 Pinia使用
- Mysql添加报错 MySqlException: Incorrect string value: ‘\xE5\xAF\xBC\xE5\x85\xA5...‘ for
- AWS中联网Amazon VPC相关概念
- 不可错过的 7 个JS 小技巧,一定要进来瞧瞧哦
- mysql 聚集函数与group by,聚集函数可以和where一起用吗 聚合函数如何与group by函数一起使用...
- CoreDNS篇9-kubernetes插件
- C++打印之字形矩阵
- JavaScript进阶(二)-- DOM基础
- 数据结构与算法课程设计大作业
- 好工作需要这么多而充足的准备,你还在浪费时间吗 行动吧?
- Day206.课程分类【导入功能】前端实现、 课程分类列表【显示功能】、课程管理【模块需求、添加课程功能】 -谷粒学院
- 虚幻引擎5新手使用方法(1)
- 15款国内移动应用开发者都必须知道的小而美SDK