生成设备树Blob

该页面涵盖了使用Xilinx工具生成devicetree源(DTS)文件以及使用标准开源工具构建/编译这些源文件的过程。特别是,将涉及使用Xilinx设备树生成器(DTG)从Xilinx硬件项目生成DTS文件,而将涉及设备树编译器(DTC)将DTS文件编译为设备树二进制文件(DTB)。尽管DTB的主要用途是将其提供给Linux内核,以便可以将Linux正确初始化为特定的硬件,但是DTB也可以与QEMU一起使用,以仿真Linux和独立系统的硬件。

目录

 

 

子页面

 

 

设备树101

什么是devicetree?

设备树或简称为DT是描述硬件的数据结构。它描述了可由Linux等操作系统读取的硬件,因此不需要对计算机的详细信息进行硬编码。
Linux基本上将DT用于平台识别,运行时配置(如bootargs)和设备节点填充。

Devicetree基础

设备树中的每个驱动程序或模块均由该节点定义,并且其所有属性均在该节点下定义。基于驱动程序,它可以具有子节点或父节点。

例如,通过SPI总线连接的设备将以SPI总线控制器作为其父节点,而该设备将成为spi节点的子节点之一。根节点是所有节点的父节点。

在根节点下通常包括
1)CPU节点信息
2)内存信息
3)选择的配置数据可以包括内核参数字符串和initrd映像的位置
4)别名
5)定义总线信息的节点

Devicetree语法示例

zynqmp-example.dtsi
/ {
    compatible = "xlnx,zynqmp";
    #address-cells = <2>;
    #size-cells = <2>;
  
    cpus {
       #address-cells = <1>;
       #size-cells = <0>;
  
       cpu0: cpu@0 {
                compatible = "arm,cortexa53""arm,armv8";
                device-type "cpu";
                enable-method = "psci";
                operating-points-v2 = <&cpu_opp_table>;
                reg = <0x0>;
                cpu-idle-states = <&CPU_SLEEP_0>;
        };
  
        cpu1: cpu@1 {
               compatible = "arm,cortexa53""arm,armv8";
               device-type "cpu";
               enable-method = "psci";
               operating-points-v2 = <&cpu_opp_table>;
               reg = <0x1>;
               cpu-idle-states = <&CPU_SLEEP_0>;
        };
  };
  
  chosen {
           bootargs = "earlycon clk_ignore_unused";
  };
  
  memory {
          device-type "memory";
          reg = <0x0 0x0 0x0 0x80000000>, <0x00000008 0x0 0x0 0x80000000>;
  };
  
  amba_apu: amba_apu@0 {
              compatible = "simple-bus";
              #address-cells = <2>;
              #size-cells = <1>;
              ranges = <0 0 0 0 0xffffffff>;
              gic: interrupt-controller@f9010000 {
                        compatible = "arm,gic-400""arm,cortex-a15-gic";
                        #interrupt-cells = <3>;
                        reg = <0x0 0xf9010000 0x10000>,
                               0x0 0xf9020000 0x20000>,
                               0x0 0xf9040000 0x20000>,
                               0x0 0xf9060000 0x20000>,
                        interrupt-controller;
                        interrupt-parent = <&gic>;
                        interrupts =<1 9 0xf04>;
              };
  };
  
  amba: amba {
          compatible = "simple-bus";
          #address-cells = <2>;
          #size-cells = <2>;
          ranges;
          can0: can@ff060000 {
                     compatible = "xlnx,zynq-can-1.0";
                     clock-names = "can_clk""pclk";
                     reg =<0x0 0xff060000 0x0 0x1000>;
                     interrupts = <0 23 4>;
                     interrupt-parent = <&gic>;
                     tx-fifo-depth = <0x40>;
                     rx-fifo-depth = <0x40>;
                     power-domains = <&pd_can0>;
          };
  };

设备树属性

兼容:顶级兼容属性通常为电路板然后为SoC定义一个兼容字符串。
值始终以最具体的优先为准,最后指定的最不具体为准。
#address-cells:该属性指示在reg属性中形成基地址部分需要多少个单元(即32位值)。
#size-cells:reg属性的大小部分。
interrupt-controller:是一个布尔型属性,指示当前节点是一个中断控制器。
#interrupt-cells:指示由所选中断控制器管理的中断的interrupts属性中的单元数。
中断父母:是一个虚拟对象,它指向当前节点的中断控制器。通常,主中断控制器有一个顶级中断父级定义。

设备树生成器(DTG)

DTG旨在帮助用户构建其特定于硬件的DTS文件。为自定义硬件构建DTS始终是一个手动过程,但是DTG可以帮助用户快速入门。这是因为可以从硬件交接文件(XSA)中的信息中提取DTS中捕获的许多信息。DTG会根据提供的XSA文件为各种DTS文件填充尽可能多的信息,然后要求用户填写空白或根据需要进行调整。

版本检查

对于较早版本的Xilinx工具,使用DTG的过程有所不同。此外,对于某些工具版本,可能存在GUI流程和CLI流程。下面的“生成DTS文件”部分为每个不同的过程提供了几个小节。如果您没有使用最新版本的Xilinx工具,请确保参考所提供的第一个部分之外的适当子部分。

任务  依赖项(先决条件)

  • DTG来源

  • Xilinx Vivado工具(以前是HDF)生成的XSA硬件交接文件

    扫描二维码关注公众号,回复: 12060212 查看本文章
  • Xilinx Vitis安装(或以前的Xilinx SDK)

任务输出产品

DTG生成带有* .dts和* .dtsi文件扩展名的DTS文件。将有一个带有* include语句的顶级* .dts文件,以引用单独的DTS包含(DTSI)文件。使用DTSI文件可以在不同文件之间组织信息。例如,如下文更详细描述的,一个DTSI可以用来描述固定硬件(即固定在硅片上),而另一个DTSI可以用来描述动态硬件(即可编程逻辑中的IP)。

通常,对于SOC,将有一个静态的dts / dtsi文件,但是当涉及FPGA时,可能会有许多复杂的设计,其外围逻辑(PL)IP可能会有所不同,或者可能具有不同的配置。
对于这些复杂的FPGA设计,我们需要一个设备树生成器(DTG),在其中它可以为这些设计自动生成dts / dtsi。

生成后,输出目录中将提供不同的文件,例如pl.dtsi,pcw.dtsi,system-top.dts,zynqmp.dtsi,zynqmp-clk-ccf.dtsi。这些文件如下所述。

  • pl.dtsi:这是一个文件,所有存储器映射的外围逻辑(PL)IP节点都将可用。
  • pcw.dtsi:这是PS外设需要动态属性的文件。
  • system-top.dts:这是一个文件,其中包含内存信息,早期控制台和引导参数。
  • zynqmp.dtsi:此文件包含所有PS外围设备信息以及cpu信息。
  • zynqmp-clk-ccf.dtsi:此文件包含外围IP的所有时钟信息。


除了这些文件以外,它还会基于board在同一输出目录dt / 下生成一个board.dtsi文件。例如,如果板卡是zcu111-reva,则它将生成dt / zcu111-reva.dtsi。

  • zcu111-reva.dtsi:它包含所有板子特定的属性,例如i2c可能已连接到某个从站等。

实际文件输出将根据设备架构(例如ZynqUS +与Zynq-7000与MicroBlaze)而有所不同。

第1步:获取DTG源

DTG是一个开源实用程序,其源代码发布在Xilinx GitHub网站上。它使用解释语言(Tcl),因此无需编译源代码。

git clone https://github.com/Xilinx/device-tree-xlnx
cd device-tree-xlnx
git checkout <xilinx-v201X.X>

在上面的最后一个命令中,<xilinx-v201X.X>应该替换为有效的标记值(例如“ xilinx-v2019.2”)。可以使用命令“ git tag”列出可用的标签。

步骤2:生成DTS文件

仅遵循适用于您的用例的以下各个小节。

使用XSCT生成DTS文件

  1. 来源Xilinx设计工具
  2. 运行XSCT(从2015.1工具版本开始可用)

    xsct
  3. 打开XSA / HDF文件

    hsi open_hw_design <design_name>.<xsa|hdf>
  4. 设置存储库路径(在SDK的上一步中完成克隆)(在Windows上,使用此格式set_repo_path {C:\ device-tree-xlnx})

    hsi set_repo_path <path to device-tree-xlnx repository>
  5. 创建软件设计并设置CPU。-proc选项应为以下值之一:对于Versal“ psv_cortexa72_0 ”,对于ZynqMP“ psu_cortexa53_0 ”,对于Zynq-7000“ ps7_cortexa9_0 ”,对于Microblaze“ microblaze_0 ”。

    hsi create_sw_design device-tree -os device_tree -proc psv_cortexa72_0
  6. 生成DTS / DTSI文件到my_dts文件夹,将在其中生成输出DTS / DTSI文件

    hsi generate_target -dir my_dts
  7. 清理。 

    hsi close_hw_design [current_hw_design]
    exit

请注意,作为XSCT用户指南文档的补充,可以在此处找到有关使用HSI的一些技巧:  HSI调试和优化技术。例如,可以在此处找到列出硬件设计中所有处理器单元的命令(即IP_TYPE == PROCESSOR);这些处理器单元名称代表上述步骤5中-proc选项的有效值。

使用Xilinx SDK生成DTS文件(GUI流:工具版本2014.2-2019.1)

从硬件项目生成HDF文件(如果尚不可用)

  1. 在Vivado中打开硬件项目。
  2. 生成模块设计
IP Integrator: Generate Block Design
# Export the hardware system to SDK:
Vivado Menu: File > Export > Export Hardware

 (在<project_name> .sdk HDF文件中生成)
 

从SDK生成设备树源(.dts / .dtsi)文件

  1. 从Vivado打开SDK或通过命令行打开SDK(xsdk -hwspec <文件名> .hdf -workspace <workspace>

    Vivado Menu: File > Launch SDK
  2.  
  3. 需要从Xilinx克隆Device Tree Generator Git存储库。有关Git的更多信息,请参见Fetch Sources页面。

    # Otherwise for SDK 2014.2 use this repo:
    git clone git://github.com/Xilinx/device-tree-xlnx.git
  4. 在SDK中添加BSP存储库(对于SDK 2014.2,然后从检出的git区域中选择“ device-tree-xlnx”):

    SDK Menu: Xilinx Tools > Repositories > New... (<bsp repo>) > OK
  5. 创建设备树板支持包(BSP):

    SDK Menu: File > New > Board Support Package > Board Support Package OS: device-tree > Finish
  6. 将出现一个BSP设置窗口。也可以通过打开设备树BSP的system.mss文件并单击“修改此BSP的设置”来访问此窗口。填写适当的值:
    • 'bootargs'参数指定在引导时(内核命令行)传递给内核的参数。***
    • “控制台设备”参数指定将使用哪个串行输出设备。从下拉列表中选择一个值。


.dts / .dtsi文件现在位于<SDK工作空间> / device_tree_bsp_0 /文件夹中

***例如console = <tty>,<baudrate> root = / dev / ram rw ip = ::::: eth0:dhcp earlyprintk 
*** <tty>的一些示例值是使用Zynq时的ttyPS0,使用时是ttyUL0 UART Lite软ip或使用UART16550软ip时为ttyS0。

使用HSI生成DTS文件(XSCT不赞成使用CLI流)

从2019.2版工具开始,HSI作为独立的实用工具不再可用,并且必须从XSCT运行HSI命令。另请注意,自从2015.1工具版本引入XSCT以来,它就一直支持HSI命令。

  1. 来源Xilinx设计工具
  2. 运行HSI(工具版本2014.4-2019.1)

    hsi
  3. 打开HDF文件 

    open_hw_design <design_name>.hdf
  4. 设置存储库路径(在SDK的上一步中完成克隆)(在Windows上,使用此格式set_repo_path {C:\ device-tree-xlnx}) 

    set_repo_path <path to device-tree-xlnx repository>
  5. 创建软件设计和设置CPU(用于ZynqMP psu_cortexa53_0,用于Zynq ps7_cortexa9_0,用于Microblaze microblaze_0) 

    create_sw_design device-tree -os device_tree -proc ps7_cortexa9_0
  6. set_property CONFIG.periph_type_overrides“ {BOARD zcu102-rev1.0}” [get_os] 

    set_property CONFIG.periph_type_overrides "{BOARD zcu102-rev1.0}" [get_os]
  7. 生成DTS / DTSI文件到my_dts文件夹,将在其中生成输出DTS / DTSI文件 

    generate_target -dir my_dts
  8. 在生成的my_dts文件夹中,应该存在zcu102-rev1.0.dtsi文件。

 

使用HSM生成DTS文件(XSCT不赞成使用CLI流)

从2019.2版工具开始,HSM不再作为独立实用程序提供,并且已被XSCT中的HSI命令弃用。另请注意,自从2015.1工具版本引入XSCT以来,它就一直支持HSI命令。

  1. 来源Xilinx设计工具
  2. 运行HSM(工具版本2014.4-2019.1)

    hsm
  3. 打开HDF文件

    open_hw_design <design_name>.hdf
  4. 设置存储库路径(在SDK的上一步中完成克隆)(在Windows上,使用此格式set_repo_path {C:\ device-tree-xlnx})

    set_repo_path <path to device-tree-xlnx repository>
  5. 创建软件设计和设置CPU(用于ZynqMP psu_cortexa53_0,用于Zynq ps7_cortexa9_0,用于Microblaze microblaze_0)

    create_sw_design device-tree -os device_tree -proc ps7_cortexa9_0
  6. 生成DTS / DTSI文件到my_dts文件夹,将在其中生成输出DTS / DTSI文件

    generate_target -dir my_dts

使用XPS / SDK生成DTS文件(旧版GUI流程:工具版本2014.1及更低版本)

  1. 在XPS中打开硬件项目。
  2. 将硬件系统导出到SDK。 

    注意:以下说明中克隆的GitHub存储库不再在线可用。请联系您当地的FAE获取存档副本,或请求访问Xilinx Space Lounge。

  3. XPS Menu: Project > Export Hardware Design to SDK... > Export && Launch SDK
    # The Device Tree Generator Git repository needs to be cloned from the Xilinx. See the [[www/Fetch Sources|Fetch Sources]] page for more information on Git. Note that there are two repos for differing SDK versions below.
    > [[code]]
    > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > git clone git://github.com/Xilinx/device-tree.git bsp/device-tree_v0_00_x//
    > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > //[[code]]//
    > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > # //Note: In order for SDK to be able to import the Device Tree Generator correctly, the file and directory hierarchy needs to look like://
    > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > //<bsp repo>/bsp/device-tree//_v0_00_x/data/device-tree_v2_1_0.mld
    > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > //<bsp repo>/bsp/device-tree//_v0_00_x/data/device-tree_v2_1_0.tcl//
    > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > # Add the BSP repository in SDK (for SDK 2014.2 and later select "device-tree-xlnx" from the checked out git area):
    > [[code]]
     > SDK Menu: Xilinx Tools > Repositories > New... (<bsp repo>) > OK
  4. 创建设备树板支持包(BSP):

    SDK Menu: File > New > Board Support Package > Board Support Package OS: device-tree > Finish
  5. 将出现一个BSP设置窗口。也可以通过打开设备树BSP的system.mss文件并单击“修改此BSP的设置”来访问此窗口。填写适当的值:
    • 'bootargs'参数指定在引导时(内核命令行)传递给内核的参数。***
    • “控制台设备”参数指定将使用哪个串行输出设备。从下拉列表中选择一个值。


.dts文件现在位于<SDK工作区> / <设备树bsp名称> / <处理器名称> / libsrc /设备树_v0_00_x / xilinx.dts中

***例如console = <tty>,<baudrate> root = / dev / ram rw ip = ::::: eth0:dhcp earlyprintk 
*** <tty>的一些示例值是使用Zynq时的ttyPS0,使用时是ttyUL0 UART Lite软ip或使用UART16550软ip时为ttyS0。

在Linux源目录中,在linux-xlnx / arch / <architecture> / boot / dts / 中也可以使用一些DTS文件。

步骤3:仅对独立的MicroBlaze仿真进行附加检查

如果生成用于使用QEMU仿真独立MicroBlaze应用程序的DTS文件,则应进行一些附加检查并注意一些最低要求。关于需求,MicroBlaze子系统(在Vivado IP集成器模块设计中定义)必须至少具有以下组件:

  • MicroBlaze处理器
  • 记忆
  • 串行接口(AXI UART)
  • 中断控制器(AXI INTC)

随附的示例DTS仅具有以下最低要求:

 文件编辑档案

应该检查生成的DTS,并根据需要进行修改,以确保pl.dtsi文件中的MicroBlaze节点(即/> cpus> microblaze_0)具有以下属性:

  • 记忆
  • 模型

例如:

...
cpus {
        #address-cells = <1>;
        #cpus = <1>;
        #size-cells = <0>;
        microblaze_0: cpu@0 {
            memory = <&lmb_bram>;
            model = "microblaze,8.40.b";
            version = "8.40.b";
...

如果内存节点已经存在,则可能只需要在其上添加标签即可被引用(上例中为“ lmb_bram”)。标签的名称是任意的,但在节点定义和引用之间最一致。例如,如果系统具有DDR,则类似“ ddr_mem”的标签会更合适。如果未生成内存节点(system-top.dts或pl.dtsi),则必须手动添加它。下面给出了向system-top.dtsi添加内存节点的示例。

...
/ {
    lmb_bram: memory@0 {
               device_type = "memory";
               reg = < 0x0 0x10000000 >;
    } ;
...

DTG局限性

  • zynqmp-clk-ccf.dtsi具有静态时钟节点配置,如果用户要更改任何时钟信息,请更新system-user.dtsi中的时钟信息。
  • DTG将不支持多连接中断块。
  • 中断端口宽度不超过一。
  • 为MAC IP启用多核时(如果MAC IP大于1),则DTG中的标签存在问题,并且失败。但是,如果MAC IP为1并且启用了多核,就不会有问题。
  • DTG将不支持生成专用外设中断(PPI)。
  • DTG支持基于内部TRD设计的视频管道生成,如Wiki  https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/25329832/Zynq+UltraScale+MPSoC+VCU+TRD+2018.3所述
  • 如果在视频管道IP之间没有连接任何自定义IP,DTG将不支持这些IP,则用户可能需要添加输入和输出端口。
  • 对于广播IP,输出可以连接到多个输出端口,而DTG无法知道哪个输出端口对正确的管道有效。
  • 如果设计中有多个类似的视频管道,则用户需要在节点中添加输入和输出端口信息。以下Wiki提供了一些有关如何添加输入和输出端口的信息
  • 多媒体IP的DTG限制

2020.1的新功能:

  • 添加了mrmac IP初始支持。
  • 添加了DPU IP支持
  • 用宏替换硬编码的值以进行复位和上电。
  • 为DTG中的axi_mcdma IP支持添加了dma通道。
  • 为Versal的每个axi_noc IP生成内存节点

 

DTG支持的驱动程序列表及其在Linux树中的绑定

  • 可以,可以
来自Linux树的绑定:https : //github.com/Xilinx/linux-xlnx/blob/master/Documentation/devicetree/bindings/net/can/xilinx_can.txt
  • axi_cdma
来自Linux树的绑定:https : //github.com/Xilinx/linux-xlnx/blob/master/Documentation/devicetree/bindings/dma/xilinx/axi-cdma.txt
  • axi_dma
来自Linux树的绑定:https : //github.com/Xilinx/linux-xlnx/blob/master/Documentation/devicetree/bindings/dma/xilinx/axi-dma.txt
  • axi_emc
  • axi_ethernet,axi_10g_ethernet,xxv_ethernet
来自Linux树的绑定:https : //github.com/Xilinx/linux-xlnx/blob/master/Documentation/devicetree/bindings/net/xilinx_axienet.txt
  • axi_gpio
来自Linux树的绑定:https : //github.com/Xilinx/linux-xlnx/commits/master/Documentation/devicetree/bindings/gpio/gpio-xilinx.txt
  • axi_iic
来自Linux树的绑定:https : //github.com/Xilinx/linux-xlnx/blob/master/Documentation/devicetree/bindings/i2c/i2c-xiic.txt
  • axi_pcie,axi_pcie3,xdma
来自Linux树的绑定:https : //github.com/Xilinx/linux-xlnx/blob/master/Documentation/devicetree/bindings/pci/xilinx-pcie.txt
  • axi_perf_mon
来自Linux树的绑定:https : //github.com/Xilinx/linux-xlnx/blob/master/Documentation/devicetree/bindings/uio/xilinx_apm.txt
  • axi_quad_spi
来自Linux树的绑定:https : //github.com/Xilinx/linux-xlnx/blob/master/Documentation/devicetree/bindings/spi/spi-xilinx.txt
  • axi_sysace
  • axi_tft
来自Linux树的绑定:https : //github.com/Xilinx/linux-xlnx/blob/master/Documentation/devicetree/bindings/video/xilinx-fb.txt
  • axi_timebase_wdt
来自Linux树的绑定:https : //github.com/Xilinx/linux-xlnx/blob/master/Documentation/devicetree/bindings/watchdog/of-xilinx-wdt.txt
  • axi_traffic_gen
来自Linux树的绑定:https : //github.com/Xilinx/linux-xlnx/blob/master/Documentation/devicetree/bindings/misc/xilinx-axitrafgen.txt
  • axi_usb2_device
来自Linux树的绑定:https : //github.com/Xilinx/linux-xlnx/blob/master/Documentation/devicetree/bindings/usb/udc-xilinx.txt
  • VCU
来自Linux树的绑定:https : //github.com/Xilinx/linux-xlnx/blob/master/Documentation/devicetree/bindings/soc/xilinx/xlnx%2Cvcu.txt
  • axi_vdma
来自Linux树的绑定:https : //github.com/Xilinx/linux-xlnx/blob/master/Documentation/devicetree/bindings/dma/xilinx/xilinx_dma.txt
  • xadc_wiz
来自Linux树的绑定:https : //github.com/Xilinx/linux-xlnx/blob/master/Documentation/devicetree/bindings/iio/adc/xilinx-xadc.txt
  • axi_intc
来自Linux树的绑定:https : //github.com/Xilinx/linux-xlnx/blob/master/Documentation/devicetree/bindings/interrupt-controller/xilinx%2Cintc.txt
  • ddr4,ddr3,mig_7series
  • pr_decoupler
  • usp_rf_data_converter
  • axi_timer
  • tsn_endpoint_ethernet_mac
来自Linux树的绑定:https : //github.com/Xilinx/linux-xlnx/blob/master/Documentation/devicetree/bindings/net/xilinx_tsn.txt
  • axi_uartlite
来自Linux树的绑定:https : //github.com/Xilinx/linux-xlnx/blob/master/Documentation/devicetree/bindings/serial/uartlite.c
  • axi_uart16550
对于其他IP,DTG将调用通用驱动程序。

编译Devicetree源

本节介绍使用设备树编译器(DTC)将设备树源编译为设备树Blob(DTB)的过程。设备树Blob是《入门》中介绍的Xilinx设计流程的一部分。

步骤1:获取Devicetree编译器源

以下是可用于直接从其Git存储库获取DTC的命令。另外,DTC是Linux源代码的一部分。例如,如果Xilinx Linux源目录可用,则可以在linux-xlnx / scripts / dtc中找到DTC。

git clone https://git.kernel.org/pub/scm/utils/dtc/dtc.git
cd dtc
make
export PATH=$PATH:/<path-to-dtc>/dtc

步骤2:预处理Devicetree源

如上一节所述,DTG会生成多个devicetree文件,并使用“ #include”指令将它们链接在一起。在将该设备树源提供给编译器(DTC)之前,必须对顶级DTS进行预处理,以将所有源合并为一个DTS。这可以使用标准的GNU C编译器来完成。例如:

gcc -I my_dts -E -nostdinc -undef -D__DTS__ -x assembler-with-cpp -o system.dts system-top.dts

步骤3:从DTS编译Devicetree Blob(.dtb)文件

称为设备树编译器(DTC)的实用程序用于将DTS文件编译为DTB文件。DTC是Linux源目录的一部分。linux-xlnx / scripts / dtc /包含DTC的源代码,需要进行编译才能使用。编译DTC的一种方法是构建Linux树。也可以通过操作系统的程序包管理器来获取DTC。

一旦DTC可用,就可以调用该工具以生成DTB,其中“ system.dts”是预处理产生的聚合设备树源。
cd /<path-to-dtc>/dtc
dtc -I dts -O dtb -o system.dtb system.dts
DTC也可以用于将DTB转换回DTS:
dtc -I dtb -O dts -o system.dts system.dtb

杂项

以下各节假定您具有可用的Linux源。

替代:仅适用于ARM

在Linux源目录中,使目标“ dtbs”将把linux-xlnx / arch / arm / boot / dts /中的所有DTS文件编译为DTB文件。

make ARCH=arm dtbs

编译后的DTB文件将位于linux-xlnx / arch / arm / boot / dts /中。

可以将单个linux-xlnx / arch / arm / boot / dts / <设备树名称> .dts编译为linux-xlnx / arch / arm / boot / dts / <设备树名称> .dtb:
make ARCH=arm <devicetree name>.dtb

Devicetree二进制比较

Linux源代码还包括用于DTB比较的脚本。我们可以使用dtx_diff二进制文件检查两个devicetree blob(DTB文件)之间的差异,如下所示。

cd linux-xlnx/scripts/dtc
make ARCH=arm <devicetree name>.dtb
dtx_diff system1.dtb system2.dtb

 

高级DTG主题

如何从DTG启用DT OVERLAY

本节仅关注设备树覆盖的DTG方面。有关使用覆盖的更多综合信息,请参见适用的FPGA Manager驱动程序页面。可以在Linux Drivers下找到适用页面的链接。

使用HSI命令1.
克隆设备树存储库
https://github.com/Xilinx/device-tree-xlnx
2)转到HSI提示符
[vabbarap @ xhdl3763 / proj / xhdsswstaff / vabbarap / Overlay / New_hdf>%hsi 
hsi v2017.3(64位)SW Build 2018833(2017年10月4日星期三19:58:07 MDT)
版权所有1986-2017 Xilinx,Inc.保留所有权利。
3)
HSI% open_hw_design system.hdf 
4)
HSI% set_repo_path /家/ vabbarap /工作区/ sync_dt_tip / clk_wiz_15_12_2017(DTG回购路径)
5)
HSI% create_sw_design -proc psu_cortexa53_0 SD22 -OS device_tree 
6)
HSI% set_property CONFIG.dt_overlay真[ get_os] 
7)
hsi%generate_target -dir dt / 
hsi% ls dt /
pcw.dtsi pl.dtsi sd22.mss system-top.dts zynqmp-clk-ccf.dtsi zynqmp.dtsi

使用XSCT  (从2019.2版本开始不支持hsi)

2)转到XSCT提示符

[问题]→xsct

****** Xilinx软件命令行工具(XSCT)v2020.1.0

3)hsi open_hw_design system.xsa

4)hsi set_repo_path  / home / vabbarap / workspace / sync_dt_tip / dt_15_12_2019  (DTG存储库路径)

5)hsi create_sw_design -proc psu_cortexa53_0 sd22 -os device_tree 

6)HSI generate_target -dir dt
 

为自定义硬件和驱动程序自定义/扩展DTG

本部分适用于希望扩展DTG以适应其自定义硬件和驱动程序的用户。

相关档案

微处理器软件规范(MSS)文件

MSS文件包含用于自定义操作系统(OS),库和驱动程序的指令。

微处理器驱动程序定义(MDD)文件

MDD文件包含用于自定义软件驱动程序的指令。
每个设备驱动程序都有一个MDD文件和一个与之关联的Tcl文件。Tcl文件使用MDD文件来自定义驱动程序,具体取决于MSS文件中配置的不同选项。
每个驱动程序的驱动程序源文件和MDD文件必须位于特定目录中,以便找到文件和驱动程序。

驱动定义

驱动程序定义涉及定义数据定义文件(MDD)和数据生成文件(Tcl文件)。
数据定义文件:MDD文件(<driver_name> .mdd)包含可配置的参数。
数据生成文件:第二个文件(<驱动程序名称> .tcl,文件名与MDD文件名相同)使用MSS文件中配置的参数来为
驱动程序生成数据。

如何将新的驱动程序添加到DTG

1.同步仓库https://github.com/xilinx/device-tree-xlnx
2.创建一个带有驱动程序名称的文件夹,例如axi_iic device-tree-xlnx / axi_iic /
3.在axi_iic下添加文件数据,例如设备树-XLNX / axi_iic /数据/
4.创建下的文件axi_iic.mdd和axi_iic.tcl 设备树-XLNX / axi_iic /数据/ axi_iic.mdd axi_iic.tcl
5.为文件的语法axi_iic.mdd是如
设备树xlnx / axi_iic / data / axi_iic.mdd
OPTION psf_version = 3.0;
 
BEGIN driver axi_iic
OPTION supported_peripherals = (axi_iic);--> the axi_iic is the IP_NAME which we get from the HDF file.
OPTION supported_os_types = (DTS);
OPTION driver_state = ACTIVE;
OPTION NAME = axi_iic;
END drive

6.将定义文件axi_iic.tcl的语法,在该语法中可以基于某些条件设置需要设置的属性。
我们使用HSI API更新节点属性。下面我们更新axi_iic的clock属性,如下所示调用泛型函数
设备树xlnx / axi_iic / data / axi_iic.tcl
if {[string match -nocase $proctype "psu_cortexa53"] } {
    update_clk_node $drv_handle "s_axi_aclk"
}

7. pl.dtsi中生成的节点应如下所示

dtsi
io_bd_iic_0: i2c@a1200000 {
    #address-cells = <1>;
    #size-cells = <0>;
    clock-names = "s_axi_aclk";
    clocks = <&misc_clk_0>;
    compatible = "xlnx,xps-iic-2.00.a";
    interrupt-names = "iic2intc_irpt";
    interrupt-parent = <&gic>;
    interrupts = <0 2 4>;
    reg = <0x0 0xa1200000 0x0 0x10000>;
};

自定义IP:
对于自定义IP,DTG将生成具有“兼容”属性的节点,并在连接任何节点时中断。


 

发行说明

建立步骤

相关链接

猜你喜欢

转载自blog.csdn.net/a8039974/article/details/107779873