笔者最近在支持新的案子,过于忙碌,好久没更新了,勿怪。

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使用方法:

NAMEdtc - Device Tree CompilerSYNOPSIS/usr/bin/dtc [options] <input file>DESCRIPTIONDevice  Tree  Compiler,  dtc,  takes  as input a device-tree in a given format and outputs adevice-tree in another format for booting kernels on embedded systems.  Typically, the inputformat  is  "dts",  a human readable source format, and creates a "dtb", or binary format asoutput.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的语法,就很有意思了。

希望得到您的关注,我们下期见。

dts、dtb的那些事儿相关推荐

  1. 设备树 DTS DTB

    Device Tree1 A device tree is a tree data structure with nodes that describe the physical devices in ...

  2. 将dtb反编译成dts

    [将dtb反编译成dts, 使用命令如下:] 1> ./out/target/product/$Project/obj/KERNEL_OBJ/scripts/dtc/dtc -h 2> . ...

  3. android dtb文件位置_反编译andriod dtb.img 为dts

    平台:Android 7.1 使用到的工具:dtc 工具在kernel 路径下 scripts/dtc 编译完成后可有执行文件生成 dtc Usage: dtc [options] Options: ...

  4. linux内核合并dtb文件,c – 如何修改内核DTB文件

    摘要 我目前正在使用一些自定义板的自定义驱动程序编译Linux内核(内核,模块和DTB).有时我会编译内核并意识到DTB文件中的兼容性字符串不是自定义驱动程序要查找的内容.现在,我可以解决这个问题的唯 ...

  5. Linux DTS (Device Tree Source)设备树源码

    Linux DTS 设备树源码 1. 简介 1.1 引入DTS的原因 1.2 文件格式 2. DTS语法 2.1 .dtsi头文件 2.2 设备节点 2.2.1 设备树中节点命名格式 2.2.2 设备 ...

  6. 树莓派开发6-配置树莓派的Linux内核

    文章目录 配置树莓派的Linux内核 树莓派Linux内核编译 文件系统 Linux内核驱动基础框架 驱动测试步骤 树莓派学习笔记,本文图片文字皆为转述 配置树莓派的Linux内核 驱动两种加载方式: ...

  7. Xilinx zynq的资料获取总结

    Xilinx zynq zc702开发: 一.zynq开发整个生态系统搭建: 1.基础资料获取: https://github.com/Xilinx/           (包括:交叉编译工具,lin ...

  8. 树莓派:关于linux内核

    1.树莓派等芯片带操作系统的启动过程 c51,STM32(裸机)>>>>>>>c直接操控底层寄存器实现相关业务.业务流程形的裸机代码 遥控灯:while(1) ...

  9. 树莓派Linux内核源码配置、编译、挂载(boot/kernal/根文件)、开启新内核

    目录 一.树莓派Linux源码配置(适合树莓派) 总体概述 配置的三种方式 1.照搬厂家的配置(使用这种方式) 2.参考厂家的配置(感受一下) 3.完全自主配置(需要一定工作经验) 二.树莓派Linu ...

最新文章

  1. 汇编试验六:实践课程中的程序
  2. linux管理子进程c,Linux 进程管理 CGroup
  3. 将某个目录下的所有文件进行压缩
  4. C指针原理(43)-helloworld的C程序汇编剖析
  5. 今天在网上看到一个帖子,怎么样锻炼自己的大脑
  6. leetcode 104. Maximum Depth of Binary Tree
  7. python图灵测试_最前沿:基于GAN和RL的思想来训练对话生成,通过图灵测试可期!...
  8. java读取本地图片的绝对地址_我想使用图片的绝对路径。为什么java不能使用图片的绝对路径。...
  9. 用java编写圆锥_求java大神帮忙 求大神帮助!Java
  10. TranslateAnimation类:位置变化动画类
  11. html中注释的正确写法,HTML 注释规范
  12. Weblogic 9.2 for Linux AS4u5安装配置
  13. 国内外开源sns源码大全
  14. 小米note2鸿蒙ROM,小米note2线刷刷机教程_小米note2第三方rom线刷包_救砖刷机包
  15. echarts饼图legend标识位置
  16. 腾讯开放平台 集成qq登录
  17. 显卡组超级计算机,NVIDIA发布全新显卡 在家就能拥有超级计算机
  18. 百度地图SDK for Android【覆盖物】
  19. 向产品宣战——开发者眼中的Android UI Design
  20. 推荐常用算法之-基于内容的推荐

热门文章

  1. object-ui之动画雪花降落实现
  2. 五、TDDI 触控、显示驱动一体化技术
  3. 吃透Chisel语言.18.Chisel模块详解(五)——Chisel中使用Verilog模块
  4. Android 真机调试
  5. 【STM32标准库】【基础知识】外部中断
  6. 百度 android 市场,百度
  7. Postman接口自动化之postman脚本编写
  8. 使用tail -f 命令时抛出“ inotify 资源耗尽,无法使用 inotify 机制,回归为 polling 机制”
  9. c语言编程解释,c语言编程,请高手一字一句解释
  10. python爬虫 requests+lxml爬取前程无忧网之模拟浏览器登录