dtsdtb的那些事儿
Posted AlexKing阁下
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了dtsdtb的那些事儿相关的知识,希望对你有一定的参考价值。
笔者最近在支持新的案子,过于忙碌,好久没更新了,勿怪。
1、设备树大变革故事
2011年3月17日的ARM Linux邮件列表有封邮件“this whole ARM thing is a fucking pain in the ass”引起了轩然大波,原来是我们的Linux之父Linus Torvalds对垃圾代码的极度指责。于是Linux社区扛过大旗,奥利给,搞起来,优化,优化,重构!!(大牛们就是大牛们,人家说优化重构是真优化真重构)
为何会有这事呢,这主要是以前啊,在arch/arm/plat-xxx和arch/arm/mach-xxx中充斥着大量的垃圾代码,相当多数的代码只是在描述板级细节,而这些板级细节对于内核来讲,不过是垃圾。于是大牛们参考PowerPC等体系架构中使用的Flattened Device Tree(FDT),也采用了Device Tree结构,透过它传递给Linux,而不再需要在kernel中进行大量的冗余编码。
2、设备树的特点
Device Tree由一系列被命名的结点(node)和属性(property)组成,而结点本身可包含子结点。所谓属性,其实就是成对出现的name和value。在Device Tree中,可描述的信息包括(原先这些信息大多被写在到kernel中):CPU的数量和类别、内存基地址和大小、总线和桥、外设连接、中断控制器和中断使用情况、GPIO控制器和GPIO使用情况、Clock控制器和Clock使用情况
通常由.dts文件以文本方式对系统设备树进行描述,经过Device Tree Compiler(dtc)将dts文件转换成二进制文件binary device tree blob(dtb),.dtb文件可由Linux内核解析,有了device tree就可以在不改动Linux内核的情况下,对不同的平台实现无差异的支持,只需更换相应的dts文件,即可满足。
按照笔者来讲呢,就是以后我就不编译内核了,你们要改就改dtb吧,我内核会去读DTB的。内核编编很占用我时间的好伐~~
3、DTB文件的编译
通常将设备树源码(dts/dtsi)编译成设备树二进制文件(dtb)可以使用DTC(Device Tree Compiler)工具编译。
-
单文件编译
对于单文件的dts,可以采用下面的命令:
# dtc命令使用方法见文末
dtc -O dtb -b 0 -o [dest_dtb_file] [src_dts_file]
将src_dts_file编译成dest_dtb_file设备树二进制文件。
-
多文件编译
对于有#include包含关系、宏定义的dts文件,直接采用以上的方法将会出现<u>#include相关的语法错误</u>。
DTC本身不支持#include语法,其正确语法为/include/。
如将以下dts(没有宏定义)
#include "child_file.dtsi"
#include "child_file_common.dtsi"
改为
/include/ "child_file.dtsi"
/include/ "child_file_common.dtsi"
即可通过编译。
对于以下稍微复杂一点(包含#include,宏,*.h等)的设备树,以上的方法不免有些笨拙。
由于“#include”“宏”等都是C的特征,因此可以使用CPP(C Preprocessor)命令对dts源文件进行处理,完成文件包含与宏置换的工作。
# cpp的使用方法较长就不列出来了,可以自己man一下。
cpp -nostdinc -I. -undef -x assembler-with-cpp [src_dts_file] > [tmp_dts_file]
# -nostdinc 不搜索标准目录
# -I. 搜索当前目录
# -undef 不预定义系统和gcc特定的宏
# -x assembler-with-cpp 指定语言c c++ objective-c assembler-with-cpp
使用以上命令将所有的*.dts、*.dtsi、*.h转换至临时*.dts中,然后再使用单文件编译的方法编译临时*.dts,生成最终的dtb。
此时你执行完命令一看,哇,报好多警告。
不要慌,后面可以直接加上,去除警告。
-W no-unit_address_format -W no-unit_address_vs_reg
就是告诉各位啊,这些警告我们可以无视。
然后跟单文件一下,将临时的[tmp_dts_file]直接用dtc生成dtb即可。
dtc使用方法:
NAME
dtc - Device Tree Compiler
SYNOPSIS
/usr/bin/dtc [options] <input file>
DESCRIPTION
Device Tree Compiler, dtc, takes as input a device-tree in a given format and outputs a
device-tree in another format for booting kernels on embedded systems. Typically, the input
format is "dts", a human readable source format, and creates a "dtb", or binary format as
output.
OPTIONS
-h Display help text.
-q Quiet:
此时,有人就要问了,dtsi去哪里了?嘿,这就来说明。
3、dtsi与dts
*.dts文件是一种ASCII文本对Device Tree的描述,放置在内核的/arch/arm/boot/dts目录。一般而言,一个*.dts文件对应一个ARM的machine。
*.dtsi文件作用:由于一个SOC可能有多个不同的电路板,而每个电路板拥有一个 *.dts。这些dts势必会存在许多共同部分,为了减少代码的冗余,设备树将这些共同部分提炼保存在*.dtsi文件中,供不同的dts共同使用。*.dtsi的使用方法,类似于C语言的头文件,在dts文件中需要进行include *.dtsi文件。当然,dtsi本身也支持include 另一个dtsi文件。
dtb大家都应该知道是什么玩意吧了,不知道的话,您再回顾一下前面的内容。
有了这些概念后呢?后面再来普及一下dtsi与dts的语法,就很有意思了。
希望得到您的关注,我们下期见。
以上是关于dtsdtb的那些事儿的主要内容,如果未能解决你的问题,请参考以下文章