本文档记录了如何利用明远智睿提供的镜像、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依赖)
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 源码:
- 打开
rzv-tfa-5.10.145/plat/renesas/rz/soc/v2h/platform.mk,在约第 78 行插入:MakefileENABLE_SRAM_REGION_ACCESS_MCPU := 1 - 打开
plat/renesas/rz/soc/v2h/plat_security.c,在所有#include声明之前添加宏定义:C#define ENABLE_SRAM_REGION_ACCESS_MCPU 1
操作提示:修改完成后,将 TF-A 和 U-Boot 源码重新压缩,严格命名为
tfa.tar.gz和uboot.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.gz和uboot.tar.gz拷贝进该目录,重新执行脚本即可。
编译完成后,前往 build/tmp/deploy/images/myzr-rzv2h-ek320 提取 bl2_bp_emmc-myzr-rzv2h-ek320.srec 和 fip-myzr-rzv2h-ek320.srec。将这两个文件烧录至开发板,即可开放 Linux 对 CM33_sram 的读写权限。
3. 设备树 (DTS) 定制与协处理器配置
为了方便后续频繁修改内核,第二阶段改用 Poky 工具链 直接编译内核源码。
3.1 准备独立内核编译环境
- 将内核源码解压至
~/linux。 - 将
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 目录并运行安装。 - 将
~/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
- 在文件顶部引入头文件:
#include "r9a09g057h4-evk-multi-os.dtsi" - 在
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 驱动
- 将
awo-notifier.c拷贝至~/linux/drivers/soc/renesas/。 - 修改
~/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:
- 手动构建:使用
debootstrap工具从头构建一个 Ubuntu 22.04minbase版本的 Rootfs(无桌面环境)。此方案已验证可成功驱动无线网卡并安装 ROS2,外设驱动需进一步适配。 - 官方提取:参考 RZ Common System Release Package 的编译方法,完整编译出一个 Ubuntu 镜像,从中提取完整的 Rootfs 替换并烧录。
6. 编译官方通信示例
6.1 编译A55应用实例
(1). 环境准备与初始化
在 Ubuntu 宿主机(WSL/虚拟机)中,进入 Yocto 工程目录并初始化编译环境。
- 加载 Yocto 环境变量:
source poky/oe-init-build-env - 添加 Multi-OS Layer:
bitbake-layers add-layer ~/meta-rz-features/meta-rz-multi-os/meta-rzv2h
(2). 编译应用与依赖库
利用 Bitbake 编译用户态测试程序及其依赖的底层库 libmetal 和 open-amp。
- 执行编译命令:
bitbake rpmsg-sample open-amp libmetal sysfsutils
(3).提取编译产物
编译完成后,从 Yocto 的 tmp/work 目录中提取所需的可执行文件和动态链接库(.so)。
1. 文件搜索路径参考
| 文件类型 | 搜索命令 | 关键目录位置 (image 目录下) |
| 可执行程序 | find tmp/work/ -name "rpmsg_sample_client" -type f -executable | usr/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 盘接入开发板,挂载并完成文件分发。
- 解压安装包:
mount /dev/sda1 /mnttar -xzvf /mnt/rzv2h_ipc_final.tar.gz -C /tmp/ - 分发文件并赋予权限:
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/) - 刷新动态库缓存:
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 条评论
NB