1. 项目概述与核心目标折腾嵌入式开发板尤其是像瑞萨RZ/G2L这样的高性能MPU编译和烧录系统往往是新手入门的第一道坎也是老手们常踩坑的地方。我最近在调试一块基于RZ/G2L的SMARC规格核心板从搭建Yocto编译环境到最终把完整的Linux系统带Qt图形界面烧录进板子的SPI Flash整个过程走下来积累了不少实战经验。这篇文章我就来详细拆解一下从源码编译到板卡启动的完整流程特别是那些官方文档可能一笔带过但实际操作中却至关重要的细节和避坑点。无论你是刚接触RZ/G2L的工程师还是正在为类似平台的系统构建而头疼希望这篇基于真实操作记录的分享能给你提供一条清晰的路径。我们的核心目标很明确在一台Ubuntu主机上使用瑞萨官方提供的Yocto BSP板级支持包为SMARC-RZG2L开发板编译出包含Bootloader、Linux内核、设备树以及core-image-qt或core-image-weston文件系统的完整镜像包并最终通过串口和Flash Writer工具将这些镜像安全、正确地烧录到开发板的SPI Flash中实现从上电到图形界面启动的全过程。这个过程涉及交叉编译环境的搭建、Yocto BitBake命令的使用、串口终端调试以及底层烧录工具的操作我会逐一说明其背后的原理和操作意图。2. 编译环境准备与源码获取在开始敲命令之前我们必须把“战场”准备好。RZ/G2L的官方BSP基于Yocto项目这是一个功能强大但体系庞大的嵌入式Linux构建框架。环境准备不到位后续编译百分百会出错。2.1 系统与依赖环境搭建官方文档通常要求Ubuntu 18.04或20.04 LTS版本这是经过充分测试的。我强烈建议使用一台纯净的物理机或虚拟机安装Ubuntu 20.04 LTS避免在Windows WSL或过于陈旧的系统上进行可以规避大量因环境差异导致的诡异问题。主机性能至关重要因为完全编译一次Yocto工程非常消耗资源。我建议CPU至少4核8线程内存16GB以上并为编译目录预留至少150GB的SSD硬盘空间。机械硬盘的IO速度会成为编译过程的巨大瓶颈耗时可能成倍增加。安装必要的宿主机工具包是第一步。这些工具包括编译器、解释器、版本控制工具等是Yocto构建系统能够正常运行的基础。sudo apt-get update sudo apt-get install -y gawk wget git-core diffstat unzip texinfo gcc-multilib \ 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注意这里安装的是python3和python3-pip。Yocto项目已经全面转向Python 3如果你系统里默认的python命令指向的是Python 2可能会在后续步骤中遇到脚本执行错误。可以通过python --version和python3 --version来确认。2.2 BSP源码包解压与目录结构解析从瑞萨官网下载对应的BSP包例如RTK0EF0045Z0021AZJ-v3.0.3.zip版本号请以实际获取为准。这个压缩包内包含了Yocto的层layer配置、机器配置文件、食谱recipe以及一些预置的脚本。# 创建一个干净的工作目录路径不要有中文或空格 mkdir -p ~/rzg2l_work cd ~/rzg2l_work # 假设下载的zip包在此目录进行解压 unzip RTK0EF0045Z0021AZJ-v3.0.3.zip解压后你会得到一个类似rzg_vlp_v3.0.3的目录。其内部结构值得我们花一分钟了解一下meta-renesas/: 瑞萨提供的核心层包含了针对RZ/G系列芯片的机器定义、BSP配方、内核和U-Boot的补丁等。这是最重要的层。meta-rzg2l/(或类似名称): 可能包含更具体的RZ/G2L配置。poky/: Yocto Project的核心构建系统提供了BitBake工具和基础层。build/: 这是你后续执行编译命令的工作目录build directory。初始时它可能不存在或为空需要你通过source环境设置脚本来创建和配置。docs/: 官方文档里面那个r01us0553ej0107-rz-g.pdf就是我们的重要参考。各种setup-environment*脚本用于初始化构建环境的脚本。理解这个结构有助于你在出问题时知道该去哪个目录下找日志或配置文件而不是盲目地在整个工程里搜索。2.3 构建环境初始化与配置这是关键一步它设置了后续所有编译命令所需的环境变量特别是MACHINE类型。# 进入BSP根目录 cd ~/rzg2l_work/rzg_vlp_v3.0.3 # 初始化构建环境并指定机器类型为 smarc-rzg2l # 这个命令会创建或清空 build 目录并为其配置好指向各层layer的路径 source meta-renesas/setup-environment -m smarc-rzg2l执行完这条命令后你的终端提示符通常会发生变化表明你已经处于一个为smarc-rzg2l配置好的构建环境中。同时当前目录会自动切换到build下。此时你可以查看一下当前的环境变量echo $MACHINE应该显示smarc-rzg2l。这个MACHINE变量告诉BitBake你要为哪一款硬件平台构建镜像。SMARC是一种由SGET组织定义的嵌入式计算机模块标准我们的核心板符合这个标准。实操心得务必在每次打开新的终端进行编译操作前重新执行一次source命令来初始化环境。直接进入build目录而不设置环境变量会导致BitBake找不到正确的配置而失败。你可以把这条source命令加到你的终端配置文件如.bashrc里但更推荐每次手动执行避免环境污染。3. 系统镜像的编译与生成环境就绪接下来就是核心的编译环节。我们将使用Yocto的bitbake命令来构建目标。3.1 编译完整根文件系统镜像对于RZ/G2L这样的图形能力较强的MPU我们通常需要带图形界面的文件系统。瑞萨BSP提供了两个主要的图形镜像core-image-weston: 基于Wayland协议Weston是参考合成器的镜像更现代图形栈较新。core-image-qt: 基于Qt框架的镜像包含了Qt库和示例应用。如果你的应用基于Qt这个镜像更合适。编译命令的格式是固定的MACHINEmachine_name bitbake target_image由于我们已经通过source设置了MACHINE环境变量所以可以直接简化命令。编译第一个镜像以core-image-qt为例# 确保当前在 ~/rzg2l_work/rzg_vlp_v3.0.3/build 目录下 bitbake core-image-qt按下回车后BitBake就会开始它的工作。它会根据MACHINE的定义解析core-image-qt这个目标所依赖的所有食谱recipes包括Linux内核、U-Boot、各种库和应用程序然后从网络下载源码如果本地缓存没有进行配置、编译、安装最后打包成完整的根文件系统镜像。关于编译时间这是一个必须正视的问题。在一台性能中等的电脑上如4核i516GB内存SATA SSD首次完全编译from scratchcore-image-qt很可能需要6-12小时甚至更久。因为Yocto需要从头编译GCC交叉工具链、C库、内核以及Qt这样一个庞大的框架及其所有依赖。CPU会持续满载硬盘灯常亮。因此有几点建议使用预构建镜像瑞萨官方通常会在BSP包中或单独提供预编译好的镜像文件如RZG2L_VLP3.0.3_Pre-built_Images_EN.zip。对于初次上手、急于验证硬件或进行应用开发的人来说强烈建议直接使用预构建镜像跳过漫长的编译过程。你可以把它解压出来后续的烧录步骤完全通用。增量编译如果你修改了某个应用比如你自己的recipe再次运行bitbake core-image-qtYocto只会重新编译受影响的部分速度很快。并行编译设置在build/conf/local.conf文件中你可以调整BB_NUMBER_THREADS和PARALLEL_MAKE变量来匹配你CPU的核心数以最大化利用多核性能例如BB_NUMBER_THREADS 8 PARALLEL_MAKE -j 8编译成功后所有生成的镜像文件都会集中在tmp/deploy/images/smarc-rzg2l/目录下。这是我们下一步烧录所需的“弹药库”。3.2 编译与安装SDK交叉编译工具链如果你需要在主机上开发应用程序然后交叉编译到RZ/G2L板子上运行那么就需要SDK。SDK包含了针对目标平台aarch64-poky-linux的交叉编译器、头文件、库文件等。# 为 weston 镜像生成SDK bitbake core-image-weston -c populate_sdk # 或者为 qt 镜像生成SDK bitbake core-image-qt -c populate_sdk-c populate_sdk是BitBake的一个任务task它指示系统为指定的镜像打包生成SDK安装程序。编译完成后在tmp/deploy/sdk/目录下会找到类似poky-glibc-x86_64-core-image-qt-aarch64-smarc-rzg2l-toolchain-3.1.21.sh的脚本文件。将这个脚本拷贝到你需要安装的目录例如/opt/然后以root权限运行安装sudo sh poky-glibc-x86_64-core-image-qt-aarch64-smarc-rzg2l-toolchain-3.1.21.sh安装过程中会提示你选择安装路径默认是/opt/poky/3.1.21/。安装完成后你可以通过source该路径下的environment-setup-aarch64-poky-linux脚本来为当前终端配置好交叉编译环境之后就可以使用aarch64-poky-linux-gcc等命令了。注意事项SDK的版本如3.1.21必须与你镜像的Yocto版本匹配。用不匹配的SDK编译出的程序可能在板子上运行时出现链接库版本不兼容的错误。4. 烧录前的硬件准备与文件梳理在把编译好的成果灌入板子之前我们必须确保硬件状态正确并且清楚每个文件是干什么的。4.1 关键文件说明无论是自己编译还是使用预构建镜像在tmp/deploy/images/smarc-rzg2l/目录下我们会看到很多文件。对于启动烧录重点关注以下几类文件类型典型文件名示例作用Flash WriterFlash_Writer_SCIF_RZG2L_SMARC_PMIC_DDR4_2GB_1PCS.mot一个运行在芯片内部SRAM中的小程序用于通过SCIF串口与主机通信擦写外部SPI Flash。它是烧录过程的“引导者”。Bootloader Stage 2 (BL2)bl2_bp-smarc-rzg2l_pmic.srecARM Trusted Firmware (ATF)的第二阶段引导程序负责初始化DDR、PMIC等关键硬件并加载FIP。Firmware Image Package (FIP)fip-smarc-rzg2l_pmic.srec一个容器文件内部包含了U-Boot、ATF的其他组件以及可选的硬件密钥等。这是BL2下一步要加载的。Linux KernelImage-smarc-rzg2l.bin压缩的Linux内核镜像。Device Tree BlobImage-r9a07g044l2-smarc.dtb设备树二进制文件描述板级的硬件资源配置。Root Filesystemcore-image-qt-smarc-rzg2l.tar.bz2或core-image-qt-smarc-rzg2l.ext4根文件系统包含操作系统的基本命令、库和应用程序。为什么是.mot和.srec格式这两种都是包含地址信息的十六进制文件格式可以被串口烧录工具识别并发送到目标内存的指定地址。Flash Writer本身是一个.mot文件而BL2和FIP通常被转换成.srec格式供其加载。4.2 硬件连接与配置串口连接使用USB转TTL串口线连接电脑USB口和开发板的调试串口通常是J17接口。务必确认TX、RX、GND三根线连接正确。串口参数一般为115200 8N1波特率115200数据位8无校验停止位1无硬件流控。启动模式设置这是最关键的一步RZ/G2L芯片上电时会读取特定引脚通常是boot mode pins的电平来决定从哪里启动。为了通过串口下载Flash Writer必须将启动模式设置为“串口下载模式”。这需要通过拨动核心板上的拨码开关如SW1来实现。请务必查阅你的开发板原理图和《硬件手册》找到正确的拨码开关组合。对于SMARC EVK通常是将SW1的所有拨码拨到ON或特定组合以选择SCIF引导。设置错误将导致芯片无法响应后续的串口命令。供电连接12V电源适配器到开发板。有些板子有电源开关如SW9长按1-2秒开启。此时电源指示灯如LED4应亮起。5. 使用Flash Writer进行底层烧录这是整个过程中最“底层”也最需要谨慎操作的一步。我们将通过串口把Flash Writer这个小程序加载到芯片的内部SRAM中运行然后由它来擦写外部的SPI Flash。5.1 串口终端准备与Flash Writer加载在电脑上打开串口终端软件如Tera Term、PuTTY、Minicom等选择正确的串口号配置好115200 8N1参数。确保开发板处于串口下载模式然后给开发板上电或按复位键。在终端里你应该会看到类似Waiting for commands ...的提示或者没有任何输出这取决于Flash Writer是否已预置。此时我们需要通过终端软件的“发送文件”功能发送Flash_Writer_SCIF_RZG2L_SMARC_PMIC_DDR4_2GB_1PCS.mot文件。关键点在Tera Term中要选择“Binary”或“Raw data”模式发送而不是文本模式。发送成功后终端会打印出Flash Writer的版本信息和命令提示符例如Flash_Writer。这表明小程序已成功在芯片内部运行正在等待你的命令。5.2 烧录BootloaderBL2和FIPBootloader是系统上电后运行的第一段软件它负责初始化硬件、加载操作系统。我们使用Flash Writer的XLS2命令来将BL2和FIP写入SPI Flash的指定地址。擦除与写入BL2在Flash_Writer提示符下输入命令XLS2命令执行后Flash Writer会等待你通过串口发送文件。此时在终端软件中再次选择“发送文件”发送bl2_bp-smarc-rzg2l_pmic.srec。发送过程中终端会显示进度。发送完成后Flash Writer会解析文件中的地址信息并提示你确认是否要擦除对应区域。这里一定要仔细核对地址通常BL2的烧录地址是0x00000000SPI Flash的起始位置。确认无误后输入y开始擦写。写入成功后会显示Write to SPI-Flash done.之类的信息。写入FIP再次在Flash_Writer提示符下输入XLS2。发送fip-smarc-rzg2l_pmic.srec文件。同样在收到擦除确认提示时核对地址FIP通常接在BL2之后地址可能是0x0001D200等具体看BSP文档输入y确认。写入成功后可能会再次提示是否清除一段数据区域SPI Data Clear(HFF) Check ...这是为了确保旧数据被清理输入y即可。致命陷阱烧录地址绝对不能错错误的地址会导致Bootloader被写到错误的位置板子将无法启动。这些地址在芯片的《硬件手册》和BSP的配置文件中定义。使用官方提供的srec文件其内部已包含正确地址但你在确认时仍需留意。最稳妥的方法是提前查阅文档明确每个组件的确切烧录地址。5.3 烧录内核、设备树与文件系统Bootloader烧录完成后Flash Writer的任务就基本结束了。接下来的内核、设备树等通常由BootloaderU-Boot通过更高级的命令如tftp、usb、mmc或专用烧录工具来更新。但Flash Writer同样可以完成。一种常见的方法是使用Flash Writer的XLS3命令如果支持来写入内核等大镜像。但更通用的流程是关闭开发板电源。将启动模式拨码开关从“串口下载模式”改回“SPI Flash启动模式”具体组合看手册。这一步至关重要重新上电此时芯片会从刚刚烧录好的SPI Flash中的BL2启动最终运行到U-Boot命令行。在U-Boot命令行中可以通过网络tftp或USB将新的Image内核、dtb设备树文件下载到内存然后使用sfSPI Flash命令将其写入Flash的对应分区。文件系统的烧录则更常用ext4write或通过tftp下载后解压到SD卡或eMMC。由于U-Boot下的烧录操作更为灵活且依赖网络环境配置这里不展开详述。但核心思路是利用U-Boot提供的存储设备访问命令将文件从传输介质网络、USB、SD卡写入到SPI Flash的指定偏移地址。这些地址在U-Boot的环境变量如kernel_addr_r,fdt_addr_r和SPI Flash的分区布局中定义。6. 启动验证与常见问题排查完成所有烧录后再次确认启动模式设置为“SPI Flash启动”重新上电。如果一切顺利你应该能在串口终端看到BL2、ATF、U-Boot的启动日志最后是Linux内核的启动信息最终进入登录提示符或Qt/Weston图形界面。常见问题与排查技巧实录问题上电后串口无任何输出。排查检查供电电源指示灯是否亮起万用表测量核心电压是否正常检查串口TX/RX线是否接反电脑端串口号是否正确波特率是否为115200换一个串口工具试试。检查启动模式这是最常见的原因反复确认拨码开关的设置是否与《硬件手册》中“SPI Flash启动”的模式完全一致。用放大镜看有时会拨错位。检查Bootloader是否成功烧录到了正确的地址可以尝试重新烧录BL2。问题启动卡在Starting kernel ...之后或出现内核恐慌Kernel Panic。排查设备树不匹配内核与设备树dtb是否匹配是否为同一版本BSP编译设备树是否正确描述了你的板载硬件如DDR容量、PMIC型号Image-r9a07g044l2-smarc.dtb这个文件名明确指出了芯片型号r9a07g044l2和板型smarc。文件系统问题根文件系统镜像是否已正确烧录到Flash或SD卡的根分区内核命令行参数bootargs中的root指定是否正确文件系统格式ext4, squashfs是否支持DDR初始化失败如果BL2阶段就卡住可能是DDR初始化参数不对。BL2的配置bl2_bp-smarc-rzg2l_pmic.srec必须严格对应板载的DDR芯片型号如DDR42GB1片。使用错误的Flash Writer或BL2文件会导致此问题。问题Flash Writer发送后无反应或提示错误。排查启动模式错误发送Flash Writer前必须确保板子处于串口下载模式而不是其他启动模式。文件发送模式错误务必使用“二进制”Binary模式发送.mot和.srec文件用文本模式发送会损坏文件。串口干扰确保在发送文件过程中没有其他程序占用串口终端没有键盘输入。电压与连接检查串口线电平是否为3.3V有些板子是1.8V确保连接稳定。问题编译过程中bitbake报错如下载失败、编译错误。排查网络问题Yocto需要从网络下载大量源码确保主机网络通畅必要时配置代理。依赖缺失回顾“环境准备”步骤确认所有apt-get install的包都已安装。磁盘空间不足bitbake会占用大量临时空间检查build/tmp所在分区是否已满。食谱解析错误有时是因为layer的路径配置不对或者conf文件有语法错误。仔细检查执行source setup-environment时有无报错并查看build/conf/bblayers.conf文件是否包含了必要的层。整个从编译到烧录的过程是对耐心和细致程度的考验。尤其是硬件设置和底层烧录部分任何一个微小的疏忽如拨码错误、地址错误都可能导致失败。我的经验是严格按照官方文档操作但不要完全迷信文档要理解每一步的目的在关键操作如拨码、烧录前双人核对或拍照记录善用串口日志它是嵌入式开发最直接的“调试器”。当你第一次看到自己编译的系统在板子上跑起来那种成就感会让你觉得这一切的折腾都是值得的。