700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > linux dts 语法格式 设备树DTS格式解析

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

时间:2020-11-01 03:28:44

相关推荐

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

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: [emailprotected] {

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

reg = <2>;

};

};

};

.....

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

fec1: [emailprotected] {

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, 上述

[emailprotected] {

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>;

[emailprotected] {

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

reg = <0x2>;

linux,phandle = <0x1b>;

phandle = <0x1b>;

};

};

};

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

/ {

[emailprotected] {

......

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

[emailprotected] {

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类型的整数; 欢迎大家纠错讨论: !

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。