设备树(device tree)学习笔记【转】
转自:https://www.cnblogs.com/pengdonglin137/p/4495056.html
阅读目录(Content)
作者信息
作者:彭东林
邮箱:pengdonglin137@163.com
1、反编译设备树
在设备树学习的时候,如果可以看到最终生成的设备树的内容,对于我们学习设备树以及分析问题有很大帮助。这里我们需要使用设备树生成工具dtc的反编译功能
root@pengdl-VirtualBox:~/tq2440/Linux/linux-4.0.1# ./scripts/dtc/dtc -h
Usage: dtc [options] <input file> Options: -[qI:O:o:V:d:R:S:p:fb:i:H:sW:E:hv]
-q, --quiet
Quiet: -q suppress warnings, -qq errors, -qqq all
-I, --in-format <arg>
Input formats are:
dts - device tree source text
dtb - device tree blob
fs - /proc/device-tree style directory
-o, --out <arg>
Output file
-O, --out-format <arg>
Output formats are:
dts - device tree source text
dtb - device tree blob
asm - assembler source
-V, --out-version <arg>
Blob version to produce, defaults to %d (for dtb and asm output)
-d, --out-dependency <arg>
Output dependency file
-R, --reserve <arg>
tMake space for <number> reserve map entries (for dtb and asm output)
-S, --space <arg>
Make the blob at least <bytes> long (extra space)
-p, --pad <arg>
Add padding to the blob of <bytes> long (extra space)
-b, --boot-cpu <arg>
Set the physical boot cpu
-f, --force
Try to produce output even if the input tree has errors
-i, --include <arg>
Add a path to search for include files
-s, --sort
Sort nodes and properties before outputting (useful for comparing trees)
-H, --phandle <arg>
Valid phandle formats are:
legacy - "linux,phandle" properties only
epapr - "phandle" properties only
both - Both "linux,phandle" and "phandle" properties
-W, --warning <arg>
Enable/disable warnings (prefix with "no-")
-E, --error <arg>
Enable/disable errors (prefix with "no-")
-h, --help
Print this help and exit
-v, --version
Print version and exit
假设我们最终的设备树文件是:arch/arm/boot/dts/s3c2416-smdk2416.dtb
./scripts/dtc/dtc -I dtb -O dts -o output.dts arch/arm/boot/dts/s3c2416-smdk2416.dtb
输出文件output.dts就是反汇编的结果,他就是实际生成的设备树,当然也可以重新将生成的dts文件在编译成dtb文件:
./scripts/dtc/dtc -I dts -O dtb -o s3c2416-smdk2416.dtb output.dts
2、分析工具fdtdump
在Linux的scripts/dtc目录下除了提供dtc工具外,还提供了一个叫做fdtdump的工具,对于分析设备树也非常有帮助。
用法:
fdtdump -h
Usage: fdtdump [options] <file> Options: -[dshV]
-d, --debug Dump debug information while decoding the file
-s, --scan Scan for an embedded fdt in file
-h, --help Print this help and exit
-V, --version Print version and exit
使用范例:
fdtdump -sd vexpress-v2p-ca9.dtb | tee vexpress.dts.debug
看看输出的文件:
vexpress-v2p-ca9.dtb: found fdt at offset 0
/dts-v1/;
// magic: 0xd00dfeed
// totalsize: 0x2e9c (11932)
// off_dt_struct: 0x38
// off_dt_strings: 0x2bb8
// off_mem_rsvmap: 0x28
// version: 17
// last_comp_version: 16
// boot_cpuid_phys: 0x0
// size_dt_strings: 0x2e4
// size_dt_struct: 0x2b80 // 0038: tag: 0x00000001 (FDT_BEGIN_NODE)
/ {
// 0040: tag: 0x00000003 (FDT_PROP)
// 2bb8: string: model
// 004c: value
model = "V2P-CA9";
可以看到,其中这个工具会同时把分析语句和原始文件打印出来,其中 // 后输出的是分析语句,其他的是原始语句。对分析Linux内核启动时遍历展开设备树镜像很有帮助。
3、Linux配置,支持设备树
make menuconfig ---> Boot options ---> Flattened Device Tree support
4、Linux 编译设备树
可以看看arch/arm/boot/dts/Makefile中你要的那个设备树的dtb文件是否配置上了。
make dtbs
5、从Linux内核代码中编译设备树的工具dtc
在内核源码目录下提供了dtc工具的源码实现, 下面是生成这个工具的命令:
make scripts
6、删除设备树属性的方法
有时我们有这样的需求,需要删除设备树的某些属性, 但是我们又不想修改设备树源文件,那么可以利用delete-property方法。
1 / {
2 ... ...
3 demo1: demo1 {
4 compatible = "demo1";
5 property1 = <1>;
6 property2;
7 property3 = <2>;
8 property4;
9 };
10 };
11
12 &demo1 {
13 /delete-property/property2;
14 /delete-property/property3;
15 };
编译完成后,执行反编译可以看到property2和property3已经消失了:
1 demo1 {
2 compatible = "demo1";
3 property1 = <0x1>;
4 property4;
5 };
7、两个内核新增的设备树调试工具
- ./scripts/dtc/dt_to_config
可以根据传入的设备树解析出每个节点对应那些驱动以及内核是否已经配置,甚至可以通过传递--config-format来直接修改.config文件,如果嫌节点的路径过长,可以传递参数--short-name,用法示例:
# 这里的--include-suspec用于解析设备树中的include字段
$./scripts/dtc/dt_to_config arch/arm/boot/dts/s3c2440-tq2440-dt.dts --include-suspect --config ./.config
-dDc-E-Hx---- : /i2c-gpio-1 : i2c-gpio : arch/arm/mach-ep93xx/core.c : obj-y : x
-dDc-E-H-n--F : /i2c-gpio-1 : i2c-gpio : arch/arm/mach-ixp4xx/avila-setup.c : CONFIG_MACH_AVILA : n
-dDc-E-H-n--F : /i2c-gpio-1 : i2c-gpio : arch/arm/mach-ixp4xx/dsmg600-setup.c : CONFIG_MACH_DSMG600 : n
...
当然后面也可以直接跟dtb文件:
$./scripts/dtc/dt_to_config arch/arm/boot/dts/s3c2440-tq2440-dt.dtb --include-suspect --config ./.config
-dDc-E-Hx---- : /i2c-gpio-1 : i2c-gpio : arch/arm/mach-ep93xx/core.c : obj-y : x
-dDc-E-H-n--F : /i2c-gpio-1 : i2c-gpio : arch/arm/mach-ixp4xx/avila-setup.c : CONFIG_MACH_AVILA : n
-dDc-E-H-n--F : /i2c-gpio-1 : i2c-gpio : arch/arm/mach-ixp4xx/dsmg600-setup.c : CONFIG_MACH_DSMG600 : n
-dDc-E-H-n--F : /i2c-gpio-1 : i2c-gpio : arch/arm/mach-ixp4xx/fsg-setup.c : CONFIG_MACH_FSG : n
...
- ./scripts/dtc/dtx_diff
这个工具用于比较两个设备树,也可以对设备树反编译。示例:
#传递一个设备树,表示反编译
./scripts/dtc/dtx_diff arch/arm/boot/dts/s3c2440-tq2440-dt.dtb #也可以直接传递一个dts文件,这个工具会将该dts文件展开
./scripts/dtc/dtx_diff arch/arm/boot/dts/s3c2440-tq2440-dt.dts #传递两个设备树表示比较
./scripts/dtc/dtx_diff arch/arm/boot/dts/s3c2440-tq2440-dt.dtb /tftpboot/dtb
--- /dev/fd/63 2017-09-23 22:01:48.407691984 +0800
+++ /dev/fd/62 2017-09-23 22:01:48.407691984 +0800
@@ -125,7 +125,7 @@
pinctrl-names = "default";
reg = <0x54000000 0x100>;
samsung,i2c-max-bus-freq = <0x30d40>;
- status = "disabled";
+ status = "okay"; demo0@51 {
compatible = "demo0";
也可以都是dts文件,或者一个dts一个dtb文件。
8、如何在设备树里控制属性值占用的字节数?
http://www.cnblogs.com/pengdonglin137/p/6044418.html
9、设备树中ranges属性分析
http://www.cnblogs.com/pengdonglin137/p/7401049.html
10、dts中memreserve和reserved-memory的区别
https://www.cnblogs.com/pengdonglin137/articles/10483018.html
11、devicetree-specification
https://files.cnblogs.com/files/pengdonglin137/devicetree-specification.pdf
其他关于设备树的调试文档
2、Youtube:Solving Devicetree Issues, part 3.0
3、Linux kernel的devicetree-compiler邮件列表里有很多好的patch,可以挑选自己想要的, 比如下面几个:
[RFC PATCH 0/3] dtc: dts source location annotation 这个系列的patch为dtc增加了一个annotate配置,这样在编译设备树时会生成annotate.dts.tmp后缀的隐藏文件,可以查看每个属性最终是被那个设备树文件设置的
[RFC PATCH 1/3] dtc: dts source location annotation
[RFC PATCH 2/3] dtc: make check test for dtc --annotate
[RFC PATCH 3/3] dtc: linux kernel build process to create annotated .dts
效果:
sdhci@f9824900 { /* arch/arm/boot/dts/qcom-apq8074-dragonboard.dts:14 */ compatible = "qcom,sdhci-msm-v4"; /* arch/arm/boot/dts/qcom-msm8974.dtsi:240 */ reg = <0xf9824900 0x11c 0xf9824000 0x800>; /* arch/arm/boot/dts/qcom-msm8974.dtsi:241 */ reg-names = "hc_mem", "core_mem"; /* arch/arm/boot/dts/qcom-msm8974.dtsi:242 */ interrupts = <0x0 0x7b 0x0 0x0 0x8a 0x0>; /* arch/arm/boot/dts/qcom-msm8974.dtsi:243 */ interrupt-names = "hc_irq", "pwr_irq"; /* arch/arm/boot/dts/qcom-msm8974.dtsi:244 */ clocks = <0xd 0xd8 0xd 0xd7>; /* arch/arm/boot/dts/qcom-msm8974.dtsi:245 */ clock-names = "core", "iface"; /* arch/arm/boot/dts/qcom-msm8974.dtsi:246 */ status = "ok"; /* arch/arm/boot/dts/qcom-apq8074-dragonboard.dts:17 */ bus-width = <0x8>; /* arch/arm/boot/dts/qcom-apq8074-dragonboard.dts:15 */ non-removable; /* arch/arm/boot/dts/qcom-apq8074-dragonboard.dts:16 */ }; /* arch/arm/boot/dts/qcom-apq8074-dragonboard.dts:18 */
设备树(device tree)学习笔记【转】的更多相关文章
- 珂朵莉树(Chtholly Tree)学习笔记
珂朵莉树(Chtholly Tree)学习笔记 珂朵莉树原理 其原理在于运用一颗树(set,treap,splay......)其中要求所有元素有序,并且支持基本的操作(删除,添加,查找......) ...
- 【转载】Linux设备树(Device Tree)机制
转:Linux设备树(Device Tree)机制 目录 1. 设备树(Device Tree)基本概念及作用2. 设备树的组成和使用 2.1. DTS和DTSI 2.2. DTC 2.3. DT ...
- ARM Linux 3.x的设备树(Device Tree)
1. ARM Device Tree起源 Linus Torvalds在2011年3月17日的ARM Linux邮件列表宣称“this whole ARM thing is a f*cking pai ...
- 转:Linux设备树(Device Tree)机制
目录 1. 设备树(Device Tree)基本概念及作用 2. 设备树的组成和使用 2.1. DTS和DTSI 2.2. DTC 2.3. DTB 2.4. Bootloader 3. 设备树中d ...
- dsu on tree学习笔记
前言 一次模拟赛的\(T3\):传送门 只会\(O(n^2)\)的我就\(gg\)了,并且对于题解提供的\(\text{dsu on tree}\)的做法一脸懵逼. 看网上的其他大佬写的笔记,我自己画 ...
- Linux device tree 简要笔记
第一.DTS简介 在嵌入式设备上,可能有不同的主板---它们之间差异表现在主板资源不尽相同,比如I2C.SPI.GPIO等接口定义有差别,或者是Timer不同,等等.于是这就产生了BSP的一个 ...
- 基于设备树的controller学习(2)
作者 彭东林 pengdonglin137@163.com 平台 TQ2440 Linux-4.10.17 概述 上一篇大概介绍了一下demo-controller的结构,下面结合驱动分析. 正文 ...
- 基于设备树的controller学习(1)
作者 彭东林pengdonglin137@163.com 平台 TQ2440Linux-4.10.17 概述 在设备树中我们经常见到诸如"#clock-cells"."# ...
- 矩阵树定理(Matrix Tree)学习笔记
如果不谈证明,稍微有点线代基础的人都可以在两分钟内学完所有相关内容.. 行列式随便找本线代书看一下基本性质就好了. 学习资源: https://www.cnblogs.com/candy99/p/64 ...
- Link Cut Tree学习笔记
从这里开始 动态树问题和Link Cut Tree 一些定义 access操作 换根操作 link和cut操作 时间复杂度证明 Link Cut Tree维护链上信息 Link Cut Tree维护子 ...
随机推荐
- Rewrite基本概述
Rewrite基本概述 什么是rewrite Rewrite主要实现url地址重写,以及重定向,就是把传入web的请求重定向到其他url的过程. rewrite使用场景 1.地址跳转,用户访问www. ...
- Python学习一、一个小例子
一.题目: 对于一串氨基酸序列(由字母表前二十个大写字母组成),需要得到每一个氨基酸数目,然后输出到文件夹D:\test\frq.txt,要求用循环和字典实现. 氨基酸序列如下: ABCDEFGHIJ ...
- 201871010113-刘兴瑞《面向对象程序设计(java)》第十一周学习总结
项目 内容 这个作业属于哪个课程 <任课教师博客主页链接> https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 <作业链接地址>htt ...
- mysql中group by 使用
问题描述 我现在需要查询表test,里面需要安装字段a 进行分组.分组之后还有按照b字段最大的.还要查询出字段c. 我先在使用的数据库是mysql8.0 解决 需注意: group by 分组的时候是 ...
- cartographer 3D运行录制rosbag包
目录: 1.运行多线激光雷达: 2.运行IMU: 3.录制rosbag包: 4.配置cartographer: 5.查看地图: 1.运行多线激光雷达: 主要是测试雷达是否正在运行,确认雷达点云topi ...
- Paper | Adaptive Computation Time for Recurrent Neural Networks
目录 1. 网络资源 2. 简介 3. 自适应运算时间 3.1 有限运算时间 3.2 误差梯度 1. 网络资源 这篇文章的写作太随意了,读起来不是很好懂(掺杂了过多的技术细节).因此有作者介绍会更好. ...
- 终于把Apollo存储加密这件事搞定了
本文摘自于<Spring Cloud微服务 入门 实战与进阶>一书. 一些比较重要的配置信息,比如密码之类的敏感配置,我们希望将配置加密存储,保证安全性.Apollo框架本身没有提供数据加 ...
- OC:浅析Runtime中消息转发机制
一.介绍 OC是一门动态性语言,其实现的本质是利用runtime机制.在runtime中,对象调用方法,其实就是给对象发送一个消息,也即objc_msgSend().在这个消息发送的过程中,系统会进行 ...
- 蓝牙Inquriy 过程详解
问题 今天遇到了一个问题,就是自己的耳机产品,手机经常搜不到,从日志里面查看,发现原因是平时手机蓝牙发送的是inquiry mode =2 出问题的时候,inquiry mode =1 由于本设备很多 ...
- linux学习之Ubuntu
查看自己的ubuntu版本,输入以下命令(我的都是在root用户下的,在普通用户要使用sudo)第一行的lsb是因为没有安装LSB,安装之后就不会出现这个东西.LSB(Linux Standards ...