MYZR RZ/V2H EK320 多核异构与 Docker 适配镜像编译指南



本文档记录了如何利用明远智睿提供的镜像、TF-A、U-Boot 以及内核源码,结合官方的 Multi-OS 补丁,基于 Yocto/Poky 重新编译具备运行 Docker 和 Multi-OS(Remoteproc)能力的适配 EK320 开发板的镜像。在开发板上对多核异构及docker功能进行验证。由于tf-a以及uboot源码是博主单独联系明远智睿工程师获得的,是否可以开源出来还需征求厂家允许。下面贴出本文的一些参考链接:

RZ/V2H Quick Start Guide for RZ Multi-OS Package多核异构参考应用文档

RZ Common System Release Package | Renesas ルネサスRZ通用系统包

https://docs.myzr.com.cn明远智睿ek320调试文档

RZ/V2H BSP Manual Set (RTK0EF0045Z94001AZJ-v1.0.1.zip) | Renesas 瑞萨电子RZ/V2H BSP Manual

Renesas RZ/V AI | The best solution for starting your AI applications.RZ/V2H evk镜像编译教程

RZV Getting Started with Flexible Software Package e2studio配置RZ/V2H开发环境教程

参考下载链接:

https://pan.baidu.com/s/16vUZhdR6dh_xncWr7ice0g 明远智睿镜像 提取码: xwyd

ROS2 Installation Guide for the RZ/V2H | Renesas 瑞萨电子 ROS2安装指导(处理docker依赖)

RZ 多操作系统软件包 | Renesas 瑞萨电子

0. 环境准备 (Prerequisites)

  • 操作系统:必须使用 Windows WSL2 安装 Ubuntu 20.04 版本(严禁使用其他版本,否则会引发不可预知的软件包版本冲突)。
  • 核心源码包
    • tfa 源码
    • uboot 源码
    • r01an7254ej0320_rzv-multi-os-pkg.zip (⚠️ 注意:必须为 3.20 版本,否则自动打补丁大概率失败)。
    • rzv2h_ai_sdk_v500.tar.gz
    • 内核源码压缩包

1. Bootloader 与 TF-A 源码准备与修补

1.1 解压与补丁准备

在 Windows 下解压 r01an7254ej0320_rzv-multi-os-pkg.zip,提取其中的 meta-rz-features_multi-os_v3.2.0.tar.gz 拷贝至 WSL2 的 ~ (home) 目录下并解压。

将 TF-A 和 U-Boot 源码包拷贝至 home 目录解压后,删除原压缩包。

  • TF-A 补丁:将 meta-rz-features/meta-rz-multi-os/meta-rzv2h/recipes-bsp/trusted-firmware-a/files/ 中的 4 个补丁文件拷贝至 TF-A 源码根目录。
  • U-Boot 补丁:将 meta-rz-features/meta-rz-multi-os/meta-rzv2h/recipes-bsp/u-boot/files/ 中的 2 个补丁文件拷贝至 U-Boot 源码根目录。

分别进入 TF-A 和 U-Boot 的根目录,执行并打入所有补丁文件

1.2 开启 MCPU 对 SRAM 的访问权限

为确保协处理器能够正常访问共享内存,需要修改 TF-A 源码:

  1. 打开 rzv-tfa-5.10.145/plat/renesas/rz/soc/v2h/platform.mk,在约第 78 行插入:MakefileENABLE_SRAM_REGION_ACCESS_MCPU := 1
  2. 打开 plat/renesas/rz/soc/v2h/plat_security.c,在所有 #include 声明之前添加宏定义:C#define ENABLE_SRAM_REGION_ACCESS_MCPU 1

操作提示:修改完成后,将 TF-A 和 U-Boot 源码重新压缩,严格命名为 tfa.tar.gzuboot.tar.gz


2. Yocto 编译环境配置与初次构建

2.1 安装系统依赖包

Bash

sudo apt update
sudo apt install -y gawk wget git diffstat unzip texinfo gcc build-essential chrpath socat cpio python3 python3-pip python3-pexpect xz-utils debianutils iputils-ping python3-git python3-jinja2 libegl1-mesa libsdl1.2-dev pylint3 xterm language-pack-en

sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8

提示:安装完成后请重启 WSL2 以确保语言环境变量生效。

2.2 初始化 Yocto 环境

解压 SDK 包并初始化环境:

Bash

cd ~
tar -zxvf rzv2h_ai_sdk_v500.tar.gz
cd ~/rzv2h_ai_sdk_v500 

# 再次确保环境变量正确
sudo locale-gen en_US.UTF-8
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8

# 初始化 Poky 构建环境
TEMPLATECONF=~/rzv2h_ai_sdk_v500/meta-renesas/meta-rzv2h/docs/template/conf/ source poky/oe-init-build-env
cd ~/rzv2h_ai_sdk_v500

2.3 网络代理配置 (防 Fetch 失败)

Yocto 构建极其依赖网络,建议配置 Git 及环境变量代理:

Bash

# 替换为您的代理 IP 和端口
git config --global http.proxy http://账号:密码@代理IP:端口号
git config --global https.proxy http://账号:密码@代理IP:端口号
export http_proxy="http://账号:密码@代理IP:端口号"
export https_proxy="http://账号:密码@代理IP:端口号"

2.4 执行编译

Bash

选择对应内存大小的板子 (例如 rvb)。

./build-myzr-rzv2h-ek320.sh

异常处理:若运行后期报错中断,查看 home 根目录是否生成了 downloads 文件夹。将之前打包好的 tfa.tar.gzuboot.tar.gz 拷贝进该目录,重新执行脚本即可。

编译完成后,前往 build/tmp/deploy/images/myzr-rzv2h-ek320 提取 bl2_bp_emmc-myzr-rzv2h-ek320.srecfip-myzr-rzv2h-ek320.srec。将这两个文件烧录至开发板,即可开放 Linux 对 CM33_sram 的读写权限。


3. 设备树 (DTS) 定制与协处理器配置

为了方便后续频繁修改内核,第二阶段改用 Poky 工具链 直接编译内核源码。

3.1 准备独立内核编译环境

  1. 将内核源码解压至 ~/linux
  2. MYZR-RZV2H/3.软件资料/Linux-5.10.145/3.3-工具/poky 中的 poky-glibc-x86_64-core-image-weston-aarch64-myzr-rzv2h-ek320-toolchain-3.1.31.sh 拷贝至 home 目录并运行安装。
  3. ~/meta-rz-features/meta-rz-multi-os/meta-rzv2h/recipes-kernel/linux/linux-renesas 中的补丁拷贝至 ~/linux 并执行打补丁操作(遇到失败可暂略,主要为驱动打补丁)。

3.2 移植 Multi-OS 设备树配置

~/linux/arch/arm64/boot/dts/renesas/r9a09g057h4-evk-multi-os.dtsi 拷贝至 ~/linux/arch/arm64/boot/dts/myzr/ 目录中。

修改 r9a09g057.dtsi

使用 VS Code (code .) 打开 ~/linux/arch/arm64/boot/dts/myzr/r9a09g057.dtsi,在文件末尾附近(约 2293 行处)添加 CM33 协处理器节点:

DTS

cm33_rproc: cm33 {
    compatible = "renesas,rz-cm33";
    reg = <0x0 0x08000000 0x0 0x00FFFFF>, [cite: 2]
          <0x0 0x40010000 0x0 0x3EF0000>; [cite: 2]
    reg-names = "cm33_sram", "cm33_ddr";
    memory-region = <&vdev0vring0>, <&vdev0vring1>, <&vdev0buffer>; [cite: 3]
    renesas,rz-cpg = <&cpg>;
    renesas,rz-sysc = <&sysc>;
    renesas,rz-bootaddrs = <0x08003000>, <0x18003000>; 
    renesas,rz-rsctbl = <0x42F00000>;
    clocks = <&cpg CPG_MOD R9A09G057_CM33_CLK_1>; [cite: 4]
    clock-names = "cm33clk1";
    resets = <&cpg R9A09G057_CM33_RESET2>,
             <&cpg R9A09G057_CM33_RESET0>,
             <&cpg R9A09G057_CM33_RESET1>;
    reset-names = "cm33reset2", "cm33reset0", "cm33reset1"; [cite: 5]
    power-domains = <&cpg>;
    status = "okay";
};

修改板级设备树 myzr-rzv2h-ek320.dts

  1. 在文件顶部引入头文件:#include "r9a09g057h4-evk-multi-os.dtsi"
  2. reserved_memory 节点内(约 142 行处),添加共享 DMA 池:

DTS

vdev0vring0: vdev0vring0@43000000 {
			compatible = "shared-dma-pool";
			reg = <0x0 0x43000000 0x0 0x50000>;
			no-map;
		};
	
		vdev0vring1: vdev0vring1@43050000 {
			compatible = "shared-dma-pool";
			reg = <0x0 0x43050000 0x0 0x50000>;
			no-map;
		};

		vdev0buffer: vdev0buffer@43200000 {
			compatible = "shared-dma-pool";
			reg = <0x0 0x43200000 0x0 0x300000>;
			no-map;
		};

至此设备树的修改结束


4. 内核驱动集成与 Docker 依赖配置

4.1 集成 AWO Notifier 驱动

  1. awo-notifier.c 拷贝至 ~/linux/drivers/soc/renesas/
  2. 修改 ~/linux/drivers/soc/renesas/Kconfig,在末尾 endif 前添加:

代码段

config AWO_NOTIFIER
	tristate "AWO Notifier support for RZ/V2H"
	depends on ARCH_RENESAS
	help
	  Say Y or M here to enable the AWO Notifier driver for Renesas RZ/V2H.

3. 修改 ~/linux/drivers/soc/renesas/Makefile,在末尾追加:

obj-$(CONFIG_AWO_NOTIFIER) += awo-notifier.o

4.2 Menuconfig设置

进入linux目录,在命令行输入make ARCH=arm64 menuconfig进入menuconfig菜单

(1). 开启 Cgroups 和 Namespaces(资源隔离核心)

路径:General setup --->

  • [*] Control Group support --->
    • 进入后,将里面的 Memory, CPU, PIDs, Device 等子选项全部勾选。
  • [*] Namespaces support --->
    • 进入后,将 User, PID, Network namespaces 等子选项全部勾选。

(2). 开启网络桥接与防火墙(Docker 联网核心)

路径:Networking support ---> Networking options --->

  • [*] 802.1d Ethernet Bridging
  • [*] Network packet filtering framework (Netfilter) --->
    • 进入后找到 IP: Netfilter Configuration,将里面的 iptables, NAT, MASQUERADE 等选项尽可能全选。

(3). 开启虚拟网卡(容器通信核心)

路径:Device Drivers ---> Network device support --->

  • [*] MAC-VLAN support
  • [*] Virtual ethernet pair device (此项即 veth,极其重要)

(4). 开启联合文件系统(容器存储核心)

路径:File systems --->

  • [*] Overlay filesystem support

(5). 开启AWO NOTIFIER

路径:File systems --->

  • [*] Renesas SoC Platforms

路径:Device Drivers --->SOC (System On Chip)specific Drivers--->

  • [*] AWO NOTIFIER support for RZ/V2H

4.3 注入 Docker 与 Remoteproc 内核配置

进入 Poky 环境并清理旧变量:

Bash

unset LD_LIBRARY_PATH LDFLAGS CFLAGS CXXFLAGS
source /opt/poky/3.1.31/environment-setup-aarch64-poky-linux

为内核追加 Docker 网络及 Multi-OS 所需的基础配置宏:

Bash

cat << 'EOF' >> .config
CONFIG_CGROUP_FREEZER=y
CONFIG_CGROUP_BPF=y
CONFIG_BRIDGE_NETFILTER=y
CONFIG_NETFILTER=y
CONFIG_NETFILTER_ADVANCED=y
CONFIG_NF_CONNTRACK=y
CONFIG_NF_NAT=y
CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=y
CONFIG_NETFILTER_XT_MATCH_CONNTRACK=y
CONFIG_NETFILTER_XT_MATCH_IPVS=y
CONFIG_NETFILTER_XT_MARK=y
CONFIG_IP_NF_IPTABLES=y
CONFIG_IP_NF_FILTER=y
CONFIG_IP_NF_NAT=y
CONFIG_IP_NF_TARGET_MASQUERADE=y
CONFIG_IP_NF_MANGLE=y
CONFIG_IP_NF_RAW=y
CONFIG_IP6_NF_IPTABLES=y
CONFIG_IP6_NF_FILTER=y
CONFIG_IP6_NF_NAT=y
CONFIG_IP6_NF_TARGET_MASQUERADE=y
CONFIG_IP6_NF_MANGLE=y
CONFIG_IP6_NF_RAW=y
CONFIG_REMOTEPROC=y
CONFIG_RZ_REMOTEPROC=y
CONFIG_UIO=y
CONFIG_UIO_PDRV_GENIRQ=y
CONFIG_UIO_DMEM_GENIRQ=y
CONFIG_AWO_NOTIFIER=y
EOF

5. 编译与根文件系统 (Rootfs) 替换方案

5.1 编译内核与设备树

在进行编译之前要对一个文件进行修改:~/linux/drivers/drp/drp-if.c

在233行的位置,将DRP_CH_NUM更改为8。

应用新配置并开始并行编译(因为新驱动直接打入 Image 中,所以无需额外编译 modules):

Bash

make ARCH=arm64 olddefconfig
make ARCH=arm64 CROSS_COMPILE=aarch64-poky-linux- -j16 Image dtbs
  • 内核镜像路径~/linux/arch/arm64/boot/Image
  • 设备树路径~/linux/arch/arm64/boot/dts/myzr/ 取出相应的 .dtb 文件。

随后将获得的bl2、fip、dtb、Image将原厂的替换掉重新烧录即可!!(如果烧录的时候出现报错可以先输入setenv fdt_high 0xffffffffffffffff在输入run bootcmd_usb)至此系统镜像构建完毕,接下来是多核异构通信的验证。

5.2 升级为 Ubuntu Rootfs (可选)

如果不习惯 Yocto 默认构建的缺少包管理器的系统,可以通过以下两种方式升级替换 Rootfs:

  1. 手动构建:使用 debootstrap 工具从头构建一个 Ubuntu 22.04 minbase 版本的 Rootfs(无桌面环境)。此方案已验证可成功驱动无线网卡并安装 ROS2,外设驱动需进一步适配。
  2. 官方提取:参考 RZ Common System Release Package 的编译方法,完整编译出一个 Ubuntu 镜像,从中提取完整的 Rootfs 替换并烧录。

6. 编译官方通信示例

6.1 编译A55应用实例

(1). 环境准备与初始化

在 Ubuntu 宿主机(WSL/虚拟机)中,进入 Yocto 工程目录并初始化编译环境。

  1. 加载 Yocto 环境变量source poky/oe-init-build-env
  2. 添加 Multi-OS Layerbitbake-layers add-layer ~/meta-rz-features/meta-rz-multi-os/meta-rzv2h

(2). 编译应用与依赖库

利用 Bitbake 编译用户态测试程序及其依赖的底层库 libmetalopen-amp

  • 执行编译命令bitbake rpmsg-sample open-amp libmetal sysfsutils

(3).提取编译产物

编译完成后,从 Yocto 的 tmp/work 目录中提取所需的可执行文件和动态链接库(.so)。

1. 文件搜索路径参考

文件类型搜索命令关键目录位置 (image 目录下)
可执行程序find tmp/work/ -name "rpmsg_sample_client" -type f -executableusr/bin/
基础依赖库find tmp/work/ -name "libmetal.so*"usr/lib64/
通信协议库find tmp/work/ -name "libopen_amp.so*"usr/lib64/
系统接口库find tmp/work/ -name "libsysfs.so*"lib64/

2. 打包与复制到 Windows

为了保留 Linux 的软链接属性,建议先打包再复制到桌面(用户:paroxetine)。

Bash

# 收集文件到临时目录
mkdir -p ~/ipc_package
cp tmp/work/aarch64-poky-linux/rpmsg-sample/*/image/usr/bin/rpmsg_sample_client ~/ipc_package/
cp -d tmp/work/aarch64-poky-linux/libmetal/*/image/usr/lib64/libmetal.so* ~/ipc_package/
cp -d tmp/work/aarch64-poky-linux/open-amp/*/image/usr/lib64/libopen_amp.so* ~/ipc_package/
cp -d tmp/work/aarch64-poky-linux/sysfsutils/*/image/lib64/libsysfs.so* ~/ipc_package/

# 打包并复制
tar -czvf ~/rzv2h_ipc_final.tar.gz -C ~ ipc_package/
cp ~/rzv2h_ipc_final.tar.gz /mnt/c/Users/paroxetine/Desktop/

(4).开发板端部署

将 U 盘接入开发板,挂载并完成文件分发。

  1. 解压安装包mount /dev/sda1 /mnttar -xzvf /mnt/rzv2h_ipc_final.tar.gz -C /tmp/
  2. 分发文件并赋予权限cp /tmp/ipc_package/rpmsg_sample_client /usr/bin/chmod +x /usr/bin/rpmsg_sample_clientcp -d /tmp/ipc_package/*.so* /usr/lib64/ (若无此目录则用 /usr/lib/)
  3. 刷新动态库缓存ldconfig

6.2 编译CM33固件

(1). 环境准备

按照参考链接6下载e2studio并配置适用于RZ/V2H的开发环境。

(1). 工程准备

在自己喜欢的地方新建一个文件夹作为工程的工作目录。

解压缩文件”r01an7254ej0320_rzv-multi-os-pkg\r01an7254ej0320_rzv-multi-os-pkg\rpmsg_demo_projects\RZV2H\rzv2h_cm33_rpmsg_linux-rtos_demo.zip”。

打开e2studio,工作目录选择刚刚新建的目录。

点击左上角文件,选择导入->常规->双击现有项目到工作空间中->选择根目录浏览(找到刚刚解压出来的文件夹)->完成。成功将工程导入。

点击窗口->显示视图->项目资源管理器,可以把工程文件夹试图调出来。

更改以下两个配置:

  • 单击项目根文件夹->点击上方导航栏项目->选择属性->选择C/C++构建->设置->选择Cross ARM C Linker->General,将右边的Script files中的第一行改为”../script/rzv2h_evk_cm.ld”。点击应用并关闭。
  • 打开src/platform_info.h 文件,将98行改为#define ENABLE_REMOTEPROC (1U)。

修改完成后点击上方的锤子进行编译,完成编译后在debug文件夹下rzv2h_cm33_rpmsg_linux-rtos_demo.elf就是我们需要的固件,将他拷贝到U盘上,插上开发板,依次执行以下命令:

bash

mount /dev/sda1 /mnt
cp /mnt/rzv2h_cm33_rpmsg_linux-rtos_demo.elf /lib/firmware

echo rzv2h_cm33_rpmsg_linux-rtos_demo.elf > /sys/class/remoteproc/remoteproc0/firmware

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

这个时候会看到仅输出一行:remoteprocremoteproc0: unsupported resource 4。这意味着我们的CM33以已经开始运行起来了。继续在命令行输入:

bash

rpmsg_sample_client

如果运行正常会输出以下内容:

root@myzr-rzv2h-ek320:~# rpmsg_sample_client

[511] proc_id:0 rsc_id:0 mbx_id:[ 1875.153401] imx462 0-001f: cannot get pwn-gpios

1

[ 1875.159910] imx462 1-001f: cannot get pwn-gpios

metal: info:      metal_uio_dev_open: No IRQ for[ 1875.167313] imx462 2-001f: cannot get pwn-gpios

 device 10480000.mbox-uio.

[511] Succes[ 1875.175331] imx462 3-001f: cannot get pwn-gpios

sfully probed IPI device

metal: info:      metal_uio_dev_open: No IRQ for device 42f000[ 1875.187352] imx462 0-001f: cannot get pwn-gpios

00.rsctbl.

[511] Succes[ 1875.194053] imx462 1-001f: cannot get pwn-gpios

sfully open uio [ 1875.200422] imx462 2-001f: cannot get pwn-gpios

device: 42f00000.rsctbl.[ 1875.206440] imx462 3-001f: cannot get pwn-gpios



[511] Successfully added memory device 42f00000.rsctbl.

metal: info:      metal_uio_dev_open: No IRQ for device 43000000.vring-ctl0.

[511] Successfully open uio device: 43000000.vring-ctl0.

[511] Successfully added memory device 43000000.vring-ctl0.

metal: info:      metal_uio_dev_open: No IRQ for device 43200000.vring-shm0.

[511] Successfully open uio device: 43200000.vring-shm0.

[511] Successfully added memory device 43200000.vring-shm0.

metal: info:      metal_uio_dev_open: No IRQ for device 43100000.vring-ctl1.

[511] Successfully open uio device: 43100000.vring-ctl1.

[511] Successfully added memory device 43100000.vring-ctl1.

metal: info:      metal_uio_dev_open: No IRQ for device 43500000.vring-shm1.

[511] Successfully open uio device: 43500000.vring-shm1.

[511] Successfully added memory device 43500000.vring-shm1.

metal: info:      metal_uio_dev_open: No IRQ for device 42f01000.mhu-shm.

[511] Successfully open uio device: 42f01000.mhu-shm.

[511] Successfully added memory device 42f01000.mhu-shm.

[511] Initialize remoteproc successfully.

[511] proc_id:1 rsc_id:1 mbx_id:1

[511] Initialize remoteproc successfully.

[511] proc_id:0 rsc_id:0 mbx_id:2

[511] Initialize remoteproc successfully.

[511] proc_id:1 rsc_id:1 mbx_id:2

[511] Initialize remoteproc successfully.

[511] proc_id:0 rsc_id:0 mbx_id:3

[511] Initialize remoteproc successfully.

[511] proc_id:1 rsc_id:1 mbx_id:3

[511] Initialize remoteproc successfully.



******************************************

*   rpmsg communication sample program   *

******************************************



1. communicate with CM33      ch0

2. communicate with CM33      ch1

3. communicate with CR8 core0 ch0

4. communicate with CR8 core0 ch1

5. communicate with CR8 core1 ch0

6. communicate with CR8 core1 ch1

7. communicate with CM33 ch0 and CR8 core0 ch1

8. communicate with CM33 ch0 and CR8 core1 ch1

9. communicate with CR8 core0 ch0 and CR8 core1 ch1





e. exit



please input

>

输入1,点击回车,就会开始运行通信测试。最终结果如下:

可以发现成功接收488字节,说明多核异构核间通信配置成功!随后我们就可以根据瑞萨multi-os文档指引开始改造官方提供的sample源码来构建符合自己需求功能的固件!

,

《“MYZR RZ/V2H EK320 多核异构与 Docker 适配镜像编译指南”》 有 1 条评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注