ZYNQ UltraScale+ MPSoC OpenAMP 2018.3

ZYNQ OpenAMP 2018.3

本文只是对 UG1186 “入门指南”的补充和阐明(适用于 Zynq UltraScale+ MPSoC。)

​快速尝试

以下是启动 Linux 和使用预构建映像运行 openamp 应用程序的基本步骤。
例如对于 ZCU102:

Echo测试应用程序将数据包从运行在四核 Cortex-A53 上的 Linux 发送到运行 FreeRTOS 的单个 Cortex-R5,然后再将它们发回。

  • 将文件 BOOT.BIN、image.ub 和 openamp.dtb 文件从预构建的 Petalinux BSP tarball 提取到 sd card。
host shell$ tar xvf xilinx-zcu102-v2018.3-final.bsp --strip-components=4 --wildcards */BOOT.BIN */image.ub */openamp.dtb
host shell$ cp BOOT.BIN image.ub openamp.dtb <your sd card>

注意:或者,如果您已经使用为您的开发板提供的 BSP 创建了一个 Petalinux 项目,则还可以在 /pre-built/linux/images / 目录下找到预构建的镜像。

  • 转到 u-boot 提示符并从 sd card 启动 Linux(按实际情况)
Hit any key to stop autoboot:  0
ZynqMP> mmcinfo &&&& fatload mmc 0 ${netstart} ${kernel_img} &&&&  fatload mmc 0 0x14000000 openamp.dtb
Device: sdhci@ff170000
...
reading image.ub
31514140 bytes read in 2063 ms (14.6 MiB/s)
reading openamp.dtb
38320 bytes read in 18 ms (2 MiB/s)
ZynqMP> bootm $netstart $netstart 0x14000000

注意:作为上述所有 sd-boot 步骤的替代方法,您可以 jtag-boot 板。为此,您需要连接 jtag 电缆、安装 jtag 驱动程序并使用提供的 BSP 创建 Petalinux 项目。然后,您将进入/pre-built/linux/images目录并将文件system.dtb替换为openamp.dtb,然后输入:“petalinux-boot --jtag --prebuilt 3”

  • 在 Linux 登录提示符下,输入“root”作为用户名,输入“root”作为密码,然后运行 ​​echo-test demo
plnx_aarch64 login: root
Password:
root@plnx_aarch64:~# echo image_echo_test > /sys/class/remoteproc/remoteproc0/firmware
root@plnx_aarch64:~# echo start > /sys/class/remoteproc/remoteproc0/state  
[  177.375451] remoteproc remoteproc0: powering up ff9a0100.zynqmp_r5_rproc
[  177.384705] remoteproc remoteproc0: Booting fw image image_echo_test, size 644144
[  177.396832] remoteproc remoteproc0: registered virtio0 (type 7)
[  177.399108] virtio_rpmsg_bus virtio0: rpmsg host is online
[  177.412370] zynqmp_r5_remoteproc ff9a0100.zynqmp_r5_rproc: RPU boot from TCM.
[  17Starting application...
Try to init remoteproc resource
Init remoteproc resource succeeded
Waiting for events...
7.422089] remoteproc remoteproc0: remote processor ff9a0100.zynqmp_r5_rproc is now up
[  177.442121] virtio_rpmsg_bus virtio0: creating channel rpmsg-openamp-demo-channel addr 0x1
root@plnx_aarch64:~# modprobe rpmsg_user_dev_driver
[  188.089835] rpmsg_user_dev_driver virtio0:rpmsg-openamp-demo-channel: rpmsg_user_dev_rpmsg_drv_probe
[  188.101250] rpmsg_user_dev_driver virtio0:rpmsg-openamp-demo-channel: new channel: 0x400 -> 0x1!
root@plnx_aarch64:~# echo_test
 Echo test start
 Open rpmsg dev!
[  190.364739] rpmsg_user_dev_driver virtio0:rpmsg-openamp-demo-channel: Sent init_msg to target 0x1.

文档和源代码:

  • 以下文档描述了 libmetal API:
    libmetal

源代码的网址:

以下位置提供对代码的访问

其他示例:

ZynqMP Linux Master 运行在 APU 上,内核空间中带有 RPMsg 和 2 个 RPU slaves。

启用 Linux 驱动程序和其他软件包按照UG1186中的说明进行操作,以启用 Linux remoteproc 驱动程序支持和其他 openamp 软件包。
设备树:

  • 将以下内容添加到 <petalinux 项目>/project-spec/meta-user/recipes-bsp/device-tree/file/system-user.dtsi
/ {
    reserved-memory {
        #address-cells = <2>;
        #size-cells = <2>;
        ranges;
        rproc_0_reserved: rproc@3ed00000 {
            no-map;
            reg = <0x0 0x3ed00000 0x0 0x1000000>;
        };
    };
  
    power-domains {
        pd_r5_0: pd_r5_0 {
            #power-domain-cells = <0x0>;
            pd-id = <0x7>;
        };
        pd_r5_1: pd_r5_1 {
            #power-domain-cells = <0x0>;
            pd-id = <0x8>;
        };
        pd_tcm_0_a: pd_tcm_0_a {
            #power-domain-cells = <0x0>;
            pd-id = <0xf>;
        };
        pd_tcm_0_b: pd_tcm_0_b {
            #power-domain-cells = <0x0>;
            pd-id = <0x10>;
        };
        pd_tcm_1_a: pd_tcm_1_a {
            #power-domain-cells = <0x0>;
            pd-id = <0x11>;
        };
        pd_tcm_1_b: pd_tcm_1_b {
            #power-domain-cells = <0x0>;
            pd-id = <0x12>;
        };
    };
  
    amba {
        r5_0_tcm_a: tcm@ffe00000 {
            compatible = "mmio-sram";
            reg = <0 0xFFE00000 0x0 0x10000>;
            pd-handle = <&pd_tcm_0_a>;
        };
        r5_0_tcm_b: tcm@ffe20000 {
            compatible = "mmio-sram";
            reg = <0 0xFFE20000 0x0 0x10000>;
            pd-handle = <&pd_tcm_0_b>;
        };
        r5_1_tcm_a: tcm@ffe90000 {
            compatible = "mmio-sram";
            reg = <0 0xFFE90000 0x0 0x10000>;
            pd-handle = <&pd_tcm_1_a>;
        };
        r5_1_tcm_b: tcm@ffe92000 {
            compatible = "mmio-sram";
            reg = <0 0xFFEB0000 0x0 0x10000>;
            pd-handle = <&pd_tcm_1_b>;
        };
  
        elf_ddr_0: ddr@3ed00000 {
            compatible = "mmio-sram";
            reg = <0 0x3ed00000 0x0 0x40000>;
        };
  
        elf_ddr_1: ddr@3ed40000 {
            compatible = "mmio-sram";
            reg = <0 0x3ed40000 0x0 0x40000>;
        };
  
        test_r50: zynqmp_r5_rproc@0 {
            compatible = "xlnx,zynqmp-r5-remoteproc-1.0";
            reg = <0x0 0xff9a0100 0 0x100>, <0x0 0xff340000 0 0x100>, <0x0 0xff9a0000 0 0x100>;
            reg-names = "rpu_base", "ipi", "rpu_glbl_base";
            dma-ranges;
            core_conf = "split0";
            srams = <&r5_0_tcm_a &r5_0_tcm_b &elf_ddr_0>;
            pd-handle = <&pd_r5_0>;
            interrupt-parent = <&gic>;
            interrupts = <0 29 4>;
  
        } ;
  
        test_r51: zynqmp_r5_rproc@1 {
            compatible = "xlnx,zynqmp-r5-remoteproc-1.0";
            reg =<0x0 0xff9a0200 0 0x100>, <0x0 0xff340000 0 0x100>, <0x0 0xff9a0000 0 0x100>;
            reg-names = "rpu_base", "ipi", "rpu_glbl_base";
            dma-ranges;
            core_conf = "split1";
            srams = <&r5_1_tcm_a &r5_1_tcm_b &elf_ddr_1>;
            pd-handle = <&pd_r5_1>;
            interrupt-parent = <&gic>;
            interrupts = <0 29 4>;
  
        } ;
  
    };
};
  • 重建设备树
petalinux-build -c device-tree

使用 Xilinx SDK 构建远程处理器演示应用程序:

对于 RPU 0 (cortex_r5_0):

继续按照UG1186中的说明用Xilinx SDK生成远程处理器openamp应用程序。
默认情况下,RPU 0 也用于 Petalinux BSP 提供的预构建应用程序。

对于 RPU 1 (cortex_r5_1)

远程处理器应用程序(echo_test、矩阵乘法、rpc 演示)代码默认设置为使用 RPU 0 运行,并且需要针对 RPU-1 稍作修改。
在 Xilinx SDK 中选择 RPU-1 时,生成的代码需要修改如下:

  • 检查RSC_table.c中的RING_TX、RING_RX和RSC_RPROC_MEM条目是否在设备树中定义的保留内存部分内,但不与其中的任何其他部分重叠。(例如,RPU 0/1的DDR,vring设备节点,等等)。
  • 检查链接描述文件地址是否匹配并适合 DTS zynqmp_r5_rproc 内存部分。
示例:在 Linux 上同时运行两个 echo_test 应用程序,每个应用程序都与一个单独的 RPU 通信

#使用 Petalinux 构建/启动您的目标,然后登录到 Linux 控制台串行端口。
#如果您尚未将远程处理器固件应用程序添加到您的 Linux 根文件系统(请参阅 [[ https://www.xilinx.com/support/documentation/sw_manuals/xilinx2018_3/ug1186-zynq-openamp-gsg.pdf|UG1186 ]] ch. 3) 你可以在目标目录 /lib/firmware 中 tftp 它们

检查 remoteproc 驱动程序是否已经加载(通常是如果你的设备树配置正确):
root@plnx_aarch64:/lib/firmware# lsmod
    Tainted: G
virtio_rpmsg_bus 20480 0 - Live 0xffffff800098e000
rpmsg_core 16384 1 virtio_rpmsg_bus, Live 0xffffff800097c000
zynqmp_r5_remoteproc 16384 0 - Live 0xffffff800096a000
remoteproc 40960 1 zynqmp_r5_remoteproc, Live 0xffffff8000959000
virtio 16384 2 virtio_rpmsg_bus,remoteproc, Live 0xffffff8000951000
virtio_ring 20480 2 virtio_rpmsg_bus,remoteproc, Live 0xffffff8000948000
uio_pdrv_genirq 16384 0 - Live 0xffffff8000940000
  1. 加载 rpmsg_user_dev_driver LKM:
root@plnx_aarch64:/lib/firmware# modprobe rpmsg_user_dev_driver
  1. 启动 RPU-0:
root@plnx_aarch64:/lib/firmware# echo image_echo_test_r5_0 > /sys/class/remoteproc/remoteproc0/firmware
root@plnx_aarch64:/lib/firmware#
root@plnx_aarch64:/lib/firmware# echo start > /sys/class/remoteproc/remoteproc0/state
root@plnx_aarch64:/lib/firmware#
[70982.961635] remoteproc remoteproc0: powering up ff9a0100.zynqmp_r5_rproc
[70982.971366] remoteproc remoteproc0: Booting fw image image_echo_test_r5_0, size 638724
[70982.985672] virtio_rpmsg_bus virtio0: rpmsg host is online
[70982.993691] remoteproc remoteproc0: registered virtio0 (type 7)
[70983.002197] zynqmp_r5_remoteproc ff9a0100.zynqmp_r5_rproc: RPU boot from TCM.
[7Starting application...
Try to init remoteproc resource
Init remoteproc resource succeeded
Waiting for events...
0983.012367] remoteproc remoteproc0: remote processor ff9a0100.zynqmp_r5_rproc is now up
[70983.032821] virtio_rpmsg_bus virtio0: creating channel rpmsg-openamp-demo-channel addr 0x1
[70983.043731] rpmsg_user_dev_driver virtio0:rpmsg-openamp-demo-channel: rpmsg_user_dev_rpmsg_drv_probe
root@plnx_aarch64:/lib/firmware# [70983.055535] rpmsg_user_dev_driver virtio0:rpmsg-openamp-demo-channel: new channel: 0x400 -> 0x1!
  1. 启动 RPU-1:
root@plnx_aarch64:/lib/firmware# echo image_echo_test_r5_1 > /sys/class/remoteproc/remoteproc1/firmware
root@plnx_aarch64:/lib/firmware#
root@plnx_aarch64:/lib/firmware# echo start > /sys/class/remoteproc/remoteproc1/state
[71185.157615] remoteproc remoteproc1: powering up ff9a0200.zynqmp_r5_rproc
[71185.167453] remoteproc remoteproc1: Booting fw image image_echo_test_r5_1, size 639140
[71185.182180] virtio_rpmsg_bus virtio1: rpmsg host is online
[71185.190226] remoteproc remoteproc1: registered virtio1 (type 7)
[71185.198724] zynqmp_r5_remoteproc ff9a0200.zynqmp_r5_rproc: RPU boot from TCM.
[7Starting application...
Try to init remoteproc resource
Init remoteproc resource succeeded
Waiting for events...
1185.208915] remoteproc remoteproc1: remote processor ff9a0200.zynqmp_r5_rproc is now up
[71185.229420] virtio_rpmsg_bus virtio1: creating channel rpmsg-openamp-demo-channel addr 0x1
[71185.240367] rpmsg_user_dev_driver virtio1:rpmsg-openamp-demo-channel: rpmsg_user_dev_rpmsg_drv_probe
root@plnx_aarch64:/lib/firmware# [71185.252200] rpmsg_user_dev_driver virtio1:rpmsg-openamp-demo-channel: new channel: 0x400 -> 0x1!
  1. 使用串行端口或其他 telnet 或 ssh 连接运行带有 RPU-0 的 echo_test Linux 应用程序:
root@plnx_aarch64:/lib/firmware# echo_test
 Echo test start
 Open rpmsg dev!
[71507.962881] rpmsg_user_dev_driver virtio0:rpmsg-openamp-demo-channel: Sent init_msg to target 0x1.
  1. 使用另一个连接(telnet、ssh…)运行带有 RPU-1 的并发 echo_test Linux 应用程序:
root@plnx_aarch64:/lib/firmware# echo_test -d /dev/rpmsg1
 Echo test start
 Open rpmsg dev!

注意:启动 RPU 的顺序决定了哪个 /dev/rpmsgX 设备与该 RPU 一起使用。
在上述情况下,/dev/rpmsg0被用于 RPU-0。
然而,如果首先启动 RPU-1,它会与 /dev/rpmsg0 相关联,而 RPU-0 会一直使用 /dev/rpmsg1。

ZynqMP Linux Master 在 APU 上运行,RPMsg 在用户空间和 2 个 RPU slaves

设置设备树

  1. 将以下设备树内容添加到 <petalinux 项目>/project-spec/meta-user/recipes-bsp/device-tree/file/system-user.dtsi
/ {
    reserved-memory {
        #address-cells = <2>;
        #size-cells = <2>;
        ranges;
        rproc_0_reserved: rproc@3ed000000 {
            no-map;
            reg = <0x0 0x3ed00000 0x0 0x1000000>;
        };
    };
 
    amba {
        /* Shared memory (APU to RPU) */
        shm0: shm@0 {
            compatible = "shm";
            reg = <0x0 0x3ed20000 0x0 0x0100000>;
            /* reg = <0x0 0x3ed04000 0x0 0x0100000>; */
        };
        /* Shared memory on OCM (APU to RPU) */
        shm_ocm: shm_ocm@fffc0000 {
            compatible = "shm-ocm";
            reg = <0x0 0xfffc0000 0x0 0x10000>;
        };
        /* IPI device */
        ipi0: ipi@0 {
            compatible = "ipi_uio";
            reg = <0x0 0xff340000 0x0 0x1000>;
            interrupt-parent = <&gic>;
            interrupts = <0 29 4>;
        };
    };
};
 
&uart1 {
    status = "disabled";
};
  1. 使用“ petalinux-config -c rootfs ”启用 OpenAMP 和 libmetal 包:
Filesystem Packages --->
   libs --->
       libmetal   --->
         [*] libmetal
       open-amp   --->
         [*] open-amp

使用 XSDK 构建 Linux OpenAMP 用户空间应用程序

  • 为 Linux 和 A53 创建空应用程序
    • 操作系统:Linux
    • 处理器:psu_cortexa53
    • Linux sysroot:来自 Petalinux 项目的 sysroot:
    • < plnx proj >/build/tmp/sysroots/plnx_aarch_64
      • 构建项目后,选择属性:
        • C/C++ Build --> Settings
          • Tool Settings Tab Libraries
            • Libaries (-l) add “metal” and “open_amp”
            • Miscellaneous
              • 在链接器Flag中,添加 --sysroot=/build/tmp/sysroots/plnx_aarch_64
    • 将 ZynqMP 的 OpenAMP 应用程序的以下文件复制到目录中:
      • platform_info.c, platform_info.h, rsc_table.c and rsc_table.h from here
      • helper.c from here
    • 以及链接中三个 OpenAMP 应用程序之一的 Linux 文件:
      • OpenAMP echo-test
      • OpenAMP matrix multiplication Demo
      • OpenAMP RPC Demo
在 Petalinux 项目中安装 XSDK 构建Linux应用程序

Linux应用程序可以通过yocto Recipe进行安装,如下所示:

SUMMARY = "Simple test application"
SECTION = "PETALINUX/apps"
LICENSE = "MIT"
LIC_FILES_CHKSUM =
"file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
SRC_URI = "file://<myapp>"
S = "${WORKDIR}"
INSANE_SKIP_${PN} = "arch"
do_install() {
             install -d ${D}/lib/firmware
             install -m 0644 ${S}/<myapp> ${D}/lib/firmware/<myapp>
}
FILES_${PN} = "/lib/firmware/<myapp>
使用Xilinx SDK构建远程处理器演示应用程序以在RPU 0(cortex_r5_0)上运行

按照UG1186中的说明,用Xilinx SDK生成远程处理器openamp应用程序。

示例:在 Linux 上同时运行两个 proxy_app-openamp 应用程序,每个应用程序与一个 RPU 通信
  1. 使用从 XSDK 构建的 RPU 固件生成 BOOT.BIN 下面是一个 BIF 示例:
the_ROM_image:
{
[fsbl_config] a53_x64
[bootloader] <plnx project>/images/linux/zynqmp_fsbl.elf
[destination_device=pl] <plnx project/images/linux/download.bit
[destination_cpu=pmu] <plnx project>/images/linux/pmufw.elf
[destination_cpu=r5-0] /path/to/openamp_firmware_on_rpu0.elf
[destination_cpu=r5-1] /path/to/openamp_firmware_on_rpu1.elf
[destination_cpu=a53-0, exception_level=el-3, trustzone] <plnx project>/images/linux/bl31.elf
[destination_cpu=a53-0, exception_level=el-2] <plnx project>/images/linux/u-boot.elf
}

2.启动时,RPU 0 和 RPU 1 的 RPU 固件应该有类似以下的输出:

Starting application...
Try to init remoteproc resource
Init remoteproc resource succeeded
Waiting for events...
  1. 使用串行端口或其他 telnet 或 ssh 连接运行带有 RPU-0 的 proxy_app-openamp Linux 应用程序:
root@plnx_aarch64# proxy_app-openamp
metal: info: metal_uio_dev_open: No IRQ for device 3ed20000.shm.
initializing rpmsg vdev
Try to create rpmsg endpoint.
Successfully created rpmsg endpoint.
Successfully open shm device.
Successfully added shared memory
Successfully probed IPI device
Successfully initialized Linux r5 remoteproc.
Successfully initialized remoteproc
Calling mmap resource table.
Successfully mmap resource table.
Successfully set resource table to remoteproc.
Creating virtio...
Successfully created virtio device.
initializing rpmsg vdev
metal: info: Initializating I/Os redirection...
Master> Remote proc resource initialized.
Master> RPMSG channel has created.
Remote>Baremetal Remote Procedure Call (RPC) Demonstration
  1. 使用另一个连接(telnet、ssh…)运行具有 RPU-1 的并发 proxy_app-openamp Linux 应用程序:
root@xilinx-zcu102-2018_3:~# linux_proxy_userspace_to_r5_1.elf
metal: info: metal_uio_dev_open: No IRQ for device 3ef00000.vring.
metal: iInitializating I/Os redirection...
nfo: metal_uio_dev_open: No IRQ for device 3ef00000.vring.
metal: info: metal_uio_dev_open: No IRQ for device 3ef40000.shm.
Master> Remote proc resource initialized.
Master> RPMSG channel has created.
Remote>Baremetal Remote Procedure Call (RPC) Demonstration

ZynqMP Linux Master 在 APU 上运行,内核空间中带有 RPMsg 和一个 RPU slave

当用RPU在分离模式下运行,并且只有一个RPU是OpenAMP的从机时,第二个RPU仍然可以运行另一个非openamp的应用程序。

* RPU-0 slave:
> Petalinux BSPs provide a default template to generate a DTB with support for OpenAMP running on RPU-0, see:
> <petalinux project>/project-spec/meta-usr/recipes-bsp/device-tree/files/openamp-overlay.dtsi
> Add its content to file <petalinux project>/project-spec/meta-user/recipes-bsp/device-tree/file/system-user.dtsi
* RPU-1 slave:
> Proceed as for the two RPU configuration above and edit your device tree to remove the unused 'zynmp_r5_rproc' entry and associated nodes (tcm, pd,...) that may not be needed any more.

在 APU Linux 上运行的 ZynqMP Linux Master 加载 OpenAMP RPU 固件

概述

以下信息旨在为希望在 APU 上设置 Linux + 在 RPU 上的裸机/RTOS 的用户提供指导。此配置依赖 FSBL 启动 APU 上运行的软件,然后使用 remoteproc 的 APU Linux 将加载 RPU。

使用 Linux 通过 APU 引导 RPU 固件

这些说明假设用户已经为 RPU 生成了固件,并且用户正在使用 Petalinux 来创建他们的嵌入式 Linux 解决方案。

  • 按照 UG 1186 中的指示,在 Petalinux 项目内创建一个应用程序,以将固件安装到 Linux 主机的文件系统 /lib/firmware。要为 yocto Recipe创建模板以安装固件,请执行以下操作:
# Create yocto application inside of Petalinux project
petalinux-create -t apps --template install -n <app_name> --enable
  1. 将固件(.elf 文件)复制到 project-spec/meta-user/recipes-apps/<app_name>/files/ 目录.
  2. 修改 project-spec/meta-user/recipes-apps/<app_name>/<app_name>.bb 以在 RootFS 中安装远程处理器固件,如下所示:
SUMMARY = "Simple test application"
SECTION = "PETALINUX/apps"
LICENSE = "MIT"
LIC_FILES_CHKSUM ="file:${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
SRC_URI = "file:<myfirmware>"
S = "${WORKDIR}"
INSANE_SKIP_${PN} = "arch"
do_install() {
  install -d ${D}/lib/firmware
  install -m 0644 ${S}/<myfirmware> ${D}/lib/firmware/<myfirmware>
}
FILES_${PN} = "/lib/firmware/<myfirmware>
  • 在 PetaLinux 项目中使用“petalinux-build”命令构建 Linux 映像。
  1. 在 project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi 修改设备树。例如:
/ {
reserved-memory {
    #address-cells = <2>;
    #size-cells = <2>;
    ranges;
    rproc_0_reserved: rproc@3ed000000 {
        no-map;
    /* DDR memory reserved for RPU firmware.
    If you want to use predefined shared memory,
    you should also reserved them here.
    */
        reg = <0x0 0x3ed00000 0x0 0x1000000>;
    };
};
 
    power-domains {
        /* For TCM memories, you will need specify the power domain
        IDs. As APU will need to use the power domain ID to request
        access through PMU FW.
        */
        pd_r5_0: pd_r5_0 {
            #power-domain-cells = <0x0>;
            pd-id = <0x7>;
        };
        pd_tcm_0_a: pd_tcm_0_a {
            #power-domain-cells = <0x0>;
            pd-id = <0xf>;
        };
        pd_tcm_0_b: pd_tcm_0_b {
            #power-domain-cells = <0x0>;
            pd-id = <0x10>;
        };
    
    };
    
    amba {
        /* You will need to specify the firmware memory as "mmio-sram". */
        r5_0_tcm_a: tcm@ffe00000 {
            compatible = "mmio-sram";
            reg = <0 0xFFE00000 0x0 0x10000>;
            pd-handle = <&pd_tcm_0_a>;
        };
        r5_0_tcm_b: tcm@ffe20000 {
            compatible = "mmio-sram";
            reg = <0 0xFFE20000 0x0 0x10000>;
            pd-handle = <&pd_tcm_0_b>;
        };
        
        elf_ddr_0: ddr@3ed00000 {
            compatible = "mmio-sram";
            reg = <0 0x3ed00000 0x0 0x40000>;
        };
        
        test_r50: zynqmp_r5_rproc@0 {
            compatible = "xlnx,zynqmp-r5-remoteproc-1.0";
            reg = <0x0 0xff9a0100 0 0x100>, <0x0 0xff9a0000 0 0x100>;
            reg-names = "rpu_base", "rpu_glbl_base";
            dma-ranges;
            core_conf = "split0";
            /* Specify the firmware memories here */
            srams = <&r5_0_tcm_a &r5_0_tcm_b &elf_ddr_0>;
            pd-handle = <&pd_r5_0>;
        } ;
    };
};

  1. 运行以下命令来构建我们的 petalinux 项目。
petalinux-build
  1. 启动 Petalinux 项目后,运行以下命令将 RPU 固件启动到 RPU。
echo <name of firmware> > /sys/class/remoteproc/remoteproc0/firmware
  1. 运行 Linux 应用程序
echo start > /sys/class/remoteproc/remoteproc0/state

6.停止固件

echo stop > /sys/class/remoteproc/remoteproc0/state

####ZynqMP Linux loads RPU, Linux OpenAMP Application talks to RPU OpenAMP Application

ZynqMP Linux 加载 RPU,Linux OpenAMP 应用程序与 RPU OpenAMP 应用程序交互

概述

以下信息旨在为希望在 APU + Bare-metal/RTOS on RPU 上设置 Linux 的用户提供指导。APU Linux 将使用 remoteproc 加载 RPU。在 APU 上运行的 Linux 将通过 RPMsg 的 OpenAMP 库实现与 RPU 通信。

设置远程固件

用户可以使用,例如,类似于在https://www.xilinx.com/support/documentation/sw_manuals/xilinx2018_1/ug1186-zynq-openamp-gsg.pdf|UG1186的构建远程应用程序部分/章节创建的OpenAMP RPU应用程序的结构。

这些说明假设用户已经为 RPU 生成了固件,并且用户正在使用 Petalinux 来创建他们的嵌入式 Linux 解决方案。

按照 UG 1186 中的指示,在 Petalinux 项目中创建一个 yocto Recipe,以将固件安装到 Linux 主机的 /lib/firmware 文件系统中。
请参阅前面的示例::ZynqMP Linux Master running on APU Linux loads OpenAMP RPU Firmware f,以获取有关如何创建此类 yocto Recipe的指南。

/include/ "system-conf.dtsi"
/{
    reserved-memory {
        #address-cells = <2>;
        #size-cells = <2>;
        ranges;
        rproc_0_reserved: rproc@3ed000000 {
            no-map;
            reg = <0x0 0x3ed00000 0x0 0x1000000>;
        };
    };
 
    power-domains {
        pd_r5_0: pd_r5_0 {
            #power-domain-cells = <0x0>;
            pd-id = <0x7>;
        };
        pd_tcm_0_a: pd_tcm_0_a {
            #power-domain-cells = <0x0>;
            pd-id = <0xf>;
        };
        pd_tcm_0_b: pd_tcm_0_b {
            #power-domain-cells = <0x0>;
            pd-id = <0x10>;
        };
    };
 
    amba {
        r5_0_tcm_a: tcm@ffe00000 {
            compatible = "mmio-sram";
            reg = <0x0 0xFFE00000 0x0 0x10000>;
            pd-handle = <&pd_tcm_0_a>;
        };
        r5_0_tcm_b: tcm@ffe20000 {
            compatible = "mmio-sram";
            reg = <0x0 0xFFE20000 0x0 0x10000>;
            pd-handle = <&pd_tcm_0_b>;
        };
        elf_ddr_0: ddr@3ed00000 {
            compatible = "mmio-sram";
            reg = <0x0 0x3ed00000 0x0 0x40000>;
        };
        test_r50: zynqmp_r5_rproc@0 {
            compatible = "xlnx,zynqmp-r5-remoteproc-1.0";
            reg = <0x0 0xff9a0100 0x0 0x100>, <0x0 0xff9a0000 0x0 0x100>;
            reg-names = "rpu_base", "rpu_glbl_base";
            dma-ranges;
            core_conf = "split0";
            srams = <&r5_0_tcm_a &r5_0_tcm_b &elf_ddr_0>;
            pd-handle = <&pd_r5_0>;
        } ;
        /* UIO device node for vring device memory */
        vring: vring@0 {
            compatible = "vring_uio";
            reg = <0x0 0x3ed40000 0x0 0x40000>;
        };
        /* UIO device node for shared memory device memory */
        shm0: shm@0 {
            compatible = "shm_uio";
            reg = <0x0 0x3ed80000 0x0 0x80000>;
        };
        /* UIO device node for IPI device */
        ipi0: ipi@0 {
            compatible = "ipi_uio";
            reg = <0x0 0xff340000 0x0 0x1000>;
            interrupt-parent = <&gic>;
            interrupts = <0 29 4>;
        };
    };
};

使用所需的软件包构建 Petalinux
  1. 使用 petalinux 工具启用所需的软件包。例如,转到 petalinux 项目的最顶层目录并启动 rootfs 配置实用程序:
  2. 启用应用程序所需的 rootfs 包。如果您从 UG1186 运行示例应用程序,则可以通过以下方式启用这些包:
petalinux-config -c rootfs
Filesystem Packages
--> libs
--> libmetal
--> [ * ] libmetal
--> openamp
--> [ * ] open-amp
--> misc
--> openamp-fw-echo-testd
--> [ * ] openamp-fw-echo-testd
--> openamp-fw-mat-muld
--> [ * ] openamp-fw-mat-muld
--> openamp-fw-rpc-demod
--> [ * ] openamp-fw-rpc-demod
--> rpmsg-echo-test
--> [ * ] rpmsg-echo-test
--> rpmsg-mat-mul
--> [ * ] rpmsg-mat-mul
--> rpmsg-proxy-app
--> [ * ] rpmsg-proxy-app
  1. 然后构建 petalinux 项目。
petalinux-build
  1. 加载固件并逐步启动固件:
  • 登录 Linux,然后启动 RPU 固件,例如:
echo <fw_name> /sys/class/remoteproc/remoteproc0/firmware
echo start > /sys/class/remoteproc/remoteproc0/state
  • 运行 Linux 应用程序
  • 停止固件
    ####ZynqMP on APU Linux communicate with RPU via Shared Memory without OpenAMP

APU Linux 上的 ZynqMP 通过共享内存与 RPU 通信,无需 OpenAMP

概述

以下信息旨在为希望设置 Linux + 裸机、RTOS 等的用户提供指导。我们假设 Linux 和 RPU 将通过共享内存进行通信。IPI 可用于进一步协调处理器之间的通信。IPI 的使用记录在标题为“在 APU Linux 上运行的 ZynqMP Linux Master 加载并运行任意 RPU 固件;APU 通过用户空间中的 RPMsg 与 RPU 通信”的部分中。

Linux 的设备树设置

要使运行在 APU 上的 Linux 可以访问共享内存设备,必须对设备树进行一些修改。
例如,如果找到 [[@ https://github.com/OpenAMP/open-amp/tree/master/apps/echo_test|here ]] 为 OpenAMP echo_test 演示配置设备树,则将共享内存节点放置在 amba 部分。例如:

/{
amba {
/* UIO device node for shared memory device memory */
shm0: shm@0 {
compatible = "shm_uio";
reg = <0x0 0x3ed80000 0x0 0x80000>;
};
};
};
配置 Petalinux 项目

OpenAMP 应用程序使用 Libmetal 来访问共享内存。因此,必须启用 petalinux 项目中的 libmetal 包。可以通过使用 petalinux-config 实用程序进入 rootfs 来启用此软件包。
运行:

petalinux-config -c rootfs

然后在实用程序中启用以下软件包:

Filesystem Packages
--> libs
--> libmetal
--> [ * ] libmetal
--> openamp
--> [ * ] open-amp
--> misc
--> openamp-fw-echo-testd
--> [ * ] openamp-fw-echo-testd
--> openamp-fw-mat-muld
--> [ * ] openamp-fw-mat-muld
--> openamp-fw-rpc-demod
--> [ * ] openamp-fw-rpc-demod
--> rpmsg-echo-test
--> [ * ] rpmsg-echo-test
--> rpmsg-mat-mul
--> [ * ] rpmsg-mat-mul
--> rpmsg-proxy-app
--> [ * ] rpmsg-proxy-app
通过共享内存进行通信

以下信息是假设共享内存节点在 Linux 用户空间中可见的情况下构建的。
使用Libmetal的API,我们可以通过以下函数从共享内存中读取和写入:

static inline uint64_t metal_io_read(struct metal_io_region *io, unsigned long offset, memory_order order, int width);
int metal_io_block_read(struct metal_io_regoin *io, unsigned long offset, void * restrict dst, int len)l;

And

static inline void metal_io_write(struct metal_io_region *io, unsigned long offset, uint64_t value, memory_order order, int width);
int metal_io_block_write(struct metal_io_region *io, unsigned long offset, const void *restrict src, int len);

可以在此处找到显示在 Linux 用户空间中使用这些函数的示例 。链接中的一些示例显示了读取和写入共享内存以及初始化和清理 Libmetal 资源的使用。

如何生成 BOOT.BIN

本节假定您的 Petalinux 项目已经运行 Petalinux-build 来构建嵌入式 Linux 解决方案的所有必要组件,以及在 RPU 上运行的固件。
使用 Petalinux 工具构建 BOOT.BIN,然后您可以将其放在 SD 卡上以启动 ZynqMP 板。
下面是一个示例 bootgen.bif 文件,您可以在 Petalinux 项目的顶级目录中创建或修改该文件,您可以使用它来帮助构建 BOOT.BIN

the_ROM_image:
{
[fsbl_config] a53_x64
[bootloader, destination_cpu=a53-0] ./images/linux/zynqmp_fsbl.elf
[pmufw_image, destination_cpu=a53-0] ./images/linux/pmufw.elf
[destination_cpu=a53-0, exception_level=el-3, trustzone] ./images/linux/bl31.elf
[destination_cpu=a53-0, exception_level=el-2] ./images/linux/u-boot.elf
}

使用这个 .bif 文件和 petalinux 工具,我们将构建一个 BOOT.BIN 文件,您可以将其用于您的 ZynqMP 板子.

petalinux-package --boot --force --u-boot ./images/linux/u-boot.elf --cpu r5-0 --add /path/to/firmware

在这里,我们展示了一些东西:

  • 我们使用 --cpu 选项和 r5-0 指定数据文件(你的固件)将转到哪个 RPU。您还可以使用 r5-1 或 r5-lockstep 选项。
  • –add 选项,其中以下参数指定你的固件的路径。
  • –force 选项将现有的 BOOT.BIN 文件覆盖到当前目录中。
  • –u-boot 选项,该选项指定了u-boot.elf的位置。

功能变化

模块名称ChangeLink
OpenAMP 回声测试和矩阵乘法演示无需用户手动输入即可运行。相反,添加 -n 命令行选项以指定迭代次数补丁链接
Xen Dom0 和 DomU 支持在 RPMsg 用户空间中运行的 OpenAMP2018.1对这两种配置的支持
RPMsg 字符驱动支持(实验性)能够使用rpmsg char驱动运行RPMsg OpenAMP演示。启用的补丁还没有在上游出现。补丁链接
libmetal MicroBlaze 裸机支持向 libmetal 添加 MicroBlaze 裸机支持链接到源代码
为在 RPU0 和 RPU1 上运行的 OpenAMP 回显演示添加修复以挂起大量有效载荷更新 Embeddedsw 中的 GIC 驱动程序,以便可以将相关中断映射或取消映射到 CPU。补丁链接
  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值