该页面涵盖了使用Xilinx工具生成devicetree源(DTS)文件以及使用标准开源工具构建/编译这些源文件的过程。特别是,将涉及使用Xilinx设备树生成器(DTG)从Xilinx硬件项目生成DTS文件,而将涉及设备树编译器(DTC)将DTS文件编译为设备树二进制文件(DTB)。尽管DTB的主要用途是将其提供给Linux内核,以便可以将Linux正确初始化为特定的硬件,但是DTB也可以与QEMU一起使用,以仿真Linux和独立系统的硬件。
设备树中的每个驱动程序或模块均由该节点定义,并且其所有属性均在该节点下定义。基于驱动程序,它可以具有子节点或父节点。
例如,通过SPI总线连接的设备将以SPI总线控制器作为其父节点,而该设备将成为spi节点的子节点之一。根节点是所有节点的父节点。
/ {
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>;
};
};
|
DTG旨在帮助用户构建其特定于硬件的DTS文件。为自定义硬件构建DTS始终是一个手动过程,但是DTG可以帮助用户快速入门。这是因为可以从硬件交接文件(XSA)中的信息中提取DTS中捕获的许多信息。DTG会根据提供的XSA文件为各种DTS文件填充尽可能多的信息,然后要求用户填写空白或根据需要进行调整。
版本检查
对于较早版本的Xilinx工具,使用DTG的过程有所不同。此外,对于某些工具版本,可能存在GUI流程和CLI流程。下面的“生成DTS文件”部分为每个不同的过程提供了几个小节。如果您没有使用最新版本的Xilinx工具,请确保参考所提供的第一个部分之外的适当子部分。
DTG来源
Xilinx Vivado工具(以前是HDF)生成的XSA硬件交接文件
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。这些文件如下所述。
除了这些文件以外,它还会基于board在同一输出目录dt / 下生成一个board.dtsi文件。例如,如果板卡是zcu111-reva,则它将生成dt / zcu111-reva.dtsi。
实际文件输出将根据设备架构(例如ZynqUS +与Zynq-7000与MicroBlaze)而有所不同。
DTG是一个开源实用程序,其源代码发布在Xilinx GitHub网站上。它使用解释语言(Tcl),因此无需编译源代码。
git clone https: //github.com/Xilinx/device-tree-xlnx
cd device-tree-xlnx
git checkout
|
在上面的最后一个命令中,
仅遵循适用于您的用例的以下各个小节。
运行XSCT(从2015.1工具版本开始可用)
xsct
|
打开XSA / HDF文件
hsi open_hw_design
|
设置存储库路径(在SDK的上一步中完成克隆)(在Windows上,使用此格式set_repo_path {C:\ device-tree-xlnx})
hsi set_repo_path
|
创建软件设计并设置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
|
生成DTS / DTSI文件到my_dts文件夹,将在其中生成输出DTS / DTSI文件
hsi generate_target -dir my_dts
|
清理。
hsi close_hw_design [current_hw_design]
exit
|
请注意,作为XSCT用户指南文档的补充,可以在此处找到有关使用HSI的一些技巧: HSI调试和优化技术。例如,可以在此处找到列出硬件设计中所有处理器单元的命令(即IP_TYPE == PROCESSOR);这些处理器单元名称代表上述步骤5中-proc选项的有效值。
从硬件项目生成HDF文件(如果尚不可用)
IP Integrator: Generate Block Design
# Export the hardware system to SDK:
Vivado Menu: File > Export > Export Hardware
|
(在
从SDK生成设备树源(.dts / .dtsi)文件
从Vivado打开SDK或通过命令行打开SDK(xsdk -hwspec <文件名> .hdf -workspace
Vivado Menu: File > Launch SDK
|
需要从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
|
在SDK中添加BSP存储库(对于SDK 2014.2,然后从检出的git区域中选择“ device-tree-xlnx”):
SDK Menu: Xilinx Tools > Repositories > New... (
|
创建设备树板支持包(BSP):
SDK Menu: File > New > Board Support Package > Board Support Package OS: device-tree > Finish
|
.dts / .dtsi文件现在位于
***例如console =
***
从2019.2版工具开始,HSI作为独立的实用工具不再可用,并且必须从XSCT运行HSI命令。另请注意,自从2015.1工具版本引入XSCT以来,它就一直支持HSI命令。
运行HSI(工具版本2014.4-2019.1)
hsi
|
打开HDF文件
open_hw_design
|
设置存储库路径(在SDK的上一步中完成克隆)(在Windows上,使用此格式set_repo_path {C:\ device-tree-xlnx})
set_repo_path
|
创建软件设计和设置CPU(用于ZynqMP psu_cortexa53_0,用于Zynq ps7_cortexa9_0,用于Microblaze microblaze_0)
create_sw_design device-tree -os device_tree -proc ps7_cortexa9_0
|
set_property CONFIG.periph_type_overrides“ {BOARD zcu102-rev1.0}” [get_os]
set_property CONFIG.periph_type_overrides "{BOARD zcu102-rev1.0}" [get_os]
|
生成DTS / DTSI文件到my_dts文件夹,将在其中生成输出DTS / DTSI文件
generate_target -dir my_dts
|
从2019.2版工具开始,HSM不再作为独立实用程序提供,并且已被XSCT中的HSI命令弃用。另请注意,自从2015.1工具版本引入XSCT以来,它就一直支持HSI命令。
运行HSM(工具版本2014.4-2019.1)
hsm
|
打开HDF文件
open_hw_design
|
设置存储库路径(在SDK的上一步中完成克隆)(在Windows上,使用此格式set_repo_path {C:\ device-tree-xlnx})
set_repo_path
|
创建软件设计和设置CPU(用于ZynqMP psu_cortexa53_0,用于Zynq ps7_cortexa9_0,用于Microblaze microblaze_0)
create_sw_design device-tree -os device_tree -proc ps7_cortexa9_0
|
生成DTS / DTSI文件到my_dts文件夹,将在其中生成输出DTS / DTSI文件
generate_target -dir my_dts
|
将硬件系统导出到SDK。
注意:以下说明中克隆的GitHub存储库不再在线可用。请联系您当地的FAE获取存档副本,或请求访问Xilinx Space Lounge。
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://
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > //
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > //
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > # 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):
SDK Menu: File > New > Board Support Package > Board Support Package OS: device-tree > Finish
|
.dts文件现在位于
***例如console =
***
在Linux源目录中,在linux-xlnx / arch /
如果生成用于使用QEMU仿真独立MicroBlaze应用程序的DTS文件,则应进行一些附加检查并注意一些最低要求。关于需求,MicroBlaze子系统(在Vivado IP集成器模块设计中定义)必须至少具有以下组件:
随附的示例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 >;
} ;
...
|
本节介绍使用设备树编译器(DTC)将设备树源编译为设备树Blob(DTB)的过程。设备树Blob是《入门》中介绍的Xilinx设计流程的一部分。
以下是可用于直接从其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:/
|
如上一节所述,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
|
cd /
dtc -I dts -O dtb -o system.dtb system.dts
|
dtc -I dtb -O dts -o system.dts system.dtb
|
以下各节假定您具有可用的Linux源。
在Linux源目录中,使目标“ dtbs”将把linux-xlnx / arch / arm / boot / dts /中的所有DTS文件编译为DTB文件。
make ARCH=arm dtbs
|
make ARCH=arm
|
Linux源代码还包括用于DTB比较的脚本。我们可以使用dtx_diff二进制文件检查两个devicetree blob(DTB文件)之间的差异,如下所示。
cd linux-xlnx/scripts/dtc
make ARCH=arm
dtx_diff system1.dtb system2.dtb
|
本节仅关注设备树覆盖的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以适应其自定义硬件和驱动程序的用户。
微处理器软件规范(MSS)文件
MSS文件包含用于自定义操作系统(OS),库和驱动程序的指令。微处理器驱动程序定义(MDD)文件
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
|
if {[string match -nocase $proctype "psu_cortexa53" ] } {
update_clk_node $drv_handle "s_axi_aclk"
}
|
7. pl.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将生成具有“兼容”属性的节点,并在连接任何节点时中断。
取得来源
安装Xilinx工具