咱直接开门见山说事。这篇东西是给搞OpenHarmony开发、尤其是手里拿着RK3568开发板的朋友准备的。标题里的“刷机全流程、SD、eMMC、单分区”这几个词,基本就是嵌入式Linux和OpenHarmony开发路上绕不开的坎。经常有新手问,板子变砖了怎么办、OpenHarmony系统到底怎么装进eMMC、SD卡在整机启动流程里到底扮演什么角色,还有网上那么多设备树文件,选错了会不会启动黑屏。这篇文章就想一次性把这些事情讲透,以RK3568平台为例子,把SD卡和eMMC两种烧录方式的区别、单分区方案的设计思路、设备树的选择方法以及刷机过程中的常见报错都梳理清楚。不管你是刚拿到开发板准备点灯,还是已经编译完系统正准备往板子上烧,这篇都值得收藏备用。
1. 核心思路拆解:为什么刷机方案要区分SD卡和eMMC
1.1 存储介质不同,刷机逻辑天差地别
先明确一个基础概念,OpenHarmony系统要想在一个嵌入式设备上跑起来,必须有存储介质来放bootloader、内核、根文件系统。目前RK3568开发板上主流的存储方案就是SD卡和eMMC,这两种介质虽然都是非易失性存储,但刷机逻辑确实完全不同的。
SD卡是一个可插拔的设备,板卡上一般设计成TF卡座或SD卡座,走SDIO接口。它的好处是灵活,刷机时可以拿读卡器在电脑上直接准备好一张卡,插到板子上就能启动。就算板子上的eMMC完全空白的,只要板上BootROM能从SD卡引导,系统就能活起来。很多开发板出厂时默认就是SD卡启动模式,因为调试阶段反复擦写系统非常方便。
eMMC则是板载的存储芯片,直接焊在PCB上,走的是专用的eMMC控制器接口。它的优势是集成度高、速度快、抗震动,适合产品量产。但缺点也显而易见,刷机方式比较折腾。eMMC烧录依赖烧录器的专用工具,比如RK3568平台常用的RKDevTool,通过USB线连接开发板,板子进入Loader模式或MaskROM模式后,用电脑端的工具把镜像写进eMMC芯片里。
这两种刷机逻辑的根本区别在于,SD卡的镜像文件是以文件形式存储在卡上的,你用一个支持GPT分区的工具直接编辑和写入分区;而eMMC的烧录往往是裸数据写入,由烧录工具把raw image按偏移地址写到芯片的固定位置。体现在具体操作上,就是SD卡方案直接写一个整盘镜像到TF卡,eMMC方案则可能需要按分区表逐个写入。
1.2 单分区方案的设计意图和适用场景
标题里特别强调了“单分区”,这是个典型的调试阶段优化手段。常规的Linux/OpenHarmony系统,分区分得特别细:uboot、boot、system、vendor、data、misc等等。但分区多了,刷机时就要一个个分区去烧录,出错的概率也高。还有一个问题是,开发调试阶段你经常要改内核、改设备树,如果分区分得很细,一次修改就得重烧一个分区,流程太慢。
单分区方案的核心思路是,把整个system镜像、内核、ramdisk、dtb这些内容全部打包进一个分区镜像里,刷机时只刷这一个分区就够了。比如把根文件系统、内核、设备树都打包进一个rootfs镜像,GPT分区表里只有一个名为“rootfs”的分区,另外保留一个uboot分区就够了。这样搞有以下几大好处:
刷机步骤大幅简化,不用再纠结哪个镜像对应哪个分区,也不用关心分区表是否匹配。
对于SD卡场景,只需把单个分区镜像用dd命令写到SD卡对应的MBR/GPT偏移位置,或者直接把整卡做成单一根文件系统分区,插上就能启动。
开发调试时改文件系统,如果需要完整打包,直接重新生成rootfs镜像烧一次;如果只是改内核或者dtb,那就在rootfs的固定目录替换文件即可(比如把zImage和dtb放在/boot目录下),灵活性很高。
但单分区方案不适合复杂的上层应用场景。比如你需要做OTA升级、数据分区隔离、双系统备份的时候,单分区就会变成灾难。所以这个方案主要定位在“系统开发初期、驱动调试阶段、快速验证OpenHarmony启动链路”这些用途上。
1.3 RK3568刷机为什么绕不开设备树和Loader
RK3568是瑞芯微推出的一款高性能四核A55处理器,OpenHarmony官方及第三方适配板卡中它的出镜率极高。但只要你在网上搜“openharmony的rk3568有许多设备树到底咋选”,就会发现这是许多新手第一个被绊倒的地方。
设备树(DeviceTree,简称DTB)本质上是描述硬件信息的二进制数据文件。OpenHarmony内核在启动时,需要从设备树中获取当前硬件平台的板级信息:DDR大小、串口地址、I2C控制器、SDIO控制器、GPIO引脚功能、lcd屏参数等等。RK3568芯片功能太强,可以做的开发板也非常多,不同的板卡在硬件细节上差异很大,引脚复用、看门狗、电源管理芯片都可能不一样,所以同一颗SoC,对应着多份不同的设备树文件。
刷机时如果你选错了设备树,内核起来后会“张冠李戴”,导致串口没有任何打印、屏幕点不亮、触摸不工作、网卡找不到,甚至内核直接panic。这个问题的根源就在于,用户对板卡的具体硬件配置不清楚,盲目选择了一份与硬件不匹配的dtb。
Loader(引导加载器,在RK平台叫MiniLoaderAll.bin)则是芯片BootROM启动后执行的第一段代码,它的作用类似于电脑的BIOS,负责初始化DDR、时钟,再引导U-Boot去加载内核。不同板卡的DDR型号、颗粒大小、跑法不同,Loader的选择也是有讲究的。通常开发板厂商提供的固件包里会带一个对应板型的Loader文件,烧录时必须匹配,否则芯片初始化DDR就会失败。
2. 准备工作:刷机工具链、镜像文件与设备树选择
2.1 硬件准备清单与连接方式
动手刷机之前,先把工具和连接方式理清楚。RK3568开发板的刷机硬件准备包括:
RK3568开发板一块,最好是官方或主流厂商的板子,比如RK3568 EVB、TB-RK3568X之类,不同板卡在跳线、按键位置和默认启动设备上会有差异。
一张质量不错的TF卡,容量建议16GB以上,速度等级至少Class 10。SD卡刷机场景下,卡的质量直接决定刷机过程中的稳定性,劣质卡是很多偶发报错的根源。
USB Type-C数据线一根,用在eMMC烧录模式。注意是“数据线”,不是纯充电线,很多朋友电脑识别不到设备,换一根数据线就好了。
12V/2A以上的DC电源适配器一个。刷机过程中如果供电不稳,会出现烧录中断、设备反复重启等诡异问题。
串口调试线(USB转TTL模块,常见的CH340或CP2102)一只,方便观察U-Boot和内核的启动日志,定位问题必备。
在物理连接方面,eMMC烧录时,把开发板的USB Type-C口连到PC,开发板断电,然后按住板上的RECOVERY键(恢复键)再上电,RKDevTool就会识别到设备进入Loader模式。如果你之前的板子已经有一份可用的uboot,也可以通过adb命令输入 reboot loader 来让它重启进入Loader模式,没必要每次去按物理按键。
SD卡刷机时,不需要USB连接电脑,只需要把写好的TF卡插到卡座,开发板供电,并确保板卡的启动拨码开关或者uboot环境变量设置的启动顺序里,SD卡优先于eMMC。
2.2 电脑端开刷工具:RKDevTool与SD Memory Card Formatter
行业里常用的是RKDevTool(瑞芯微开发工具),这是刷RK系列芯片的必备工具。它支持烧录单个分区镜像、整体镜像、查看设备信息、擦除Flash等操作。新版RKDevTool界面很直观,选中“分区表”标签页,可以从配置文件中加载分区信息,然后给每个分区指定本地镜像文件路径,点击“执行”就开始烧录。
需要提醒的是,RKDevTool的版本和固件包的烧录配置文件download.config要匹配。如果固件包烧录配置文件是给老版本工具用的,新版工具可能无法识别;反之,老版本工具可能不支持新固件的打包格式。所以建议优先使用开发板厂商提供的工具版本,而不是一昧追新。
SD卡刷机工具方面,推荐先用SD Memory Card Formatter把TF卡彻底格式化一遍,清掉所有分区残留,然后再用写卡工具写入镜像。SD Memory Card Formatter是SDA协会出的官方工具,主要好处是它执行的是完整的物理格式化,能修复很多普通格式化解决不了的分区表问题,也能把卡恢复到出厂状态,减少刷机时因分区残留导致的奇葩错误。
用SD卡启动OpenHarmony时,写卡工具可以选择Win32DiskImager、balenaEtcher,或者直接使用dd命令在Linux/macOS环境下写卡。如果你只是往已有的分区镜像里更新内核文件,则不需要整卡写入,只需要在电脑上挂载SD卡的分区,然后把新的kernel和dtb文件直接替换进去就行。
2.3 镜像文件构成、分区表与单分区设计
在OpenHarmony的烧录文件包里,常见的镜像文件名和含义如下:
| 文件名称 | 说明 |
|---|---|
| MiniLoaderAll.bin | RK平台的引导Loader,完成DDR初始化,加载U-Boot |
| parameter.txt | 分区表描述文件,定义各分区名称、起始地址、大小 |
| uboot.img | U-Boot引导程序镜像 |
| boot.img | 内核、ramdisk、dtb打包镜像(标准方案) |
| system.img | 系统根文件系统镜像,OpenHarmony的system组件 |
| vendor.img | 厂商私有库、硬件抽象层文件 |
| userdata.img | 用户数据分区镜像 |
但在单分区方案中,上述的boot和system往往会被合并处理。一种常见的做法是:U-Boot单独一个分区,剩余的空间全部做“rootfs”分区,在rootfs分区的/boot目录下放置内核镜像、dtb文件和ramdisk。这样只有两个分区,刷机时只需关注rootfs这一个核心分区即可。
这里要展开说说为什么这种做法在调试阶段效率奇高。标准多分区方案中,如果你改了kernel,需要重新打包boot.img再单独烧写boot分区;如果你改了系统配置,需要重新打包system.img并烧写system分区。每次重新打包出来的镜像很大,烧录时间也长。单分区方案就把这些步骤全部简化成了“镜像生成后,整体写卡/烧写”。在OpenHarmony开发早期,系统还在高频迭代、文件系统调整很频繁的阶段,单分区的便利性是不可替代的。
2.4 设备树选择的核心原则
回到标题里那个热搜词“openharmony的rk3568有许多设备树到底咋选”,这块儿我多写一些,因为踩坑率实在太高。
RK3568的OpenHarmony内核源码里,arch/arm64/boot/dts/rockchip/目录下会有几十个dts文件。命名规律通常是rk3568-xxxx.dts。选择设备树的第一原则是看板卡型号,比如你是RK3568 EVB板,那就找rk3568-evb.dts或者rk3568-evb1-ddr4-v10.dts这种带evb字样的。第二个原则是看厂家,很多第三方板子的源码适配是直接提交到上游的,名字里会带厂商缩写。
假如你的板子是自研的,或者厂商没有提供适配好的设备树,那就需要在现有设备树基础上自行裁剪。这个时候先确认DDR颗粒类型和容量、电源管理IC型号(RK3568常用RK809-5或RK809-2)、以太网PHY型号、LCD屏幕的MIPI/EDP配置。这些硬件参数可以从原理图里找到,对照着现有设备树修改即可。
选错设备树最典型的现象是串口死活没有任何打印信息。这种现象不止会发生在内核启动阶段,其实在U-Boot阶段如果设备的DDR配置不一致,也可能导致U-Boot无法完成重定位,整个启动过程静默失败。所以在刷机前,如果你不确定设备树对不对,先看一眼U-Boot默认加载的dtb路径和环境变量,很多厂商会将默认dtb写进U-Boot的环境变量里。烧录后如果没有任何打印,先别急着怀疑硬件,检查这一步就对了。
3. SD卡刷机实操全流程
3.1 TF卡准备与格式化细节
写卡之前一定要先格式化,这个步骤不能跳过。我有一个朋友直接往旧卡上写镜像,结果启动时卡在“Failed to load DTB”上,排查了整整一天,最后发现是卡里残留了之前某个大型Linux发行版创建的多个分区,GPT和MBR格式混乱导致引导器找不到有效分区表。
格式化操作建议如下:
把TF卡通过读卡器插到电脑上,用SD Memory Card Formatter先执行“Overwrite Format”,确保彻底删除所有数据。
如果是在Windows下用Win32DiskImager写卡,可以把“Write”选项直接指向下载好的单分区镜像文件。
如果是在Ubuntu主机上操作,使用lsblk确认TF卡的设备节点(通常是/dev/sdb或/dev/mmcblk0),然后执行 sudo dd if=your_image.img of=/dev/sdb bs=4M status=progress 完成写入。
注意:写卡时设备节点千万不能选错,否则会把电脑上的数据盘直接覆盖掉,这种事故在嵌入式圈子里并不罕见。
写卡完成后,拔出读卡器之前一定要执行sync命令(Linux下),或者等Windows提示安全弹出硬件。
3.2 确认启动顺序与拨码开关
开发板支持从SD卡启动确实很方便,但有个前提:启动顺序必须正确。RK3568平台的上电启动顺序由芯片的BootROM决定,BootROM会按照预先烧录在芯片OTP区里的启动设备顺序去尝试加载Loader。常见的启动顺序是SD卡优先、eMMC其次,但不同的开发板设计可能不同,有的板子需要通过拨码开关来配置。
操作步骤:
查看开发板硬件手册,确认启动模式开关的位置和档位定义。
一般会在板子丝印上标有BOOT或MODE字样,旁边注明各档位的启动介质。
默认出厂时,板子通常设置为“SD卡启动优先”或“eMMC启动优先”。如果要从SD卡启动,把拨码开关对应拨到SD启动档位。
如果开发板出厂时eMMC里已经有一个可启动系统,而你需要优先用SD卡调试,记得把启动顺序设为SD优先,否则插上卡也是直接进eMMC里的老系统。
3.3 上电启动与日志观察
把写好的TF卡插进卡座,连接串口线,波特率一般设为1500000(RK平台默认是1500000,不是常规的115200,这一点要特别注意),打开串口工具后给板上电。
正常启动时,串口会输出U-Boot的版本信息、DDR初始化日志,接着是加载ramdisk和内核的日志。如果看到海量日志刷屏,并且最后进入OpenHarmony的init进程,那基本就说明SD卡刷机成功了。
如果出现以下情况,就要按照排查思路处理:
串口完全没输出,检查供电、串口线连接、波特率设置,再确认是否进入了SD启动模式。
有BootROM加载Loader的提示但随后卡住,可能是Loader与板卡DDR不匹配,换对应板型的Loader。
U-Boot能起来,但加载kernel时提示找不到分区,通常是U-Boot的环境变量中root分区名与你镜像分区表里的名称不一致。
SD卡刷机的最佳应用场景是调试。你不需要反复插拔USB线,也不需要进入Loader模式,只需要在电脑上把新的镜像写入TF卡,插到板子上重启就完成了一次系统刷新。这对快速验证内核配置修改、测试设备树变更特别友好。
3.4 SD卡刷机时容易踩的坑
SD卡写好了,启动却失败了,这是新手最容易绝望的时刻。但从经验来看,绝大多数问题都出在下面这几个点:
卡速太低。Class 4级别的老卡读速不够,U-Boot加载内核镜像时就会超时,表现为主板上电后串口有输出,但一到加载boot.img就卡住或报错。建议用Class 10及以上的卡。
分区表残留。这个问题上面提过,旧的MBR/GPT残留会导致U-Boot解析分区失败。用SD Memory Card Formatter整卡格式化能解决大部分问题。
镜像文件损坏。下载的镜像包可能不完整,建议较验MD5/SHA256值,或者在烧录后重新挂载分区查看文件列表,确认关键文件是否都在。
单分区镜像里kernel和dtb文件放置路径错误。OpenHarmony的U-Boot对rootfs中/boot目录的路径要求比较严格,kernel命名为kernel.img或zImage,dtb命名为resource.img或直接使用带DTB路径的配置,一定要和U-Boot环境变量对应上。
4. eMMC刷机实操全流程
4.1 进入Loader模式
eMMC刷机远比SD卡刷机复杂,因为涉及到设备进入特定模式并和电脑通信。RK3568进入Loader模式有两种常见方式:
方式一:硬件强制进入。先断电,按住板上的RECOVERY键不放,给板上电,等待约2秒后松开。此时芯片的BootROM会进入下载模式,USB设备枚举出来,电脑端会发现一个新的USB设备(VID_2207,PID_350a之类的)。
方式二:软件命令进入。如果板上已经有了可用的OpenHarmony或Linux系统,并且adb功能正常,直接执行 adb reboot loader,系统重启时就会进入Loader模式。
进入Loader模式后,打开设备管理器,如果看到“USB输入设备”或“Rockusb Device”之类的设备,说明连接正常。如果设备管理器里完全没反应,先换USB线、换电脑USB口、换电脑试试,再考虑主板USB供电的问题。
4.2 RKDevTool烧录参数与分区表解析
打开RKDevTool后,主界面会显示“发现一个LOADER设备”。此时切到“设备分区表”页面,可以看到从parameter.txt里解析出来的分区信息。你的烧录步骤是:
点击“高级功能”菜单里的“导入配置”,导入开发板厂商提供的parameter.txt和对应的烧录配置文件。
在每个分区对应的镜像路径处,填入你本地准备好的镜像文件。比如uboot分区对应uboot.img,misc分区对应misc.img,rootfs分区对应你打包好的单分区根文件系统镜像。
注意检查分区大小是否比本地镜像实际大小要大。如果镜像大小超过分区定义大小,烧录会直接报错。
点击“执行”按钮,工具会按顺序擦除目标分区并写入数据,整个烧录过程会有进度条。
烧录完成后,工具会提示“烧录成功”。此时点击“高级功能”里的“重启设备”,如果是SD卡启动优先,并且卡里插着SD卡,那么设备会从SD卡启动;如果拔掉SD卡且主板配置为eMMC优先,则会从eMMC启动。
这里要单独说明一下,RKDevTool烧录eMMC时,写入的是裸分区数据。这就意味着你的镜像文件必须是完整的、带正确文件系统格式的镜像,工具不会帮你做文件系统的创建和格式化。所以单分区方案在eMMC场景下的rootfs镜像,应该是用mkfs.ext4或类似工具制作好的ext4文件系统镜像,然后烧录工具直接把这个镜像写到rootfs分区对应的物理偏移地址。
4.3 eMMC烧录常见报错与修复
烧录eMMC过程中,最让人头大的报错是“烧录失败:设备断开连接”和“emmc偶发报错-110错误”。
先解释-110错误的本质。Linux内核里USB通信超时错误码是-110(对应ETIMEDOUT)。在RKDevTool烧录过程中,设备端(开发板)在上传数据时与电脑端的USB通信中断,超过指定时间没有响应,就会报这个错。产生原因大概有这几类:
USB数据线质量差或线缆过长,信号衰减导致传输不稳定。
主机端的USB控制器驱动问题,尤其在Windows系统里,USB驱动兼容性不佳时容易出现。
eMMC芯片写入速度不稳定,某些劣质eMMC颗粒在长时间擦写后性能下降,导致写入超时。
开发板的供电不足。RK3568在烧录eMMC时电流需求较大,如果适配器电流余量不够,电压跌落会导致eMMC控制器异常。
排查建议:
换一根短线高质量USB数据线,不要超过1米。
换电脑的USB口,优先用主机背面的USB 3.0口。
关闭电脑上可能占用大量USB资源的软件,比如同步工具、调试工具。
给开发板使用独立电源适配器,避免USB供电和板卡供电互相干扰。
如果-110错误反复出现,还有一个非常实用的办法:把烧录速度调低。RKDevTool的配置里有一个“速率设置”选项,默认可能是最高的,选择中等或低速模式重新烧录,很多偶发超时问题会直接消失。
4.4 配置parameter.txt实现单分区
如果你想完全按单分区的思路来烧eMMC,可以从修改parameter.txt入手。下面是一个精简版的分区表示例:
FIRMWARE_VER: 1.0 MACHINE_MODEL: RK3568 MACHINE_ID: 007 MANUFACTURER: Rockchip CMDLINE: mtdparts=rk29xxnand:0x00002000@0x00004000(uboot),0x00002000@0x00006000(misc),0x00100000@0x00008000(system)一个极简的场景下,你甚至可以只保留uboot和system两个分区。CMDLINE里mtdpart的地址与大小决定了这些分区在裸设备上的物理布局。system分区对应的偏移地址,就是eMMC上根文件系统映化开始的位置。烧录时RKDevTool会根据parameter.txt的配置,把system.img写到正确的偏移地址。
但我不建议新手一上来就完全自定义parameter.txt,默认的parameter.txt分区表通常已经预留了较合理的布局。你要做的只是在RKDevTool的界面里,只选择那些有用的分区(比如只在uboot和system前打勾),镜像文件也只填入这两个分区的文件,其他分区留空不烧写。这样既保留了完整的分区表结构,实际操作时又只用关注两个分区,和单分区方案的核心理念是一致的。
5. 常见问题与排查技巧实录
5.1 刷完SD卡但启动无打印
这个问题的排查路径很清晰,按顺序检查以下环节:
确认开发板供电是否正常。RK3568的最小系统需要12V供电,如果用户用USB供电来启动,功耗远超USB口的输出能力,板子根本起不来。
确认串口连接正确。RK3568的调试串口一般是UART2,对应板子上的TX、RX、GND三个针脚。TX和RX需要交叉连接(板子的TX接串口模块的RX,板子的RX接串口模块的TX),GND共地。
确认波特率是1500000而不是115200。这一点很隐蔽,默认波特率不对,收到的全是乱码,或者干脆没有任何显示。
确认SD卡上写入的镜像包含正确的Loader。单片镜像文件如果是由OpenHarmony编译打包生成的sdcard.img,它本身就包含从0偏移开始的所有内容,不需要再额外处理引导部分。但如果只改写了rootfs分区而忽略了Loader,那么SD卡启动时BootROM找不到合法的Loader数据,整个启动流程会在最早期就终止,表现就是串口完全没打印。
还有一点容易被忽略:某些开发板由于硬件设计原因,SD卡座默认只支持1-bit模式,而U-Boot可能默认尝试8-bit模式,导致读取SD卡失败。这个可以在U-Boot源码的板级配置里强制修改为1-bit模式来验证。
5.2 设备树选错导致的内核panic
选错设备树后的典型症状前面已经提过。这里补充一个实际案例:一块第三方RK3568核心板,硬件上用的是LPDDR4颗粒,但设备树文件里写的是DDR4配置,导致内核在启动时访问DDR参数错误,直接panic在早期。排查时一次偶然的机会对照原理图发现内存颗粒的型号编号是LPDDR4,才意识到问题根源。
设备树的选择一定要结合具体的硬件配置,不能只看核心板型号。如果核心板是直接购买的模组,厂商通常会提供配套的设备树文件,最稳妥的做法就是向厂商要他们验证过的配置,而不是自己从零堆配置。
如果设备树里外设配置选错了,比如LCD驱动里明明用了GC9503V芯片,设备树里写的却是HX8399,那启动时屏幕会闪一下然后熄灭。有时候U-Boot能起来、内核也能起来,但某个驱动初始化失败,导致系统日志里出现大量无法识别的设备。这时候用dmesg查看具体报错信息,倒推到设备树里查找对应的节点配置,就是最快的解决路径。
5.3 Windows下RKDevTool识别不到设备
这个问题的来源非常多,最常见的几种:
没有安装瑞芯微的USB驱动。在设备管理器中如果看到一个带黄色感叹号的未知设备,右键更新驱动,选择“浏览我的电脑以查找驱动程序”,指向RKDevTool驱动目录下对应的驱动文件。
USB线是纯充电线。外壳标注有“Support USB 2.0”字样的才是数据线,很多手机附带的线只支持充电,无法传输数据。
开发板需要按住RECOVERY键再上电,顺序不能搞反。先上电再按RECOVERY键是没法进入Loader模式的,因为芯片BootROM早就跑过去了。
电脑USB口供电不足。部分台式机前置USB口供电质量差,建议用后置USB口。
如果以上都排除了,换一台电脑试试。Win10/Win11对Rockusb设备的识别兼容性确实会有差异,买个几十块钱的USB HUB带独立供电的,接上之后插到HUB上,往往就能解决问题。
5.4 刷机后OpenHarmony无法进入桌面/系统异常
系统能启动但进不了桌面,或者进入桌面后频繁奔溃,这在SD卡和eMMC刷机中都有可能出现,但原因不太一样。
SD卡场景下,大多数是卡速太慢导致的IO瓶颈。OpenHarmony启动过程中,System Server各组件会大量读取文件系统,如果卡速不稳定,就会出现服务启动超时,系统一直卡在开机动画阶段。解决方法是换速度更快的A2级别的卡,或者重新用SD Memory Card Formatter完整格式化后再写镜像。
eMMC场景下,如果系统能启动但频繁崩溃,优先考虑是不是分区表不匹配导致system分区后面的数据被污染。举个例子,之前烧录过标准多分区镜像的板子,再烧单分区镜像时,如果parameter.txt没有被正确更新,工具可能把rootfs镜像写到了旧分区表对应的偏移地址上,旧分区表中的其他分区残留数据还在,就会导致内核挂载根文件系统后出现难以理解的错误。这种情况下最简单的操作是先用RKDevTool的“擦除Flash”功能把所有分区清空,再重新烧录。
5.5 高效调试建议与实操心得
最后针对整个刷机与调试过程,分享几点靠踩坑换来的经验:
手里常备一张“万能救砖卡”。提前在SD卡里放一个Uboot + 内核 + 最简根文件系统的基础镜像,并做好标记。当eMMC里系统刷挂了,用这张卡就能快速启动,然后通过adb或串口重新烧录eMMC,不至于变砖后束手无策。
保存好每一次成功启动时的串口日志。出问题时做对比分析,很多时候问题不是突然出现的,而是你改了某个设备树或者调制了某个内核参数后才出现的。有正常日志和异常日志的对比,定位问题的速度会翻倍。
编译镜像前,把编译产物和对应的parameter.txt、dtb文件放在同一个文件夹并命名清楚。时间一长你会发现,镜像文件和设备树多得像迷宫一样,不做好版本管理,找不到对应关系的时候非常痛苦。
烧录完成后,建议立即在设备上执行 df -h 查看分区挂载情况,确认rootfs确实挂载到了预期分区。很多烧录问题表面看是“系统起不来”,实际上是挂载了错误分区或错误文件系统,尽早确认能少绕很多弯子。
RKDevTool烧录过程中,尽量不要操作其他占用USB带宽的任务,比如拷贝大文件、手机充电等。USB资源抢占在某些主板上非常明显,会导致烧录时间变长甚至失败。
OpenHarmony在RK3568上的刷机流程,本质上是一个“理解引导链路、选择正确镜像、匹配硬件配置”的过程。SD卡方案胜在灵活,适合高频调试;eMMC方案胜在稳定,适合系统成型后的固化。单分区设计则是在开发效率与系统复杂度之间的一个平衡点,理解它背后的思路,对于后续自行裁剪系统、定制产品镜像都很有帮助。按这套流程操作下来,不敢说百分之百不踩坑,但至少能让少走很多弯路。