linux 编译dts_linux 编译 dts - CSDN
  • 1、设备树的概念  在内核源码中,存在大量对板级细节信息描述的代码。这些代码充斥在/arch/arm/plat-xxx和/arch/arm/mach-xxx目录,对内核而言这些platform设备、resource、i2c_board_info、spi_board_info以及...

    1、设备树的概念

            在内核源码中,存在大量对板级细节信息描述的代码。这些代码充斥在/arch/arm/plat-xxx和/arch/arm/mach-xxx目录,对内核而言这些platform设备、resource、i2c_board_info、spi_board_info以及各种硬件的platform_data绝大多数纯属垃圾冗余代码。为了解决这一问题,ARM内核版本3.x之后引入了原先在Power PC等其他体系架构已经使用的Flattened Device Tree。

            开源文档中对设备树的描述是,一种描述硬件资源的数据结构,它通过bootloader将硬件资源传给内核,使得内核和硬件资源描述相对独立。

             Device Tree可以描述的信息包括CPU的数量和类别、内存基地址和大小、总线和桥、外设连接、中断控制器和中断使用情况、GPIO控制器和GPIO使用情况、Clock控制器和Clock使用情况

             另外,设备树对于可热插拔的设备不进行具体描述,它只描述用于控制该热插拔设备的控制器

             设备树的主要优势:对于同一SOC的不同主板,只需更换设备树文件.dtb即可实现不同主板的无差异支持,而无需更换内核文件

    注:要使得3.x之后的内核支持使用设备树,除了内核编译时需要打开相对应的选项外,bootloader也需要支持将设备树的数据结构传给内核

    2、设备树的组成和使用

            设备树包含DTC(device tree compiler),DTS(device tree source和DTB(device tree blob)。其对应关系如下图所示:

                                                                   

    2.1 DTS和DTSI(源文件)

            .dts文件是一种ASCII文本对Device Tree的描述,放置在内核的/arch/arm/boot/dts目录。一般而言,一个.dts文件对应一个ARM的machine。

             由于一个SOC可能有多个不同的电路板(  .dts文件为板级定义, .dtsi文件为SoC级定义),而每个电路板拥有一个 .dts。这些dts势必会存在许多共同部分,为了减少代码的冗余,设备树将这些共同部分提炼保存在.dtsi文件中,供不同的dts共同使用。.dtsi的使用方法,类似于C语言的头文件,在dts文件中需要进行include .dtsi文件。当然,dtsi本身也支持include 另一个dtsi文件。

    2.2 DTC (编译工具)

            DTC为编译工具,dtc编译器可以把dts文件编译成为dtb,也可把dtb编译成为dts文件。在3.x内核版本中,DTC的源码位于内核的scripts/dtc目录,内核选中CONFIG_OF,编译内核的时候,主机可执行程序DTC就会被编译出来。 即scripts/dtc/Makefile中

    1. hostprogs-:= dtc
    2. always := $(hostprogs-y) 

            在内核的arch/arm/boot/dts/Makefile中,若选中某种SOC,则与其对应相关的所有dtb文件都将编译出来。在linux下,make dtbs可单独编译dtb。以下截取了TEGRA平台的一部分。

    1. ifeq ($(CONFIG_OF),y)
    2. dtb-$(CONFIG_ARCH_TEGRA) += tegra20-harmony.dtb \
    3. tegra30-beaver.dtb \
    4. tegra114-dalmore.dtb \
    5. tegra124-ardbeg.dtb 
            在2.6.x版本内核中,只在powerpc架构下使用了设备树,DTC的源码位于内核的arch/powerpc/boot/dtc-src目录,编译内核后,可将DTC编译出来,DTC编译工具位于arch/powerpc/boot目录下。

    2.3 DTB (二进制文件)

           DTC编译.dts生成的二进制文件(.dtb),bootloader在引导内核时,会预先读取.dtb到内存,进而由内核解析

            在2.6.x版本内核中,在powerpc架构下,dtb文件可以单独进行编译,编译命令格式如下:

    dtc [-I input-format] [-O output-format][-o output-filename] [-V output_version] input_filename

    参数说明

    input-format:

    - “dtb”: “blob” format

    - “dts”: “source” format.

    - “fs” format.

    output-format:

    - “dtb”: “blob” format

    - “dts”: “source” format

    - “asm”: assembly language file

    output_version:

    定义”blob”的版本,在dtb文件的字段中有表示,支持1 2 3和16,默认是3,在16版本上有许多特性改变

    (1)  Dts编译生成dtb

    ./dtc -I dts -O dtb -o B_dtb.dtb A_dts.dts

    把A_dts.dts编译生成B_dtb.dtb

    (2)  Dtb编译生成dts

    ./dtc -I dtb -O dts -o A_dts.dts A_dtb.dtb

    把A_dtb.dtb反编译生成为A_dts.dts

            在linux 3.x内核中,可以使用make的方式进行编译。

    2.4 Bootloader(boottloader支持)

        Bootloader需要将设备树在内存中的地址传给内核。在ARM中通过bootm或bootz命令来进行传递。    

        bootm [kernel_addr] [initrd_address] [dtb_address],其中kernel_addr为内核镜像的地址,initrd为initrd的地址dtb_address为dtb所在的地址。若initrd_address为空,则用“-”来代替。


    3、linux内核对硬件的描述方式

           在以前的内核版本中:
    1)内核包含了对硬件的全部描述;
    2)bootloader会加载一个二进制的内核镜像,并执行它,比如uImage或者zImage;
    3)bootloader会提供一些额外的信息,成为ATAGS,它的地址会通过r2寄存器传给内核;
        ATAGS包含了内存大小和地址,kernel command line等等;
    4)bootloader会告诉内核加载哪一款board,通过r1寄存器存放的machine type integer;
    5)U-Boot的内核启动命令:bootm <kernel img addr>
    6)Barebox变量:bootm.image (?)


    现今的内核版本使用了Device Tree:
    1)内核不再包含对硬件的描述,它以二进制的形式单独存储在另外的位置:the device tree blob
    2)bootloader需要加载两个二进制文件:内核镜像和DTB
        内核镜像仍然是uImage或者zImage;
        DTB文件在arch/arm/boot/dts中,每一个board对应一个dts文件;
    3)bootloader通过r2寄存器来传递DTB地址,通过修改DTB可以修改内存信息,kernel command line,以及潜在的其它信息;
    4)不再有machine type;
    5)U-Boot的内核启动命令:bootm <kernel img addr> - <dtb addr>
    6)Barebox变量:bootm.image,bootm.oftree


            有些bootloader不支持Device Tree,或者有些专门给特定设备写的版本太老了,也不包含。为了解决这个问题,CONFIG_ARM_APPENDED_DTB被引进。 
        它告诉内核,在紧跟着内核的地址里查找DTB文件;
        由于没有built-in Makefile rule来产生这样的内核,因此需要手动操作:
            cat arch/arm/boot/zImage arch/arm/boot/dts/myboard.dtb > my-zImage
            mkimage ... -d my-zImage my-uImage
        (cat这个命令,还能够直接合并两个mp3文件哦!so easy!)
    另外,CONFIG_ARM_ATAG_DTB_COMPAT选项告诉内核去bootloader里面读取ATAGS,并使用它们升级DT。


    4、DTB加载及解析过程

        先从uboot里的do_bootm出发,根据之前描述,DTB在内存中的地址通过bootm命令进行传递。在bootm中,它会根据所传进来的DTB地址,对DTB所在内存做一系列操作,为内核解析DTB提供保证。上图为对应的函数调用关系图。

        在do_bootm中,主要调用函数为do_bootm_states,第四个参数为bootm所要处理的阶段和状态。 

        在do_bootm_states中,bootm_start会对lmb进行初始化操作,lmb所管理的物理内存块有三种方式获取。起始地址,优先级从上往下:

    1.  环境变量“bootm_low”
    2.  宏CONFIG_SYS_SDRAM_BASE(在tegra124中为0x80000000)
    3.  gd->bd->bi_dram[0].start

    大小:

    1.  环境变量“bootm_size”
    2.  gd->bd->bi_dram[0].size

        经过初始化之后,这块内存就归lmb所管辖。接着,调用bootm_find_os进行kernel镜像的相关操作,这里不具体阐述。

        还记得之前讲过bootm的三个参数么,第一个参数内核地址已经被bootm_find_os处理,而接下来的两个参数会在bootm_find_other中执行操作。

        首先,bootm_find_other根据第二个参数找到ramdisk的地址,得到ramdisk的镜像;然后根据第三个参数得到DTB镜像,同检查kernel和ramdisk镜像一样,检查DTB镜像也会进行一系列的校验工作,如果校验错误,将无法正常启动内核。另外,uboot在确认DTB镜像无误之后,会将该地址保存在环境变量“fdtaddr”中。

        接着,uboot会把DTB镜像reload一次,使得DTB镜像所在的物理内存归lmb所管理:    

    • ①boot_fdt_add_mem_rsv_regions会将原先的内存DTB镜像所在的内存置为reserve,保证该段内存不会被其他非法使用,保证接下来的reload数据是正确的;
    • ②boot_relocate_fdt会在bootmap区域中申请一块未被使用的内存,接着将DTB镜像内容复制到这块区域(即归lmb所管理的区域)

    注:若环境变量中,指定“fdt_high”参数,则会根据该值,调用lmb_alloc_base函数来分配DTB镜像reload的地址空间。若分配失败,则会停止bootm操作。因而,不建议设置fdt_high参数。

        接下来,do_bootm会根据内核的类型调用对应的启动函数。与linux对应的是do_bootm_linux。

    • ① boot_prep_linux

            为启动后的kernel准备参数

    • ② boot_jump_linux

        以上是boot_jump_linux的片段代码,可以看出:若使用DTB,则原先用来存储ATAG的寄存器R2,将会用来存储.dtb镜像地址。

        boot_jump_linux最后将调用kernel_entry,将.dtb镜像地址传给内核。

     

        下面我们来看下内核的处理部分:

        在arch/arm/kernel/head.S中,有这样一段:

        _vet_atags定义在/arch/arm/kernel/head-common.S中,它主要对DTB镜像做了一个简单的校验。

        真正解析处理dbt的开始部分,是setup_arch->setup_machine_fdt。这部分的处理在第五部分的machine_mdesc中有提及。

     

        如图,是setup_machine_fdt中的解析过程。

    •     解析chosen节点将对boot_command_line进行初始化。
    •     解析根节点的{size,address}将对dt_root_size_cells,dt_root_addr_cells进行初始化。为之后解析memory等其他节点提供依据。
    •     解析memory节点,将会把节点中描述的内存,加入memory的bank。为之后的内存初始化提供条件。

     

    •     解析设备树在函数unflatten_device_tree中完成,它将.dtb解析成device_node结构(第五部分有其定义),并构成单项链表,以供OF的API接口使用。

    下面主要结合代码分析:/drivers/of/fdt.c

     

     

     

    总的归纳为:

        ① kernel入口处获取到uboot传过来的.dtb镜像的基地址

        ② 通过early_init_dt_scan()函数来获取kernel初始化时需要的bootargs和cmd_line等系统引导参数。

        ③ 调用unflatten_device_tree函数来解析dtb文件,构建一个由device_node结构连接而成的单向链表,并使用全局变量of_allnodes保存这个链表的头指针。

        ④ 内核调用OF的API接口,获取of_allnodes链表信息来初始化内核其他子系统、设备等。


    展开全文
  • DTS结构及其编译方法 一:主要问题 1,需要了解dtsi与 dts的关系 ...2,dts的结构模型 ...3,dts是如何被编译的,以及编译后会生成一个什么文件. ...基本上,在ARMLinux内,一个.dts文件对应一个ARM的machine,

    DTS结构及其编译方法


    一:主要问题

    1,需要了解dtsidts的关系

    2,dts的结构模型

    3,dts是如何被编译的,以及编译后会生成一个什么文件.


    二:参考文字

    1DTS(device tree source)

    .dts文件是一种ASCII文本格式的DeviceTree描述。基本上,在ARMLinux内,一个.dts文件对应一个ARMmachine,一般放置在内核的arch/arm/boot/dts/目录。由于一个SoC可能对应多machine(一个SoC可以对应多个产品和电路板),势必这些.dts文件需包含许多共同的部分。Linux内核为了简化,把SoC公用的部分或者多个machine共同的部分一般提炼为.dtsi,类似于C语言的头文件。其他的machine对应的.dtsinclude这个.dtsi



    2dts的结构模型

    为了了解DeviceTree的结构,我们首先给出一个DeviceTree的示例:

    /o device-tree
          |- name ="device-tree"
          |- model ="MyBoardName"
          |-compatible = "MyBoardFamilyName"
         |- #address-cells = <2>
          |-#size-cells = <2>
          |-linux,phandle = <0>
          |
         o cpus
          | | - name = "cpus"
         | | - linux,phandle = <1>
          | |- #address-cells = <1>
          | | -#size-cells = <0>
          | |
         | o PowerPC,970@0
          | |- name ="PowerPC,970"
          | |-device_type = "cpu"
          | |-reg = <0>
          | |-clock-frequency = <0x5f5e1000>
         | |- 64-bit
          | |- linux,phandle =<2>
          |
         o memory@0
          | |- name ="memory"
          | |- device_type= "memory"
          | |- reg =<0x00000000 0x00000000 0x00000000 0x20000000>
         | |- linux,phandle = <3>
         |
          o chosen
           |- name = "chosen"
           |- bootargs = "root=/dev/sda2"
           |- linux,phandle = <4>



    从上图中可以看出,devicetree的基本单元是node。这些node被组织成树状结构,除了rootnode,每个node都只有一个parent。一个devicetree文件中只能有一个rootnode。每个node中包含了若干的property/value来描述该node的一些特性。每个node用节点名字(nodename)标识,节点名字的格式是node-name@unit-address。如果该node没有reg属性(后面会描述这个property),那么该节点名字中必须不能包括@unit-addressunit-address的具体格式是和设备挂在那个bus上相关。例如对于cpu,其unit-address就是从0开始编址,以此加一。而具体的设备,例如以太网控制器,其unit-address就是寄存器地址。rootnodenodename是确定的,必须是/”



    3dts是如何被编译的,以及编译后会生成一个什么文件。

      1. DTC(device tree compiler)

    dtc是将.dts编译为.dtb的工具。DTC的源代码位于内核的scripts/dtc目录,在Linux内核使能了DeviceTree的情况下,编译内核时,主机工具dtc会被编译出来,对应scripts/dtc/Makefile中的hostprogs-y:= dtc”这一hostprogs编译target

    Linux内核的arch/arm/boot/dts/Makefile中,描述了当某种SoC被选中后,哪些.dtb文件会被编译出来。举例如下:

    如与VEXPRESS对应的.dtb包括:

    	dtb-$(CONFIG_ARCH_VEXPRESS) += vexpress-v2p-ca5s.dtb \
            	vexpress-v2p-ca9.dtb \
            	vexpress-v2p-ca15-tc1.dtb \
            	vexpress-v2p-ca15_a7.dtb \
            	xenvm-4.2.dtb

    Linux下,我们可以单独编译DeviceTree文件。当我们在Linux内核下运行makedtbs时,若我们之前选择了ARCH_VEXPRESS,上述.dtb都会由对应的.dts编译出来。因为arch/arm/Makefile中含有一dtbs编译target项目。

      1. DeviceTree Blob (.dtb)

    .dtb.dtsDTC编译后的二进制格式的DeviceTree描述,可由Linux内核解析。通常在我们为电路板制作NANDSD启动image时,会为.dtb文件单独留下一个很小的区域以存放之,之后bootloader在引导kernel的过程中,会先读取该.dtb到内存。

    1. 源代码体现

    有两种方式使用DT。第一种可包含多个dtb,编入dt.img,放入boot.img。第二种只包含一个dtb,直接追加到kernelimage后面,放入boot.img
    dtc
    编译在kernel/AndroidKernel.mk中定义。先用定义"DTS_NAMES"变量,它的每个entry(记为"DTS_NAME"变量,下面的$$arch)中可能有archrev两部分,和.config中相关配置有关,用下面方法找出。

    while (<>) {
    $$a = $$1 if /CONFIG_ARCH_((?:MSM|QSD|MPQ)[a-zA-Z0-9]+)=y/;
    $$r = $$1 if /CONFIG_MSM_SOC_REV_(?!NONE)(\w+)=y/;
    $$arch = $$arch.lc("$$a$$r ") if /CONFIG_ARCH_((?:MSM|QSD|MPQ)[a-zA-Z0-9]+)=y/
    } print $$arch;

    得到上述"DTS_NAMES"变量,用"$(DTS_NAME)*.dts"方式去"kernel/arch/arm/boot/dts/"下匹配。见下面的定义,其中"cat"命令就是生成带DTkernelimage

    define append-dtb
    mkdir -p $(KERNEL_OUT)/arch/arm/boot;\
    $(foreach DTS_NAME, $(DTS_NAMES), \
       $(foreach d, $(DTS_FILES), \
          $(DTC) -p 1024 -O dtb -o $(call DTB_FILE,$(d)) $(d); \
          cat $(KERNEL_ZIMG) $(call DTB_FILE,$(d)) > $(call ZIMG_FILE,$(d));))
    endef

    第二种方式没看到后续如何放入boot.img。对于第一种方式,会用"device/qcom/common/generate_extra_images.mk"中定义的下面规则编出"dt.img"

    $(INSTALLED_DTIMAGE_TARGET): $(DTBTOOL) $(INSTALLED_KERNEL_TARGET)
            $(build-dtimage-target)

    "build/core/Makefile"中用下面语句使它被编入boot.img

    ifeq ($(strip $(BOARD_KERNEL_SEPARATED_DT)),true)
      INTERNAL_BOOTIMAGE_ARGS += --dt $(INSTALLED_DTIMAGE_TARGET)
      BOOTIMAGE_EXTRA_DEPS   s:= $(INSTALLED_DTIMAGE_TARGET)
    endif







    展开全文
  • DTS结构及其编译方法

    2017-01-09 19:59:04
    DTS结构及其编译方法 一:主要问题 1,需要了解dtsi与dts的关系 ...2,dts的结构模型 ...3,dts是如何被编译的,以及编译后会生成一个什么文件. ...基本上,在ARMLinux内,一个.dts文件对应一个ARM的mach
    DTS结构及其编译方法


    一:主要问题

    1,需要了解dtsi与dts的关系

    2,dts的结构模型

    3,dts是如何被编译的,以及编译后会生成一个什么文件.


    二:参考文字
    1,DTS(device tree source)

    .dts文件是一种ASCII文本格式的DeviceTree描述。基本上,在ARMLinux内,一个.dts文件对应一个ARM的machine,一般放置在内核的arch/arm/boot/dts/目录。由于一个SoC可能对应多个machine(一个SoC可以对应多个产品和电路板),势必这些.dts文件需包含许多共同的部分。Linux内核为了简化,把SoC公用的部分或者多个machine共同的部分一般提炼为.dtsi,类似于C语言的头文件。其他的machine对应的.dts就include这个.dtsi。



    2,dts的结构模型

    为了了解DeviceTree的结构,我们首先给出一个DeviceTree的示例:

        /o device-tree
              |- name ="device-tree"
              |- model ="MyBoardName"
              |-compatible = "MyBoardFamilyName"
             |- #address-cells = <2>
              |-#size-cells = <2>
              |-linux,phandle = <0>
              |
             o cpus
              | | - name = "cpus"
             | | - linux,phandle = <1>
              | |- #address-cells = <1>
              | | -#size-cells = <0>
              | |
             | o PowerPC,970@0
              | |- name ="PowerPC,970"
              | |-device_type = "cpu"
              | |-reg = <0>
              | |-clock-frequency = <0x5f5e1000>
             | |- 64-bit
              | |- linux,phandle =<2>
              |
             o memory@0
              | |- name ="memory"
              | |- device_type= "memory"
              | |- reg =<0x00000000 0x00000000 0x00000000 0x20000000>
             | |- linux,phandle = <3>
             |
              o chosen
               |- name = "chosen"
               |- bootargs = "root=/dev/sda2"
               |- linux,phandle = <4>



    从上图中可以看出,devicetree的基本单元是node。这些node被组织成树状结构,除了rootnode,每个node都只有一个parent。一个devicetree文件中只能有一个rootnode。每个node中包含了若干的property/value来描述该node的一些特性。每个node用节点名字(nodename)标识,节点名字的格式是node-name@unit-address。如果该node没有reg属性(后面会描述这个property),那么该节点名字中必须不能包括@和unit-address。unit-address的具体格式是和设备挂在那个bus上相关。例如对于cpu,其unit-address就是从0开始编址,以此加一。而具体的设备,例如以太网控制器,其unit-address就是寄存器地址。rootnode的nodename是确定的,必须是“/”。



    3,dts是如何被编译的,以及编译后会生成一个什么文件。

            DTC(device tree compiler)

    dtc是将.dts编译为.dtb的工具。DTC的源代码位于内核的scripts/dtc目录,在Linux内核使能了DeviceTree的情况下,编译内核时,主机工具dtc会被编译出来,对应scripts/dtc/Makefile中的“hostprogs-y:= dtc”这一hostprogs编译target。

    在Linux内核的arch/arm/boot/dts/Makefile中,描述了当某种SoC被选中后,哪些.dtb文件会被编译出来。举例如下:

    如与VEXPRESS对应的.dtb包括:

        dtb-$(CONFIG_ARCH_VEXPRESS) += vexpress-v2p-ca5s.dtb \
                vexpress-v2p-ca9.dtb \
                vexpress-v2p-ca15-tc1.dtb \
                vexpress-v2p-ca15_a7.dtb \
                xenvm-4.2.dtb

    在Linux下,我们可以单独编译DeviceTree文件。当我们在Linux内核下运行makedtbs时,若我们之前选择了ARCH_VEXPRESS,上述.dtb都会由对应的.dts编译出来。因为arch/arm/Makefile中含有一个dtbs编译target项目。

            DeviceTree Blob (.dtb)

    .dtb是.dts被DTC编译后的二进制格式的DeviceTree描述,可由Linux内核解析。通常在我们为电路板制作NAND、SD启动image时,会为.dtb文件单独留下一个很小的区域以存放之,之后bootloader在引导kernel的过程中,会先读取该.dtb到内存。

        源代码体现

    有两种方式使用DT。第一种可包含多个dtb,编入dt.img,放入boot.img。第二种只包含一个dtb,直接追加到kernelimage后面,放入boot.img。
    dtc编译在kernel/AndroidKernel.mk中定义。先用定义"DTS_NAMES"变量,它的每个entry(记为"DTS_NAME"变量,下面的$$arch)中可能有arch和rev两部分,和.config中相关配置有关,用下面方法找出。

    while (<>) {
    $$a = $$1 if /CONFIG_ARCH_((?:MSM|QSD|MPQ)[a-zA-Z0-9]+)=y/;
    $$r = $$1 if /CONFIG_MSM_SOC_REV_(?!NONE)(\w+)=y/;
    $$arch = $$arch.lc("$$a$$r ") if /CONFIG_ARCH_((?:MSM|QSD|MPQ)[a-zA-Z0-9]+)=y/
    } print $$arch;

    得到上述"DTS_NAMES"变量,用"$(DTS_NAME)*.dts"方式去"kernel/arch/arm/boot/dts/"下匹配。见下面的定义,其中"cat"命令就是生成带DT的kernelimage。

    define append-dtb
    mkdir -p $(KERNEL_OUT)/arch/arm/boot;\
    $(foreach DTS_NAME, $(DTS_NAMES), \
       $(foreach d, $(DTS_FILES), \
          $(DTC) -p 1024 -O dtb -o $(call DTB_FILE,$(d)) $(d); \
          cat $(KERNEL_ZIMG) $(call DTB_FILE,$(d)) > $(call ZIMG_FILE,$(d));))
    endef

    第二种方式没看到后续如何放入boot.img。对于第一种方式,会用"device/qcom/common/generate_extra_images.mk"中定义的下面规则编出"dt.img",

    $(INSTALLED_DTIMAGE_TARGET): $(DTBTOOL) $(INSTALLED_KERNEL_TARGET)
            $(build-dtimage-target)

    在"build/core/Makefile"中用下面语句使它被编入boot.img。

    ifeq ($(strip $(BOARD_KERNEL_SEPARATED_DT)),true)
      INTERNAL_BOOTIMAGE_ARGS += --dt $(INSTALLED_DTIMAGE_TARGET)
      BOOTIMAGE_EXTRA_DEPS   s:= $(INSTALLED_DTIMAGE_TARGET)
    endif




    展开全文
  • dtb 反向编译生成dts

    2018-09-04 10:23:30
    linux 开发driver 的时候,需要check 生成的dtb 文件是否符合预期,这个时候如果可以将build 生成的dtb 文件做反编译生成对应的dts文件,对于我们check 问题,将是很有帮助的: ./dtc -I dtb -O dts *.dtb -o *...

    dtb 反向编译生成dts

    在linux 开发driver 的时候,需要check 生成的dtb 文件是否符合预期,这个时候如果可以将build 生成的dtb 文件做反编译生成对应的dts文件,对于我们check 问题,将是很有帮助的:

    ./dtc -I dtb -O dts *.dtb -o *.dts

    这就是反编译用到的命令。至于dtc 脚本的位置,可以到如下位置去找:

    kernel-verion/scripts/dtc/

    再多说一句,反编译生成的dts是所有dtsi、dts文件的merge后的总文件。

    展开全文
  • 移植DTS时,首先要利用SDK,生成对应版本的kernel的DTS。 SDK生成DTS,主要依据的HDF文件。 需要从HDF中提取出有哪些外设,以及这些外设对应的REG。 SDK是根据HDF文件生成的DTS,所以这个生成的DTS,是参考的基础...
  • dtc的使用: 将dtb文件编译dts的文件: dtc -I dtb -O dts kernel/arch/arm/boot/dts/rv1108-evb-v12.dtb -o ../../../share-2018xyw/f08/rv1108-evb-v12-new.dts  
  • KERNEL_DEFCONFIG用于编译内核时所用的配置 KERNEL_DEFCONFIG ?= eh15_defconfig 2、eh15_defconfig文件下定义 kernel-4.9/arch/arm/configs/eh15_defconfig CONFIG_BUILD_ARM_DTB_OVERLAY_IMAGE_NA...
  • dts 结构和编译方法

    2016-08-10 18:26:52
    DTS结构及其编译方法 一:主要问题 1,需要了解dtsi与dts的关系 2,dts的结构模型 3,dts是如何被编译的,以及编译后会生成一个什么文件. 二:参考文字 1,DTS(device tree source) .dts文件是一种...
  • LinuxDTS

    2019-03-07 17:31:43
    Linux DTS(Device Tree Source)设备树详解之二(dts匹配及发挥作用的流程篇) Linux DTS(Device Tree Source)设备树详解之三(高通MSM8953实例分析篇) 有上一篇文章,我们了解了dts的背景知识和相关基础...
  • linux编译后文件夹

    2019-12-05 19:41:31
    Linux 自带 block 块设备相关目录。 crypto 加密相关目录。 Documentation 文档相关目录。 drivers 驱动相关目录。 firmeare 固件相关目录。 fs 文件系统相关目录。 include 头文件相关目录。 init 初始化相关目录。...
  • 通常将设备树源码(dts/dtsi)编译成设备树二进制文件(dtb)可以使用DTC(Device Tree Compiler)工具编译。 单文件编译 对于单文件的dts,可以采用下面的命令: # dtc命令使用方法见文末 dtc -O dtb -b 0 -o [dest_dtb...
  • 对于 MT7620a 。必须修改dts文件,否则编译出来的固件将无法启动: vi target/linux/ramips/dts/MT7620a.dts11 把 ethernet@10100000 和 gsw@10110000 修改成下面的内容: ethernet@10100000 { status = "okay";
  • 如何将dtb反编译dts

    2016-11-29 09:03:48
    由于device tree会将一个node的信息分布在各个文件里,比如如下例子: imx6qdl-sabresd.dtsi: &ldb { status = "okay"; ....... }; imx6qdl.dtsi: ldb: ldb@020e0008 { #address-cells = ;...imx6
  • dts、dtb编译

    2019-09-23 12:22:49
    设备树(Device Tree)包括DTC(device tree compiler),...dtc编译器能够把 dts 文件生成为dtb文件,也能把dtb文件生成为dts文件,Jetpack中提供了编译工具dtc,所在的目录为: ....64_TX2/Linux_for_Tegra_tx...
  • kernel_dir/script/dtc/dtc -I dtb -O dts -o xxx.dts xxx....dtb通过dtc转换为dts后是一个全的device tree,因为之前#include "xxx.dtsi"中的内容也一起在反编译出来的dts中了,所有的内容都集中在一个dts文件中了。
  • 1、系统介绍Android/Linux的设备树dts的规则和用法; 2、对设备树dts各个知识点进行系统的总结; 3、设备树dts的基本语法和基本格式介绍; 4、设备树dts的组成,各个模块使用方法,实例分析。
  • 待上传
  • linux msm dts加载分析

    2016-12-04 22:46:14
    MSM8974 上DeviceTree设备描述源文件放在”kernel/arch/arm/boot/dts/”下后缀是”.dts”或”.dtsi”,一般”.dtsi”是被其它文件包含的,只用dtc编译”.dts”文件。Build时会用”dtc”命令把需要的设备描述文件编译...
  • 九、编译设备树dts为dtb前面的linux内核源码目录中已经包含了设备树编译器Device Tree Compiler(dtc),在目录arch/arm/boot/dts/目录下。将前面生成的xilinx.dts文件拷贝到ubuntu下,使用如下命令进行编译dtc -I...
  • ARM Linux设备树-DTS

    2019-04-12 09:56:14
    通常所在目录kernel/arch/arm/boot/dts dtc工具将test.dts文件,生成test.dtb文件;fdtdump工具可以将test.dtb文件,解析成test.dts文件 参考链接:https://elinux.org/Device_Tree_Usage 语法说明 name <name>...
1 2 3 4 5 ... 20
收藏数 5,703
精华内容 2,281
关键字:

linux 编译dts