zoukankan      html  css  js  c++  java
  • 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),子节点可以有子节点

    mark

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

    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)>;
    	};
    };
    
    

    mark

    mark

  • 相关阅读:
    一些常用编程经验
    “一键GHOST”系统备份与还原(icmzn)
    office2010安装不成功提示缺少MSXML 6.10.1129.0?
    python 的几种启动方式
    win7 环境安装Python + IDE(vs2010)开发
    U盘单个文件最大4G限制问题
    第一百零三节,JavaScript对象和数组
    第一百零二节,JavaScript函数
    第一百零一节,JavaScript流程控制语句
    第一百节,JavaScript表达式中的运算符
  • 原文地址:https://www.cnblogs.com/zongzi10010/p/10793074.html
Copyright © 2011-2022 走看看