做嵌入式开发这几年RK3568 在我手里已经不知道折腾过多少回了。很多刚上手的工程师拿到开发板后第一句问的不是“内核怎么编译”也不是“设备树怎么改”而是“我的板子怎么进 Maskrom”。这个模式在最关键的时候能救命改错设备树起不来、烧错 Uboot 变砖、想把整块 Flash 擦干净重新来全得靠它。这篇文章不玩虚的直接把你会在 RK3568 开发板上遇到的所有 Maskrom 相关问题一次讲透尤其是三种不同的进入方式。1. Maskrom 模式到底是个什么东西1.1 从启动流程说起为什么会有 Maskrom 这么个模式先别急着按按键搞懂原理能让你少走很多弯路。RK3568 这颗 SoC 上电之后第一段执行的代码不是 Uboot也不是内核而是芯片出厂时就固化在内部 ROM 里的一段程序业内叫 BootROM。这段代码短小精悍主要干两件事初始化最基本的时钟和存储控制器然后去检测外部的启动介质比如 eMMC、SD 卡、SPI Flash。如果 BootROM 在检测过程中发现外部介质里没有可用的 BootLoader或者检测到了某些强制进入下载模式的信号它就不会继续往下走而是停在一个等待主机命令的状态。这个状态就是 Maskrom 模式。你可以把它理解成芯片的“BIOS 引导失败后的恢复模式”底层、基础、几乎没有被破坏的可能因为那段代码是 Mask 工艺固化进去的擦不掉、改不了。Maskrom 这个名字里的“Mask”其实指的就是芯片制造时的掩膜Mask意思是这块代码在流片的时候就已经固定了。有些人会把 Maskrom 和 Loader 模式搞混这俩确实长得很像但本质上有区别。Maskrom 是 BootROM 没能加载外部 Loader 时的状态这时候芯片的 DDR 都还没完全初始化能做的事比较有限而 Loader 模式是 BootROM 已经把板级 Loader比如 MiniLoaderAll.bin加载进内存并运行起来了这时候芯片已经具备完整的存储访问能力工具能做的事情也多得多。1.2 Maskrom、Loader、Uboot 和 Recovery到底区别在哪初期接触这块的同事经常被 RKDevTool 界面上的 MASKROM 和 LOADER 两个标签搞晕。我在带新人时一般会直接给他们画一张表把几种启动阶段对应的状态、触发条件和工具显示列清楚。模式触发条件能做什么工具显示MaskromBootROM 没找到可用 Loader或检测到按键强制进入擦除 Flash、烧写全部分区、向内存加载 LoaderMASKROMLoaderBootROM 成功加载外部板级 Loader常规分区烧写、固件升级、调试LOADERRecoveryAndroid 系统引导层检测到组合键系统恢复出厂、OTA 升级RecoveryNormal正常启动跑 Linux / Android 系统无注意Maskrom 模式下你没法直接去枚举 eMMC 或 SPI Flash因为 DDR 控制器还没有被完整初始化所以无论是 RKDevTool 还是 rkdeveloptool在 Maskrom 阶段做的第一件事基本都是先往芯片内存里塞一份 DDR 初始化代码和 Loader然后才能执行后续的读写操作。这个机制后面讲烧写流程时还会再提这里你先记住一个结论Maskrom 是芯片最底层的兜底状态恢复能力最强但使用门槛也最高。1.3 什么场景下非进 Maskrom 不可进 Maskrom 的需求无非这么几类。最常见的是系统起不来比如你改了设备树里的某个管脚复用导致内核 panic 在启动早期或者你烧录了一个不匹配的 Uboot连 bootloader 阶段都过不去。这种时候普通的重刷流程根本跑不起来因为系统连 Loader 阶段都未必能稳定进入唯一的办法就是强制芯片停留在 Maskrom从底层重新写一遍。其次是整盘擦除和低格。某些情况下旧分区里的数据会干扰新固件的烧录尤其是从 Android 切到 Linux或者买了开发板想清掉厂商预装的系统直接在 Maskrom 下擦除整颗 eMMC 或 SPI NOR Flash 是最干净的做法。还有一类场景是做底层开发比如适配 EtherCAT 主站驱动、调试 OV5695 或 OV8858 这类摄像头模组时要反复修改设备树和内核一旦改错就起不来。熟练进入 Maskrom能让你在一分钟之内把板子拉回可烧录状态开发效率完全不一样。所以不要觉得 Maskrom 只是“救砖工具”它其实是嵌入式开发里的底层安全网。2. 进入 Maskrom 模式的三种姿势2.1 最常规的 UPDATE 键进入法RK3568 开发板上最常见的进 Maskrom 方式是通过 UPDATE 键但不同厂家对这个按键的命名五花八门有的叫 UPDATE有的叫 RECOVERY有的叫 MASKROM还有的干脆只印一个向下箭头。不管叫什么它的作用基本一致在 BootROM 阶段把一个 GPIO 拉成特定电平告诉芯片“我要进下载模式”。标准操作流程是这样的。先准备一根支持数据传输的 USB 线一头插电脑另一头插开发板的 OTG 口。这里有一个特别容易踩的坑很多开发板上有两个 USB 口一个是 USB Host一个是 OTG只有 OTG 口能用于烧录。你插错了口按住 UPDATE 键按到天荒地老电脑也认不出设备。找到 OTG 口之后按住 UPDATE 键不松手保持这个状态给板上电。有的板子是独立 DC 电源有的板子是 Type-C 供电还有的板子可以通过 OTG 口直接供电。以大多数核心板加底板的组合为例推荐顺序是先接好 USB 线然后按住 UPDATE 键再插 DC 电源。上电后大概两三秒电脑右下角会弹出一个设备接入提示声设备管理器里应该能看到一个 Rockusb 设备这时候就可以松开 UPDATE 键了。这里要补充一句不同板卡对“先上电还是先插 USB”的容忍度不一样。我实测过一些板子如果先上电再插 USB就算按住键也未必能进 Maskrom而先插 USB 再上电的成功率很高。原因可能是 USB 枚举时序和 BootROM 检测窗口之间的配合问题。保险起见我建议一律使用“先插 USB按住按键再上电”的顺序。2.2 音量- 键进入法按键都在的板子怎么操作不少 RK3568 方案的开发板为了兼容 Android 系统板上会保留音量加减键有些甚至没有独立的 UPDATE 键只有一个隐藏焊盘或者干脆把音量减键复用来做 Maskrom 触发。第一次看到这种设计时我也愣了一下后来翻了原理图才明白原来这个音量-键的 GPIO 和 BootROM 检测脚是连在一起的至少在启动阶段它起到的就是 UPDATE 键的作用。操作上和 UPDATE 键类似但有一个细节不同音量-键往往需要按住的时间更长一些。在带 Android 系统的板子上BootROM 要先读取按键状态然后判断是正常开机还是进 Maskrom如果你只按了一瞬间就松开系统可能直接正常启动了。我的经验是按住音量-键保持三秒以上再插电源或者按复位键等电脑识别到设备后再松手。还有一个容易忽略的地方如果你的板子同时有音量-键和复位键最稳定的组合方式是按住音量-键不松然后点按一下复位键让系统在按键保持的状态下重新上电复位这样就不需要反复插拔电源了。这个技巧在量产调试时特别实用因为不需要每次都去摸电源插头。需要特别提醒的是音量-键进 Maskrom 并不是 RK3568 的通用特性而是板级设计决定的。有的板卡虽然画了音量键但 BootROM 的检测引脚并没有连过去这时候按音量-根本没用。所以拿到一块新板子第一件事一定是去查原理图确认按键网络名是不是类似 KEY_MASKROM、KEY_UPDATE 或者 BOOT_SEL 这样的信号。2.3 复位键进入法没有独立按键时的保底方案第三种方法巧妙一点适合板子没有独立 UPDATE 键、或者已经上电但系统卡死的情况。很多 RK3568 核心板把 Maskrom 触发设计成了一个需要短接的焊盘这在量产产品上很常见因为产品外观上不想留一个用户能按到的烧录键。这种情况下你可以用镊子短接那个焊盘然后配合复位键进入 Maskrom。操作步骤也简单。首先保证板子已经上电不管它是卡死在 Uboot 还是内核都不影响。然后用镊子或者杜邦线短接 Maskrom 焊盘或者按住对应的按键保持不松。接下来找到板上的复位键轻点一下。这一步的目的就是让芯片重新走一遍 BootROM 流程而 BootROM 在上电瞬间会重新检测按键状态发现你有进 Maskrom 的请求就停住了。等电脑识别出 Rockusb 设备之后就可以松开短接的镊子了。这个方法的精髓在于“热复位进入”它避免了频繁插拔电源线对已经固定在工装上的板子特别友好。实际上就算你的板子上有 UPDATE 键我也建议你有意识地习惯一下“按住触发键再按复位”这个操作它比断电上电更温和也能减少对电源接口的物理损耗。2.4 三种方式怎么选硬件设计和实操效率的矛盾三种方式各有适用场景我直接给你一个优先级建议。如果板子上有独立的 UPDATE 键优先用它操作最直接。如果板子带音量键或者触发键位置比较隐蔽优先试音量- 键加复位键的组合。如果板子上只有触发焊盘那就老老实实用镊子短接同时把复位键配合进来。进入方式适用板卡关键操作点推荐场景UPDATE 键大多数开发板、核心板按住后插入 USB 或上电首次烧录、常规救砖音量- 键带 Android 或带音量键的板子按住 3 秒以上可配合复位无独立烧录键时的替代方案复位键所有带复位键的板子按住触发键后轻点复位板子已上电、系统卡死时说句实话硬件设计上最省事的还是独立 UPDATE 键加复位键的组合但为了节省空间和成本现在越来越多的板卡喜欢把按键做成焊盘或者复用音量键。不管哪种设计你只要弄清楚一个核心问题这个板子上哪个信号在 BootROM 阶段能被检测到就成功了一大半。剩下的就是通过阅读原理图和实测来确认。3. 进入之后怎么确认以及配套工具链怎么搭3.1 从设备枚举看状态VID/PID 和驱动识别进了 Maskrom 之后第一件要做的事就是确认主机端真的认到了设备。Windows 下最简单的方法是打开设备管理器展开“通用串行总线设备”或者“libusb-win32 devices”正常情况下你应该看到一个名字里带 Rockusb 的设备。如果 RKDevTool 是开着的它会在界面右侧显示“发现一个 MASKROM 设备”之类的提示。从 USB 协议层面看RK3568 在 Maskrom 模式下枚举出来的 VID 是 2207PID 是 350a而在 Loader 模式下 PID 通常是 0011。这两个数值可以直接用 USB 抓包工具或者设备管理器里的详细信息看到。我用这个办法判断板子当前处于哪个阶段特别准比肉眼盯屏幕还快。Linux 下则直接用 lsusb 命令就能看到lsusb Bus 002 Device 003: ID 2207:350a Rockchip如果你看到的是 2207:350a说明你的板子确实停在了 Maskrom。如果看到 2207:0011说明 Loader 已经被加载了。如果啥都没看到那就要检查前面的操作步骤了。3.2 Windows 下的驱动安装与 RKDevTool 识别Windows 下玩 RK 芯片绕不开驱动安装这一步。很多新手第一次插上板子设备管理器里出现一个带黄色感叹号的未知设备就以为板子坏了其实只是驱动没装。去瑞芯微官网或者开发板厂商的网盘里找 RKDriverInstall 工具解压后右键以管理员身份运行它会自动把 Rockusb 驱动装上。Win10 和 Win11 有一个额外的坑默认开启驱动签名强制如果装的是没有签名的驱动系统会直接拦截。解决办法是启动到“高级启动”模式选择“禁用驱动程序强制签名”然后再安装一次。注意这个设置只对当次生效重启之后如果有新设备接入还得再操作一遍。驱动装好之后打开 RKDevTool正常情况下它会自动刷新界面中间会变成一个绿色的“发现一个 MASKROM 设备”或者类似“发现一个 LOADER 设备”。如果你手里的工具版本比较老可能需要手动点一下“切换”或者重新插拔一次设备。只要工具能识别到设备接下来的烧录就是水到渠成的事。3.3 Linux 下用 rkdeveloptool 和 upgrade_tool 确认如果在 Linux 环境下开发就不需要驱动安装这套流程了系统自带的 USB 内核驱动就能直接和设备通信。你只需要装一个命令行工具rkdeveloptool 或者 upgrade_tool。以 rkdeveloptool 为例安装之后先列一下设备rkdeveloptool ld DevNo1 Vid0x2207,Pid0x350a,LocationID106 Maskrom看到 Maskrom 字样就说明进入成功了。接下来如果你需要烧写整个镜像可以先用它下载 Loader 到内存rkdeveloptool db MiniLoaderAll.bin执行完这条命令后设备会从 Maskrom 状态切换到 Loader 状态之后再执行写分区操作就不会报错了。upgrade_tool 的用法类似upgrade_tool LD查看设备upgrade_tool DB下载 Loaderupgrade_tool UF升级固件。两者选一个用就行我个人更习惯 rkdeveloptool因为它的命令更直观和 rkflashtool 的风格更接近。3.4 驱动装不上、设备识别不了时先查这几处很多人在这一步卡很久浪费时间这里直接给你一个排查顺序。先看 USB 线是不是只充电没数据换一根手机原装数据线试再看插的是不是 OTG 口有些板子的 Type-C 口和 Debug 口紧挨着插错口很常见然后在设备管理器里强制更新驱动手动指向驱动目录最后关闭杀毒软件和防火墙有时候它们会拦截驱动安装。如果以上都排查完还是不行我建议你换个电脑的 USB 口。实测下来主板后置的 USB 2.0 口兼容性最好USB 3.0 口在某些老版本驱动下反而容易出现识别问题。还有一个冷门但有效的操作有些主板对 USB 口的电源管理比较激进在设备管理器里把“允许计算机关闭此设备以节约电源”的勾去掉能减少枚举失败的几率。4. 实战用 Maskrom 模式救砖和烧写固件4.1 救砖场景Uboot 挂了怎么把板子拉回来说一个我实际遇到过的场景最有代表性。一次调试中我在 RK3568 上烧了一个从别的平台移植过来的 Uboot本来是想试试兼容性结果板子直接变砖串口没有任何输出HDMI 也黑屏。这个时候正常的烧录流程已经走不通了因为系统在任何阶段都起不来必须进 Maskrom。我当时的操作是先按住底板上的 UPDATE 键然后用 USB 线连接 OTG 口和电脑最后插上 DC 电源。电脑识别设备后我先用 rkdeveloptool 下载了一份对应 DDR 容量和型号的 MiniLoaderAll.bin 到芯片内存rkdeveloptool db MiniLoaderAll.bin这一步成功之后设备会从 Maskrom 进入 Loader 状态紧接着就可以直接烧写完整的 update.img 了。如果时间紧不一定非得烧整包也可以只烧关键的 Uboot 分区把板子先拉起来再说。这里我想强调一个很多人不知道的细节Maskrom 模式下芯片的 DDR 还没初始化所以你不能直接往 Flash 里写数据必须先让 Loader 跑起来完成 DDR 初始化。工具帮你做的事情本质上就是把一段很小的 DDR 初始化代码加载到 SRAM 里执行然后再把 Loader 本体加载到 DDR 中运行。明白了这层机制你就知道为什么每次进入 Maskrom 后的第一个操作几乎都是 download loader。4.2 烧写分区固件时的参数选择和地址对齐如果你不想每次都用整包镜像只改了一个设备树或者一个内核完全可以只烧写对应分区。RK3568 的 eMMC 烧写地址是有讲究的直接用 rkdeveloptool 写分区时地址是扇区号一个扇区 512 字节。我常用的一份分区起始地址如下分区起始扇区说明uboot0x4000Uboot 和 Trust 镜像misc0x6000启动模式标记boot_a0x8000内核和设备树rootfs_a0x18000根文件系统实际分区表要以你手头固件的 parameter 文件为准不同厂家差异很大。曾经有人不看参数直接套用网上教程的地址烧写结果把 boot 分区写到了 uboot 的位置板子直接起不来。这种问题不是烧坏硬件但排查起来很折磨人。所以我建议在开发阶段先烧一整包 update.img确认系统能启动后再研究单分区更新的事。使用工具烧写整包时RKDevTool 的“升级固件”按钮会把 Loader 和所有分区镜像一起处理期间不要拔线、不要断电否则可能停留在半砖状态还得重新进 Maskrom 再走一遍流程。另外不同版本的 rkdeveloptool 对某些新分区表支持可能有差异如果出现写分区报错优先试试更新工具版本。4.3 借助 Maskrom 做底层调试从设备树到 EtherCAT 主站移植Maskrom 不只是用来救砖的它在日常底层调试里作用也很大。举个例子你在给 RK3568 适配摄像头传感器 OV5695 或者 OV8858 时经常要改设备树里的 I2C 地址、复位 GPIO 和电源时序。一旦 GPIO 复用配置错误内核可能在启动早期就 panic别说是摄像头了连串口都出不来。这种时候我的调试节奏是改完设备树编译内核和 dtb打包成 boot.img然后进 Maskrom 擦掉旧的 boot 分区烧入新的 boot 镜像重启看日志。如果起不来再进 Maskrom继续调整。整个过程熟练之后一次来回可能就两分钟这比反复接串口、看启动日志、猜测问题要高效得多。还有做工业控制的朋友要把 EtherCAT 主站 IGH 移植到 RK3568 上。IGH 通常对网卡和内核实时性有要求需要替换或编译特定的网卡驱动同时调整内核的 PREEMPT 配置这个过程要反复烧写内核和设备树。我们当时的做法就是准备一个只有在 Maskrom 模式下才能识别的 USB 烧录脚本一旦新内核不稳定立刻一键重刷回备份镜像。可以说熟练进入和退出 Maskrom已经成了团队做底软开发的必备技能。5. 常见问题与排查技巧实录5.1 长按 UPDATE 键没反应先查这四件事这个问题出现频率最高。明明按住了录键也插了电电脑就是一点反应都没有。我自己的排查顺序是这样的。第一USB 线是不是数据线很多人的桌面充电线泛滥随手拿一根只能供电不能传数据。第二插的是不是 OTG 口RK3568 开发板上的 USB 口可能有三四个只有专用于烧录的 OTG 口能进 Maskrom。第三按键有没有按对有的板卡 UPDATE 键其实是个焊盘需要短接不是按压式按键。第四上电顺序对不对有的板子必须“先按着键再上电”如果先上电再按键BootROM 已经跳过了检测窗口自然没反应。如果按键确认没问题还可以用万用表量一下按键两端的电压。正常状态下BootROM 检测引脚应该有一个上拉或下拉电平按下按键后会翻转。量不到电压变化说明原理图上的网络和你实际按的按键根本不是一路信号。5.2 电脑提示无法识别的 USB 设备大概率是驱动问题Windows 下最常见的就是设备管理器里出现“Unknown Device”或者设备名前带一个黄叹号。这种情况先别急着怀疑板子九成是驱动没装对。Win10 以上系统先按前面说的禁用驱动签名强制再装 RKDriverInstall。装完之后重新插拔一次 USB 线让系统重新枚举设备。如果还是不识别可以手动在设备管理器里选择“更新驱动程序”然后指向驱动目录让系统强制安装一次。Linux 下遇到无法识别的情况相对少但如果你用的是虚拟机比如 VMware 或 VirtualBox需要先把 USB 设备从宿主机的驱动中解绑然后手动连接到虚拟机里。虚拟机环境下 USB 枚举不稳定是很常见的建议优先在物理机上操作少走弯路。5.3 进入 Maskrom 后烧录到一半失败多半是供电问题烧录过程中失败比设备识别不了更让人崩溃。遇到过烧到一半工具直接报错设备从电脑上消失了的情况。排查到最后基本都是供电问题。Maskrom 模式和 Loader 模式下芯片某些外设没有完全初始化功耗波动比较大如果只用 USB 口供电碰到电源质量一般的电脑瞬间电流不足就会导致设备掉线。解决办法是给板子接独立电源不要依赖 USB 供电。如果是核心板加底板的架构确认底板上的电源指示灯稳定不闪。另外换一根短一点粗一点的 USB 线也有帮助线材电阻太大时压降非常明显。还有一个小技巧烧录前先在工具里执行一次“擦除 Flash”把目标存储介质清空再烧写完整镜像。这样可以排除旧分区残留数据导致的写入异常。不过要提前备份重要数据擦除操作是不可逆的。5.4 不同开发板在 Maskrom 上的特殊细节最后说一下不同板卡之间的差异。RK3568 的 Maskrom 本身是芯片级的所有基于这颗芯片的板子都能进但触发方式真的是五花八门。有的开发板在核心板上有独立的 UPDATE 键但底板留出的位置很别扭你只能拿螺丝刀顶住才能按到有的板子把按键设计成音量加减一体的摇杆需要长按音量减三秒以上才触发还有的板卡没有物理按键只留了两个标注为 MASKROM 的焊盘需要你焊接引线或者直接用镊子短接。我强烈建议拿到一块新板子之后第一时间去官网下载原理图 PDF用关键词搜索 MASKROM、UPDATE、BOOT 这几个信号名看清楚它们接到 SoC 的哪个引脚以及板级上拉下拉的默认电平。这一步花不了十分钟但能让你在之后整个开发周期里省下大量排查时间。很多时候你以为的“板子坏了”其实就是没有按照这块板子的设计意图去操作而已。还有一条经验不管是哪种按键方式进 Maskrom 之前最好把串口调试线拔掉再接 USB某些调试串口工具会占用额外的 IO虽然理论上不影响 BootROM 的 USB 枚举但我确实碰到过串口工具导致 USB 枚举失败的怪事。操作顺序上我先拔串口、再插 OTG、然后按键上电整个流程稳定很多。5.5 附快速排查速查表现象可能原因解决方法按住 UPDATE 键无反应USB 线或 OTG 口不对换数据线确认插到 OTG 口电脑提示 Unknown Device驱动问题禁用驱动签名后重装驱动工具识别设备后立刻掉线供电不足使用独立电源供电烧录到一半报错数据线质量差或电压不稳换短线、加独立电源、先擦除 Flash按键位置找不到不同板卡设计差异查阅原理图确认按键网络名Linux 下 lsusb 无设备虚拟机 USB 透传问题改用物理机操作说实话Maskrom 模式本身并不神秘它就是芯片设计者预留的一个底层恢复通道。真正让很多人觉得难搞的是不同板卡五花八门的触发设计和主机端的驱动环境。但只要你理解了一个底层原理——BootROM 上电时检测按键信号然后决定是否停留在 Maskrom——所有的方法都是这个原理在不同硬件设计下的具体落地。我个人在实际项目中最常用的还是“按住触发键 点按复位键”这套组合拳既不用频繁插拔电源又能在系统卡死后快速恢复。也建议你在自己的开发环境里固定一套操作顺序别每次都临场发挥。等你把进入 Maskrom 练得像喝水一样自然调起设备树、内核这些底层模块来底气会完全不一样。
