设备树实例解析

[DTS]设备树实例解析

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

前言 

    前面对设备树的一些基本语法进行了讲解,然后这一节通过一个demo来实践一下具体的语法,可以和上一小节一起阅读。多看多改自然就慢慢理解语法规则了。^_^

实例解析

    

    下面的dts文件内容是网上比较常见的一个demo,我们把它拿过来解析。为什么不从arch/arm/boot/dts/中找一份呢? 因为里面的dts内容都很多,看着很容易晕,所以找一份简短的来学习会更容易获取成就感。

/ {    
compatible = "acme,coyotes-revenge";

#address-cells = <1>; //子结点需要一个 cell 描述地址

#size-cells = <1>; //子结点需要一个 cell 描述长度

interrupt-parent = <&intc>;

cpus {

  #address-cells = <1>;

  #size-cells = <0>;

  cpu@0 {

  compatible = "arm,cortex-a9";

  reg = <0>;

  };

  cpu@1 {

  compatible = "arm,cortex-a9";

  reg = <1>;

  };

};


serial@101f1000 { //串口

  compatible = "arm,pl011";

  reg = <0x101f1000 0x1000 >;

  interrupts = < 1 0 >;

};

serial@101f2000 { //串口

  compatible = "arm,pl011";

  reg = <0x101f2000 0x1000 >;

  interrupts = < 2 0 >;

};


intc: interrupt-controller@10140000 { //中断控制器

  compatible = "arm,pl190";

  reg = <0x10140000 0x1000 >;

  interrupt-controller;

  #interrupt-cells = <2>;

};

spi@10115000 { //spi 控制器

  compatible = "arm,pl022";

  reg = <0x10115000 0x1000 >; 起始地址为 0x10115000,长度为 0x1000

  interrupts = < 4 0 >;

};

external-bus { //external bus 桥

  #address-cells = <2> //子结点需要两个 cell 描述地址,片选

  #size-cells = <1>; //子结点需要一个 cell 描述长度

  ranges = <0 0 0x10100000 0x10000 // Chipselect 1, Ethernet 片选 0 0,地址 0x10100000 ,长度 0x10000

       1 0 0x10160000 0x10000 // Chipselect 2, i2c controller

       2 0 0x30000000 0x1000000>; // Chipselect 3, NOR Flash

  ethernet@0,0 {

    compatible = "smc,smc91c111";

    reg = <0 0 0x1000>;

    interrupts = < 5 2 >;

  };

  i2c@1,0 {

    compatible = "acme,a1234-i2c-bus";

    #address-cells = <1>; //rtc 需要一个 cell 描述地址

    #size-cells = <0>; //rtc 不需要 0 描述长度

    reg = <1 0 0x1000>;

    rtc@58 {

      compatible = "maxim,ds1338";

      reg = <58>;

      interrupts = < 7 3 >;

    };

  };

  flash@2,0 {

    compatible = "samsung,k8f1315ebm", "cfi-flash";

    reg = <2 0 0x4000000>;

  };

}; //external-bus

};

解析:

(1) 根节点

compatible: 内核通过root节点"/"的compatible属性来判断它启动的是哪个machine。

#address-cells : 子结点(reg属性)需要多少个cell描述地址。

#size-cells : 子结点(reg属性)需要多少个cell描述长度。

interrupt-parent : 标示该节点属于哪个中断控制器,如果没有该属性,则依附于父节点。

(2) cpus节点

#address-cells : 同上

#size-cells : 同上

(3) cpu节点

@unit-address: 可选项,设备地址,节点名相同时可以通过这个来区分不同节点。unit-address地址也经常在其对应的reg属性中给出。

reg : region,描述设备地址

格式: reg = <address1 length1 [address2 length2] [address3 length3]>

(4) serial节点

compatible: 外设节点上的compatible属性用于驱动和设备的绑定(匹配)

reg: 外设基地址和偏移量 ,比如:reg = <0x101f1000 0x1000 >

interrupts: 中断号和标识(上升沿,下降沿等), 里面多少个值要根据中断控制器的#interrupt-cells属性来决定。而#interrupt-cells属性值要由中断控制器的类型决定。

中断控制器类型:

GIC: Generic Interrupt Controller(通用中断控制器)

    中断类型,中断号,标识(上升沿,下降沿等)

VIC : Vectored Interrupt Controller(向量中断控制器)

    中断号

NVIC:Nested Vectored Interrupt Controller(内嵌向量中断控制器)

    中断号,中断优先级

参考: Documentationdevicetreeindingsinterrupt-controller

(5) interrupt-controller节点

compatible: 中断控制器类型,查看上面路径下的文件来获知, 芯片datasheet也有说明。

reg:同上

interrupt-controller:空属性,用来声明这个节点接收中断信号。

#interrupt-cells:标识该控制器需要几个cell来描述中断,其实就是决定了interrupts属性需要几个cell

(6) external-bus节点

ranges: 地址转换表,每一行都包含子地址、父地址、在子地址空间内的区域大小。

ranges属性值为空的话,表示1:1映射。

ranges属性值的格式 <local地址, parent地址, size>

local地址的个数取决于当前含有ranges属性的节点的#address-cells属性的值。

parent地址的个数取决于父节点的#address-cells的值。

size取决于当前含有ranges属性的节点的#size-cells属性的值。

(7) rtc节点

reg: i2c设备地址

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

欢迎加入QQ群聊

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

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