设备树语法

[DTS]设备树语法

原创: 杨永达 嵌入式软件开发交流 3月15日

前言

之前分享了一些设备树的基本概念,今天来聊聊设备树的语法。以前阅读设备树文件时发现很多平台的节点的属性名称都不一样,然后就很纠结,就到官方去找,发现都没有该属性或节点,就很郁闷。这其实犯了一个错误,那就是设备树并不是一种编程语言,没有什么绝对的关键字。我们应该把设备树理解成配置文件,如果知道xml文件,就可以把设备树类比成xml文件。

好,废话不多说了。。。

语法规则

一、设备树语法

(1)设备树节点语法

[label:] node-name[@unit-address] {    [properties definitions];    [child nodes];};

解释:

label: 可选项,节点别名

node-name: 节点名

unit-address: 设备地址

properties definitions:属性定义

child nodes:子节点

(2) 属性定义语法

[label:] property-name = value;[label:] property-name;

属性分为有属性值和无属性值

属性值有三种取值:

  • arrays of cells(1个或多个32位数据, 64位数据使用2个32位数据表示),用尖括号表示(< >)
  • string(字符串), 用双引号表示(" ")
  • bytestring(1个或多个字节),用方括号表示([ ])

举例:

//Arrays of cells : cell就是一个32位的数据interrupts = <17 0xc>;//64bit数据使用2个cell来表示:clock-frequency = <0x00000001 0x00000000>;//A null-terminated string (有结束符的字符串):compatible = "simple-bus";//A bytestring(字节序列) :local-mac-address = [00 00 12 34 56 78];  // 每个byte使用2个16进制数来表示local-mac-address = [000012345678];       // 每个byte使用2个16进制数来表示//可以是各种值的组合, 用逗号隔开:compatible = "ns16550", "ns8250";example = <0xf00f0000 19>, "a strange property format";

二、特殊属性

(1)根节点

#address-cells   // 在子节点的reg属性中, 使用多少个u32整数来描述地址(address)#size-cells      // 在子节点的reg属性中, 使用多少个u32整数来描述大小(size)compatible       // 定义一系列的字符串, 用来指定内核中哪个machine_desc可以支持本设备                 // 即这个板子兼容哪些平台                                model            // 比如有2款板子配置基本一致, 它们的compatible是一样的                 // 那么就通过model来分辨这2款板子

* cell: 一个u32整数

(2) /memory

所有设备树文件的必需节点,它定义了系统物理内存的 layout

device_type = "memory";reg             // 用来指定内存的地址、大小

(3) /chosen

传递runtime parameter

bootargs        // 内核command line参数, 跟u-boot中设置的bootargs作用一样

(4) /cpus

/cpus节点下有1个或多个cpu子节点, cpu子节点中用reg属性用来标明自己是哪一个cpu

所以 /cpus 中有以下2个属性:

#address-cells   // 在它的子节点的reg属性中, 使用多少个u32整数来描述地址(address)#size-cells      // 在它的子节点的reg属性中, 使用多少个u32整数来描述大小(size)                 // 必须设置为0

(5) aliases

用来定义别名

aliases {    ethernet0 = &gmac;    i2c0 = &i2c0;    i2c1 = &i2c1;    i2c2 = &i2c2;    mshc0 = &emmc;    mshc1 = &sdmmc;    mshc2 = &sdio0;    mshc3 = &sdio1;    serial0 = &uart0;    serial1 = &uart1;    spi0 = &spi0;    spi1 = &spi1;  };

三、引用其他节点

(1) phandle属性引用

节点中的phandle属性, 它的取值必须是唯一的(不要跟其他的phandle值一样)

[email protected] {    phandle = <1>;    interrupt-controller;};another-device-node {    interrupt-parent = <1>;   // 使用phandle值为1来引用上述节点};

(2)使用别名(本质还是phandle)

PIC: [email protected] {    interrupt-controller;};another-device-node {    interrupt-parent = <&PIC>;   // 使用label来引用上述节点                       };

四、包含dtsi文件

#include "rk3288-firefly.dtsi"

在每个.dsti和.dts中都会存在一个“/”根节点,那么如果在一个设备树文件中include一个.dtsi文件,那么岂不是存在多个“/”根节点了么。其实不然,编译器DTC在对.dts进行编译生成dtb时,会对node进行合并操作,最终生成的dtb只有一个root node。

五、使用宏定义

#include <dt-bindings/gpio/gpio.h>#include <dt-bindings/interrupt-controller/irq.h>#include <dt-bindings/interrupt-controller/arm-gic.h>#include <dt-bindings/pinctrl/rockchip.h>#include <dt-bindings/clock/rk3288-cru.h>#include <dt-bindings/power/rk3288-power.h>#include <dt-bindings/thermal/thermal.h>#include <dt-bindings/power/rk3288-power.h>#include <dt-bindings/soc/rockchip,boot-mode.h>arm-pmu {    compatible = "arm,cortex-a12-pmu";    interrupts = <GIC_SPI 151 IRQ_TYPE_LEVEL_HIGH>,           <GIC_SPI 152 IRQ_TYPE_LEVEL_HIGH>,           <GIC_SPI 153 IRQ_TYPE_LEVEL_HIGH>,           <GIC_SPI 154 IRQ_TYPE_LEVEL_HIGH>;    interrupt-affinity = <&cpu0>, <&cpu1>, <&cpu2>, <&cpu3>;  };

上面的GIC_SPI和IRQ_TYPE_LEVEL_HIGH都是宏定义,定义在头文件中。

六、属性重写

//rk3288.dtsihdmi: [email protected] {    compatible = "rockchip,rk3288-dw-hdmi";    reg = <0x0 0xff980000 0x0 0x20000>;    reg-io-width = <4>;    #sound-dai-cells = <0>;    rockchip,grf = <&grf>;    interrupts = <GIC_SPI 103 IRQ_TYPE_LEVEL_HIGH>;    clocks = <&cru  PCLK_HDMI_CTRL>, <&cru SCLK_HDMI_HDCP>, <&cru SCLK_HDMI_CEC>;    clock-names = "iahb", "isfr", "cec";    power-domains = <&power RK3288_PD_VIO>;    status = "disabled";};//rk3288-firefly.dtsi&hdmi {  ddc-i2c-bus = <&i2c5>;  status = "okay";};

上面的rk3288-firefly.dtsi包含rk3288.dtsi, 然后使用&hdmi引用rk3288.dtsi中的hdmi节点。并在原有的基础上添加ddc-i2c-bus属性,然后将status属性进行重写覆盖。这就体现了dtsi文件的价值,dtsi定义公共的部分,板级差异再进行添加或重写。

还是提醒大家,设备树不能当成一种编程语言来学哦!否则你有时候会很纠结。

精彩还在继续,欢迎继续关注!!!!

欢迎加入QQ群聊

如果你喜欢就请分享给你的朋友,感谢大家的支持

原文地址:https://www.cnblogs.com/idyllcheung/p/11183757.html

时间: 2024-11-11 04:13:40

设备树语法的相关文章

Linux设备树语法详解

Linux内核从3.x开始引入设备树的概念,用于实现驱动代码与设备信息相分离.在设备树出现以前,所有关于设备的具体信息都要写在驱动里,一旦外围设备变化,驱动代码就要重写.引入了设备树之后,驱动代码只负责处理驱动的逻辑,而关于设备的具体信息存放到设备树文件中,这样,如果只是硬件接口信息的变化而没有驱动逻辑的变化,驱动开发者只需要修改设备树文件信息,不需要改写驱动代码.比如在ARM Linux内,一个.dts(device tree source)文件对应一个ARM的machine,一般放置在内核的

Linux设备树语法详解【转】

本文转载自:http://www.cnblogs.com/xiaojiang1025/p/6131381.html 概念 Linux内核从3.x开始引入设备树的概念,用于实现驱动代码与设备信息相分离.在设备树出现以前,所有关于设备的具体信息都要写在驱动里,一旦外围设备变化,驱动代码就要重写.引入了设备树之后,驱动代码只负责处理驱动的逻辑,而关于设备的具体信息存放到设备树文件中,这样,如果只是硬件接口信息的变化而没有驱动逻辑的变化,驱动开发者只需要修改设备树文件信息,不需要改写驱动代码.比如在AR

设备树API

设备树API通常以of_开头,实现代码位于drivers/of目录下. 参考: 1. linux设备树语法 2. ARM Linux 3.x的设备树(Device Tree)

Linux内核 设备树操作常用API【转】

本文转载自:http://www.cnblogs.com/xiaojiang1025/p/6368260.html Linux设备树语法详解一文中介绍了设备树的语法,这里主要介绍内核中提供的操作设备树的API,这些API通常都在"include/of.h"中声明. device_node 内核中用下面的这个结构描述设备树中的一个节点,后面的API都需要一个device_node对象作为参数传入. //include/of.h 46 struct device_node { 47 con

设备树DTS使用

参考:<设备树DTS使用总结 - 基于MT76X8> .<linux内核设备树及编译> 一.Linux设备树的起源 在Linux 2.6中,arch/arm/plat-xxx和arch/arm/mach-xxx中充斥着大量的垃圾代码,相当多数的代码只是在描述板级细节,而这些板级细节对于内核来讲,不过是垃圾,如板上的platform设备.resource.i2c_board_info.spi_board_info以及各种硬件platform_data. 在Linux3.x版本后,ar

【Linux-设备树】设备树

Linux3.1之前的版本,对于一般的ARM平台的设备,板级信息一般存放在/arch/arm/mach-**目录下. 设备树对应的文件存放在/arch/arm/boot/dts/***.dts目录下 设备树引入的目的: 避免各个厂商代码的重复,加速linux内核的bsp的开发.编译一个镜像可以支持多个不同设备,只需要编译对应的设备树并打包就可以. 设备树:是一种描述板子硬件信息的数据结构(二进制文件),通过lk(bootloader)加载不同(对应的内核). 内容:dts源文件----dtc编译

Linux设备树使用(二)

一.设备树与驱动的匹配1.设备树会被/scripts中的dtc可执行程序编译成二进制.dtb文件,之前设备树中的节点信息会以单链表的形式存储在这个.dtb文件中:驱动与设备树中compatible属性匹配上后, 驱动中的相应的node节点就映射在这个设备树节点上了,然后以这个node为参数调用of函数来解析这个设备树块上的信息为驱动所用.设备树中的信息是逐条进行获取的(?) 2.例如设备树中有如下定义: flash_SY7803:flashlight { compatible = "qcom,l

设备树机制

转自:http://blog.csdn.net/machiner1/article/details/47805069,转载仅供个人参考. ------------------Based on linux 3.10.24 source code 参考/documentation/devicetree/Booting-without-of.txt文档 目录 1. 设备树(Device  Tree)基本概念及作用 2. 设备树的组成和使用 2.1. DTS和DTSI 2.2. DTC 2.3. DTB

Linux设备树(2)——设备树格式和使用

一.设备树dts文件的语法规范 1. DTS文件布局(layout) /dts-v1/; [memory reservations] // 格式为: /memreserve/ <address> <length>; / { [property definitions] [child nodes] }; (1) 特殊的.默认的属性 a. 根节点的: #address-cells // 在它的子节点的reg属性中, 使用多少个u32整数来描述地址(address) #size-cell