我有一个Xilinx块设计,它包含了一个“AXI BRAM控制器”(一个将AXI总线连接到块内存生成器的Xilinx IP核心,其细节可能并不重要)。
我认为,关键是Xilinx工具会自动生成一个名为
components/plnx_workspace/device-tree/device-tree/pl.dtsi
包含此Core的设备树定义:
/* components/plnx_workspace/device-tree/device-tree/pl.dtsi */
&amba {
#address-cells = <2>;
#size-cells = <2>;
[snip]
axi_bram_ctrl_1: axi_bram_ctrl@a0040000 {
clock-names = "s_axi_aclk";
clocks = <&zynqmp_clk 71>;
compatible = "xlnx,axi-bram-ctrl-4.1";
reg = <0x0 0xa0040000 0x0 0x2000>;
xlnx,bram-addr-width = <0xb>;
[snip]
};
我还有一个文件,名为
project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi
,分配给用户进行修改,是最后一个
.dtsi
由编译器处理。
我希望使用此文件修改
axi_bram_ctrl_1
节点以启用UIO
:
/* project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi */
/include/ "system-conf.dtsi"
/ {
};
&axi_bram_ctrl_1 {
compatible = "generic-uio";
};
我的理解,基于
Device Tree Mysteries#Labels
,是指:
为节点的路径使用标签通常用于引用以前存在的节点,以修改该节点中一个或多个属性的值。在本例中,reg属性被修改。请注意,引用被放置在.dts文件的顶层,而不是节点内,因为引用被扩展到完整路径。
我相信我已经这样做了,但设备树编译器会抛出以下错误:
Exception: subprocess.CalledProcessError: Command '['dtc', '-@', '-@', '-p', '0x1000', '-@', '-i',
[snip lots of paths]
' returned non-zero exit status 1.
Subprocess output:
Error: build/tmp/work/xilinx_zcu208-xilinx-linux/device-tree/xilinx-v2023.1+gitAUTOINC+0bd6e466ba-r0/system-user.dtsi:173.1-17
Label or path axi_bram_ctrl_1 not found
FATAL ERROR: Syntax error parsing input tree
这让我很困惑,因为在活树上,我可以看到:
$ dtc -f /proc/device-tree
/ {
[snip]
__symbols__ {
[snip]
axi_bram_ctrl_1 = "/axi/axi_bram_ctrl@a0040000";
[snip]
axi {
[snip]
axi_bram_ctrl@a0040000 {
xlnx,single-port-bram = <0x01>;
xlnx,memory-depth = <0x800>;
clock-names = "s_axi_aclk";
xlnx,bram-inst-mode = "EXTERNAL";
[snip]
我已经看到了很多这种语法的例子,而且看起来都和我在这里所做的类似。是什么原因导致了这一失败?