300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > dtsi与dts_设备树dts dtsi文件

dtsi与dts_设备树dts dtsi文件

时间:2019-03-29 03:30:15

相关推荐

dtsi与dts_设备树dts dtsi文件

1.DTS文件布局(layout):

/dts-v1/;

[memory reservations] //格式为:memreserve /

;保留的内存区域,定义一部分内存留给自己用

/{

[property definitions]

[child nodes]

}

Property格式1:

[label:] property-name = value;

Property格式2(没有值):

[label:] property-name;

Property取值只有3种:

arrays of cells(1个或多个32位数据, 64位数据使用2个32位数据表示),

string(字符串),

bytestring(1个或多个字节)

示例:

a.Arrays of cells:cell就是一个32位的数据

interrupts = <17 0xc>;

b.64bit数据使用2个cell来表示

clock-frequency = <0x00000001 0x00000000>;

c.A null-terminated string(有结束符的字符串):

compatible = "simple-bus"

d.A bytestring(字节序列):

local-mac-address = [00 00 12 34 56 78];//每个byte使用2个16进制来表示

local-mac-address =[000012345678];//每个byte之间可以不用空格表示

e. 可以是各种值的组合, 用逗号隔开:

compatible = "ns16550", "ns8250";

example = <0xf00f0000 19>, "a strange property format";

(2)

DTS文件布局(layout):

/dts-v1/;

[memory reservations] // 格式为: /memreserve/

;

/ {

[property definitions]

[child nodes]

};

(3) 特殊的、默认的属性:

a. 根节点:

#address-cells // 在它的子节点的reg属性中, 使用多少个u32整数来描述地址(address)

#size-cells // 在它的子节点的reg属性中, 使用多少个u32整数来描述大小(size)

如#address-cells = <1>;表示在子节点里面这个reg属性里用1个32位的数据来代表地址

#size-cells = <1>;表示在子节点里面这个reg属性里用1个32位的数据来表示大小

compatible // 定义一系列的字符串, 用来指定内核中哪个machine_desc可以支持本设备

// 即这个板子兼容哪些平台

// uImage : smdk2410 smdk2440 mini2440 ==> machine_desc

eg: compatible = "samsung,smdk2440","samsung,s3c24xx" //定义一系列的字符串,内核先匹配前面的的字符串,匹配不到就匹配后面的字符串

model // 咱这个板子是什么

// 比如有2款板子配置基本一致, 它们的compatible是一样的

// 那么就通过model来分辨这2款板子

b. /memory

device_type = "memory";

reg // 用来指定内存的地址、大小

c. /chosen

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

内核启动时命令行参数

d. /cpus

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

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

#address-cells // 在它的子节点的reg属性中, 使用多少个u32整数来描述地址(address)

#size-cells // 在它的子节点的reg属性中, 使用多少个u32整数来描述大小(size)

// 必须设置为0

e. /cpus/cpu*

device_type = "cpu";

reg // 表明自己是哪一个cpu

(4) 引用其他节点:

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

pic@10000000 {

phandle = <1>;

interrupt-controller;

};

another-device-node {

interrupt-parent = <1>; // 使用phandle值为1来引用上述节点

};

b.指明 label:

PIC: pic@10000000 {

interrupt-controller;

};

another-device-node {

interrupt-parent = ; // 使用label来引用上述节点,

// 使用lable时实际上也是使用phandle来引用,

// 在编译dts文件为dtb文件时, 编译器dtc会在dtb中插入phandle属性

};

示例:dtsi文件

/dts-v1/;

/memreserve/ 0x33f00000 0x100000;

/ { #指定根节点

model = "SMDK24440"; #指定板子类型

compatible = "samsung,smdk2440"; #指定内核中哪个machine_desc可以支持本设备

#address-cells = <1>; #指定子节点(memory)reg属性里用1个32位数据代表地址

#size-cells = <1>;#指定子节点(memory)reg属性里用1个32位数据代表大小(size)

memory { /* /memory */ #内存子节点

device_type = "memory"; #设备类型

reg = <0x30000000 0x4000000 0 4096>;#设备起始地址和大小

};

/*

cpus {

cpu {

compatible = "arm,arm926ej-s";// 表明自己是哪一个cpu

};

};

*/

chosen {

bootargs = "noinitrd root=/dev/mtdblock4 rw init=/linuxrc console=ttySAC0,115200"; // 内核command line参数, 跟u-boot中设置的bootargs作用一样

};

LED:led { //led子节点,LED表示可引用的标号

compatible = "jz2440_led";

pin = ;

};

};

dts文件:包含dtsi文件

示例1:覆盖dtsi的属性

/dts-v1/;

/{

led{

pin = ;

};

};

示例2:直接加标号引用

&LED{

pin = ;

};

编译:make dtbs

反汇编:./scripts/dtc/dtc - I dtb - O dts -o tmp.dts arch/arm/boot/dts/xxx.dtb

./scripts/dtc/dtc -I dtb -O dts -o output.dts ./arch/arm/boot/dts/stm32mp157c-dk2.dtb

内核查看:/Documentation/devicetree/usage-model.txt

对应驱动的设备文档设备树写法:/Documentation/devetree/bindings

点赞

收藏

分享

文章举报

守望者910

发布了31 篇原创文章 · 获赞 4 · 访问量 1872

私信

关注

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