代码之家  ›  专栏  ›  技术社区  ›  davidA

Linux设备树:为什么对标签的引用没有展开?

  •  0
  • davidA  · 技术社区  · 1 年前

    我有一个Xilinx块设计,它包含了一个“AXI BRAM控制器”(一个将AXI总线连接到块内存生成器的Xilinx IP核心,其细节可能并不重要)。

    enter image description here

    我认为,关键是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]
    
    

    我已经看到了很多这种语法的例子,而且看起来都和我在这里所做的类似。是什么原因导致了这一失败?

    0 回复  |  直到 1 年前