dtb和dtc文件浅析

目录


title: dtb和dtc文件浅析
date: 2019/4/25 20:09:38
toc: true
---

dtb和dtc文件浅析

工具集

在之前的内核中,我们编译出来了可执行程序

linux-4.19-rc3/scripts/dtc/dtc
# 复制到bin下
 sudo cp dtc /usr/bin/ 

常规用法如下:

  • 转换到二进制 dtc>dtb

    dtc -I dtb -O dts -o output.dts arch/arm/boot/dts/jz2440.dtb
  • 转换到可读文件 dtb>dtc

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

可以看下帮助

 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

dts格式

更多参考下这里

这个就放张图好了,总结起来就是只有一个根(root),子节点可以有子节点

dtb和dtc文件浅析

当然存在着一些保留的关键字

Standard Properties
compatible 定义一系列的字符串, 用来指定内核中哪个
model
phandle
status
#address-cells 在它的子节点的reg属性中, 使用多少个u32整数来描述地址(address)
#size-cells 在它的子节点的reg属性中, 使用多少个u32整数来描述大小(size)
reg
virtual-reg
ranges
dma-ranges
name (deprecated)
device_type (deprecated)

dtb头部结构

struct fdt_header {
uint32_t magic;
uint32_t totalsize;
uint32_t off_dt_struct;
uint32_t off_dt_strings;
uint32_t off_mem_rsvmap;
uint32_t version;
uint32_t last_comp_version;
uint32_t boot_cpuid_phys;
uint32_t size_dt_strings;
uint32_t size_dt_struct;
};

dtb标识符

参见 5.4.1 Lexical structure

01 表示节点开始
02 节点结束
09 树结束
03 属性名字开始
04 nop

分析具体的文件

找到这里的文件

/arch/arm/boot/dts/jz2440.dtb jz2440.dts

具体的文件如下

// SPDX-License-Identifier: GPL-2.0
/*
 * SAMSUNG SMDK2440 board device tree source
 *
 * Copyright (c) 2018 weidongshan@qq.com
 * dtc -I dtb -O dts -o jz2440.dts jz2440.dtb
 */
 
#define S3C2410_GPA(_nr)    ((0<<16) + (_nr))
#define S3C2410_GPB(_nr)    ((1<<16) + (_nr))
#define S3C2410_GPC(_nr)    ((2<<16) + (_nr))
#define S3C2410_GPD(_nr)    ((3<<16) + (_nr))
#define S3C2410_GPE(_nr)    ((4<<16) + (_nr))
#define S3C2410_GPF(_nr)    ((5<<16) + (_nr))
#define S3C2410_GPG(_nr)    ((6<<16) + (_nr))
#define S3C2410_GPH(_nr)    ((7<<16) + (_nr))
#define S3C2410_GPJ(_nr)    ((8<<16) + (_nr))
#define S3C2410_GPK(_nr)    ((9<<16) + (_nr))
#define S3C2410_GPL(_nr)    ((10<<16) + (_nr))
#define S3C2410_GPM(_nr)    ((11<<16) + (_nr))

/dts-v1/;

/ {
    model = "SMDK24440";
    compatible = "samsung,smdk2440";

    #address-cells = <1>;
    #size-cells = <1>;
        
    memory@30000000 {
        device_type = "memory";
        reg =  <0x30000000 0x4000000>;
    };
/*
    cpus {
        cpu {
            compatible = "arm,arm926ej-s";
        };
    };
*/  
    chosen {
        bootargs = "noinitrd root=/dev/mtdblock4 rw init=/linuxrc console=ttySAC0,115200";
    };

    
    led {
        compatible = "jz2440_led";
        pin = <S3C2410_GPF(6)>;
    };
};

dtb和dtc文件浅析

dtb和dtc文件浅析

上一篇:dts reader


下一篇:linux-kernel-4.4 移植 (1)启动