
1. 项目背景RV1106G3平台的fastboot调试到底是怎么回事做嵌入式Linux开发的人应该对瑞芯微Rockchip的方案不陌生。RV1106系列是瑞芯微面向安防IPC网络摄像头、智能门铃、低功耗AI视觉设备推出的一条产品线集成了ARM Cortex-A7单核CPU部分型号是双核、0.5TOPS算力的NPU以及一颗自带3A自动曝光、自动白平衡、自动对焦能力的ISP主打的就是低成本、低功耗、高集成度。RV1106G3则是这个家族里的一个具体型号后缀G3通常对应某类DDR内存配置或封装版本本质上还是同一套SoC平台调试思路是通用的。那fastboot在这类平台上扮演什么角色简单说fastboot是一种基于USB的底层刷机协议在设备还没有完全启动到Linux系统的时候由bootloader在瑞芯微平台上通常是U-Boot提供的一个调试烧录通道。通过fastboot协议你可以直接往设备的eMMC或者SPI NOR/NAND Flash里写分区镜像也可以在系统起不来的时候执行一些底层命令把机器救回来。它是“设备变砖”之后最后一道防线也是产线烧录、固件升级的核心通道之一。我做这个项目的时候手里拿到的是RV1106G3的开发板跑的是瑞芯微官方SDK里的Linux系统。最开始接触这个平台习惯性地以为fastboot就是一条命令打进机器里后来实际搞起来才发现瑞芯微平台在fastboot的使用上和其他平台比如高通、联发科有一些不太一样的细节尤其是「分区表匹配」和「loader与fastboot的共存关系」这两个点踩坑踩得非常深。这篇文章把我从环境搭建到分区烧录再到疑难杂症排查的完整过程记录下来所有内容都是基于RV1106G3实际调试中验证过的操作应该能帮后面拿到类似板子的朋友少走不少弯路。2. 先把底子打好RV1106G3的fastboot环境搭建2.1 硬件连接和驱动准备工作调试fastboot第一件事不是敲命令而是把硬件环境搞对。RV1106G3开发板上一般有一个USB Device接口也叫USB OTG口这个口就是用来做fastboot/adb烧录调试的千万别拿它跟普通的USB Host口搞混。有些板子上会把烧录口标注为“USB Download”或者“USB DEBUG”用Type-C口居多少数是Micro-B口。连接方式如下开发板先不要上电用USB线把电脑和开发板的烧录口连起来按住开发板上标注为“RECOVERY”或“DOWNLOAD”的按键有的板子是拨码开关有的板子还需要配合某个GPIO拉低具体看原理图保持按键按下给开发板上电DC电源或者USB供电都行上电后等待1~2秒松开按键。这一步操作的原理是RV1106G3的片上ROMBootROM在上电后会先检测烧录引脚的状态如果检测到烧录模式被触发ROM就会进入下载模式枚举出一个USB设备。这个模式叫做Maskrom模式或Loader模式是所有底层烧录操作的基础。实测下来按住按键上电基本都能稳定进入比软件命令切换可靠得多。连接好后在电脑上打开设备管理器Windows或者运行lsusbLinux如果看到一个未知设备或者出现“Rockchip USB”之类的字样说明硬件链路是通的。如果完全没反应先换USB线——很多USB线只支持充电不支持数据传输这个坑我一开始就踩过排查了半天最后发现是线的问题。2.2 瑞芯微平台驱动和fastboot工具的选型驱动问题在Windows下是重灾区。RV1106G3进入下载模式后Windows默认不认这个设备需要安装瑞芯微的USB驱动。目前最常用的是两个Rockchip USB Driver也叫DriverAssitant瑞芯微官方的驱动安装工具会把Maskrom、Loader、ADB等模式下的驱动一次性装好如果你平时做Android开发装了Google的USB Driver有些情况下也能顶上但不保证全覆盖。Linux下就简单很多不需要装驱动内核自带的usbfs和usb-storage驱动就能识别Rockchip设备。用lsusb确认一下能看到类似“ID 2207:350b”这样的设备。2207是瑞芯微的USB Vendor ID不同模式下Device ID会有区别比如Maskrom模式下是350aLoader模式下是350bADB模式下是0006。记住这个规律对后面区分设备状态非常有用。fastboot工具本身推荐直接用Google官方发布的Android Platform Tools里面的fastbootLinux和Windows都有对应版本。不建议用别的第三方工具兼容性问题遇到过一次就够头疼了。另外瑞芯微官方烧录工具RKDevTool里面也集成了一套fastboot工具但那个主要配合瑞芯微自己的协议使用和标准的fastboot还是有点区别。我这里讲的都是标准fastboot指令和Android生态完全通用。2.3 先验证一条基础命令fastboot devices环境准备到位后先跑一条最基础的命令试试水fastboot devices正常情况下会输出一行设备信息类似C3D2E1F4090B fastboot输出格式是“设备序列号 状态”。如果能列出设备说明驱动器、USB链路、协议栈都是通的可以从这一步开始正式调试。如果这条命令没有任何输出那后面所有的烧录操作都无从谈起需要回到驱动和连接上排查。注意Linux下执行fastboot命令一般需要root权限或者给USB设备配置udev规则。否则会出现“no permissions (user in plugdev group)”之类的报错。最简单的做法是sudo执行想省事的可以写一条udev规则允许普通用户访问Rockchip的USB设备。3. 核心操作RV1106G3分区烧录与fastboot指令实战3.1 分区布局认知瑞芯微平台的特定烧录思路fastboot烧录逻辑很简单往指定的分区写入镜像。但分区叫什么名字、每个分区对应什么内容不同平台差别巨大。RV1106G3这块板子的分区布局和Android手机不一样跟其他嵌入式平台也不同必须先用瑞芯微的parameter分区表对齐。简单说parameter文件就是一份分区布局清单记录了每个分区在eMMC里的起始位置、大小、名字。以下是典型的RV1106G3分区布局实际以SDK版本为准这里是示意分区名称起始偏移大小内容说明loader0x04MB一级引导代码U-Boot SPLparameter4MB4MB分区表描述文件uboot8MB4MBU-Boot主体镜像misc12MB4MB系统启动控制信息boot16MB32MB内核 initramfsrootfs48MB剩余空间Linux根文件系统这里最关键的一点是瑞芯微平台的uboot镜像和俄bootloader是分离的loader分区由芯片ROM直接加载uboot分区才是完整的U-Boot程序。fastboot功能就实现uboot里面所以如果uboot坏了fastboot也没了机器只能进Maskrom模式用瑞芯微的升级工具恢复。这也是为什么有的朋友反映系统起不来、想用fastboot救砖却连不上很可能就是uboot分区已经损坏了。烧录之前一定要搞清楚当前SDK对应的parameter文件不要拿A版本的烧B版本。分区名字对不上最容易出现的就是“fastboot flash xxx unknown partition”这类报错后文会详细说。3.2 标准烧录流程从擦除到写入的完整命令顺序确认设备能被fastboot识别之后我习惯按以下顺序操作这个顺序是经过多次实践总结出来的能最大限度避免烧出半砖第一步查当前设备信息fastboot getvar version fastboot getvar product一般会输出version: 0.4 product: rv1106这个步骤的目的有两个一是确认设备通信正常二是确认uboot的fastboot版本和SDK预期一致避免出现版本不匹配导致的低级问题。第二步必要时擦除分区fastboot erase uboot fastboot erase boot fastboot erase rootfs这里要注意erase操作是把整个分区清成0xFF或0x00属于破坏性操作。如果当前固件还能用只是想更新某个分区就没必要擦除。擦除存在的意义是在分区内数据格式错误、写入新镜像可能造成冲突时才需要。比如boot分区里之前写了一个损坏的内核直接改写分区有时候会因为剩余数据残留在某些文件系统场景下出问题先erase一遍更干净。第三步烧录镜像fastboot flash loader loader.img fastboot flash parameter parameter.img fastboot flash uboot uboot.img fastboot flash boot boot.img fastboot flash rootfs rootfs.img每条flash指令背后干的事情是把本地镜像文件通过USB传输到设备端的fastboot缓冲区由uboot负责写入指定的eMMC分区偏移地址。写入完成后设备会回一个“OKAY”状态终端上显示“Finished. Total time: X.XXXs”。这里有个瑞芯微平台的特定细节loader、parameter这两个分区在正常烧录时建议先烧因为uboot启动时会去读parameter来获取分区表如果parameter是旧的新烧的uboot可能因为分区信息不一致而出问题。我遇到过一次先烧uboot后烧parameter中间设备重启了一次结果uboot起不来只能重新进Maskrom救。第四步重启设备验证fastboot reboot重启后如果系统能正常起来说明烧录成功。这个命令本质上是让uboot执行重启指令不经过操作系统非常直接。3.3 单分区更新与产线快速迭代技巧不是每次调试都需要全量烧录。实际开发中大部分时间是只改了内核或者只改了应用层脚本这时候全量烧录纯属浪费时间。我常用的做法是改了内核dts或驱动只烧boot分区fastboot flash boot boot.img改了文件系统内容只烧rootfs分区fastboot flash rootfs rootfs.img改了U-Boot配置只烧uboot分区fastboot flash uboot uboot.img。这里有几个实操经验值得分享一下第一boot.img在瑞芯微SDK里往往是内核和dtb打包在一起的改完内核用SDK的编译脚本生成新的boot.img烧进去生效。如果只改了设备树极端情况下可以用fastboot flash dtb dtb.img单独烧dtb分区但前提是parameter里定义了单独的dtb分区否则还是老老实实烧boot。第二rootfs分区如果用的是ext4格式烧写后第一次启动时文件系统可能会自动做一次resize这个过程需要几秒钟属于正常现象不用慌。如果用的是squashfs这种只读文件系统就不存在这个问题但临时修改文件系统内容就很麻烦所以调试阶段我都用ext4。第三产线或者快速迭代场景下不要频繁做erase操作。eMMC的擦除会消耗P/E周期虽然现在的eMMC寿命已经很长但每次全量擦除重写对存储介质总归是磨损。只做flash写入、跳过erase大多数情况下没问题。4. 实战解析RV1106G3调试中遇到的典型报错与排查方案4.1 “fastboot连不上”类问题设备枚举失败的常见原因这是所有fastboot调试中出现频率最高的问题。现象是设备已经按流程进入下载模式但fastboot devices死活不认或者干脆设备管理器里就看不到设备。我归纳下来有四个高频原因驱动没装对或没生效。这个问题在Windows上最常见。解决办法是打开设备管理器如果看到带感叹号的未知设备右键更新驱动手动指定到Rockchip Driver的安装目录。注意装完驱动后要重新插拔USB线或者重启电脑否则驱动状态不会更新。USB线是充电线不支持数据。别笑真的有一半以上的“连不上”是这个原因。普通USB线内部只有电源线没有数据线。建议备两根短线、质量好的数据线作为调试专用线能省下大量排查时间。USB口选错或者供电不足。台式机优先用机箱背板的USB口不要用前置扩展口尤其是那种通过排线转接的前置口信号质量差很容易导致高速USB枚举失败。笔记本的话尽量用直连的口不要经过扩展坞。RV1106G3开发板部分场景下需要外部供电如果只靠USB口供电电流不够会导致设备反复枚举、断开、再枚举现象看起来就是“时好时坏”。设备其实没进fastboot而是一个黑屏或者半死状态。RV1106G3进了fastboot之后屏幕如果有HDMI或MIPI屏一般会停留在uboot的logo或者完全黑屏只靠外观判断很容易误判。最可靠的方式是看USB枚举出来的设备IDMaskrom是2207:350aLoader是2207:350bADB是2207:0006。如果看到350b说明uboot起来了fastboot应该就在如果看到350a说明uboot没起来正在Maskrom此时只能走瑞芯微升级工具标准fastboot是进不去的。4.2 “unknown partition”报错分区名不匹配的根本原因与对策fastboot flash unlock unknown partition这条错误在搜索热词里出现了显然很多朋友在烧录时都撞到过。这个报错翻译过来就是“烧录目标分区不存在”。原因几乎都是同一个parameter分区表里的分区名和你在fastboot命令里写的分区名对不上。RV1106G3这套平台出现unknown partition的高发场景是手里有个通用fastboot烧录脚本脚本里写的是Android平台的分区名比如system、vendor、bootloader直接拿来烧瑞芯微平台必然报错SDK版本更新后分区布局改了老参数和新镜像不匹配直接fastboot flash unlock想解锁OEM锁但瑞芯微平台压根没有独立的unlock分区概念这命令自然找不到目标。排查思路很清晰先通过串口或者烧录工具拿到当前设备的parameter分区表查看实际的分区名列表。可以在uboot命令行里输入parameter print或print partition能看到类似这样的输出partitions: loader:0x0:0x400000:raw, parameter:0x400000:0x400000:raw, uboot:0x800000:0x400000:raw, ...这份输出就是设备当前真实的分区布局照着这里的名字去执行fastboot flash就绝对不会报unknown partition。如果手头没有串口也可以在PC端用瑞芯微的parameter文件比对比如SDK里有个parameter-emmc.txt打开看分区定义跟你要烧的分区名对齐。生产环境中我见过有人为了省事把脚本里的分区名写了一个统配的“all”这在其他平台上可以一次烧全部分区但瑞芯微平台的fastboot不认这种写法老老实实逐个分区烧最靠谱。提示瑞芯微平台烧录时有些文件不是直接对应分区名的。比如parameter分区烧的是parameter.img但里面封装的内容其实是parameter的文本描述加校验信息。不建议用fastboot flash这个方式去改parameter更稳妥的是在Maskrom模式下用升级工具统一处理。4.3 烧录中断或校验失败传输层的隐性坑还有一种现象是烧录过程中报写入失败或者校验不通过类似“FAILED (remote: write failed)”或者“(remote: verify failed)”。这种多半不是分区的问题而是USB传输不够稳定或者镜像文件本身有问题。USB传输稳定性的坑我的经验是这个平台的fastboot工作在高带宽模式下对USB信号质量比较敏感。如果连接线过长超过1米、线材过细、或者USB口扩展过多镜像文件超过几十MB之后传输就容易出错。解决办法是用短线、直接拔插主机USB口、不要在烧录的同时跑大量USB带宽应用。镜像文件校验失败的话先在本机重新解压或重新编译一次镜像确认文件大小和md5和原始产物一致。之前遇到过SD卡拷贝过程中镜像被截断的情况烧进去之后系统起不来后来用ls -l对比文件大小才发现镜像本身就缺尾巴。养成烧录前检查文件完整性的习惯能省很多事。另外如果某次烧到一半被中断设备状态可能变成一种“半烧状态”。此时不要慌按住烧录键重新上电进Maskrom模式用瑞芯微升级工具全量烧回一个基础固件再进fastboot继续调试。虽然没有fastboot那么轻量但能兜底这是每个做瑞芯微平台的人必须掌握的后手。5. 进阶技巧与效率工具让fastboot调试一天省出两小时5.1 把常用烧录流程固化成脚本实际开发中每天烧录几次甚至十几次是常态。每次都手动敲那几条fastboot命令既慢又容易出错。我一般会把常用流程写成一个shell脚本放工位上随便调。一个最基础的全量烧录脚本长这样#!/bin/bash # 全量烧录脚本适用于RV1106G3标准分区布局 set -e echo 等待设备连接... fastboot devices echo 开始烧录loader fastboot flash loader loader.img echo 开始烧录parameter fastboot flash parameter parameter.img echo 开始烧录uboot fastboot flash uboot uboot.img echo 开始烧录boot fastboot flash boot boot.img echo 开始烧录rootfs fastboot flash rootfs rootfs.img echo 烧录完成重启设备 fastboot rebootset -e的作用是任何一条命令失败就立即退出不会继续执行后面的烧录避免在错误状态下造成更严重的固件损坏。这个细节很重要。如果是单分区更新可以给脚本加参数通过$1传入要烧的分区名灵活调用。长年累月用下来这个脚本帮我省了太多重复劳动也避免了手动敲错分区名的低级事故。5.2 善用fastboot getvar和oem命令做状态诊断除了烧录fastboot还能用来做设备状态诊断。RV1106G3的uboot实现了不少getvar变量常用的是fastboot getvar all会输出一长串变量包括product、serialno、partition-size等。通过partition-size可以确认某个分区的实际大小比如fastboot getvar partition-size:boot如果返回的大小和你预期不符比如parameter里定义了64MB但返回显示只有32MB多半是parameter没生效可以从这个点入手排查。部分uboot还支持fastboot oem开头的厂商自定义命令可以用来做复位、进入Maskrom等操作。具体支持哪些命令进入uboot命令行后敲fastboot oem help查看。这类命令没有统一标准不同SDK版本差异大但作为调试入口非常有用。比如某些版本支持fastboot oem reboot2loader一条命令就能让设备重启进loader模式不用再手动按键对自动化测试非常有帮助。5.3 日志与双通道调试串口配合fastboot的黄金组合fastboot模式下的调试信息并不多因为它是一个精简的协议栈不会输出太多log。真正在系统起不来的时候光靠fastboot很难定位问题根因。我的习惯是连接fastboot的同时一定把UART串口线也接上。串口线一头接开发板的调试串口通常是UART0TTL电平波特率1500000——瑞芯微平台默认这个波特率比其他平台常见的115200要高另一头接USB转串口模块电脑上用minicom或SecureCRT打开。烧写完镜像重启设备时串口会打出完整的启动日志从BootROM到U-Boot再到kernel每一阶段的打印都有。如果系统起不来串口最后的打印就是判断问题的关键线索。比如如果串口停在DDR Version打印之后说明DDR初始化失败或loader不匹配如果停在U-Boot 2017.09的banner之后没有继续说明uboot在定位parameter或env的时候出了问题如果kernel解压后panic说明boot分区里的内核和设备树不匹配。fastboot负责“把镜像送进去”串口负责“看镜像跑起来之后发生了什么”。两者配合起来才是完整的调试闭环单靠任何一边都是瘸腿走路。我在项目前期的教训是图省事只接fastboot不接串口结果boot烧进去之后反复重启瞎猜了一天最后接上串口一看是内核设备树里DDR容量配置和实际板载DDR不一致三分钟定位完成。6. 产线与量产场景下的fastboot批量烧录心得6.1 产线模式识别从“Gree已进入fastboot下载模式”说起搜索结果里有一条“gree已进入fastboot下载模式请用usb连接电脑进行软件升级”这个其实是格力家电产品比如空调、风扇的控制面板或联网模块的升级提示。家电类产品用瑞芯微方案通过fastboot做固件升级这个操作在消费电子产线上太常见了。它跟我们开发板调试的逻辑是一模一样的设备端进入fastboot下载模式PC端发送固件。这个场景给我们的启示是fastboot不只是开发者用来调试的工具它同时也是量产产线烧录和售后维修升级的通道。所以遇到这种“进入下载模式请连接USB”的提示别当成系统bug这其实是设备运行正常、固件需要升级的标准动作。对应的PC端操作依然是驱动安装、设备识别、镜像推送这套流程。6.2 批量烧录的产线落地要点产线批量烧录和开发板调试有几个明显区别这些区别决定了产线的流程设计第一是尽量不依赖人手按键触发。产线工人一天要烧几十上百台设备每一台都去按键进fastboot不现实。实践中一般通过治具夹具在上电时自动拉高/拉低烧录引脚让设备一上电就自动进入烧录模式。RV1106G3的烧录引脚在硬件设计时需要预留出来接到治具的继电器或者电子开关上。第二是脚本要有失败重试和良率统计。产线的烧录脚本和开发用的快速脚本不一样要记录每一台设备的烧录结果、耗时、失败原因。可以基于fastboot命令的返回值做判断配合扫码枪实现SN和设备一一绑定确保每一台烧进去的镜像版本可控可追溯。我见过最简单的产线方案就是PC上跑一个Python脚本调subprocess执行fastboot指令把输出重定向到日志文件再结合条形码解析自动归档。第三是固件包要做好版本校验。产线经常出现不同批次产品用不同版本固件的情况一旦烧错版本轻则功能异常重则整批返工。最有效的办法是在固件包名字里带上清晰的版本号和适用硬件型号脚本里做一次关键字匹配不匹配就终止烧录。这属于流程上的防呆比任何技术手段都管用。6.3 售后升级场景面向用户侧的fastboot按钮如果产品已经进入了用户手里需要远程或本地升级通常的做法是OTA但当OTA失败或者用户设备变砖时就必须靠用户手动进入fastboot模式来恢复。这也是为什么很多带屏设备的系统设置里会有“本地升级”“恢复模式”这样的菜单本质就是让用户触发uboot的fastboot模式或者recovery模式然后通过USB线连接电脑用PC工具推送固件恢复系统。这个场景里需要注意的坑是用户在Windows下装驱动是一个巨大痛点。瑞芯微官方驱动对小白用户并不友好经常出现安装失败或者被安全软件拦截的情况。所以面向售后场景很多厂商会把fastboot重封装成一个集成安装驱动的exe工具用户双击运行工具自动装驱动、自动检测设备、自动推送固件、自动重启全程不要用户敲任何命令。我在做RV1106G3的方案时就专门做过一个这样的简易升级工具打包了驱动静默安装、设备自动识别、固件一键推送、日志自动上传这几个模块售后反馈效率提升非常明显。7. 从一个报错说起fastboot调试中的整体排查思路演练以标题相关的搜索热词“sprocommsprocomm-thinkstation-p300:~$ fastboot flash unlock unknown partiti”为例这个场景很有代表性在Ubuntu工作站上执行fastboot flash unlock报错unknown partition。这个场景经过前文的分析是一条非常典型的“命令写错分区名不匹配”组合问题。我们来走一遍完整的排查流程首先确认设备是否真的在fastboot模式。执行fastboot devices如果列不出设备说明问题在驱动或者USB连接跟unlock命令报错无关。如果设备能列出来进入下一步。然后查一下设备分区表。可以执行fastboot getvar all或者在串口uboot命令行里打印partition信息找一下有没有一个叫“unlock”的分区。正常情况下RV1106G3平台不会有一个专门叫unlock的分区所以报unknown partition是正常的——不是设备的问题而是命令目标就不存在。接着明确你到底想干什么。如果是想“解锁bootloader”在标准Android平台上会有对应的分区或者OEM锁机制但瑞芯微的RV1106G3默认不开启针对fastboot的锁分区机制开发调试阶段不需要解锁这个概念。如果是为了产线烧录直接烧你想要覆盖的分区即可分区名照着parameter走loader、uboot、boot、rootfs哪个不对烧哪个。最后如果确实需要执行某些厂商特殊命令去查这个SDK版本的U-Boot源码里面fastboot命令实现处会列出所有支持的命令和分区。源码比任何文档都靠谱。这个案例告诉我们一个通用的排查逻辑报错信息只是结果不要急着在报错表面找对策先确认设备状态再确认分区表再确认命令目标最后确认协议版本。按这个顺序排查多数fastboot问题都能在十分钟内定位。8. 我在RV1106G3的fastboot调试中踩过的坑与最终心得最后聊几句实操层面偏个人化、但对后来者很有用的一些体会。第一个体会是做单片机、或者普通ARM Linux开发出身的朋友第一次碰瑞芯微平台时最需要转变的一个观念是——复位和启动流程里“下载模式”不是额外的软件功能而是BootROM里的固有代码。你把烧录引脚拉低设备上电后ROM就必然跑一段下载代码进Maskrom不需要任何软件参与。fastboot则是uboot这一层才提供的所以“uboot坏了fastboot就没法用”是在瑞芯微平台上要学会接受的事实。遇到这种局面不要再跟fastboot较劲老老实实进Maskrom用升级工具恢复十分钟搞定比研究一下午更快。第二个体会是调试这种底层玩意儿环境因素占比远高于技术难度。我前前后后遇到的上百次fastboot连不上的情况中大概有一半原因是USB线质量问题三成是驱动和USB口问题只有两成才是真正的协议或固件问题。所以给调试环境备两条高质量短线把驱动装好在设备管理器里确认设备ID然后用串口当辅助判断节奏就对了。被“fastboot连不上adb”这类问题卡住的时候先怀疑物理层再怀疑驱动层最后才考虑软件协议层这个顺序能帮你省下大把时间。第三个体会是流程化、脚本化是提高嵌入式调试效率最快的方式。手动敲fastboot命令没有技术含量但特别耗时特别容易在敲错分区名这种低级错误上翻车。写一个可靠的脚本从设备检测到分区烧录到重启验证一气呵成不光省时间关键是每个烧录动作可复现、可记录遇到问题往回追溯的时候非常方便。这套做法我在RV1106G3项目里用得很顺手后来换到别的芯片平台思路也照样能复制。RV1106G3这个平台本身性能不算亮眼但它在成本和功能之间的平衡做得很好尤其适合安防和AIoT类产品。fastboot调试这一关过了后续的启动流程分析、驱动调试、OTA升级都会顺很多。希望这篇踩坑记录能让你在这条路上少走几个弯路踏踏实实把设备跑起来。