3. Yocto构建R-Car BSP实战

R-Car BSP 的官方交付形态是 Yocto 层(meta-renesas 及其依赖层),而不是一个可以直接烧写的完整镜像。这意味着拿到 BSP 之后,必须自己走一遍 Yocto 的构建流程,才能得到可启动的 SD 卡镜像。本节以 R-Car H3/M3(如 Salvator-XS、ULCB 系列)为对象,完整走通“搭环境 → 取层 → 配 MACHINE/DISTRO → 编译 core-image-weston → 生成 SD 卡镜像 → 首次启动”这条链路。

一、主机环境与依赖准备

Yocto 对宿主机的版本比较敏感,Renesas 官方通常推荐 Ubuntu 20.04/22.04 LTS 的 64 位系统,磁盘建议预留 150 GB 以上(含 sstate 缓存与多个构建目录),内存 16 GB 起步,编译时最好给到 8 核以上。先安装基础依赖:

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 \
  pylint xterm zstd liblz4-tool file locales
sudo locale-gen en_US.UTF-8

随后安装 repo 工具,它是管理 Yocto 多仓库清单的关键:

mkdir -p ~/bin
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
export PATH=~/bin:$PATH

这里有一个容易踩的坑:git 必须配置 user.name 和 user.email,否则 repo 同步会在中途报错。另外,若使用代理,需要同时给 git 和 bitbake 的 fetcher 配置代理,否则下载源码包时会卡住。

二、获取 Renesas BSP 层

Renesas 的 Yocto BSP 通过一个 manifest 仓库统一管理,典型做法是:

mkdir ~/rcar-yocto && cd ~/rcar-yocto
repo init -u https://github.com/renesas-rcar/renesas-yocto-manifest.git \
  -b master -m rcar-v5.1.xml
repo sync -j8

同步完成后,目录下会出现 poky、meta-renesas、meta-openembedded、meta-qt5 等层。其中 meta-renesas 是核心 BSP 层,包含 R-Car 的机器配置、内核配方、U-Boot 配方以及专有的图形/多媒体组件(如 GPU 驱动、视频编解码库)。meta-renesas/meta-rcar-gen3 下按 SoC 代际划分,H3、M3、M3N、E3 等都在其中。

需要特别注意的是,Renesas 的部分组件(如图形驱动)受许可协议约束,首次构建前需要接受 EULA。通常做法是在 local.conf 中设置:

LICENSE_FLAGS_ACCEPTED = "commercial"
ACCEPT_EULA_rcar = "1"

如果漏掉这一步,bitbake 会在解析配方阶段直接报错,提示某个包因许可标志被跳过。

三、初始化构建环境与配置 MACHINE/DISTRO

进入 poky 目录,执行环境初始化脚本,并指定目标机器:

cd ~/rcar-yocto/poky
source oe-init-build-env ../build-h3

这会创建 build-h3 目录并生成 conf/local.conf 与 conf/bblayers.conf。接下来编辑 bblayers.conf,把 Renesas 相关层加入:

BBLAYERS ?= " \
  ${TOPDIR}/../poky/meta \
  ${TOPDIR}/../poky/meta-poky \
  ${TOPDIR}/../meta-renesas \
  ${TOPDIR}/../meta-renesas/meta-rcar-gen3 \
  ${TOPDIR}/../meta-openembedded/meta-oe \
  ${TOPDIR}/../meta-openembedded/meta-python \
  ${TOPDIR}/../meta-openembedded/meta-multimedia \
  ${TOPDIR}/../meta-openembedded/meta-networking \
"

然后在 local.conf 中设置机器与发行版:

MACHINE = "salvator-xs"
DISTRO = "poky"
PACKAGE_CLASSES = "package_ipk"
IMAGE_INSTALL_append = " kernel-modules"

MACHINE 决定了内核设备树、U-Boot 配置和启动参数。以 Salvator-XS(H3)为例,可选 salvator-xs;ULCB 则用 ulcb 或 h3ulcb。DISTRO 一般保持 poky,若需要 Weston 的特定后端,可在 local.conf 中追加 DISTRO_FEATURES_append = " opengl wayland"。配置完成后,可以用 bitbake -e 快速确认变量是否生效:

bitbake -e | grep -E "^MACHINE=|^DISTRO="

四、编译 core-image-weston

core-image-weston 是 Yocto 提供的带 Weston(Wayland 合成器)的参考镜像,适合验证 R-Car 的显示与图形栈。首次编译建议先构建工具链,再构建镜像:

bitbake core-image-weston

首次构建耗时较长(视机器性能,通常 2~6 小时),过程中会依次完成:下载源码包 → 解压 → 打补丁 → 配置 → 编译 → 打包 → 生成 rootfs。若中途失败,优先看 tmp/work/.../temp/log.do_compile 这类日志,而不是只看终端最后几行。常见失败原因包括:网络下载超时、EULA 未接受、bblayers 路径写错、以及宿主机缺少某个依赖包。

编译成功后,镜像产物位于 tmp/deploy/images/<MACHINE>/ 下,典型文件包括:

  • core-image-weston-<MACHINE>.wic:可直接写入 SD 卡的完整镜像;
  • Image 或 Image-<MACHINE>.bin:内核镜像;
  • u-boot-<MACHINE>.bin:U-Boot 二进制;
  • *.dtb:设备树二进制。

五、生成 SD 卡镜像并首次启动

如果使用 .wic 文件,直接写入即可:

sudo dd if=core-image-weston-salvator-xs.wic of=/dev/sdX bs=4M conv=fsync
sync

其中 /dev/sdX 是 SD 卡设备节点,务必用 lsblk 确认,写错会覆盖主机磁盘。若 BSP 未提供 wic,则需要按 Renesas 文档手动分区:通常分为 FAT 分区(存放 U-Boot、内核、dtb)和 ext4 分区(rootfs),再用 tar 解压 rootfs。

首次启动时,把 SD 卡插入开发板,设置启动模式为 SD 启动,接好串口(通常 115200 8N1)。上电后应能看到 U-Boot 打印、内核启动日志,最终进入 Weston 桌面或登录提示。判断启动是否成功,可以看三个信号:串口是否出现内核 Kernel command line 与 Run /sbin/init;是否出现 Weston 的 weston.service 启动日志;以及 HDMI 是否有画面输出。若卡在 U-Boot 阶段,多半是启动模式或 SD 卡分区不对;若内核 panic,则优先检查 dtb 与 MACHINE 是否匹配。

R-Car Yocto BSP 构建与启动链路 宿主机环境 Ubuntu 20.04/22.04 repo / git / 依赖包 磁盘 ≥150GB,内存 ≥16GB locale en_US.UTF-8 获取 Renesas BSP 层 repo init -u renesas-yocto-manifest repo sync -j8 meta-renesas / meta-rcar-gen3 接受 EULA:ACCEPT_EULA_rcar=1 配置 MACHINE / DISTRO MACHINE = "salvator-xs" DISTRO = "poky" bblayers.conf 加入 meta-renesas DISTRO_FEATURES += opengl wayland 编译镜像 bitbake core-image-weston 下载→编译→打包→rootfs 产物:.wic / Image / dtb 日志:tmp/work/.../temp 部署产物目录 tmp/deploy/images/<MACHINE>/ core-image-weston-<MACHINE>.wic 写入 SD 卡 sudo dd if=*.wic of=/dev/sdX bs=4M conv=fsync lsblk 确认设备节点,避免写错盘 开发板首次启动 SD 启动模式 · 串口 115200 8N1 · HDMI 输出 启动结果判读 ✓ 串口出现 Kernel command line ✓ weston.service 启动日志 ✓ HDMI 有画面输出 ✗ 卡 U-Boot:启动模式/分区 ✗ 内核 panic:dtb 与 MACHINE ✗ 无 Weston:DISTRO_FEATURES

六、关键配置速查

配置项典型值作用
MACHINEsalvator-xs / h3ulcb / ulcb选择 SoC 与板级设备树、U-Boot 配置
DISTROpoky决定发行版特性与包管理策略
ACCEPT_EULA_rcar1接受 Renesas 专有组件许可
DISTRO_FEATURESopengl wayland启用图形与 Wayland 支持
IMAGE_INSTALL_appendkernel-modules把内核模块装入 rootfs
首次构建建议先执行 bitbake core-image-minimal 验证环境是否通畅,再编译 core-image-weston。这样能把“环境问题”和“图形栈问题”分开定位,节省大量排查时间。
写入 SD 卡前务必用 lsblk 或 dmesg 确认设备节点。把 /dev/sda 误写成 /dev/sdb 会直接破坏主机系统盘,且不可逆。

走完这一遍之后,你会得到一张可启动的 SD 卡镜像,并掌握 Yocto 构建 R-Car BSP 的完整闭环。后续无论是改内核配置、加自定义配方,还是切换到其他 R-Car 板型,都只是在这条链路上替换 MACHINE、层或配方,而不是重新理解整套流程。