用瑞芯微开发板这几年,打交道最多的就是烧录。RK3568、RK3588、RV1126这些板子,不管是刷系统、做量产、还是把变砖的板子救回来,第一步永远是让开发板进对模式。瑞芯微的下载模式分两种:LOADER模式和MASKROM模式,很多人看到RKDevTool界面上一行“发现一个LOADER设备”、一行“发现一个MASKROM设备”,就不知道该怎么选。这篇文章我根据自己的实际使用经验,把这两种模式的区别、进入方法、适用场景和完整烧录流程一次讲透。如果你刚入手开发板,或者被救砖折腾过,这篇应该能帮你少走几条弯路。
先给个结论:日常升级固件、刷系统镜像,优先用LOADER模式;系统完全起不来、存储介质里连loader都被清掉的时候,只能用MASKROM模式。但为什么是这个结论,背后的原理值得花几分钟看完。
1. 烧录的本质:先搞懂Rockchip启动链路
1.1 BootROM是什么:芯片出厂自带的“最小引导程序”
芯片上电之后,内部ROM里固化的一段代码会最先执行,这段代码就是BootROM。它出厂时就烧死在芯片硅片里,任何人都没法改。BootROM的任务很简单:初始化最基础的时钟和USB/UART控制器,然后判断从哪个介质启动——eMMC、SPI Flash、SD卡还是USB。如果判定从存储介质启动,它就把介质头部第一个扇区里的loader读出来,跳到内存里交给loader执行。
如果存储介质里没有有效loader,或者外部引脚被设置成强制下载模式,BootROM就停留在自己的状态,通过USB和电脑通信,等待烧录工具向它发送数据。这个“停留在BootROM里等待下载”的状态,就是MASKROM模式。
很多人第一次听到MASKROM这个名字会觉得玄乎,其实它指的就是芯片内部那块掩膜ROM(Mask ROM),BootROM就是这种ROM。所以MASKROM模式可以理解为“芯片最底层的下载模式”,是BootROM本人在跟你对话。相比之下,LOADER模式是BootROM把loader加载到内存之后的事。
1.2 MASKROM和LOADER在启动链路上的位置
我们常说的rk356x_spl_loader、rk3588_spl_loader这类文件,就是Rockchip的loader,它通常是官方SDK编译出来的一个二进制,由两部分组成:DDR初始化代码(俗称DDR bin)和loader主程序。BootROM把loader加载到内存后,loader会接着初始化DDR、存储控制器、USB控制器,然后跑起一套基于Rockusb协议的通信程序,这时候芯片和电脑之间就能对话了,这个状态就是LOADER模式。
启动链路可以简化成一句话:BootROM → loader(进入LOADER模式)→ U-Boot → Kernel。MASKROM模式发生在第一步之前,LOADER模式发生在第一步之后。两个模式能做的事、能烧录的范围、对DDR的状态要求,完全是两套逻辑,这也是新手容易混淆的地方。
我见过不少人在板子已经进入LOADER模式的情况下,点工具里的“下载Loader”按钮,结果工具提示失败。其实LOADER模式下loader已经在内存里跑着,不用也没法重复下载。反过来,在MASKROM模式下直接点“升级固件”,工具会先自动走一遍下载loader的流程,这两个模式的操作流程差别很大。
2. MASKROM模式:救砖和底层烧录的终极手段
2.1 什么是MASKROM模式:BootROM直接和PC对话
MASKROM模式是芯片最底层的下载状态。此时DDR还没初始化,eMMC、SPI Flash里的任何代码都还没被执行。芯片通过USB枚举成一个“Maskrom设备”,等待上位机发送loader镜像到芯片内部的小块SRAM里,再由这个loader完成DDR初始化和后续烧录。
正因为DDR还没起来,MASKROM模式下第一件事永远是下载loader到内存。Windows下的RKDevTool选中loader文件,Linux下用rkdeveloptool的db命令,干的事都是这个。
这个模式最常见的三个应用场景是:
- 变砖恢复:eMMC或SPI Flash里的loader被刷坏、被清空,BootROM找不到可执行的loader,自动进入MASKROM模式,这是救砖的唯一入口。
- 彻底擦除存储:量产或者回收板子时,需要把整片eMMC擦干净,也要在MASKROM模式下做。
- 烧写底层固件:比如要换掉整个SPI Flash里的原厂UBoot,或者重新写全部分区表,MASKROM模式最彻底。
2.2 进入MASKROM的三种常用姿势
不同开发板进入MASKROM的方式不太一样,但原理是共通的。我拿自己用的几块RK3568、RK3588开发板举例:
第一种,板上带MASKROM按键。这种最省事,按住MASKROM键不松,再给板上电,几秒后松开,设备就处于MASKROM模式了。部分开发板把这个按键和Recovery键做在一起,长按是MASKROM,短按是LOADER,具体看板卡说明书。
第二种,短接测试点。很多核心板或工控板没做按键,需要自己找测试点。SDK文档里通常会标注SPI Flash的CS引脚或eMMC的CLK引脚,把对应引脚和GND短接一下再上电,就能强制进入MASKROM。操作前一定要看原理图,确认哪个点是安全的,短接错了轻则没反应,重则短路烧硬件。
第三种,自动进入。如果存储介质里连loader都没有了,BootROM找不到有效启动代码,芯片会自动留在MASKROM模式。很多人遇到的就是这种情况——板子之前烧录失败导致loader损坏,插上USB直接被识别为MASKROM设备。
提示:进入MASKROM模式后,在Windows设备管理器里一般会看到“Rockusb Device”或“Maskrom Device”这类设备,PID会跟LOADER模式不一样,RKDevTool状态栏会明确显示“发现一个MASKROM设备”。
2.3 MASKROM模式下能做什么,不能做什么
MASKROM模式能做的事覆盖面很广:下载loader到内存、烧写全部分区镜像、擦除Flash、重写分区表、写设备信息等等。但它有一个边界——BootROM本身不可写。BootROM是出厂掩膜ROM,任何烧录工具都改不了它,这也是它作为“最后防线”的根本原因。
另一个容易被忽略的点是:MASKROM模式下烧写时,工具先下载loader再执行后续操作。如果这一步的loader版本和芯片不匹配,后面所有操作都会失败。比如RK3588的loader拿去给RK3568用,下载loader阶段直接报错。所以救砖前一定先确认固件包里的loader对应芯片型号。
我建议不到万不得已别在MASKROM模式下乱擦Flash。擦除是全面操作,擦完整个存储介质就是一张白纸,如果手头没有完整的全套固件,板子就等于彻底废了。一般流程是先进MASKROM,正常加载loader,再烧完整update.img,一条龙走完。
3. LOADER模式:日常开发刷机的主力模式
3.1 LOADER模式的运行状态
LOADER模式是开发板正常工作状态下的烧录模式。BootROM把loader加载进内存并跳转过去,loader初始化DDR、存储控制器、USB控制器之后,不用依赖任何外部按键,就能通过USB和烧录工具通信。
这时候DDR已经跑起来了,数据传输速度和稳定性比MASKROM模式高不少。你可以把LOADER模式想象成一个“已经穿好装备的士兵”,随时等着接收命令;而MASKROM模式是“刚出生的士兵”,还得先领装备。
LOADER模式下,loader负责把电脑端发来的数据写入eMMC、SPI Flash或SD卡对应分区。它甚至支持热切换——有些板卡在系统里运行adb reboot loader,就能直接重启进入LOADER模式,不用去按物理按键,这对开发调试太友好了。
3.2 进入LOADER模式的几种方式
LOADER模式的进入姿势比MASKROM多,我按优先级列一下常用的:
- Recovery键上电:按住板上的Recovery按键不松,再上电,保持两三秒后松开,板子进入LOADER模式。这是最通用、最保险的方法。
- adb命令重启:板子系统正常运行时,执行
adb reboot loader,设备重启后会进入loader烧录状态。 - 系统内恢复模式:Android系统设置里的恢复出厂(备份和重置)往往也会触发类似流程,有的固件会切入LOADER模式等待烧录。
- U-Boot命令控制:进入U-Boot命令行后,执行
rockusb 0 1 mmc 0这类命令,也可以把设备切到Rockusb下载模式,这个方法适合熟悉U-Boot的朋友。
如果你发现按住Recovery键上电后,电脑一点反应都没有,先别急着怪板子。很多开发板必须先接好USB线再上电,或者反过来先上电再插USB,这个时序不同板子不一样,我在下面问题排查部分细说。
3.3 LOADER模式下适合的操作
LOADER模式覆盖了开发中90%以上的烧录需求:
- 一键升级完整固件:直接用update.img升级整个系统,不用关心内部怎么分区。
- 分区级烧录:只更新boot分区、rootfs分区或recovery分区,调试内核和根文件系统时非常高效。
- 擦除指定分区:比如清空misc分区、userdata分区,不需要整片擦除。
- 读取设备信息:在LOADER模式可以通过工具读取芯片型号、存储介质信息等。
日常开发时,我基本都用LOADER模式。它不涉及BootROM底层,操作风险比MASKROM低很多。就算烧录失败,板子大概率还能重新进入LOADER模式再来一次,不至于直接变砖。
4. MASKROM和LOADER到底怎么选:对比与决策
4.1 一张表看懂两种模式
| 对比项 | MASKROM模式 | LOADER模式 |
|---|---|---|
| 运行主体 | BootROM(芯片出厂固件) | Loader(系统加载的bootloader) |
| DDR状态 | 未初始化,需要先下载loader | 已完成初始化 |
| 进入方式 | 短接触点/按键/无loader自动进入 | Recovery键、adb reboot loader |
| 首要操作 | 必须先下载loader到内存 | 可直接升级固件或分区 |
| 可烧录范围 | 全部分区、Flash擦除、loader本身 | 除BootROM外的全部分区 |
| 典型场景 | 救砖、彻底擦除、底层烧写 | 日常刷机、分区更新、调试 |
| 风险等级 | 高,操作失误影响大 | 中,烧录失败通常可重来 |
| 工具显示 | MaskROM设备 | LOADER设备 |
这张表基本能回答“什么时候该用哪种模式”的问题。简单说,系统进不去但loader还在,用LOADER;loader没了或者要擦整片存储,只能MASKROM。
4.2 实际场景中的模式选择
举几个我实际遇到的场景:
场景一:RK3588开发板原厂系统想换成Ubuntu。系统能正常启动,进入系统后执行adb reboot loader,或者按住Recovery键上电,进入LOADER模式,直接升级Ubuntu的update.img。完全没必要碰MASKROM。
场景二:烧录过程中掉电,eMMC里的loader损坏,板子上电后RKDevTool识别为MASKROM。这时候只能走MASKROM流程,先下载loader,再重烧完整固件。
场景三:开发板不想用eMMC了,想改成从SPI Flash启动。这种涉及存储介质切换和底层UBoot,我会在MASKROM模式下操作,因为要重新规划整个存储布局。
场景四:做完一版固件,想擦干净userdata分区或者恢复出厂。这种小操作LOADER模式就够了,点分区擦除,几秒钟的事。
我的选择逻辑很朴素:能用LOADER解决的绝不上MASKROM,MASKROM是用来兜底的。毕竟MASKROM操作时如果选错固件、擦错介质,恢复成本远高于LOADER模式。
4.3 与MCU平台烧录的横向类比
很多朋友从STM32、ESP32这些MCU平台转过来玩瑞芯微,一开始会被这两种模式搞晕。其实类比一下就明白了:
STM32的BOOT0引脚拉高后会从系统存储器启动,进入芯片自带的bootloader,烧录Flash,这个角色就有点像Rockchip的MASKROM模式——都是芯片出厂固件在提供烧录能力。STM32正常从主Flash启动,运行用户程序,需要烧录时通过SWD接口跟调试器通信,这个角色更像LOADER模式,只不过STM32用SWD,瑞芯微用USB Rockusb协议。
联发科MTK平台也有类似设计:BROM对应瑞芯微的MASKROM,Preloader对应LOADER。ESP32的UART下载模式,对应的是芯片ROM里的bootloader。理解了“芯片出厂固件下载模式”和“上层bootloader下载模式”这两个概念,各个平台的烧录模式就都串起来了。
5. 实操:RKDevTool与rkdeveloptool完整烧录流程
5.1 准备驱动、工具和固件
Windows下烧录瑞芯微,最常用的是官方DKDevTool(实际上叫RKDevTool)加DriverAssitant驱动。驱动安装这一步卡住的人最多:DriverAssitant装完要先打开“驱动安装”,设备进入LOADER/MASKROM模式后,系统才能识别为Rockusb设备。Win10/11如果没关闭驱动签名,会提示安装失败,这种情况需要进系统高级启动,选择“禁用驱动程序强制签名”后再装。
Linux下用rkdeveloptool,一般不用额外驱动,但访问USB设备需要root权限。Debian/Ubuntu可以直接apt install rkdeveloptool,编译安装也很简单。命令行的操作习惯和Windows图形界面不一样,但功能更灵活,脚本化批量烧录会很方便。
固件准备分两种:一是完整的update.img,一般在SDK编译后生成,里面打包了loader、分区表、UBoot、kernel、rootfs等全部内容;二是单独的分区镜像,比如boot.img、rootfs.img、paramter分区表文件。救砖时优先用完整update.img,省心。
5.2 用RKDevTool在LOADER模式下升级固件
这是最常规的升级流程,步骤不多但顺序别乱:
- 先把DriverAssitant驱动装好,打开RKDevTool。
- 开发板断电,按住Recovery键不松,给板上电。
- 等两三秒,插上USB线(如果之前没插),松开Recovery键。
- 观察RKDevTool状态栏,显示“发现一个LOADER设备”说明识别成功。
- 切到“升级固件”页,选择update.img文件,点“升级”。
- 等待进度条跑完,工具提示烧录完成,板子会自动重启。
这里有个细节:部分开发板需要先接USB线再按Recovery键上电,不然USB枚举时序对不上,电脑端永远没反应。我在RK3568的一块核心板上就遇到过,必须“先插USB、再按住Recovery、再上电”这个顺序,换成其他板子又变成“先上电再插USB”。所以遇到识别不到的情况,先试试调换插线时序。
升级过程中不要碰USB线,不要手动断电。RKDevTool烧完ROM区域后,有时板子会自动进入正常系统,而工具这边还会显示“等待设备重新枚举”,这是正常的,等几秒就行。如果烧完后板子反复重启,往往是rootfs和数据分区还没完全写好,再等一两分钟。
5.3 用rkdeveloptool在MASKROM模式下救砖
Linux下用rkdeveloptool走MASKROM救砖,我把它拆成几个明确步骤:
先把板子短接或按MASKROM键进入MASKROM模式,插上USB线。在终端执行:
sudo rkdeveloptool ld如果能看到类似DevNo=1 Vid=0x2207@Pid=0x320a的输出,说明设备已被识别。注意,VID 0x2207是瑞芯微的统一厂商ID,PID会根据芯片型号和模式变化。
接着下载loader到内存,这里要用和芯片匹配的loader文件:
sudo rkdeveloptool db rk3588_spl_loader_v1.09.112.bin这一步成功后再升级完整固件:
sudo rkdeveloptool ul rk3588_update.img如果不想烧完整固件,只想单独写分区,需要先写分区表再写镜像。比如RK3588的parameter.txt里规定boot分区从第0x8000扇区开始,那就这样操作:
sudo rkdeveloptool gpt parameter.txt sudo rkdeveloptool wl 0x8000 boot.imgwl后面的数字是分区的起始LBA扇区号,具体以parameter.txt为准,不同芯片、不同固件的偏移量不一样。这里多说一句,千万不要不看分区表就乱写,写错位置轻则启动失败,重则覆盖其他分区。
整条救砖流程下来,最关键的就是db这一步。如果db都失败,说明loader跟芯片不匹配,或者MASKROM进入姿势有问题,别急着继续下一步。
5.4 分区烧录、设备树与Ubuntu的补充
分区烧录在开发中很常用,尤其是只想调试内核或文件系统时。瑞芯微的分区表是parameter.txt,里面用类似0x00004000@0x00008000(boot)这样的格式描述每个分区的偏移和大小。读懂这个文件就能精准定位每个分区的起始扇区,再用rkdeveloptool wl或RKDevTool的分区烧录页操作。
很多人问瑞芯微rk3568设备树怎么处理。这里我说下现状:较新的平台,BootROM和loader启动后,U-Boot会读取boot.img里的内核和设备树,dtb通常是直接打包在boot.img里的。想单独改设备树,需要先用mkbootimg --unpack boot.img解包,替换dtb后再重新打包。
mkbootimg --kernel kernel --ramdisk ramdisk --dtb rk3568-evb.dtb --output boot.img这样生成的boot.img再烧录到boot分区就行。这里顺手提醒一句:改设备树尽量走SDK编译流程,你手动改完dtb后,kernel的配置、ramdisk的对应关系都容易出问题。我在RK3588上手动重打包过一次,忘了加ramdisk,结果内核起来后挂载不上根文件系统,排查了半天才反应过来。
“开发板挂载ubuntu”这个需求,本质是烧录一个ubuntu rootfs。一般做法是:把SDK编译出的Ubuntu update.img通过LOADER模式整体烧录,或者只更新rootfs分区。根文件系统烧进去之后,启动参数要保证root指向正确的分区,比如root=/dev/mmcblk0p7,这个参数通常在U-Boot环境变量或内核cmdline里配置。如果你只是把rootfs烧进去却没改U-Boot里的root参数,内核起来会报“Unable to mount root fs”,这就是典型的启动参数不匹配。
6. 常见问题与排查技巧实录
6.1 电脑识别不到设备
这是出现频率最高的一个问题。插上板子之后,RKDevTool一直显示无设备,设备管理器里也没有Rockusb设备。我建议按这个顺序排查:
- 换USB线:很多USB线只能充电,没有数据线芯,或者质量差导致信号不稳。找一根短线,最好带屏蔽的,别用延长线。
- 换USB口:电脑前置USB口供电不稳定,尽量插主板后置口。
- 确认驱动:Win10/11下先关掉强制驱动签名,重新装DriverAssitant。
- 调整上电时序:先插USB再上电、先上电再插USB、按住Recovery后插USB再松开,多试几种组合。
- 看设备管理器:如果出现未知设备或带感叹号的设备,右键更新驱动,手动指定到DriverAssitant安装目录。
我遇到过一次很典型的情况:RK3568板卡在Windows下死活识别不了,换到Linux下lsusb能正常看到设备,说明USB枚举没问题,问题出在Windows驱动上。最后重装驱动签名加重启解决。
6.2 烧录中途报错怎么办
烧录过程中报错,先看错误发生在哪个阶段:
- 下载Loader失败:MASKROM模式下出现,大概率是loader选错芯片,或者MASKROM没有真正进入。
- 烧录到xx%卡死:基本是USB不稳定,换线、换口重试;也有可能固件本身损坏,重新解压一份再试。
- 分区表不匹配:update.img里的parameter和设备当前存储布局不一致,刷新固件前先做一次擦除或用gpt命令重写分区表。
- 中断后无法再识别设备:LOADER模式下烧录中断,loader损坏导致设备变成MASKROM。这种情况直接进MASKROM走救砖流程,别试图重复进LOADER。
烧录中途如果断电,数据一致性肯定会出问题。我自己的习惯是烧录前先保证板子有稳定外接电源,不要把板子仅靠USB供电扛全程。很多开发板USB供电电流不够,烧录过程中存储写入电流一大,压降明显,USB连接就断了。
6.3 几条烧录经验
平时烧录踩坑多了,有几条经验我觉得值得单独拿出来讲:
第一条,烧写前先备份。拿到一块新板子,不要上来就刷别的固件。先用RKDevTool或rkdeveloptool把原厂的boot、uboot、rootfs这些关键分区读出来存好。原厂固件有时候提供下载链接,但真到救砖的时候发现板子型号停产了,官方固件都找不到,那时候备份就是救命稻草。
第二条,loader版本必须跟着芯片和SDK走。瑞芯微的loader文件虽然名字看着都像spl_loader,但RK3568、RK3588、RV1126不通用。同一个芯片,SDK版本不同,loader也可能有不兼容的情况,优先使用当前固件包附带的loader。
第三条,烧录完无法启动先别急着怀疑硬件。定时清空misc分区这一条可能被很多人忽略。Android固件切换、恢复出厂设置异常,misc分区里的启动标记会干扰正常启动。MASKROM模式下擦除Flash重新烧录完整固件,基本能解决90%的“烧完起不来”问题。
第四条,从MCU转到MPU的开发者,别再用“烧程序”的思维理解瑞芯微。STM32烧个hex几百KB,瑞芯微一个update.img可能好几个GB,烧录时间、分区管理、启动链路复杂度完全不是一个量级。拿到板子先摸清启动介质、分区表、loader版本,再动手操作,会顺手很多。
我自己的习惯是,固定一根短线USB、一个稳定的电源适配器,专门用来烧录。救砖的时候心态放平,一步一步来:先进MASKROM,下载loader,确认设备枚举成功,再写固件。只要loader能下进去,这板子就还有救。别在找不到原因的时候反复重试同一个操作,把时序、线材、驱动、固件都排查一遍,问题基本都能定位到。