linux dts 语法格式,设备树DTS格式解析

2023-10-27

66b52468c121889b900d4956032f1009.png

8种机械键盘轴体对比

本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?

宿主机: ubuntu16.04

开发板: tq-imx6ull

内核版本: linux-4.1.15

用实例讲解下设备树dts语法, dts文档都在内核的arch/arm/boot/dts目录下; 在查看dts文档时候发现这有些c语言的语法包含在其中, 比如#inlcude , #include "xxx.dtsi"; 接下来分析天嵌官方提供的设备树文档;

二. 语法分析arch/arm/boot/dts

tq官方提供了两种设备树配置, 一种是单网口和8串口配置, 一种是双网口和6串口配置; 笔者将以后一种配置的设备树文档进行分析, 开头有说过, dts文档支持类似C语言的语法, 下面列出了包含情况:

tq-imx6ul_net0_uart.dts

#include "tq-imx6ul.dts"

#include

#include "imx6ul.dtsi"

#include "skeleton.dtsi"

#include

#include

#include

#include "imx6ul-pinfunc.h"

先从最前面的dts文档分析:tq-imx6ul_net0_uart.dts

截取部分内容如下:

#include "tq-imx6ul.dts"

.....

&fec1 { ①

pinctrl-names = "default";

pinctrl-0 = ; ②

phy-mode = "rmii";

phy-handle = ;

status = "okay";

mdio {

#address-cells = <1>;

#size-cells = <0>;

ethphy0: [email protected] {

compatible = "ethernet-phy-ieee802.3-c22";

reg = <2>;

};

};

};

.....

2.1 dts修改方式①: &fec1表示引用标签fec1, 它来自imx6ul.dtsi, 原型如下:

fec1: [email protected] {

compatible = "fsl,imx6ul-fec", "fsl,imx6q-fec";

reg = <0x02188000 0x4000>;

interrupts = ,

;

clocks = ,

,

,

,

;

clock-names = "ipg", "ahb", "ptp",

"enet_clk_ref", "enet_out";

stop-mode = ;

fsl,num-tx-queues=<1>;

fsl,num-rx-queues=<1>;

fsl,magic-packet;

fsl,wakeup_irq = <0>;

status = "disabled";

};

仔细观察它比在tq-imx6ul_net0_uart.dts时的属性多的多, 其实这是dts的一个特点, 可以进行引用修改, 即在原有的基础上进行修改或增加, 以属性status为例, 原本是"disable"状态, 后引用修改为"okay"状态, 而不需要重新全部的写一边节点; 因为在编译成dtb的时候, 编译器会将他们合并; 这个可以通过dtb文档反汇编成dts文档查看反汇编dtb, 上述

[email protected] {

compatible = "fsl,imx6ul-fec", "fsl,imx6q-fec";

reg = <0x2188000 0x4000>;

interrupts = <0x0 0x76 0x4 0x0 0x77 0x4>;

clocks = <0x1 0x90 0x1 0x91 0x1 0x30 0x1 0x2c 0x1 0x2c>;

clock-names = "ipg", "ahb", "ptp", "enet_clk_ref", "enet_out";

stop-mode = <0x16 0x10 0x3>;

fsl,num-tx-queues = <0x1>;

fsl,num-rx-queues = <0x1>;

fsl,magic-packet;

fsl,wakeup_irq = <0x0>;

status = "okay";

pinctrl-names = "default";

pinctrl-0 = <0x1a>;

phy-mode = "rmii";

phy-handle = <0x1b>;

mdio {

#address-cells = <0x1>;

#size-cells = <0x0>;

[email protected] {

compatible = "ethernet-phy-ieee802.3-c22";

reg = <0x2>;

linux,phandle = <0x1b>;

phandle = <0x1b>;

};

};

};

可以看到他们已经合并在一起了, 其实还有修改一种方式如下:

/ {

[email protected] {

......

status = "okay";

};

};

该方式称为重写; 注意, 这样书写的方式必须写在root节点内; 讲到这里觉得有比较说下dts的基本语法知识, 如下:

[label:] node-name[@unit-address] {

[properties definitions]

[child nodes]

};

在设备树中最开始的符号:

/ {

};

表示根节点, 也叫做root节点, 而fec1表示一个label, ethernet表示节点名字, 则@02188000表示节点对应的寄存器地址, 加上这个只是为了区分不同的节点, 比如这款soc就支持双网口;

compatible和status表示一个属性, mdio { };则表示一个子节点;

从lable的引用可以看出很多公共的节点都会先在.dtsi中书写或.h中书写, 有差异的时候需要修改则在.dts中引用修改;

2.2 lable转换phandle

pinctrl_enet1: enet1grp {

fsl,pins = <

MX6UL_PAD_GPIO1_IO07__ENET1_MDC0x1b0b0

MX6UL_PAD_GPIO1_IO06__ENET1_MDIO0x1b0b0

.....

>;

};

其实在编译以后, lable会转换成属性phandle在该节点中, 并且会为其赋上u32类型的值; 反汇编后enet1grp节点的dts如下:

enet1grp {

....

linux,phandle = <0x1a>;

phandle = <0x1a>;

};

我们在看看前面反汇编出的pinctrl-0引用的值变为了0x1a

[email protected] {

compatible = "fsl,imx6ul-fec", "fsl,imx6q-fec";

....

pinctrl-0 = <0x1a>;

phy-mode = "rmii";

phy-handle = <0x1b>;

....

};

2.3 属性取值方式prop-encoded-array

比如: local-mac-address = [ 00 00 12 34 56 78];

每个字节的值用两个16进制的数表示, 也可以写成local-mac-address = [ 000012345678];string

比如: compatible = "fsl,imx6ul-lcdif";string list

比如: compatible = "fsl,imx6ul-lcdif", "fsl,imx28-lcdif";u32

比如: address-bits = <48>;phandle

比如: phy-handle = ;

该方式其实是引用lable, 最后编译其实是个u32类型的整数; 欢迎大家纠错讨论: !

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux dts 语法格式,设备树DTS格式解析 的相关文章

随机推荐

  • Java从入门到实战总结-3.7、XML和JSON

    Java从入门到实战总结 3 7 XML和JSON 文章目录 Java从入门到实战总结 3 7 XML和JSON 1 前言 2 XML介绍 1 XML概述 2 用途 3 处理器与应用 4 标记 Markup 与内容 content 5 标签
  • java 利用方法实现数组之间的传递

    import java util public class HelloWorld public static void main String args int arr 1 2 3 int output transform arr 运用tr
  • springboot打印启动信息

    打印启动信息 param application 应用 SneakyThrows private static void printMsg ApplicationContext application String ip InetAddre
  • vuex(4.x)

    1 简介 vuex状态管理插件 在vue最重要就是数据驱动和组件化 每个组件都有自己的data template和methods data是数据 我们也叫做状态 通过methods中方法改变状态来更新视图 在单个组件中修改状态更新视图是很方
  • vue - mvvm模式的理解?

    1 MVVM 是Model View ViewModel 的缩写 它是一种基于前端开发的架构模式 其核心是提供对View 和 ViewModel 的双向数据绑定 2 MVVM 中的核心 VM vm负责连接 View 和 Model 保证视图
  • Python如何永久修改sys.path

    Python如何永久修改sys path 起因 这两天运行需要用命令行来运行python文件 但是总是报错ModuleNotFoundError No module named xxx tf liushanlin liushanlindeM
  • 解决Fastjson的下划线与大小写映射问题

    一 问题场景 目前我有一个类如下所示 Data ToString class BTEST Long infoId Long info id 需要执行的方法如下 Test public void jsonToBean Map
  • python3使用pykeyboard和Pyhook的问题及解决

    python3 7无法import pykeyboard的原因 问题1 ModuleNotFoundError No module named windows 问题2 cant import name PyKeyboard from pkk
  • python(列表、元组、字典)详解

    文章目录 什么是列表 列表的定义 in max min sum在列表中的使用 操作列表 初识元组 元组定义 列表与元组的区别 初识字典 字典的结构与创建方法 字典的遍历 字典支持的数据类型 循环 什么是列表 列表就是队列 是各种数据类型的集
  • 关于数论中的互质数的最大不能组合数

    题意 给定A和B A和B互质 求最大不能组合数 和不能组合数的个数 基础知识 Gcd A B 1 Lcm A B AB剩余类 把所有整数划分成m个等价类 每个等价类由相互同余的整数组成任何数分成m个剩余类 分别为 mk mk 1 mk 2
  • 新论文石锤Transformer:别只看注意力,没有残差和MLP,它啥都不是

    作者 青暮 基于注意力的架构在机器学习社区中已经变得无处不在 Transformer最初在机器翻译打出名堂 随着BERT的问世几乎统治了整个NLP领域 RNN LSTM等老前辈瑟瑟发抖 GPT 3的零样本学习能力又令人不禁怀疑其智能本质 还
  • 简单几步,让Mac外接显示器更好用

    光懂得给MacBook连接外置显示器还不行 了解这几点 才能让Mac外接显示器更好用 可以在两个显示器桌面之间任意拖拽移动软件窗口 这也是双 多 显示器一个高效的地方 将外接显示器设置为最佳分辨率 MacBook连接上外接显示器后 打开 系
  • Qt之工程文件

    文章目录 1 注释 2 QT 3 模板变量 TEMPLATE 4 TARGET 5 CONFIG 6 控制输出目录 6 1 UIC DIR 6 2 RCC DIR 6 3 MOC DIR 6 4 OBJECTS DIR 6 5 DESTDI
  • linux下制作动态库

    1 动态库的介绍 动态库 也叫共享库 动态库与用户编写的程序相互独立 不被包含在用户生成的可执行文件当中 2 动态库的创建 第一步 将写好的程序编译 我们事先写好两个程序 bye c hello c 一个输出hello一个输出bye 在终端
  • Spring AOP(一)五种增强(Advice)

    AOP术语都非常抽象 结合某些小例子就会形象 具体一些 连接点 Joinpoint Spring仅支持方法的连接点 即仅能在方法调用前 方法调用后 方法抛出异常时及方法调用前后 这些程序执行点织入增强 黑客攻击系统需要找到突破口 从某种程度
  • 【安卓网络编程】Android Studio导入Volley

    在Android Studio中使用Volley框架 首先要导入Volley到项目中去 点击主界面左上角File 点击Project Structure 在Modules下 点击app 然后点击Dependencies 然后点击右边的那个
  • 企业级音视频会议实战之webrtc服务器janus品尝实战

    1 前言 之前写过单纯用webrtc和springboot实现单人 多人 屏幕分享等功能的一系列文章了 心疼各位giegie 已将例子放在下面 不麻烦你们去找了 webrtc实现视频群聊系列文章 一 之基础入门 webrtc实现视频群聊系列
  • C++ 大话设计之《访问者模式》(优缺点,设计原理,常用场景)

    访问者模式是一种行为型模式 优点 能够在不改变对象结构的情况下增加新的操作 使得操作集合可以相对独立地演化 缺点 增加新的元素类变得困难 因为每个新元素都必须被访问者类所接受 此外 如果对象结构中的元素类经常发生变化 那么使用访问者模式可能
  • 微信公众号订阅通知设置

    1 开通订阅通知 根据api开通 https developers weixin qq com doc offiaccount Subscription Messages intro html 2 设置订阅通知组件 根据api设置服务号订阅
  • linux dts 语法格式,设备树DTS格式解析

    8种机械键盘轴体对比 本人程序员 要买一个写代码的键盘 请问红轴和茶轴怎么选 宿主机 ubuntu16 04 开发板 tq imx6ull 内核版本 linux 4 1 15 用实例讲解下设备树dts语法 dts文档都在内核的arch ar