dts、dtb的那些事儿
笔者最近在支持新的案子,过于忙碌,好久没更新了,勿怪。
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的那些事儿相关推荐
- 设备树 DTS DTB
Device Tree1 A device tree is a tree data structure with nodes that describe the physical devices in ...
- 将dtb反编译成dts
[将dtb反编译成dts, 使用命令如下:] 1> ./out/target/product/$Project/obj/KERNEL_OBJ/scripts/dtc/dtc -h 2> . ...
- android dtb文件位置_反编译andriod dtb.img 为dts
平台:Android 7.1 使用到的工具:dtc 工具在kernel 路径下 scripts/dtc 编译完成后可有执行文件生成 dtc Usage: dtc [options] Options: ...
- linux内核合并dtb文件,c – 如何修改内核DTB文件
摘要 我目前正在使用一些自定义板的自定义驱动程序编译Linux内核(内核,模块和DTB).有时我会编译内核并意识到DTB文件中的兼容性字符串不是自定义驱动程序要查找的内容.现在,我可以解决这个问题的唯 ...
- 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-配置树莓派的Linux内核
文章目录 配置树莓派的Linux内核 树莓派Linux内核编译 文件系统 Linux内核驱动基础框架 驱动测试步骤 树莓派学习笔记,本文图片文字皆为转述 配置树莓派的Linux内核 驱动两种加载方式: ...
- Xilinx zynq的资料获取总结
Xilinx zynq zc702开发: 一.zynq开发整个生态系统搭建: 1.基础资料获取: https://github.com/Xilinx/ (包括:交叉编译工具,lin ...
- 树莓派:关于linux内核
1.树莓派等芯片带操作系统的启动过程 c51,STM32(裸机)>>>>>>>c直接操控底层寄存器实现相关业务.业务流程形的裸机代码 遥控灯:while(1) ...
- 树莓派Linux内核源码配置、编译、挂载(boot/kernal/根文件)、开启新内核
目录 一.树莓派Linux源码配置(适合树莓派) 总体概述 配置的三种方式 1.照搬厂家的配置(使用这种方式) 2.参考厂家的配置(感受一下) 3.完全自主配置(需要一定工作经验) 二.树莓派Linu ...
最新文章
- 汇编试验六:实践课程中的程序
- linux管理子进程c,Linux 进程管理 CGroup
- 将某个目录下的所有文件进行压缩
- C指针原理(43)-helloworld的C程序汇编剖析
- 今天在网上看到一个帖子,怎么样锻炼自己的大脑
- leetcode 104. Maximum Depth of Binary Tree
- python图灵测试_最前沿:基于GAN和RL的思想来训练对话生成,通过图灵测试可期!...
- java读取本地图片的绝对地址_我想使用图片的绝对路径。为什么java不能使用图片的绝对路径。...
- 用java编写圆锥_求java大神帮忙 求大神帮助!Java
- TranslateAnimation类:位置变化动画类
- html中注释的正确写法,HTML 注释规范
- Weblogic 9.2 for Linux AS4u5安装配置
- 国内外开源sns源码大全
- 小米note2鸿蒙ROM,小米note2线刷刷机教程_小米note2第三方rom线刷包_救砖刷机包
- echarts饼图legend标识位置
- 腾讯开放平台 集成qq登录
- 显卡组超级计算机,NVIDIA发布全新显卡 在家就能拥有超级计算机
- 百度地图SDK for Android【覆盖物】
- 向产品宣战——开发者眼中的Android UI Design
- 推荐常用算法之-基于内容的推荐
热门文章
- object-ui之动画雪花降落实现
- 五、TDDI 触控、显示驱动一体化技术
- 吃透Chisel语言.18.Chisel模块详解(五)——Chisel中使用Verilog模块
- Android 真机调试
- 【STM32标准库】【基础知识】外部中断
- 百度 android 市场,百度
- Postman接口自动化之postman脚本编写
- 使用tail -f 命令时抛出“ inotify 资源耗尽,无法使用 inotify 机制,回归为 polling 机制”
- c语言编程解释,c语言编程,请高手一字一句解释
- python爬虫 requests+lxml爬取前程无忧网之模拟浏览器登录