02 设备树的格式 DTS文件

参考博客:
https://www.cnblogs.com/zongzi10010/p/10793074.html

Device Tree 详解_pwl999的博客-CSDN博客_device tree

1 dtc命令

dtc -h
Usage: dtc [options] <input file>

Options: -[qI:O:o:V:d:R:S:p:a:fb:i:H:sW:E:@Ahv]
  -q, --quiet
        Quiet: -q suppress warnings, -qq errors, -qqq all
  -I, --in-format <arg>
        Input formats are:
                dts - device tree source text
                dtb - device tree blob
                fs  - /proc/device-tree style directory
  -o, --out <arg>
        Output file
  -O, --out-format <arg>
        Output formats are:
                dts - device tree source text
                dtb - device tree blob
                asm - assembler source
  -V, --out-version <arg>
        Blob version to produce, defaults to 17 (for dtb and asm output)
  -d, --out-dependency <arg>
        Output dependency file
  -R, --reserve <arg>
        Make space for <number> reserve map entries (for dtb and asm output)
  -S, --space <arg>
        Make the blob at least <bytes> long (extra space)
  -p, --pad <arg>
        Add padding to the blob of <bytes> long (extra space)
  -a, --align <arg>
        Make the blob align to the <bytes> (extra space)
  -b, --boot-cpu <arg>
        Set the physical boot cpu
  -f, --force
        Try to produce output even if the input tree has errors
  -i, --include <arg>
        Add a path to search for include files
  -s, --sort
        Sort nodes and properties before outputting (useful for comparing trees)
  -H, --phandle <arg>
        Valid phandle formats are:
                legacy - "linux,phandle" properties only
                epapr  - "phandle" properties only
                both   - Both "linux,phandle" and "phandle" properties
  -W, --warning <arg>
        Enable/disable warnings (prefix with "no-")
  -E, --error <arg>
        Enable/disable errors (prefix with "no-")
  -@, --symbols
        Enable generation of symbols
  -A, --auto-alias
        Enable auto-alias of labels
  -h, --help
        Print this help and exit
  -v, --version
        Print version and exit

常见用法
二进制文件编译为可读文件

dtc -I dtb -O dts -o output.dts arch/arm/boot/dts/jz2440.dtb

生成二进制文件

dtc -I dts -O dtb -o jz2440.dtb output.dts

2 dts文件

2.1 dts格式

设备树由两种元素组成:node(节点);property(属性)
node节点,使用一对花括符来定义

node-name[@unit-address] {
}

property属性

property-name=value

语法:

字符包含在双引号中,字符存在结束符

字节序使用[]包围

多个值的组合使用,隔开

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

Property格式1:
[label:] property-name = value;

Property格式2(没有值):
[label:] property-name;
Property值为空,用property本身出现或者不出现来表示一个true/false值。

Property取值只有3种: 
arrays of cells(1个或多个32位数据, 64位数据使用2个32位数据表示), 
string(字符串), 
bytestring(1个或多个字节)

dtsi文件:

dtsi文件与dts文件一样,一般为dts需要使用的公共部分配置。在使用时直接include即可

/dts-v1/;
#include <dt-bindings/input/input.h>
#include "imx6ull.dtsi"
/ {
……
};

示例:

/ {                     /* 定义根节点 / */
    model = "mt6799";
    compatible = "mediatek,mt6799";
    interrupt-parent = <&gic>;
    #address-cells = <2>;
    #size-cells = <2>;

    /* chosen */
    chosen {            /* 定义节点chosen */
        bootargs = "console=tty0 console=ttyMT0,921600n1 root=/dev/ram";
    };
}

注意:节点和属性名是可以自定义的,但是在设备树中。预定义了一些标准节点和属性

2.2 预设标准property

  • compatible
    通常用来描述devicedriver的适配

    compatible = "ns16550", "ns8250";
    先去匹配ns16550,如果失败再去匹配ns8250

    compatible的值建议设置为“manufacturer,model”, 即“厂家名,模块名”

  • model
    表示硬件设备型号

    需要注意的是model与compatoble的差异。model表示使用的硬件设备的型号,compatible表示硬件兼容的驱动
    / {
    compatible = "samsung,smdk2440", "samsung,mini2440";
    model = "jz2440_v3";
    };
    如上表示使用的单板为jz2440_v3,可兼容内核中的smdk2440和mini2440的驱动。

    其实也很好理解:一个设备可能有多种驱动,从而实现不同的功能

  • phandle
    引用node。常见用法是定义一个label来引用node。在编译时系统会自动生成一个phandle属性。
    使用&来引用label
    label的定义

        // cpu0是一个label代指cpu@0
        cpu0: cpu@0 {
            device_type = "cpu";
            compatible = "arm,cortex-a35";
            reg = <0x000>;
            enable-method = "psci";
            cpu-idle-states = <&LEGACY_MCDI &LEGACY_SODI &LEGACY_SODI3 &LEGACY_DPIDLE>,
                      <&LEGACY_SUSPEND &MCDI &SODI &SODI3 &DPIDLE &SUSPEND>;
            cpu-release-addr = <0x0 0x40000200>;
            clock-frequency = <1248000000>;
        };
    

    引用

            cpu-map {
                cluster0 {
                    core0 {
                        cpu = <&cpu0>;
                    };
    
    
                    core1 {
                        cpu = <&cpu1>;
                    };
    
                    core2 {
                        cpu = <&cpu2>;
                    };
    
                    core3 {
                        cpu = <&cpu3>;
                    };
    
                };
    
    
  • #address-cells #size-cells
    定义当前节点中reg的属性和解析格式。选择解析reg中的第几个数据。
    #address-cells=<0>:不解析
    #address-cells=<1>: 一个一个解析
    #address-cells=<2>: 解析第二个
    #size-cells#address-cells
    示例

    soc {
    	#address-cells = <1>;
    	#size-cells = <1>;
    	serial {
    		reg = <0x0 0x100 0x0 0x200>;
    	}
    }
    

    1、如果node”soc””#address-cells=<1>”、”#size-cells=<1>”,那么子node”serial””reg”属性的解析为“addr1 = 0x0, size1 = 0x100, addr2 = 0x0, size2 = 0x200”
    2、如果node”soc””#address-cells=<2>”、”#size-cells=<2>”,那么子node”serial””reg”属性的解析为“addr1 = 0x100, size1 = 0x200”
    3、如果node”soc””#address-cells=<2>”、”#size-cells=<0>”,那么子node”serial””reg”属性的解析为“addr1 = 0x100, addr2 = 0x200”

  • reg
    解析出address,length。解析格式由#address-cells #size-cells控制

  • ranges
    当前节点和父节点之间的地址映射
    格式:

    child-bus-address,parentbus-address,length
    

    child-bus-address解析的长度受当前节点#address-cells控制
    parentbus-address解析的长度受父节点的#address-parentbus-address控制
    length的解析受当前node#size-cells控制

  • interrupt
    中断节点分为3种
    interrupt Gernerating Devices,产生中断的设备
    interrupt Controllers中断控制器,处理中断的设备
    interrupt Nexus中断联结,路由中断给中断控制器

    #interrupt-cells#address-cells #size-cells
    interrupt-controller用来声明当前node为中断控制器

    interrupt-map用来描述interrupt nexus设备对中断的路由。
    解析格式为child unit address, child interrupt specifier, interrupt-parent, parent unit address, parent interrupt specifier

  • status

    设备状态的使能标志

2.3 标准node

node一般由名字加@地址构成,这样可以防止node name冲突

node-name[@unit-address]{

}

msdc0:msdc@11240000
  • root node

    根节点为每个deivce tree必备的

    property成员为下:

    #address-cells
    #size-cells	
    model			:详见property
    compatible
    
  • aliases node

    给绝对路径取别名

    aliases {
    	serial0 = "/simple-bus@fe000000/serial@llc500";
    	ethernet0 = "/simple-bus@fe000000/ethernet@31c000";
    };
    
  • memory node

    用于传递内存布局

    property成员

    device_type         : should be memory
    reg                 : 指定内存大小和物理地址范围
    initial-mapped-area	:是一个由(有效地址、物理地址、大小)三元组组成的prop编码数组
    
        #address-cells = <2>;
        #size-cells = <2>;
    
        memory@0 {
            device_type = "memory";
            reg = <0x000000000 0x00000000 0x00000000 0x80000000
            0x000000001 0x00000000 0x00000001 0x00000000>;
        };
    
    
    
  • chosen node

    property成员

    bootargs    :引导参数字符串
    stdout-path	:引导控制台输出的设备
    stdin-path	:引导控制台输入的设备   
    
    chosen {
        bootargs = "earlycon=cdns,0xfd000000,115200 console=tty0 console=ttyPS0,115200 root=/dev/ram0 rw earlyprintk xilinx_uartps.rx_trigger_level=32 loglevel=8 nohz=off ignore_loglevel";
    };
    
  • cpus node

    一般dtsi文件中已经写好了

            cpus {
                    #address-cells = <1>;
                    #size-cells = <0>;
                    cpu@0 {
                            compatible = "cdns,xtensa-cpu";
                            reg = <0>;
                    };
            };
    
posted @ 2022-10-14 16:43  人民广场的二道贩子  阅读(143)  评论(0编辑  收藏  举报