linux dtc源码分析,dtb和dtc文件浅析

dtb和dtc文件浅析

[TOC]

工具集

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

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]

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

Input formats are:

dts - device tree source text

dtb - device tree blob

fs - /proc/device-tree style directory

-o, --out

Output file

-O, --out-format

Output formats are:

dts - device tree source text

dtb - device tree blob

asm - assembler source

-V, --out-version

Blob version to produce, defaults to 17 (for dtb and asm output)

-d, --out-dependency

Output dependency file

-R, --reserve

Make space for reserve map entries (for dtb and asm output)

-S, --space

Make the blob at least long (extra space)

-p, --pad

Add padding to the blob of long (extra space)

-a, --align

Make the blob align to the (extra space)

-b, --boot-cpu

Set the physical boot cpu

-f, --force

Try to produce output even if the input tree has errors

-i, --include

Add a path to search for include files

-s, --sort

Sort nodes and properties before outputting (useful for comparing trees)

-H, --phandle

Valid phandle formats are:

legacy - "linux,phandle" properties only

epapr - "phandle" properties only

both - Both "linux,phandle" and "phandle" properties

-W, --warning

Enable/disable warnings (prefix with "no-")

-E, --error

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),子节点可以有子节点

36b4b2ecbec04cc2eb6c16c9095b1838.png

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

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

};

};

a71805764ef063ec895333909f5ed1be.png

926969e7f657fee8b2f9f3f938e576e2.png