取消
显示结果 
显示  仅  | 搜索替代 
您的意思是: 

Xilinx Petalinux工程设备树介绍

yolanda
Moderator
Moderator
0 0 273

BY Terry Ni

注意:本论坛博客所有内容皆来源于Xilinx工程师,如需转载,请写明出处作者及赛灵思论坛链接并发邮件至cncrc@xilinx.com,未经Xilinx及著作权人许可,禁止用作商业用途 


引言


设备树是Petalinux kernel的关键组件,接下来以2020.1版本为例,为大家介绍一下在Xilinx Petalinux 工程中的设备树是如何产生,配置以及修改的。

Petalinux工程中设备树的位置

当我们创建了一个petalinux工程后(以zcu102为例),在编译的时候,会自动生成对应的设备树文件。这些设备树的描述信息通常在以下2个工程路径下。
第一个是在components/plnx_workspace/device-tree/device-tree路径下,这个路径下主要保存的都是基于你导入的hdf/xsa后,自动生成的设备树信息。通常包括PS的设备树,时钟的设备树,PL部分IP的设备树(Xilinx发布的包含驱动的IP),以及设备树头文件。

 

./components/plnx_workspace/device-tree/device-tree/zynqmp-clk-ccf.dtsi
./components/plnx_workspace/device-tree/device-tree/zcu102-revc.dtsi
./components/plnx_workspace/device-tree/device-tree/pl.dtsi
./components/plnx_workspace/device-tree/device-tree/system-top.dts
./components/plnx_workspace/device-tree/device-tree/zynqmp.dtsi
./components/plnx_workspace/device-tree/device-tree/system-conf.dtsi
./components/plnx_workspace/device-tree/device-tree/pcw.dts

 

另一个是在project-spec/meta-user/recipes-bsp/device-tree/files路径下,这个路径下主要就是用户基于自动生成的设备树,自行添加和修改的部分。这部分可以查看UG1144第10章Device Tree Configuration节的内容。

 

./project-spec/meta-user/recipes-bsp/device-tree/files/openamp.dtsi
./project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi
./project-spec/meta-user/recipes-bsp/device-tree/files/pl-custom.dtsi
./project-spec/meta-user/recipes-bsp/device-tree/files/xen-qemu.dtsi
./project-spec/meta-user/recipes-bsp/device-tree/files/xen.dtsi

 

需要注意的是,如果petalinux-config->DTG settings->MACHINE_NAME采用的是xilinx开发板预设的名称的话(UG1144 DTG Settings章节中的Machine name的说明),那么会自动生成对应开发板相关的设备树信息。

1.png

 所以如果使用的是自己的硬件平台,那么尽量不要使用预设的名称,这样可以避免导入多余的设备树信息从而导致编译失败或者最终功能不正确。

 

如何修改设备树

 

 1. 基于自动生成的设备树,添加和修改节点。

        通过修改./project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi,来实现对之前已经定义的设备树节点中的属性进行变更,也可以添加没有自动生成的设备树节点。

 

/dts-v1/;
/include/ "system-conf.dtsi"
/ {
};
&gem0 {
phy-handle = <&phy0>;
ps7_ethernet_0_mdio: mdio {
phy0: phy@7 {
compatible = "marvell,88e1116r";
device_type = "ethernet-phy";
reg = <7>;
};
};
};
 
gpio-leds {
    compatible = "gpio-leds";
    led-ds23 {
        label = "led-ds23";
        gpios = <&ps7_gpio_0 10 0>;
        default-state = "on";
        linux,default-trigger = "heartbeat";
    };
};

 

 有时候为了方便设备树的管理,可以定义多个设备树文件,然后在system-user.dtsi中将这些设备树文件都包含进去,如下所示。

 

/include/ "system-conf.dtsi"
/include/ "system-user-1.dtsi"
/include/ "system-user-2.dtsi"
/include/ "system-user-3.dtsi"

/ {
};

 

 当添加了其他的dtsi文件后,还需要修改./project-spec/meta-user/recipes-bsp/device-tree/device-tree.bbappend文件,将这些dtsi文件的路径信息包含进去。如下所示。

 

SRC_URI += "file://system-user.dtsi"
SRC_URI += "file://system-user-1.dtsi"
SRC_URI += "file://system-user-2.dtsi"
SRC_URI += "file://system-user-3.dtsi"

 

 2. 完全使用自己的设备树

        我们还可以更改petalinux-config -> Auto Config Settings中的配置,直接使用自己编写好的设备树。

        取消Device tree autoconfig,使能Specify a manual device tree include directory, 然后指定设备树的路径地址。

2.png

怎么描述设备树

 

设备树中描述的信息都是要与kernel中设备的驱动互相对应的。如果驱动中需要某个参数,但是设备树中并没有包含,很可能就会编译错误或者直接使用了默认值,从而导致工作异常。kernel的设备驱动中,一般都会包含设备树的描述说明来保证设备树的正确。你可以在git上的kernel源码中找到响应的设备树说明。以GPIO驱动为例。你可以找到相关的设备树描述信息如下。

https://github.com/Xilinx/linux-xlnx/blob/xlnx_rebase_v5.4_2020.1/Documentation/devicetree/bindings/gpio/gpio-zynq.txt

 

 

Example:	 
 	gpio@e000a000 {
 	#gpio-cells = <2>;
 	compatible = "xlnx,zynq-gpio-1.0";
 	clocks = <&clkc 42>;
 	gpio-controller;
 	interrupt-parent = <&intc>;
 	interrupts = <0 20 4>;
 	interrupt-controller;
 	#interrupt-cells = <2>;
 	reg = <0xe000a000 0x1000>;
 	};

 

 

另外,你可以查看xilinx wiki上linux driver的主题页面来获取所有xilinx支持的设备驱动内容,其中包含有各个设备树的例子以及相关配置等说明。

https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841873/Linux+Drivers

反编译设备树

 

        为了最终确认设备树是否正确,我们可以通过dtc这个小应用,将dtb文件反编译成dts设备树文件。这个设备树文件,从system-top.dts这个top文件开始,把所有包含的设备树内容都整合到了一个dts文件中,便于我们确认最终的设备树是否正确。其命令格式如下:

 

dtc -I dtb -O dts -o system.dts system.dtb