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 是否匹配。
六、关键配置速查
| 配置项 | 典型值 | 作用 |
|---|---|---|
| MACHINE | salvator-xs / h3ulcb / ulcb | 选择 SoC 与板级设备树、U-Boot 配置 |
| DISTRO | poky | 决定发行版特性与包管理策略 |
| ACCEPT_EULA_rcar | 1 | 接受 Renesas 专有组件许可 |
| DISTRO_FEATURES | opengl wayland | 启用图形与 Wayland 支持 |
| IMAGE_INSTALL_append | kernel-modules | 把内核模块装入 rootfs |
bitbake core-image-minimal 验证环境是否通畅,再编译 core-image-weston。这样能把“环境问题”和“图形栈问题”分开定位,节省大量排查时间。lsblk 或 dmesg 确认设备节点。把 /dev/sda 误写成 /dev/sdb 会直接破坏主机系统盘,且不可逆。走完这一遍之后,你会得到一张可启动的 SD 卡镜像,并掌握 Yocto 构建 R-Car BSP 的完整闭环。后续无论是改内核配置、加自定义配方,还是切换到其他 R-Car 板型,都只是在这条链路上替换 MACHINE、层或配方,而不是重新理解整套流程。