ZYNQ OpenAMP .3
本文只是对 UG1186 “入门指南”的补充和阐明(适用于 Zynq UltraScale+ MPSoC。)
目录
ZYNQ OpenAMP .3快速尝试文档和源代码:源代码的网址: 其他示例:ZynqMP Linux Master 运行在 APU 上,内核空间中带有 RPMsg 和 2 个 RPU slaves。使用 Xilinx SDK 构建远程处理器演示应用程序:对于 RPU 0 (cortex_r5_0):对于 RPU 1 (cortex_r5_1)示例:在 Linux 上同时运行两个 echo_test 应用程序,每个应用程序都与一个单独的 RPU 通信检查 remoteproc 驱动程序是否已经加载(通常是如果你的设备树配置正确): ZynqMP Linux Master 在 APU 上运行,RPMsg 在用户空间和 2 个 RPU slaves使用 XSDK 构建 Linux OpenAMP 用户空间应用程序在 Petalinux 项目中安装 XSDK 构建Linux应用程序使用Xilinx SDK构建远程处理器演示应用程序以在RPU 0(cortex_r5_0)上运行示例:在 Linux 上同时运行两个 proxy_app-openamp 应用程序,每个应用程序与一个 RPU 通信 ZynqMP Linux Master 在 APU 上运行,内核空间中带有 RPMsg 和一个 RPU slave在 APU Linux 上运行的 ZynqMP Linux Master 加载 OpenAMP RPU 固件概述使用 Linux 通过 APU 引导 RPU 固件 ZynqMP Linux 加载 RPU,Linux OpenAMP 应用程序与 RPU OpenAMP 应用程序交互概述设置远程固件使用所需的软件包构建 Petalinux APU Linux 上的 ZynqMP 通过共享内存与 RPU 通信,无需 OpenAMP概述Linux 的设备树设置配置 Petalinux 项目通过共享内存进行通信如何生成 BOOT.BIN 功能变化快速尝试
以下是启动 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-v.3-final.bsp --strip-components=4 --wildcards */BOOT.BIN */image.ub */openamp.dtbhost 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: 0ZynqMP> mmcinfo &&&& fatload mmc 0 ${netstart} ${kernel_img} &&&& fatload mmc 0 0x14000000 openamp.dtbDevice: sdhci@ff170000...reading image.ub31514140 bytes read in 2063 ms (14.6 MiB/s)reading openamp.dtb38320 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: rootPassword:root@plnx_aarch64:~# echo image_echo_test > /sys/class/remoteproc/remoteproc0/firmwareroot@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 resourceInit remoteproc resource succeededWaiting 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 0x1root@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_testEcho test startOpen rpmsg dev![ 190.364739] rpmsg_user_dev_driver virtio0:rpmsg-openamp-demo-channel: Sent init_msg to target 0x1.
文档和源代码:
以下文档描述了 libmetal API:libmetal
源代码的网址:
以下位置提供对代码的访问
OpenAMP 库和演示代码Libmetal 库和演示代码Yocto Recipe构建OpenAMP 和 Libmetal Xilinx 版本的 Linux 内核在XSDK 和 XSCT 中使用的 RPU 裸机和 FreeRTOS 源码
其他示例:
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 根文件系统(请参阅 [[ /support/documentation/sw_manuals/xilinx_3/ug1186-zynq-openamp-gsg.pdf|UG1186 ]] ch. 3) 你可以在目标目录 /lib/firmware 中 tftp 它们
检查 remoteproc 驱动程序是否已经加载(通常是如果你的设备树配置正确):
root@plnx_aarch64:/lib/firmware# lsmodTainted: Gvirtio_rpmsg_bus 20480 0 - Live 0xffffff800098e000rpmsg_core 16384 1 virtio_rpmsg_bus, Live 0xffffff800097c000zynqmp_r5_remoteproc 16384 0 - Live 0xffffff800096a000remoteproc 40960 1 zynqmp_r5_remoteproc, Live 0xffffff8000959000virtio 16384 2 virtio_rpmsg_bus,remoteproc, Live 0xffffff8000951000virtio_ring 20480 2 virtio_rpmsg_bus,remoteproc, Live 0xffffff8000948000uio_pdrv_genirq 16384 0 - Live 0xffffff8000940000
加载 rpmsg_user_dev_driver LKM:
root@plnx_aarch64:/lib/firmware# modprobe rpmsg_user_dev_driver
启动 RPU-0:
root@plnx_aarch64:/lib/firmware# echo image_echo_test_r5_0 > /sys/class/remoteproc/remoteproc0/firmwareroot@plnx_aarch64:/lib/firmware#root@plnx_aarch64:/lib/firmware# echo start > /sys/class/remoteproc/remoteproc0/stateroot@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 resourceInit remoteproc resource succeededWaiting 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_proberoot@plnx_aarch64:/lib/firmware# [70983.055535] rpmsg_user_dev_driver virtio0:rpmsg-openamp-demo-channel: new channel: 0x400 -> 0x1!
启动 RPU-1:
root@plnx_aarch64:/lib/firmware# echo image_echo_test_r5_1 > /sys/class/remoteproc/remoteproc1/firmwareroot@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 resourceInit remoteproc resource succeededWaiting 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_proberoot@plnx_aarch64:/lib/firmware# [71185.252200] rpmsg_user_dev_driver virtio1:rpmsg-openamp-demo-channel: new channel: 0x400 -> 0x1!
使用串行端口或其他 telnet 或 ssh 连接运行带有 RPU-0 的 echo_test Linux 应用程序:
root@plnx_aarch64:/lib/firmware# echo_testEcho test startOpen rpmsg dev![71507.962881] rpmsg_user_dev_driver virtio0:rpmsg-openamp-demo-channel: Sent init_msg to target 0x1.
使用另一个连接(telnet、ssh…)运行带有 RPU-1 的并发 echo_test Linux 应用程序:
root@plnx_aarch64:/lib/firmware# echo_test -d /dev/rpmsg1Echo test startOpen 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
设置设备树
将以下设备树内容添加到 <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";};
使用“ petalinux-config -c rootfs ”启用 OpenAMP 和 libmetal 包:
Filesystem Packages --->libs --->libmetal --->[*] libmetalopen-amp --->[*] open-amp
使用 XSDK 构建 Linux OpenAMP 用户空间应用程序
为 Linux 和 A53 创建空应用程序 操作系统:Linux处理器:psu_cortexa53Linux 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 herehelper.c from here 以及链接中三个 OpenAMP 应用程序之一的 Linux 文件: OpenAMP echo-testOpenAMP matrix multiplication DemoOpenAMP 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/firmwareinstall -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 通信
使用从 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 resourceInit remoteproc resource succeededWaiting for events...
使用串行端口或其他 telnet 或 ssh 连接运行带有 RPU-0 的 proxy_app-openamp Linux 应用程序:
root@plnx_aarch64# proxy_app-openampmetal: info: metal_uio_dev_open: No IRQ for device 3ed20000.shm.initializing rpmsg vdevTry to create rpmsg endpoint.Successfully created rpmsg endpoint.Successfully open shm device.Successfully added shared memorySuccessfully probed IPI deviceSuccessfully initialized Linux r5 remoteproc.Successfully initialized remoteprocCalling mmap resource table.Successfully mmap resource table.Successfully set resource table to remoteproc.Creating virtio...Successfully created virtio device.initializing rpmsg vdevmetal: info: Initializating I/Os redirection...Master> Remote proc resource initialized.Master> RPMSG channel has created.Remote>Baremetal Remote Procedure Call (RPC) Demonstration
使用另一个连接(telnet、ssh…)运行具有 RPU-1 的并发 proxy_app-openamp Linux 应用程序:
root@xilinx-zcu102-_3:~# linux_proxy_userspace_to_r5_1.elfmetal: 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 projectpetalinux-create -t apps --template install -n <app_name> --enable
将固件(.elf 文件)复制到 project-spec/meta-user/recipes-apps/<app_name>/files/ 目录.修改 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/firmwareinstall -m 0644 ${S}/<myfirmware> ${D}/lib/firmware/<myfirmware>}FILES_${PN} = "/lib/firmware/<myfirmware>
在 PetaLinux 项目中使用“petalinux-build”命令构建 Linux 映像。 在 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 domainIDs. As APU will need to use the power domain ID to requestaccess 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>;} ;};};
运行以下命令来构建我们的 petalinux 项目。
petalinux-build
启动 Petalinux 项目后,运行以下命令将 RPU 固件启动到 RPU。
echo <name of firmware> > /sys/class/remoteproc/remoteproc0/firmware
运行 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 通信。
设置远程固件
用户可以使用,例如,类似于在/support/documentation/sw_manuals/xilinx_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 Firmwaref,以获取有关如何创建此类 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
使用 petalinux 工具启用所需的软件包。例如,转到 petalinux 项目的最顶层目录并启动 rootfs 配置实用程序:启用应用程序所需的 rootfs 包。如果您从 UG1186 运行示例应用程序,则可以通过以下方式启用这些包:petalinux-config -c rootfsFilesystem 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
然后构建 petalinux 项目。
petalinux-build
加载固件并逐步启动固件: 登录 Linux,然后启动 RPU 固件,例如:
echo <fw_name> /sys/class/remoteproc/remoteproc0/firmwareecho 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 可以访问共享内存设备,必须对设备树进行一些修改。
例如,如果找到 [[@ /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的位置。