This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] AM4376:用于访问 PRU 的器件树设置

Guru**** 656470 points
Other Parts Discussed in Thread: AM4372, AM4376
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1198364/am4376-device-tree-settings-to-access-prus

器件型号:AM4376
主题中讨论的其他器件:AM4372

您好!

我们正在尝试从运行 Linux 的 ARM 访问 PRU。 内核是具有 RT 补丁的 Linux-ti 内核5.10。 我们是否需要在器件树中添加任何内容、以便 Linux PRU 驱动程序能够访问 PRU?

驱动程序是构建的、似乎包含在其中。 我们可以使用启动和停止 PRU

echo "start">/sys/class/remoteproc/remoteproc1/state 

但未在/dev/rpmsg 下看到 PRU。

此致、

Jonathan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    现在已在 TI 文档中阅读过、5.4以上的内核不支持 remoteproc 和 RPMsg 与 PRU 通信。 如果我们的内核版本高于此版本、我们应该如何与 PRU 通信并使用它们?

    "TI 的 Linux 内核5.4版(Linux 处理器 SDK 7.x)支持与 PRU 内核进行 Linux RPMsg 通信。 Linux 处理器 SDK 8.0未实现与 PRU 内核的 Linux RPMsg 通信。"

    https://software-dl.ti.com/processor-sdk-linux/esd/AM65X/08_00_00_04/exports/docs/linux/Foundational_Components/PRU-ICSS/RPMsg_Quick_Start_Guide.html

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好 Jonathan、

    对于 SDK 8.0和 SDK 8.1这两个软件版本、我们不支持 PRU RPMsg。 我们在 SDK 8.2中添加了 PRU RPMsg 支持。 由于 AM437x SDK 版本为7.3和8.2、因此 AM437x 支持所有 TI Linux SDK 版本的 PRU RPMsg。

    您将看到该行仅包含在 AM65x 和 AM64x SDK 8.0和 SDK 8.1版本的 SDK 文档中。 对于 AM437x SDK 8.2、我们删除了它: https://software-dl.ti.com/processor-sdk-linux/esd/AM437X/08_02_00_24/exports/docs/linux/Foundational_Components/PRU-ICSS/RPMsg_Quick_Start_Guide.html

    您是否遵循了该文档并且 RPMsg 不起作用? 如果是、请提供其他信息。

    此致、

    Nick

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    此外、"访问"是什么意思? RPMsg 可用于在内核之间发送512字节数据包。 因此、如果这正是您想要的、RPMsg 是一个很好的解决方案。

    但是、如果您的目的是为了实现不同的目的、例如允许 Linux 用户空间直接读取 PRU 存储器的一部分、那么我们需要进行额外的讨论。

    此致、

    Nick

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的回复! 512字节数据包对我们来说是完美的。 由于我们有 SDK 8.2中包含的内核5.10、因此它应该起作用。

    然后、我们返回到 DTS 的原始问题、并显示/dev/rpmsg 器件。

    我们的 DTS 包括 am4372.dtsi。 该文件没有提到 rpmsg,但定义了 PRU。 除了包含该文件之外,我们还需要执行任何操作来使 PRU rpmsg 接口显示在/dev/下面,例如,将某些模块的状态更新为“正常”吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好 Jonathan、

    1) devicetree:将 devicetree 文件视为板级文件或处理器级文件。 am4372.dtsi 是一个处理器级文件-它的任务是定义 AM437x 处理器内部的所有电路和外设。 因此、您不会在此文件中看到软件结构。  在几乎所有情况下、您都不想修改此文件、而是要修改板级.dts 文件... 除非您需要更改 RPMsg 中断设置。

    转至 PRU 内核定义(pru1_0、pru1_1等)。 看到那里的"中断"和"中断名称"条目? 用于为进入 Linux 内核的中断配置 PRU 中断控制器(INTC)。 您可以在 PRU 固件的 INTC_MAP 文件 中找到指向 PRU 内核的中断的其他 INTC 设置:https://git.ti.com/cgit/pru-software-support-package/pru-software-support-package/tree/examples/am437x/PRU_RPMsg_Echo_Interrupt0_0。 PRU 固件需要知道用于中断 Linux 内核的设置-例如 https://git.ti.com/cgit/pru-software-support-package/pru-software-support-package/tree/examples/am437x/PRU_RPMsg_Echo_Interrupt0_0/main.c 变量 TO_ARM_CORE。

    有关 INTC 设置的更多信息、请参阅 https://software-dl.ti.com/processor-sdk-linux/esd/AM437X/08_02_00_24/exports/docs/common/PRU-ICSS/INTC_Configuration.html

    2) 2)您是否确保按照 RPMsg 快速入门指南中的说明使用 RPMsg 示例项目?  https://software-dl.ti.com/processor-sdk-linux/esd/AM437X/08_02_00_24/exports/docs/linux/Foundational_Components/PRU-ICSS/RPMsg_Quick_Start_Guide.html#rebuilding-the-pru-firmwares-from-source

    RPMsg 库可能有点重、因此不使用它们的 PRU 项目可能不会将它们包含在固件的 makefile 文件中。

    此致、

    Nick

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我们已经测试了我们可以想到的所有内容,但仍然无法使 rpmsg 设备显示在/dev/.下 尝试总结我们在下面测试过的内容。 非常感谢您为我们提供任何可能出错的提示!

    很久以前、在4.9内核上、一位同事尝试了以太网 PRU、因此在 defconfig 中仍然启用了该功能。 我使用 menuconfig 从 defconfig 中删除了 CONFIG_TI_PRUETH、构建了新映像并进行了测试。 行为与以前相同。 是否还有其他需要删除的旧 PRUETH 测试可能遗留的内容?

    在从 defconfig 中删除 CONFIG_TI_PRUETH (使用 menuconfig)之前、我们尝试了以下操作。

    我们已经尝试了以下示例项目:

    PRU_RPMsg_Echo _Interrupt0_0
    PRU_RPMsg_Echo _Interrupt0_1
    PRU_RPMsg_Echo _Interrupt1_0
    PRU_RPMsg_Echo _Interrupt1_1

    TO_ARM_CORE 变量与 dtsi 中断的第一个值匹配。

    Remoteproc 和 Rpmsg 驱动程序已通过 menuconfig 启用、我们已将 m 和 y 作为选项进行了测试。 内核是 TI 的 RT 补丁:5.10.145-rt74

    我们已在目标上测试了 insmod /lib/modules/5.10.145-rt74-gfe20c3f42e/kernel/drivers/rpmsg/rpmsg_pru.ko、运气不佳。

    我们还尝试通过在 DTS 中将状态设置为"确定"来启用 PRU:

    {&pruss1}
          状态="正常";
    };

    pru1_0{(&P)
          状态="正常";
    };

    pru1_1{(&P)
          状态="正常";
    };

    pruss1_intc{(&P)
          状态="正常";
    };

    pruss0{(&P)
          状态="正常";
    };

    pru0_0{(&P)
          状态="正常";
    };

    pru0_1{(&P)
          状态="正常";
    };

    pruss0_intc{&pruss0_intc}
          状态="正常";
    };

    这就是我们尝试加载时看到的内容:

    root@我们的名字:/lib/firmware/test-pru CP PRU_RPMsg_Echo_Interrupt0_0.out ./AM437x-pru1_0-FW
    root@我们的名字:/lib/firmware/test-pru 回显开始>/sys/class/remoteproc/remoteproc1/state
    root@我们的名字:/lib/firmware/test-pru dmesg
    [0.000000]   在物理 CPU 0x0上引导 Linux
    [0.000000]   Linux 版本5.10.145-rt74-gfe20c3f42e (OE-user@OE-host)(ARM-EPF-Linux-gnueabi-gcc (GCC) 11.3.0、GNU ld (GNU binutils) 2.38.20220708)#1 preemit_RT Fri2
    [0.000000]   CPU:ARMv7处理器[412fc09A]修订版10 (ARMv7)、CR=10c53c7d                                                                                          
    [0.000000]   CPU:PIPT/VIPT 非混叠数据高速缓存、VIPT 别名指令高速缓存

    (笑声)

    [880.5532] remoteproc remoteproc1:启动54434000.PRU
    [880.556073] remoteproc remoteproc1:引导 FW 映像 AM437x-pru1_0-FW、大小为76200                                                                                     
    [880.560108] virtio_rpmsg_bus virtio0:rpmsg 主机处于联机状态                                                                                                            
    [880.560267]  remoteproc1#vdev0buffer:registered virtio0 (类型7)                                                                                                     
    [880.560283] remoteproc remoteproc1:远程处理器544340.PRU 现已启动
    root@我们的名字:/lib/firmware/test-pru ls /dev/| grep PRU

    如您所见,dmesg 输出中没有提到/dev/rpmsg_pru 或 ti-pruss,但 remoteproc 消息指示它已启动。

    1.我们是否需要修改 DTS 以启用 PRU 或仅包含 am4372.dtsi? 在这种情况下、您是否有适用于此 SoC 的示例 DTS?

    2.在 SDK 中有4个 PRU_RPMsg_Echo_Interrupt 项目。 在/sys/class/remoteproc 目录中有5个子目录 remoteproc 05。 根据数据表、我认为 am4376具有两个 PRU。 应将哪个项目加载到哪个 PRU?

    任何其他指示都将不胜感激!

    此致、

    Jonathan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好 Jonathan、

    1) 1)您使用的是什么板? 板级 devicetree 文件决定是将 PRU 以太网固件加载到 PRU 内核中、还是将通用 PRU 固件加载到 PRU 内核中。

    我们以 AM437x IDK 为例(AM437X-idk-EVM.dts)。 请注意、pruss1-eth 已定义、PRU 的所有 MDIO、EMAC 等条目都已定义? 这意味着、借助开箱即用设置、AM437x IDK 将 PRU 以太网固件加载到 PRU 中、并尝试启动 Linux 驱动程序。 此外、由于 Linux 驱动程序启动了 PRU、因此您将无权停止 PRU 内核以将不同的 PRU 固件加载到其中。

    在这种情况下、您需要修改 AM437X-idk-EVM.dts 文件以删除所有 PRU 以太网内容、重新编译 AM437X-idk-EVM.dTB 文件、并将新的 DTB 文件放入 AM437x EVM 的 Linux 文件系统的/boot/目录(而不是引导分区、这是不同的引导分区。 在 SD 卡上、文件系统位于根分区中)。

    请参阅 AM437X-gp-evm.dts 和 AM437X-SK-evm.dts、了解在处理器级 devicetree 文件中默认启用 PRU 内核、但在板级 DTS 文件中未修改的电路板示例。

    2) 2)此处是有用的命令行调试命令  

    Which remoteprocX device is which?
    
    # head /sys/class/remoteproc/remoteproc*/name
    
    Let's say we're looking at remoteproc0
    is remoteproc0 running? If so, what firmware is it running?
    
    # cat /sys/class/remoteproc/remoteproc0/state
    # cat /sys/class/remoteproc/remoteproc0/firmware
    
    what if I want to stop and start the PRU core?
    (assuming that the core was NOT loaded by PRU Ethernet driver)
    
    # echo stop > /sys/class/remoteproc/remoteproc0/state
    # echo start > /sys/class/remoteproc/remoteproc0/state

    请注意、Linux RemoteProc 驱动程序在/lib/firmware 目录中查找固件二进制文件(或指向固件二进制文件的链接)、其名称在 am4372.dtsi 处理器级设备树文件中指定。 例如、PRU1_0查找/lib/firmware/am437x-pru1_0-fw 等

    此致、

    Nick

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    感谢您的所有帮助!

    我们最终意识到、当我们将.out 文件重命名为 am4372.dtsi 文件中指定的名称时、这是一个简单的错误。 二进制文件被混用、这导致成功加载 PRU、但 rpmsg 设备未显示。

    此致、

    Jonathan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您发布您的解决方案 Jonathan! 很高兴它成功了。 如果您有后续问题、请随时创建一个新的 e2e 线程。

    此致、

    Nick

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢 Nick! 我创建了一个后续主题: https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1200470/am4376-rpmsg-to-pru-message-sequence-limitations

    此致、

    Jonathan