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.

[FAQ] [参考译文] [常见问题解答] AM64X:如何将 R5F PRU_ICSSG 以太网与 Linux A53内核相结合

Guru**** 2455560 points
Other Parts Discussed in Thread: SYSCONFIG, TMDS64EVM

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1485051/faq-am64x-how-to-combine-r5f-pru_icssg-ethernet-with-linux-a53-cores

器件型号:PROCESSOR-SDK-AM64X
主题中讨论的其他器件:TMDS64EVM、SysConfig、 DP83869

工具与软件:

我在 A53内核上运行 Linux、我想使用 R5F 内核控制网络接口。 我如何使 Linux 内核和 R5F 内核彼此并行运行?

此常见问题解答将展示获取随 Linux 一起运行的特定网络示例的示例。 相同的概念也适用于其他网络示例。

本常见问题解答基于 AM64x Academy 多核模块中介绍的概念而构建:
https://dev.ti.com/tirex/explore/node?node=A__AJa64F6ctzZNbb.TYx4mCA__AM64-ACADEMY__WI1KRXP__LATEST 

本常见问题解答使用以下配置:

* AM64x MCU+ SDK 10.1、AM64x Linux SDK 10.1 (SDK 9.2文件 在附录中)
* AM64x EVM (TMDS64EVM)

A53:Linux
R5F0-0:RTOS
引导介质:Linus SDK SD 卡映像
引导流程:SPL (Linux SDK 中的默认值)
R5F 示例:Enet Lwip ICSSG

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

    GETTING STARTED

    1) 1)下载并安装两个 SDK

    2) 2)按照 AM64x EVM 快速入门指南中的说明设置 EVM、创建 SD 卡并启动 EVM

    3) 3)在进行任何软件更改之前、请验证 Linux 是否可以将固件加载到 R5F 中、R5F 固件可以运行、以及开箱即用的处理器间通信(IPC)演示是否按预期工作。

    AM64x Academy > Linux > Booting Remote Cores

    AM64x Academy > Linux > IPC 示例

    要使 Linux 与控制网络接口的 R5F 内核一起运行、需要执行哪些步骤?  

    我们将按照 AM64x Academy > Multicore >远程内核上的应用开发中的步骤进行操作:

    1) 1) 修改 MCU+示例、以便 Linux 可以加载它

    2)修复所有资源冲突(外设、存储器)

    3) 3)更新资源配置设置、以便将网络 DMA 通道分配给 R5F 内核、而不是 Linux

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

    MCU+项目更新

    现在、让我们看看 RTOS 端。

    在本常见问题解答中、我们将使用 AM64x MCU+ SDK:Enet Lwip ICSSG 示例

    SDK 10.1路径: mcu_plus_sdk_am64x_10_01_xxxx\source\networking\enet\core\examples\lwip\enet_lwip_icssg
    SDK 9.2.1路径: mcu_plus_sdk_am64x_09_02_01_05/examples/networking/lwip/enet_lwip_icssg

    修改要由 Linux 加载的远程核心应用程序

    启用 IPC 以获取资源表

    我们需要向 MCU+项目添加一个资源表。  从学院页面"资源表"中、我们知道:

    • 远程内核应用程序必须具有资源表、以便由 Linux Remoteproc 驱动程序进行初始化
    • 资源表由远程内核生成并包含在远程内核二进制文件中。
    • 添加资源表的一种简单方法是在 SysConfig 中使用 Linux 启用 IPC

    按照"将 Linux IPC 添加到远程核心工程"中的步骤操作。

    更新后的 SysConfig 文件附在后面。

    更新 linker.cmd 文件-  为资源表添加了 DDR 部分

    上述更改将生成资源表。 现在、必须在 linker.cmd 文件中为资源表分配一个 DDR 段。

     资源表地址必须与  Linux devicetre 文件中"external code/data mem"段的开头对齐。   有关更多信息、请参阅"在 Linux 中分配内存"。  有关存储器 布局的更多信息、请查看 AM64x MCU+ SDK:存储器映射布局

       组 :  {

       .resource_table:{

       } palign (4096)

       }> DDR_0

    }

    DDR_0    :origin = 0xA0100000、length = 0x10000  

    MSRAM    : origin = 0x70082F00 , length = 0xB9700 (注:在链接器命令中,我们在0x70080000之后开始,但如果 SBL 不使用,它可以从0x70000000开始)

    链接器命令文件示例:

    e2e.ti.com/.../25087.linker.cmd

    分配外设-修复外设分配冲突

    此项目与 Linux 有2个冲突:R5F 和 Linux 请求 UART0和 I2C1。 每个外设只能由1个软件实例控制、因此必须从 SysConfig 工程设置中删除该外设、或在 Linux devicetre 中禁用该外设。

    1) 1)解决 UART0冲突

    您可以看到、Linux 在 arch/arm64/boot/dts/ti/k3-am642-evm.dts 中使用 main_uart0

    我们从 R5F 项目中删除 UART0来解决该冲突。

    • 选项1:通过取消选中"Enable UART Log"从 SysConfig 中删除 UART

     

    • 选项2:或者、如果使用 UART 日志、您也可以更改为 Linux 不使用的另一个 UART 实例


    2)解决 I2C1冲突

    Linux 在 arch/arm64/boot/dts/ti/k3-am642-evm.dts 中也会使用 MAIN_i2c1

    在本练习中、我们将从 SysConfig 中删除 I2C1模块。  另一种可能的解决方案是通过将"status"从"oke"更改为"disabled"来禁用 Linux devicetree"中的 I2C1。 (下面以红色显示)

    • 选项1:

    • 选项2:更改 Linux DTS:

    &MAIN_i2c1{
      状态="已禁用";
      pinctrl-names ="默认值";
      pinctrl-0 =<&MAIN_i2c1_PINS_DEFAULT>;

    SysConfig 示例文件:

    e2e.ti.com/.../6545.example.syscfg

    重新编译 MCU+工程  

    按照以下步骤构建修改后的 R5F 项目:
    https://software-dl.ti.com/mcu-plus-sdk/esd/AM64X/latest/exports/docs/api_guide_am64x/GETTING_STARTED_BUILD.html 

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

    Linux

    分配外设-修复外设分配冲突

    DTS 和 DTSI 文件位于 Linux SDK 中的
    ti-processor-sdk-linux-am64xx-evm-xxxxxxx/board-support/ti-linux-kernel-xxxxxx/arch/arm64/boot/dts/ti/k3-am64*

    禁用 k3-am642-evm.dts 中的"icssg"。 PRU_ICSSG 实例归 R5F 所有

     &icssg1_iep0 {
    
    pinctrl-names = "disabled";
    pinctrl-0 = <&icssg1_iep0_pins_default>;
    
    };
    
    &icssg0 {
    
    status = "disabled";
    
    }; 
    
    &icssg1 {
    
    status = "disabled";
    
    }; 
    
    &icssg1_eth {
    
    status = "disabled";
    
    };

    注意: 为了避免在 SDK 10.1中、在 A53上运行的 Linux 与在 R5F 上运行的 RTOS 之间发生进一步的冲突、我们从中删除了 ICSSG1  /board-support/ti-linux_xxxx/arch/arm64/boot/dts/k3-am642-evm.dts  和  /board-support/ti-linux_xxxx/arch/arm64/boot/dts/k3-am642-evm.dtsi 和 IN   /board-support/ti-u-boot-xxxxx/arch/arm/dts/k3-am642-evm.dts

    分配内存-修复内存分配冲突

    在 DTSI 文件中创建区域"r5f0_0_SRAM"、并从 devicetre 节点 main_r5fss0_core0添加指向 SRAM 区域的链接。 这将确保 Linux 不会覆盖 R5F 存储器。

    • 在 k3-am64-main.dtsi 中为 R5F 创建 MSRAM 区域

    r5f0_0_SRAM:r5f0_0_SRAM@0{

    REG =<0x0 0x180000>;

    };

    • 在 k3-am642-evm.dts 中添加"r5f0_0_SRAM"区域

    &main_r5fss0_core0{

    mboxes =<&mailbox0_cluster2 &mbox_main_r5fss0_core0>;

    memory-region =<&main_r5fss0_core0_dma_memory_region>、

    <&main_r5fss0_core0_memory_region>;

    SRAM =<&R 5f0_0_SRAM>;                         

    };

    下面是修改后的 DTS 和 DTSI 文件示例:

    e2e.ti.com/.../1680.kernel_5F00_dts.zipe2e.ti.com/.../1680.uboot_5F00_dts.zipe2e.ti.com/.../1680.mod_5F00_k3_2D00_am64_2D00_main_5F00_v1.dtsi

     

    资源管理器:将 网络 DMA 通道分配给 R5F

    1) 1) 资源配置更改-更新 /board/ti/rm-cfg.yaml 文件、用于将 PRU 以太网的 PKTDMA 通道分配 给 R5F 而不是 Linux A53内核。 下面的实用链接

    2) 2)使用1)中的步骤修改资源管理器 YAML 文件后、在 ~μ C/ti-processor-sdk-linux-am64xx-evm-xxxx/board-support/ti-u-boot-xxxx/board/ti/am64x 中复制此新的*。yaml

    • $ cp mod_rm-cfg.yaml rm-cfg.yaml

    以下是修改后的资源管理器 YAML 文件示例:

    e2e.ti.com/.../0842.mod_5F00_rm_2D00_cfg.yaml

    在 rm-cfg.yaml 中更改后、k3-am642-evm.dts 文件(在内核和 u-boot 中)和 k3-am64-main.dtsi 中运行"make linux"和"make u-boot"。 此处提供更多详细信息: 构建 U-Boot

    • μ C/ti-processor-sdk-linux-am64xx-evm-xxxx$、使~成为 Linux
    • μ C/ti-processor-sdk-linux-am64xx-evm-xxxx$ make u-boot ~

     注意:dtb 文件将在 DTS 文件存在的相同位置生成

    将新启动文件复制到 SD 卡

    • ~/ti-processor-sdk-linux-am64xx-evm-xxxx/board-support/u-boot-build$ CP A53/tispl.bin /media/alice/boot
    • ~/ti-processor-sdk-linux-am64xx-evm-xxxx/board-support/u-boot-build$ CP a53/u-boot.img /media/alice/boot
    • ~/ti-processor-sdk-linux-am64xx-evm-xxxx/board-support/u-boot-build$ CP R5/tiboot3.bin /media/alice/boot
    • ~/ti-processor-sdk-linux-am64xx-evm-xxxx/sudo /board-support/ti-linux-kernel-xxxx/arch/arm64/boot/dts/ti cp k3-am642-evm.dtb /media/alice/root/boot/dtb/ti (如果您面临"只读文件系统"、可能需要为此"root"分区执行一个装载点)

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

    更新 EVM 文件系统中的 R5F 固件

    在 SD 卡文件系统中、复制*。out 并创建新固件的符号链接。 示例步骤如下。  

    • 使用 WinSCP (或类似工具)  在/lib/firmware/mcusdk-benchmark_demo 中复制 enet_lwip_icssg_am64x-evm_r5fss0-0_freertos_ti-arm-clang.out
    • "cd /lib/firmware
    • 删除 OOB 符号链接:"RM am64-main-r5f0_0-fw"
    • 创建新的 符号链接:"ln -sf /lib/firmware/mcusdk-benchmark_demo/enet_lwip_icssg_am64x-evm_r5fss0-0_freertos_ti-arm-clang.out am64-main-r5f0_0-fw"
    • 确认 符号链接 "ls -l"
      • am64-main-r5f0_0-fw ->/lib/firmware/mcusdk-benchmark_demo/enet_lwip_icssg_am64x-evm_r5fss0-0_freertos_ti-arm-clang.out  

    功能

    重新启动 EVM、检查是否加载了新的 R5F 固件、您应该会看到新的文件大小

    • root@am64xx-evm:~# dmesg | grep remoteproc

    [7.153455]   k3-m4-rproc 5000000.m4fss:将 M4配置为 remoteproc 模式

    [7.382876]   remoteproc remoteproc0: 5000000.m4fss 可用

    [7.462955]   remoteproc remoteproc0:为5000000.m4fss 供电

    [   7.468814] remoteproc remoteproc0:启动固件映像 am64-mcu-m4f0_0-fw、大小为86084

    [7.529858]   remoteproc remoteproc0:远程处理器5000000.m4fss 现已启动

    [   7.746279] platform 78000000.r5f:已将 R5F 配置为 Remoteproc 模式

    [7.752373]   remoteproc remoteproc1: 78000000.r5f 可用

    [7.827354]   remoteproc remoteproc1:为78000000.r5f 加电

    [7.827390]   remoteproc remoteproc1:启动固件映像 am64-main-r5f0_0-fw、大小为3071612.

    [7.831056]   remoteproc remoteproc1:远程处理器78000000.r5f 现在已启动

    [   7.859219] platform 782000.r5f:已将 R5F 配置为 remoteproc 模式

    [7.860675]   remoteproc remoteproc2: 782000.r5f 可用

    [7.863756]   remoteproc remoteproc2:启动782000.r5f

    [7.863791]   remoteproc remoteproc2:启动固件映像 am64-main-r5f0_1-fw、大小为141772

    [7.867293]   remoteproc remoteproc2:远程处理器782000.r5f 现在已启动

    [   7.938997] platform 784000.r5f:已将 R5F 配置为 remoteproc 模式

    [   8.095898] remoteproc remoteproc3: 784000.r5f 可用

    [8.110907]   remoteproc remoteproc3:上电784000.r5f

    [8.116886]   remoteproc remoteproc3:启动 FW 映像 am64-main-r5F1_0-fw、大小93260

    [8.151913]   platform 786000.r5f:已将 R5F 配置为 remoteproc 模式

    [8.158498]   remoteproc remoteproc3:远程处理器78400000.r5f 现在已启动

    [8.335912]   remoteproc remoteproc4: 786000.r5f 可用

    [8.344783]   remoteproc remoteproc4:上电786000.r5f

    [8.350875]   remoteproc remoteproc4:启动 FW 映像 am64-main-r5F1_FW、大小91520

    [8.399547]   remoteproc remoteproc4:远程处理器786000.r5f 现在已启动

    • root@am64xx-EVM:~# cat /sys/class/remoteproc/remoteproc1/state

    持续更新

    • root@am64xx-EVM:~# cat /sys/kernel/debug/remoteproc/remoteproc1/trace0

    [r5f0-0] 0.004196s :==========
    [r5f0-0] 0.006959s : ENET LWIP 应用程序
    [r5f0-0] 0.009680s :==========
    [r5f0-0] 0.012622s:正在启用时钟!
    [r5f0-0] 0.015315s : EnetAppUtils_reuceCoreMacAllocation:将 CoreID:1的 MAC 地址分配从4减少为1
    [r5f0-0] 0.024545s:
    [r5f0-0] 0.130878s:MDIO_open:MDIO Manual_Mode enabled.
    打开 MAC 端口1134413s:
    [r5f0-0] 0.137210s : EnetPhy_bindDriver: Phy 15: OUI:080028模型:0f Ver:01 <->'DP.83869':确定
    打开 MAC 端口2144499s:
    [r5f0-0] 0.147196s : EnetPhy_bindDriver: Phy 3: OUI:080028模型:0f Ver:01 <->'DP.83869':确定
    PHY 3处于活动状态。154375s:
    [r5f0-0] 0.158652s:PHY 15处于活动状态
    [r5f0-0] 0.165085s:启动 lwIP 时、本地接口 IP 已启用 DHCP
    [r5f0-0] 0.170113s:[LWIPIF_LWIP] NETIF 初始化成功
    [r5f0-0] 0.173619s:主机 MAC 地址-0:34:08:E1:80:B5:e8
    [r5f0-0] 0.178340s :[LWIPIF_LWIP] Enet 已成功启动
    [r5f0-0] 0.183508s:[0]STATUS_CALLB=UP、本地接口 IP 为0.0.0.0
    [r5f0-0] 0.189216s:UDP 服务器侦听端口5001

    如果存在内核严重错误或固件加载不正确等任何问题、请查看 Academy: Debug the remote core with linux 、了解其他提示。

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

    Academy 是多内核开发的重要资源。 以下是一些供进一步研究使用的建议链接:

    远程内核上的应用程序开发>修改要由 Linux 加载的远程内核应用程序
    https://dev.ti.com/tirex/explore/node?node=A__AaxbsDidZkzMnkMKgzk7bQ__AM64-ACADEMY__WI1KRXP__LATEST 

    如何分配外设:
    https://dev.ti.com/tirex/explore/node?node=A__AaxbsDidZkzMnkMKgzk7bQ__AM64-ACADEMY__WI1KRXP__LATEST