RV1126B开发环境搭建全攻略:从Ubuntu配置到固件烧录
1. 项目概述:为什么RV1126B的开发环境如此重要?
最近在折腾一块荣品的RV1126B开发板,这板子用的是瑞芯微的RV1126芯片,主打的是AIoT和边缘计算。说实话,拿到板子第一件事,不是急着跑Demo,而是得先把开发环境给搭起来。一个稳定、高效的开发环境,是后续所有调试、开发和性能优化的基石。很多新手朋友卡在第一步,要么是编译不过,要么是烧录失败,折腾半天热情都耗光了。所以,今天我就把自己从零开始搭建RV1126B开发环境的完整过程,包括踩过的坑和总结的技巧,详细地梳理一遍。无论你是刚接触嵌入式Linux,还是从其他平台(比如全志、NXP)转过来,这篇内容都能帮你快速上手,把环境搭得既稳又快。
RV1126B这个芯片,集成了ARM Cortex-A7 CPU和一颗NPU,性能在入门级AI视觉产品里很能打。荣品提供的这块开发板,接口也比较全,适合做原型验证。但它的官方SDK是基于Buildroot的,和常见的Ubuntu文件系统有些区别,工具链的配置、内核的编译选项都有自己的一套。搭建环境的核心目标就三个:第一,能在你的Ubuntu主机上顺利编译出SDK里的所有组件(U-Boot, Kernel, Rootfs);第二,能通过工具把编译好的固件烧录到板子的存储里;第三,能方便地进行后续的应用程序开发和调试。围绕这三点,我们一步步来。
2. 开发环境整体设计与思路拆解
2.1 核心需求与方案选型
搭建RV1126B的开发环境,本质上是在你的开发主机(通常是x86_64架构的PC)上,构建一个能够为ARM架构(具体是armv7l)生成可执行代码的交叉编译环境,并配备相应的烧录和调试工具。荣品官方推荐使用Ubuntu 18.04或20.04 LTS系统,这是经过大量测试最稳定的组合。虽然更高版本的Ubuntu理论上也可以,但可能会遇到一些依赖库版本冲突的问题,对于新手来说,优先选择官方推荐的系统版本能避开很多不必要的麻烦。
整个环境搭建主要包含以下几个部分:
- 基础操作系统 :Ubuntu 20.04 LTS 桌面版或服务器版。我强烈建议使用物理机安装,或者使用VMware/VirtualBox安装虚拟机并分配足够的资源(至少4核CPU,8GB内存,100GB硬盘)。在虚拟机中操作,方便做快照和回滚,非常适合折腾。
- SDK获取与解压 :荣品的SDK通常通过网盘或官方渠道提供,是一个巨大的压缩包(可能叫
rv1126_rv1109_linux_sdk_vx.x.x.tar.gz)。我们需要把它解压到合适的位置。 - 编译工具链 :SDK里通常会自带预编译好的交叉编译工具链(比如
gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf)。我们的任务是把它配置到系统的环境变量中。 - 本地编译环境依赖 :编译Linux内核、Buildroot根文件系统需要主机上安装一系列的开发库和工具,比如
bison,flex,libssl-dev等。 - 烧录工具 :瑞芯微提供了Windows下的烧录工具(RKDevTool),但在Linux下我们通常使用命令行工具
upgrade_tool。我们需要在主机上安装并配置这个工具,以及对应的USB驱动。 - 调试与连接 :串口调试是嵌入式开发的“眼睛”。需要一根USB转TTL串口线,并在主机上配置串口终端软件(如
minicom或picocom)。
方案选型上,我选择在Ubuntu 20.04虚拟机内完成所有环境搭建。为什么不直接用Windows的WSL?因为烧录工具 upgrade_tool 对USB设备的直接访问在WSL1/WSL2中配置相对复杂,而完整的Linux虚拟机对USB设备的支持更直接、更稳定,更贴近真实的服务器开发环境。
2.2 环境搭建的目录规划
一个清晰的目录结构能让后续操作事半功倍。我建议在用户主目录下创建一个专门的工作空间。
mkdir -p ~/workspace/rv1126
将下载的SDK包放到这个目录下。解压后的SDK目录可能会很大(超过10GB),确保你的磁盘空间充足。整个环境搭建的所有操作,除非特别说明,都将在这个工作空间或其子目录下进行。这样做的好处是路径清晰,备份方便,也避免了污染系统其他目录。
3. 核心细节解析与实操要点
3.1 Ubuntu系统基础配置要点
刚安装好的Ubuntu系统,需要先进行一些基础配置,更新软件源并安装一些通用工具。
sudo apt update
sudo apt upgrade -y
sudo apt install -y vim git curl wget net-tools openssh-server
安装SSH服务是为了方便从宿主机器远程登录到虚拟机进行操作,使用 ssh 命令比在虚拟机窗口里复制粘贴要方便得多。使用 ifconfig 命令查看虚拟机的IP地址,然后在宿主机的终端里 ssh username@ip 即可。
接下来需要修改Ubuntu的软件源,替换为国内的镜像源以加速下载。备份原有源列表文件,然后编辑它。
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
sudo vim /etc/apt/sources.list
将文件内容替换为阿里云或清华大学的Ubuntu 20.04镜像源。替换后再次执行 sudo apt update 检查是否生效。这个步骤能极大提升后续安装各种依赖包的速度。
注意:在虚拟机中,建议禁用“自动休眠”和“锁屏”功能,避免长时间编译过程中系统进入休眠导致编译中断。可以在系统设置的“Power”和“Privacy”选项中调整。
3.2 SDK获取与初步解压
荣品的SDK通常是一个“双层打包”的文件。你首先会下载到一个如 rv1126_rv1109_linux_sdk_vx.x.x.tar.gz 的文件,但这个压缩包内部可能还包含了一个或多个更大的 .tar.gz 分卷文件。这是瑞芯微SDK常见的发布方式。
cd ~/workspace/rv1126
# 假设SDK包已下载至此
ls -lh
# 输出可能类似:-rw-r--r-- 1 user user 15G Mar 10 10:00 rv1126_rv1109_linux_sdk_v2.0.0.tar.gz
首先解压这个外层包:
tar -xzf rv1126_rv1109_linux_sdk_v2.0.0.tar.gz
解压后,你会得到一个同名的目录,进入该目录,可能会看到类似 rv1126_rv1109_linux_sdk 的文件夹,以及一个 README 文件。关键的 .repo 目录(可能被隐藏)或分卷压缩包就在里面。根据荣品文档或 README 的指示,通常需要运行一个脚本来完整解压SDK。这个脚本会检查并解压内部分卷。
cd rv1126_rv1109_linux_sdk
ls -la
# 寻找类似 release.sh, unpack.sh, 或 .repo 目录
如果看到 .repo 目录,那么SDK可能是通过 repo 工具管理的。但更常见的情况是看到一个或多个 rv1126_rv1109_linux_sdk_xxx.tar.gz00 、 xxx.tar.gz01 这样的分卷文件。此时,需要使用 cat 命令合并它们,然后解压。
cat rv1126_rv1109_linux_sdk_*.tar.gz* > sdk_full.tar.gz
tar -xzf sdk_full.tar.gz
这个过程耗时较长,且需要巨大的磁盘空间(解压后可能超过30GB)。务必确保磁盘空间充足。
3.3 交叉编译工具链的配置
SDK完全解压后,在根目录下寻找 prebuilts 或 toolchain 目录。交叉编译工具链通常就在里面。
find . -name "*gcc-arm*" -type d
常见的路径可能是 ./prebuilts/gcc/linux-x86/arm/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf 。这个工具链目录包含了为ARM架构编译代码所需的所有二进制工具(如 arm-linux-gnueabihf-gcc )。
我们需要将这个工具链的 bin 目录添加到系统的 PATH 环境变量中。修改用户主目录下的 .bashrc 文件是一种持久化的方法。
vim ~/.bashrc
在文件末尾添加如下内容(请根据实际路径修改):
export RK_TOOLCHAIN=/home/yourusername/workspace/rv1126/rv1126_rv1109_linux_sdk/prebuilts/gcc/linux-x86/arm/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf
export PATH=$RK_TOOLCHAIN/bin:$PATH
保存退出后,执行 source ~/.bashrc 使配置立即生效。然后验证工具链是否安装成功:
arm-linux-gnueabihf-gcc --version
如果成功,你会看到GCC的版本信息(如8.3.0)。这个 arm-linux-gnueabihf- 前缀就是交叉编译器的标志。至此,你的系统已经具备了为RV1126B编译程序的能力。
实操心得:有些SDK可能会自带一个设置环境变量的脚本,比如
build.sh或envsetup.sh。在SDK根目录下执行source build.sh或./envsetup.sh可能会自动设置好工具链路径和一些其他环境变量。在编译前,可以先查看SDK的快速入门文档,确认是否有这样的脚本。如果有,优先使用官方脚本,可以避免手动配置可能带来的路径错误。
4. 实操过程与核心环节实现
4.1 安装编译依赖包
编译整个SDK(包括U-Boot、Kernel和Buildroot)需要主机系统安装大量的开发库。以下命令涵盖了大部分必需和可选的依赖。建议一次性安装,避免编译过程中因缺少某个库而中断。
sudo apt install -y repo git-core gitk git-gui gcc-arm-linux-gnueabihf \
gcc-aarch64-linux-gnu gcc make automake autoconf libtool cmake flex bison \
ncurses-dev libncurses5-dev libssl-dev libelf-dev device-tree-compiler \
parted lzop lib32z1 lib32stdc++6 libc6-i386 lib32ncurses5-dev \
python2.7 python3 python3-pip python3-distutils python-is-python3 \
libreadline-dev libgmp-dev libmpc-dev libmpfr-dev patchutils \
diffstat texinfo gawk chrpath dos2unix xsltproc \
build-essential libncurses5-dev libncursesw5-dev
这里有几个关键点:
-
libssl-dev:编译内核和某些应用程序时可能需要OpenSSL库。 -
ncurses-dev:这是make menuconfig图形化配置界面所依赖的库,无论是配置内核还是Buildroot都必不可少。 -
device-tree-compiler:设备树编译器(dtc),用于处理.dts文件。 -
python2.7:虽然Python2已停止维护,但一些旧的构建脚本可能仍然依赖它。同时安装python3并确保python命令指向python3(通过python-is-python3包实现)。 -
lib32*系列库:因为我们的交叉工具链是32位的(arm-linux-gnueabihf),在64位系统上运行需要这些32位兼容库。
安装过程可能需要一段时间,请耐心等待。完成后,基础的编译环境就准备好了。
4.2 编译完整固件(U-Boot, Kernel, Rootfs)
荣品的SDK通常提供了一个顶层的 build.sh 脚本来统一编译。这是最推荐的方式,因为它会自动处理组件间的依赖关系。
首先,确保你在SDK的根目录下,并且已经按照前述方法设置好了环境变量(或执行了官方的envsetup脚本)。
cd ~/workspace/rv1126/rv1126_rv1109_linux_sdk
ls
# 你应该能看到 build.sh, device, kernel, u-boot, buildroot, app 等目录
在编译前,通常需要选择板级配置。RV1126B可能对应多个配置文件,荣品的板子很可能使用 rv1126b-荣品板型号.mk 这样的配置文件。查看 device/rockchip/rv1126_rv1109/ 目录下的 .mk 文件。
ls device/rockchip/rv1126_rv1109/*.mk
假设我们找到 device/rockchip/rv1126_rv1109/rv1126b-荣品xxx.mk 。那么编译命令通常如下:
./build.sh rv1126b-荣品xxx.mk
或者,更常见的做法是使用 lunch 命令(如果SDK支持)来选择配置,然后执行 ./build.sh 。具体步骤请务必参考SDK根目录下的 README 或 docs/ 目录中的快速入门文档。
build.sh 脚本会依次执行以下操作:
- 清理 :可选地清理之前的编译输出。
- 编译U-Boot :进入
u-boot目录,根据选择的板级配置,编译生成uboot.img和trust.img等。 - 编译Kernel :进入
kernel目录,配置内核(可能使用预定义的defconfig,如rockchip_rv1126b_荣品xxx_defconfig),然后编译生成boot.img和内核模块。 - 编译Buildroot根文件系统 :进入
buildroot目录,根据配置编译生成根文件系统镜像,通常是rootfs.ext4或squashfs格式。 - 打包 :将上述生成的镜像文件,可能还包括
MiniLoaderAll.bin(一级loader),打包成一个完整的、可供烧录的固件包,通常输出在rockdev/目录下,文件名为update.img。
整个编译过程非常耗时,首次编译在性能一般的虚拟机上可能需要1-2小时甚至更久。期间会下载大量的Buildroot包(如果未提前缓存),请保持网络通畅。
注意事项:编译过程最容易出错的两个阶段,一是下载第三方软件包超时或失败,二是内核配置不匹配导致编译错误。对于网络问题,可以考虑为Buildroot配置国内镜像源,或者将
dl/目录(下载缓存)从其他成功编译的环境中拷贝过来。对于内核错误,确保你选择的defconfig与你的开发板完全匹配,不要随意修改。
4.3 安装烧录工具与驱动
在Linux下,我们使用 upgrade_tool 这个命令行工具进行烧录。首先需要安装它。
- 下载工具 :工具可能包含在SDK的
tools/目录下,或者需要从瑞芯微官方网站下载。假设我们找到了upgrade_tool的可执行文件。 - 放置与赋权 :将其拷贝到系统路径,例如
/usr/local/bin/,并赋予执行权限。sudo cp ~/workspace/rv1126/rv1126_rv1109_linux_sdk/tools/linux/upgrade_tool /usr/local/bin/ sudo chmod +x /usr/local/bin/upgrade_tool - 安装USB规则 :为了让普通用户权限能访问开发板的USB烧录接口,需要安装udev规则。在SDK工具目录下通常有一个
udev规则文件,例如99-rk-usb.rules。# 查看工具目录下是否有.rules文件 ls ~/workspace/rv1126/rv1126_rv1109_linux_sdk/tools/linux/*.rules # 将其复制到系统udev规则目录 sudo cp ~/workspace/rv1126/rv1126_rv1109_linux_sdk/tools/linux/99-rk-usb.rules /etc/udev/rules.d/ # 重新加载udev规则 sudo udevadm control --reload-rules sudo udevadm trigger - 验证驱动 :断开开发板与电脑的USB连接。将开发板切换到 Loader模式 。对于RV1126B,常见的操作是:先按住板子上的 Recovery键(或Loader键) 不放,然后按一下 Reset键 ,最后松开Recovery键。此时,开发板应进入烧录模式。
- 通过USB数据线( 必须连接OTG口或标有Download的USB口 )将开发板连接到电脑。在终端输入
lsusb命令,你应该能看到一个瑞芯微的USB设备,类似:
注意,这里的IDBus 003 Device 012: ID 2207:350a Fuzhou Rockchip Electronics Co., Ltd. RK356x Loader2207:350a是示例,RV1126的Loader模式ID可能是2207:0010或其他。看到类似的Rockchip Loader设备,就说明驱动和连接正常。
4.4 烧录固件到开发板
烧录前,请确认你已经成功编译出生成了 update.img 文件,通常位于 rockdev/ 目录下。
ls ~/workspace/rv1126/rv1126_rv1109_linux_sdk/rockdev/ -lh
使用 upgrade_tool 进行烧录的基本命令如下:
cd ~/workspace/rv1126/rv1126_rv1109_linux_sdk/rockdev
sudo upgrade_tool uf update.img
uf 命令代表“update firmware”。烧录过程会在终端显示进度条。烧录完成后,工具会提示“Download OK”之类的信息。此时,将开发板断电,拔掉USB线,然后重新上电(或按Reset键),开发板就会从新的固件启动了。
实操心得:如果烧录失败,首先检查开发板是否确实进入了Loader模式(
lsusb能否看到设备)。其次,尝试使用upgrade_tool的ld命令查看设备:sudo upgrade_tool ld。如果能看到设备列表,再尝试烧录。有时需要先擦除Flash再烧写,可以使用命令sudo upgrade_tool ef update.img(ef=erase flash)。但请注意,全擦除会清空所有数据,包括可能存在的密钥等信息,需谨慎操作。
4.5 配置串口调试终端
串口是嵌入式开发最重要的调试和交互接口。你需要一根USB转TTL串口线(如CH340、CP2102等芯片的)。
- 连接硬件 :将串口线的 TX 接开发板的 UART RX , RX 接开发板的 UART TX , GND 接 GND 。 切勿连接VCC! 开发板的串口通常是3.3V电平。找到开发板的调试串口(通常是UART2),荣品板子一般会明确标出“DEBUG UART”。
- 查找串口设备 :将串口线的USB端插入电脑。在Ubuntu终端输入
dmesg | grep tty查看内核日志,或者直接查看/dev/目录下新增的ttyUSB*设备。ls /dev/ttyUSB* # 输出可能为 /dev/ttyUSB0 - 安装串口终端软件 :推荐使用
minicom或更轻量的picocom。sudo apt install -y minicom - 配置minicom :
这会进入配置菜单。选择“Serial port setup”。sudo minicom -s- 按
A键,设置“Serial Device”为你的串口设备,例如/dev/ttyUSB0。 - 按
E键,设置“Bps/Par/Bits”,波特率通常为1500000(瑞芯微平台常用),数据位8,停止位1,无校验。具体波特率请参考开发板手册,RV1126B的调试串口波特率很可能是1500000。 - 按
F键,将“Hardware Flow Control”设置为No。 配置完成后,选择“Save setup as dfl”保存为默认配置,然后选择“Exit”。
- 按
- 连接与使用 :现在可以直接运行
minicom(或minicom -D /dev/ttyUSB0)打开串口终端。给开发板上电,你应该能看到U-Boot和内核的启动日志滚滚而来。按Ctrl+A,然后按X可以退出minicom。
有了串口终端,你就能与开发板进行交互,查看启动过程,登录系统(用户名密码通常是 root /空,或 rock / rock ),并执行命令了。这是验证系统是否正常启动的最直接方式。
5. 常见问题与排查技巧实录
即使按照步骤操作,也难免会遇到问题。这里记录了几个最常见的问题和解决方法。
5.1 编译错误:缺少头文件或库
问题描述 :在编译内核或Buildroot包时,报错“fatal error: xxx.h: No such file or directory”或“cannot find -lxxx”。
排查思路 :这几乎总是因为缺少对应的开发库( -dev 或 -devel 包)。
解决方法 :
- 根据错误信息中的文件名或库名,使用
apt search命令查找对应的Ubuntu包。例如,错误提到openssl/bio.h,那就找libssl-dev;提到ncurses.h,就找libncurses5-dev。 - 使用
apt-file工具可以更精确地查找哪个包提供了某个文件:sudo apt install apt-file && sudo apt-file update,然后apt-file search xxx.h。 - 将找到的包安装即可。如果不确定,可以把错误信息直接复制到搜索引擎,通常能找到解决方案。
5.2 烧录工具无法识别设备(Loader模式)
问题描述 :执行 sudo upgrade_tool ld 没有任何输出,或者烧录时提示“No found rockusb”。
排查思路 :这是一个阶梯式排查过程。
解决方法 :
- 确认硬件连接 :确保USB线连接的是开发板的 Download口(或OTG口) ,而不是普通的USB Host口。
- 确认进入Loader模式 :严格按照“按住Recovery键 -> 按Reset -> 松开Recovery键”的顺序操作。有些板子可能需要先断电,再执行此操作后上电。多试几次,观察电脑是否有USB设备连接的提示音。
- 检查
lsusb:在终端运行lsusb,仔细查看列表中是否有Rockchip或“2207”开头的VID设备。如果没有,回到步骤1和2。 - 检查udev规则 :确认
99-rk-usb.rules文件已正确复制到/etc/udev/rules.d/,并且其内容包含了你的用户组(通常是plugdev)。你可以尝试直接以root身份运行upgrade_tool:sudo su然后执行命令,排除权限问题。 - 虚拟机USB穿透 :如果你使用的是虚拟机,确保虚拟机的USB控制器设置正确(如USB 3.0兼容),并且已经在虚拟机软件界面中将识别到的Rockchip设备连接到虚拟机内部。
- 尝试其他USB口或数据线 :有时是USB口供电或数据线质量问题。
5.3 系统启动失败,卡在U-Boot或内核
问题描述 :烧录后,串口有输出,但停在U-Boot命令行,或者内核panic。
排查思路 :根据串口输出的错误信息定位。
解决方法 :
- 卡在U-Boot :检查U-Boot是否成功加载了正确的环境变量和启动命令。可以在U-Boot命令行下输入
printenv查看。重点检查bootargs(内核启动参数)和bootcmd(自动启动命令)。可能与存储设备(mmc)的分区设置有关。确保编译时选择的板级配置与你的硬件(尤其是DDR型号和存储类型eMMC/NAND)完全匹配。 - 内核Panic :错误信息通常很明确。常见原因:
- 文件系统挂载失败 :内核找不到
root=参数指定的根文件系统。检查bootargs中的root=值是否正确指向了存放根文件系统的分区(如root=/dev/mmcblk0p5)。检查编译的根文件系统格式是否与内核配置支持的一致(如ext4)。 - 设备树(DTS)不匹配 :内核使用的设备树二进制文件(
.dtb)与硬件不匹配。确认编译时使用的defconfig和dts文件是否对应你的开发板型号。荣品的板子可能有一个特定的DTS文件,如rv1126b-荣品xxx.dts。 - 驱动缺失 :某些关键硬件(如PMIC、DDR)驱动初始化失败。这通常需要根据错误信息调整内核配置或DTS。
- 文件系统挂载失败 :内核找不到
5.4 网络连接问题(开发板无法上网)
问题描述 :系统启动后,能登录,但 ping 不通外网,也无法 apt-get update 。
排查思路 :分步检查网络配置。
解决方法 :
- 检查物理连接与驱动 :
ifconfig -a查看所有网络接口。有线网卡通常是eth0。确认网口灯是否亮起。使用dmesg | grep eth查看网卡驱动是否加载成功。 - 检查IP地址 :使用
ifconfig eth0或ip addr show eth0查看是否获取到了IP地址(通过DHCP或静态配置)。如果没有,需要配置网络。- DHCP :运行
udhcpc -i eth0(如果BusyBox支持)或修改/etc/network/interfaces文件(如果系统使用ifupdown)。 - 静态IP :编辑
/etc/network/interfaces,添加类似以下内容:
然后重启网络服务或重启系统。auto eth0 iface eth0 inet static address 192.168.1.100 netmask 255.255.255.0 gateway 192.168.1.1
- DHCP :运行
- 检查DNS :能
ping通同网段IP但无法解析域名,是DNS问题。编辑/etc/resolv.conf,添加nameserver 8.8.8.8或你的路由器地址nameserver 192.168.1.1。 - 检查防火墙与路由 :在开发板上
route -n查看默认网关是否正确。在主机或路由器上检查是否有防火墙规则阻止了开发板的访问。
5.5 如何加速后续编译
首次编译耗时很长,主要时间花在下载和编译Buildroot的各种软件包上。
技巧 :
- 使用编译缓存 :Buildroot支持
ccache。在make menuconfig的Build options中启用Enable compiler cache,可以显著加速多次编译。 - 备份
dl和output目录 :dl目录是下载缓存,output目录是编译输出(对于Buildroot)。首次完整编译成功后,将这两个目录打包备份。在新环境或需要清理后重新编译时,直接解压恢复这两个目录,可以跳过漫长的下载和基础编译过程。 - 并行编译 :确保
build.sh脚本或你在make时使用了-jN参数(N为你的CPU核心数,如-j8),充分利用多核性能。 - 选择性编译 :如果只修改了内核某个驱动,可以进入
kernel目录单独执行make。如果只修改了用户态应用,可以在Buildroot中单独编译该包(make <pkg>-rebuild)。这需要你对SDK的构建系统有一定了解。
环境搭建是个细致活,尤其是第一次,遇到问题很正常。关键是要有耐心,学会看错误日志(编译输出、串口日志),并善用搜索引擎和社区资源。荣品官方文档、瑞芯微的Wiki以及相关的技术论坛(如CSDN、电子工程世界)都是宝贵的资料库。当你成功看到串口终端上出现登录提示符,并顺利登录系统时,那种成就感会让你觉得之前所有的折腾都是值得的。这只是一个开始,接下来你就可以在这个稳定的基础上,尽情开发你的RV1126B应用了。
更多推荐

所有评论(0)