
经常有人问我你手头怎么全是瑞芯微的板子抽屉里翻出来RK3228H的拆机盒子、RK3568的核心板、RV1106的摄像头小板甚至一些别人丢给我的奇怪开发板撕掉标签一看SoC还是瑞芯微。以前我以为是自己的选型偏好后来做项目、逛社区、帮人看原理图才发现这不是个人口味问题。在边缘计算、智能硬件、工业控制这些方向上瑞芯微几乎是绕不开的名字。这篇不是厂商软文而是从一个常年和 SoC 打交道的开发者角度把为何总是瑞芯微这件事拆开讲清楚。我会顺便把大家搜得最多的几个关键词——RK3568设备树、RK3228H固件包、瑞芯微系统烧录、RV1106开发、Hugging Face模型转ONNX再到RKNN转换——串成一条完整的实战链路把我踩过的坑和验证过的方法一并放出来。1. 先从一颗不起眼的SoC说起瑞芯微为什么会出现在任何地方1.1 从电视盒子到智能硬件瑞芯微的渗透路径很多人对瑞芯微的第一印象来自电视盒子。早些年运营商赠品盒子和外贸盒子大量采用RK3228、RK3229、RK3128这些芯片四核Cortex-A7、28nm工艺性能放在当时就是个中规中矩的影音方案。但正是盒子这个巨大的出货量把瑞芯微的SoC打进了无数代工厂和方案公司的BOM表里让整个供应链围绕它形成了成熟的配套。当行业风向从客厅娱乐转向边缘计算时瑞芯微手里的牌恰好全押在了正确的位置上。RK3568/RK3566这类中端SoC开始大量出现在商业显示、收银机、工业HMI、门禁主机上瑞芯微的PCIe、SATA、双千兆网口、多路显示接口让一块芯片什么活都能干。再往后AI落地瑞芯微又掏出带NPU的RK3588和轻量级的RV1103/RV1106视觉SoC从高端边缘盒子到几十块钱的摄像头模组全覆盖。我接触过好几个做智能硬件的团队主控选型开会讨论半天最后画风基本一致性能合适、文档能看懂、采购说供货稳、硬件说参考设计完整于是又回到瑞芯微。这就像手机圈里某些芯片成了中端标配瑞芯微也在不知不觉中成了嵌入式Linux和边缘AI的默认选项。1.2 开发者的真实诉求资料、工具链与容错空间站在开发者角度总是瑞芯微的根本原因可以总结成三个点资料密度、工具链成熟度、容错空间。先看资料密度。瑞芯微官网有完整的芯片手册、硬件设计指南、SDK源码、设备树示例虽然整理得不算精致但胜在全面。更关键的是社区积累你做RK3568设备树时遇到一个问题大概率能在各种技术论坛、开源项目、甚至二手交易平台的宝贝描述里找到线索。同一个坑之前已经有一百个人踩过并留下了解决记录这种安全感是很多其他国产SoC给不了的。工具链就更明显了。瑞芯微的烧录工具RKDevTool、固件解包/打包工具、RKNN-Toolkit2模型转换工具链都是长期维护的。只要是进入瑞芯微生态的开发者基本都能在半小时内完成从装驱动到烧录系统的全流程。相比之下某些竞品芯片连烧录工具都要找代理商要体验差距不是一点半点。还有一点很微妙瑞芯微的SDK给开发者留了很大的折腾空间。系统是开源的Linux或Androidroot随便搞固件可以拆开改启动参数能调设备树随便改这种高自由度让开发者有试错余地。对于做产品和做学习的人来说容错空间大就意味着愿意在上面投入时间一旦投入了时间就会形成习惯最后变成生态黏性。2. 设备树、固件提取与系统烧录瑞芯微开发者的三项基本功2.1 RK3568设备树从dts源码到内核真正认到硬件如果你跟我一样经常用RK3568做板子适配那设备树是躲不掉的第一关。瑞芯微的设备树体系由多个层级构成soc级dtsi比如rk3568.dtsi、板级dts或dtsi比如某开发板的rk3568-evb.dts、以及用户自己改的overlay或者增量dts。很多人一上来就在设备树里乱加节点结果内核起不来或者外设不工作问题往往出在没有理清这几层关系。以我的一次I2C外设适配为例。RK3568的I2C控制器在rk3568.dtsi里已经定义好了比如i2c1节点默认挂载在某个pinctrl组上。但板子上具体的I2C引脚是接在GPIO3_A4和GPIO3_A5上的那就要在板级dts里做两件事一是将i2c1的status从disabled改为okay并配置时钟频率二是通过pinctrl把i2c1的引脚复用功能设为i2c1-xfer组。设备树里GPIO的复用关系错了内核不会报错但总线上就是扫描不到设备。i2c1 { status okay; clock-frequency 100000; bme28076 { compatible bosch,bme280; reg 0x76; }; };这段dts看起来简单但有个细节很容易踩I2C设备的reg地址不能随便填。BME280的地址可能是0x76也可能是0x77取决于SDO引脚电平。如果你的设备实际地址是0x77却写了0x76dmesg里只会显示probe失败排查起来很浪费时间。设备树编译也是一个常见坑。直接用dtc把dts编译成dtb如果头文件的include路径不对或者宏定义没展开编译出来的是一个看似成功实际残缺的dtb。瑞芯微官方SDK里有mkdtimg工具和cpp预处理流程个人开发时建议装好device-tree-compiler再用类似这样的方式手工编译cpp -nostdinc -I include -undef -D__DTS__ -x assembler-with-cpp rk3568-myboard.dts | dtc -I dts -O dtb -o rk3568-myboard.dtb -每次改完设备树用fdtdump或者内核的/proc/device-tree检查节点是否存在这个习惯能救命。我见过太多人改完设备树直接重启发现没生效其实是dtb没被uboot正确加载到或者overlay没被应用。2.2 固件提取与RK3228H固件包解析拆开官方固件看分区瑞芯微提取固件教程这个搜索词很典型。很多时候我们手里只有别人编译好的完整固件update.img没有源码想改启动参数、替换logo或者提取某个分区就必须先学会解析瑞芯微的固件包。瑞芯微的完整固件结构大致是这样最外层是update.img内部包含loader、parameter分区表、以及多个分区镜像uboot、trust、misc、boot(recovery)、rootfs、userdata等。RK3228H这个老芯片的固件结构相对简单更适合拿来练手。我常用的一套流程是先下载瑞芯微的imgRePackerRK工具Windows版是一个命令行工具Linux下也有对应版本或者用开源社区里的rkImageMaker、rk2900工具。将update.img拖入工具目录执行解包命令imgRePackerRK update.img如果工具识别正常会在当前目录生成一个和固件同名的文件夹里面直接能看到被拆分出来的镜像文件。分区表信息通常在parameter文件中打开后能看到类似这样的文本FIRMWARE_VER: 1.0 MACHINE_MODEL: RK3228H MACHINE_ID: 007 MANUFACTURER: rockchip CMDLINE: mtdpartsrk29xxnand:0x000020000x00002000(uboot),0x000020000x00004000(trust),...这段CMDLINE里就是各分区的起始地址、长度和名称也正是烧录工具的分区依据。解包之后boot分区一般就是Linux内核镜像如果固件是Android的boot里可能是kernelramdisk的合并体。想提取里面的内核可以用unpack_bootimg之类的工具进一步拆。想提取根文件系统则要把rootfs分区镜像挂载到本地sudo mount -o loop rootfs.img /mnt/rk-rootfs这里有个经验之谈RK3228H这类老芯片的rootfs往往是ext4格式的镜像文件挂载最方便。但有些新芯片的rootfs是erofs或squashfs挂载方式不同需要先确认文件系统类型。用file命令看一眼镜像头别盲目mount。2.3 系统烧录搞定驱动、loader与maskrom模式烧录是瑞芯微开发里的高频操作也是新手最容易卡住的地方。瑞芯微进入烧录模式主要有两种loader模式和maskrom模式。loader模式是正常bootloader启动后按特定按键组合或执行adb reboot loader进入的maskrom模式是引导代码损坏或没有合法固件时SoC内部的固化ROM引导逻辑直接暴露USB烧录接口的状态。在Windows上装好瑞芯微驱动后打开RKDevTool插入设备正常情况下工具会识别到发现一个LOADER设备或者发现一个MASKROM设备。很多人卡在这一步——设备管理器里能看到设备但RKDevTool没有任何反应大概率是驱动签名问题或者设备被识别成了ADB接口而不是烧录接口。如果你从maskrom模式开始烧录流程会有点不同。maskrom模式下通常要先点导出或下载一个loader文件工具先往SoC内部RAM加载一段mini-loader之后才能正常识别分区并进行完整烧录。很多教程没强调这一步小白就直接点升级结果工具一直卡在等待loader。说一个我自己的倒霉经历。有次手头一块RK3568板子被我刷坏了uboot板子只进maskrom我按教程把parameter和各个分区都选好点执行发现到uboot分区的时候报错下载IDB失败。折腾半天才发现是参数里的扇区起始地址和我选的loader不匹配换回官方配套的parameter后一次通过。所以烧录遇到下载到XX分区失败别急着怀疑硬件先确认分区表、loader文件、镜像文件三者是否来自同一套SDK版本这是最常见的坑。瑞芯微系统烧录还有一个容易被忽略的点eMMC和NAND的烧录逻辑不同。RK3228H很多板子用的是NANDNAND有坏块管理和特殊ECC校验如果你拿eMMC的parameter去烧NAND大概率会在某个分区写入时报错。所以动手之前一定先确认板子存储介质类型。3. AI落地的最后一公里从Hugging Face模型到瑞芯微NPU3.1 为什么Hugging Face的模型不能直接跑在瑞芯微上很多人都知道瑞芯微芯片自带NPU比如RK3568有1TOPS算力RK3588有6TOPSRV1106也有0.5TOPS。但你从Hugging Face上下载一个训练好的PyTorch模型是没法直接丢进瑞芯微NPU跑的。原因很简单NPU能执行的不是PyTorch计算图而是特定格式的指令序列。瑞芯微NPU要求先做一次模型格式转换最终产物是.rknn后缀的模型文件。在这里整个转换链路是PyTorch模型 - ONNX - RKNN格式。Hugging Face社区里的模型绝大多数是PyTorch权重格式所以第一步需要把模型导出成ONNX。有些知名模型在Hugging Face仓库里已经附带ONNX版本可以直接跳过这一步但大多数情况还得自己导出。很多人在这一步就懵了我的模型是YOLO或者BERT这类结构torch.onnx.export到底该怎么配以YOLOv5为例你需要在模型代码里把forward中的一些动态操作固定下来尤其注意anchor生成、nms这些后处理是否包含在导出图里。我的建议是导出时只导出主干检测头的原始输出把后处理留在NPU之外用CPU完成这样既避免ONNX算子兼容问题也方便调试。3.2 RKNN-Toolkit2转换ONNX模型完整流程瑞芯微官方提供的转换工具是rknn-toolkit2它既能在x86开发机上跑也能在板端运行。实际工作中绝大多数人是在x86开发机上完成模型转换再在板端使用rknn-toolkit-lite或RKNN Runtime加载模型推理。转换流程在代码里非常固定from rknn.api import RKNN rknn RKNN() rknn.config(target_platformrk3568, quantized_dtypew8a8, optimization_level2) ret rknn.load_onnx(modelyolov5s.onnx) if ret ! 0: print(load onnx failed) exit(1) ret rknn.build(do_quantizationTrue, datasetdataset.txt) if ret ! 0: print(build failed) exit(1) ret rknn.export_rknn(yolov5s.rknn) if ret ! 0: print(export failed) exit(1)这段代码看着简单但几个细节非常关键。target_platform要和你实际使用的芯片一致rk3568和rk3588的NPU架构不同转换出来的rknn模型不能混用。dataset.txt是量化校准数据列表每一行是图片路径建议选20到50张覆盖真实场景的图像而不是随便拿几张网图。量化质量直接决定模型在NPU上的精度我用yolov5s做过对比校准数据选得好的模型mAP能高2到3个点。rknn.config里的quantized_dtype可以选w8a8、w8a16等默认w8a8表示权重和激活都用INT8量化速度最快但精度损失最大。如果你的模型对精度敏感可以先尝试w8a16感受一下推理速度区别再决定要不要牺牲精度换速度。转换完成后板端加载rknn模型推理的Python代码大致是from rknnlite.api import RKNNLite rknn_lite RKNNLite() rknn_lite.load_rknn(yolov5s.rknn) rknn_lite.init_runtime() outputs rknn_lite.inference(inputs[img_tensor])注意PC端用的rknn.api和板端用的rknnlite.api是两套接口两者初始化方式不同别搞混。很多人在板端装了rknn-toolkit2的完整版又装rknn-toolkit-lite导致import冲突最后把自己的Python环境弄崩这也是老坑了。3.3 量化、精度与算子兼容的实战避坑RKNN转换中最大的痛点是算子支持度的问题。你把一个Hugging Face上新出的模型下载下来一转换大概率遇到Unsupported operator之类的报错。瑞芯微的NPU支持算子列表在rknn-toolkit2的文档里有详细说明但实际情况是即使算子名称支持某些属性组合也可能不被支持。我遇到过最麻烦的是Transformer类模型里的LayerNorm和GELU激活函数在旧版本rknn-toolkit2上支持不好要么转出来的模型推理结果完全不对要么量化后精度崩得一塌糊涂。解决办法有几种思路一种是不变模型结构用混合量化把敏感的层保留为FP16其他层用INT8。在rknn.config里可以设置quantized_dtypew8a8之外还能用custom_quantize配置具体层级的量化参数但这需要你对模型结构有足够理解知道哪层是精度敏感层。另一种是改模型结构把不支持的算子替换成等效组合。比如有些模型里的HardSwish可以展开为x * relu6(x3) / 6这种算子组合在NPU上就能跑得通。但要记住改完必须重新验证模型输出和原始模型的误差别凭空相信替换等价。还有一个大家容易忽略的问题ONNX导出时的opset版本会影响RKNN支持度。建议导出ONNX时固定opset版本在11到13之间太新的opset可能引入NPU不认识的算子。在torch.onnx.export里可以显式指定opset_version12不要偷懒不写。4. 视觉特长生RV1106嵌入式AI摄像头是怎么玩起来的4.1 RV1106的定位与能力边界把RV1106单独拉出来说是因为它代表了瑞芯微在视觉生态上的一次精准卡位。RV1106是一个SoC内部集成了Cortex-A7应用处理器和一个0.5TOPS算力的NPU同时自带ISP、MIPI-CSI接口、音频编解码等外设专门为IPC摄像头、门锁、AI视觉模组这类产品设计。很多人拿RV1106和树莓派Pico这类单片机比其实完全不是一个量级。RV1106能跑Linux虽然内存通常只有64MB DDR3L但足够跑轻量Linux系统加一个微型推理框架。0.5TOPS算力听起来小但对于分类、简单目标检测、人脸检测这类任务配合INT8量化实际体验远好于在MCU上跑TinyML。我最初用RV1106时也被它的启动流程搞糊涂过。RV1106没有传统意义上的emmc或SD卡起系统那么直观官方推荐的SDK构建出来的镜像烧写方案和RK3568不太一样。如果只是玩功能验证建议直接用Luckfox Pico这类现成开发板它把RV1106的引脚、摄像头接口、TF卡槽都做成了标准的Arduino风格排针上手成本低很多。RV1106的另一个特点是内置的ISP处理效果不错。直接用普通CMOS摄像头模组在光线复杂的场景下也能输出还行的图像这对快速原型验证很友好。你不需要像以前那样在ISP上堆算法芯片帮你处理了大部分工作。4.2 一个RV1106图像识别小项目的实操记录这里分享一个我实际跑通的RV1106小项目用一块OV2640摄像头模组采集图像在RV1106上运行一个MobileNetV2分类模型实时判断画面里有没有猫。整个流程走下来其实很有意思。第一步是准备模型。在PC上从Hugging Face或自己训练一个MobileNetV2分类模型导出ONNX再按前面说的方法用rknn-toolkit2转换成RV1106的rknn格式。RV1106的target_platform在rknn-toolkit2里对应的是rv1106转换命令和之前几乎一样只改平台名。第二步是写推理代码。RV1106的Python环境比较精简官方SDK提供了基于RKNN Lite的Python示例。代码核心就是读取摄像头帧、resize到224x224、做归一化、送入模型推理、解析输出。这里有个细节RV1106上的图像采集通常走V4L2你需要自己处理camera buffer到numpy数组的转换有些示例代码把这一步封装好了但如果你是自己从SDK摸起大概率会被YUV格式转换折腾一下。第三步是性能调优。我最初在RV1106上跑MobileNetV2分类单帧推理大概150毫秒加上图像采集和预处理整体吞吐只有6到7帧每秒。后来做了三个优化把图像输入尺寸从256降到224把归一化操作改成定点近似把rknn_lite的inference调用改成异步模式整体帧率提升到了12帧每秒左右。对一个0.5TOPS的芯片来说这个性能已经能接受。RV1106开发的坑也不少。最典型的是内存太紧64MB内存跑完整Linux系统加Python解释器加推理buffer随便一折腾就内存不足。我的建议是能不用Python就不用Python官方SDK提供C接口用C写推理逻辑能省一半内存。另外RV1106的SDK还在快速迭代阶段不同版本之间API差异很大一定要按官方文档对应版本来别拿着旧教程硬套新SDK。5. 从RK3228H到RK3568再到RV1106瑞芯微生态的选型指南5.1 不同场景下的芯片选型建议很多新入行的朋友会问这么多瑞芯微芯片到底该选哪个这个问题没有标准答案我结合自己做过的小项目给出一个参考表按场景划分场景需求推荐芯片理由入门学习嵌入式Linux、玩设备树/烧录RK3228H/RK3229价格极低、资料多、踩坑成本小工业HMI/商业显示/需要丰富外设RK3568/RK3566接口全、性能均衡、Linux主线支持好边缘AI盒子/需要中高性能NPURK3588/RK3588S6TOPS NPU、8K视频、多路显示智能摄像头/门锁/低功耗视觉RV1103/RV1106小封装、内置ISP、0.5TOPS NPU够用音视频播放器/低成本平板RK3308专注音频外围简单这个表的逻辑很清楚先看你的应用是计算密集还是IO密集再看有没有AI需求最后看成本压力。RK3228H虽然老但它28nm工艺、四核A7拿来学习完全够用真要跑现代图形界面和神经网络还是得RK3568往上。RV1106这类视觉SoC的专属性太强除非做摄像头相关产品否则不建议当通用Linux板用。5.2 瑞芯微生态的优点与隐患我要客观地说瑞芯微生态虽然强但不是没有问题。优点方面瑞芯微几乎可以说是国产SoC开发者体验的标杆。SDK长期维护、BSP更新及时、文档密度高、社区活跃度在国产芯片里数一数二。尤其在AI这一块rknn-toolkit2持续增加新模型支持让很多原本需要在高通或英伟达平台上跑的场景也能在低成本国产芯片上落地。这也是为什么Hugging Face上的模型越来越多地出现已支持RKNN转换的第三方项目社区生态已经在反哺芯片生态了。隐患也同样明显。第一瑞芯微的SDK碎片化问题严重不同芯片系列对应不同SDK版本rknn-toolkit2对不同芯片的支持程度也不一致你在一颗芯片上验证好的代码换一颗芯片可能要改不少东西。第二某些BSP和内核分支长期停留在厂商定制版本上上游Linux社区的某些新特性要过很久才能跟上。第三文档虽然多但准确性参差不齐官方Wiki里也经常出现过时表述需要靠社区补充验证。我自己见过最坑的一次是按官方Wiki配置RK3568的MIPI-DSI屏幕文档里的复位引脚和实际v1.3版硬件完全对不上最后是翻论坛和看原理图才确认正确引脚。所以用瑞芯微一定要养成官方文档和硬件原理图双核对的习惯不能盲目相信文档。从RK3228H拆盒子练烧录到RK3568调设备树、做RKNN模型转换再到RV1106玩视觉识别一路下来你会慢慢理解为何总是瑞芯微——它靠的不是某个单点突破而是把从入门到量产、从硬件到算法、从文档到工具链的整条链路都铺在了开发者脚下。虽然生态有瑕疵但这份让你能折腾、敢折腾、折腾完有收获的环境才是它被反复选择的原因。最后分享一个我的习惯每次拿到一块新的瑞芯微板子第一件事不是跑demo而是打开原理图对照SDK里的设备树把每个外设引脚过一遍再决定要不要改dts。这个习惯帮我省下过无数次返工时间也让我踩过的每一个坑都变成了可复用的经验。如果你刚入手瑞芯微不妨也试试。