Windows刷机工具与串口第一次进桌面—【万物智能之开源鸿蒙 OpenHarmony 系统实战开发系列教程】
hdc 能列出设备,只说明电脑侧通了。今天把系统刷进去——串口 1500000,认清手里那张镜像,直到看见桌面。
DevEco 和 hdc 装好以后,电脑侧能说话了。接下来是板子侧开口,并且把系统跑起来。
卡住通常不是工具难,是三件事叠在一起:USB 口插错、波特率还是 115200、手里那张 .img 不是工具认的格式。任意一件的表现都是「没反应」。
顺序可以很简单:先让 Windows 认出板子的两种 USB 身份,再刷 SD 或 eMMC,串口全程开着。桌面出来之后,用 hdc 确认当前是从哪块介质启动的。
官方对 RK3568 烧录的入口在这儿:RK3568 开发板介绍。官方还写了一条 DevEco Device Tool 远程烧录的路。那条路能走,下面不靠它。原因很具体:Device Tool 把「编译机 + 烧录 + 串口」揉成一套 IDE 操作,一旦失败,日志分散,你很难判断是 USB 驱动、是镜像格式、还是板子没进 Maskrom。瑞芯微自己的 SDDiskTool 和 RKDevTool 是专门干烧录的,失败时窗口里就那几行字,好查。



1. 先把三条线分清楚,别指望一根线干所有事
板子跟电脑之间不是「插上 USB 就全通」。物理上至少三条路,职责完全不同。
flowchart LR
PC[Windows 电脑]
PC -->|数据线, OTG 口| OTG[烧录 / hdc]
PC -->|USB 转串口, 1500000| UART[UART2 ttyS2]
PC -->|读卡器| SD[Micro SD 卡]
OTG --> EMMC[核心板 eMMC]
USB 转串口线插底板调试口,丝印一般写 UART、DEBUG、UART2。这条线只运文字:U-Boot、内核 printk、最后那个 # 提示符。它不刷机,也不跑 hdc。板子完全砖了、eMMC 空了、系统 panic 了,只要 3.3 V 和 UART2 还在,这条线就能告诉你卡在哪一步。所以我要求你:刷机时串口窗口必须开着。闭着眼刷,失败了你连「是 loader 没起来还是内核 panic」都分不清。
USB 数据线插底板的 OTG / DEVICE 口,不是旁边那排 Host 口。Host 口是给 U 盘、USB 相机、Wi-Fi 网卡用的,板子在那头当主机。OTG 口反过来,板子当从机,电脑才能看见它。这根线干两件事:没系统时走瑞芯微 ROCKUSB 协议刷 eMMC;有系统时走 hdc。同一根线、同一个口,板子处于不同阶段,电脑看到的设备类不一样。这就是为什么你要装两套东西:DriverAssistant 认 ROCKUSB,hdc 的 USB 调试驱动认 hdcd。
读卡器插电脑,给 Micro SD 写整包。跟板子当时开不开机无关。SD 卡是「可拿走的磁盘」,Windows 把它当普通 U 盘写。写完拔下来插到板子 SD 槽。
为什么不能偷懒只留 OTG?因为你第一次上手,eMMC 里可能什么都没有,hdcd 起不来,hdc 必然没设备。这时候你若没有串口,就只剩「屏亮不亮」这一个比特的信息,排障会变成猜谜。反过来,只有串口没有 OTG,你能看日志,但 eMMC 刷不进去,hdc 也传不了文件。三条线都接上,才是成年人的调试台。
线材有坑。USB 线必须能传数据。手机盒子里那根「只能充电」的线,插上之后电脑毫无反应,设备管理器不刷新,你却以为是驱动没装。换线的成本是十秒,怀疑驱动的成本是一小时。OTG 口和 Host 口长得一样,都是 USB-A 或 Type-C,认丝印。认不准就看:插上之后板子有没有给 U 盘供电的意思——有供电、电脑仍看不见设备,多半插到 Host 去了。
2. DriverAssistant:让 Windows 认识「没系统的板子」
系统起来之后,板上跑着 hdcd,电脑侧 hdc.exe 跟它握手,DevEco 那篇写过。系统没起来、或者你主动让它进 Maskrom 时,板上没有 Linux,没有 hdcd,USB 控制器被 BootROM / MiniLoader 枚举成瑞芯微的 ROCKUSB。Windows 没装对应驱动,设备管理器里就是黄色感叹号,RKDevTool 左侧空白。你点「升级」没有任何设备可升级。
所以先装 DriverAssistant。它是瑞芯微的 USB 驱动安装器,网上常见 v5.1x。管理员运行,一路下一步。装完把板子 USB 拔掉再插一次,让 Windows 重新枚举。不必重启电脑,但已经打开的 RKDevTool 要关掉重开,它不会热更新设备列表。
装完怎么验收?让板子进一次 Maskrom。具体键位看底板丝印,常见做法是:OTG 线先插电脑,按住 Maskrom 键不放,点一下复位(或断电再上电),松手。RKDevTool 左侧应出现:
Found One MASKROM Device
设备管理器对应位置出现 Rockusb Device 或类似名字。出现了,驱动就没问题,后面刷 eMMC 才有资格谈。
进不去 Maskrom,按这个顺序排,不要一上来重装驱动:
- 换数据线、换电脑上的 USB 口。笔记本扩展坞、前置口、带充电协议的口,经常枚举不稳。直插机身口。
- 确认按的是 Maskrom,不是 Recovery。有的底板两个键挨着,按错会进 Loader 或者什么都不进。
- 核心板没供电。Maskrom 是芯片 BootROM 行为,3.3 V / 5 V 没到 SoC 时 USB 不会枚举。看电源灯。
- 驱动装了但没对这个 VID/PID 生效。设备管理器里对该未知设备「更新驱动」,指向 DriverAssistant 解出来的目录。
进到的是 Loader Device 而不是 MASKROM,也不是失败。说明 eMMC 里已经有一份能跑的 MiniLoader,上电后它接管了 USB。Loader 状态下 RKDevTool 同样可以「升级固件」。全新核心板、或者上次把 loader 区刷坏了,BootROM 才会落到 Maskrom。两种都能刷,差别只是砖得深不深。砖深的必须 Maskrom,因为这时候 eMMC 里没有能说话的 MiniLoader。
有人会问:为什么不直接装 hdc 驱动就完了?因为 hdc 驱动认的是 Linux 起来之后 hdcd 报的设备类。Maskrom 阶段根本没有 Linux。你把 hdc 驱动装得再完美,设备管理器在 Maskrom 里依然不认识 ROCKUSB。两套身份,两套驱动,这是瑞芯微平台的老规矩,开源鸿蒙没改它。
3. 你手里那张 img,到底是什么东西
刷之前先认包。认错包,工具要么打不开,要么打开了刷进去系统起不来。这两种都比「包是对的、操作错了」难查,因为你直觉会去怀疑工具和硬件。
打包脚本最后会吐两个文件,经常躺在同一个目录里:
| 文件 | 头 4 字节 | 谁产生的 | 拿去干什么 |
|---|---|---|---|
| `sd_image.img` 或你改名为 `emmc-xxx.img` 的那份 | `RKFW` | `rkImageMaker` | **真正刷的整包** |
| `update.img` | `RKAF` | `afptool` | 中间产物。本机 RKDevTool 经常加载失败 |
Windows 上看文件头,不必装 hex 编辑器:
certutil -f -encodehex D:\ohos\sd_image.img D:\ohos\head.txt 4
notepad D:\ohos\head.txt
开头应是 52 4B 46 57,ASCII 就是 RKFW。若是 52 4B 41 46,那是 RKAF,不要拿去刷。有人看见 update.img 几个字比较眼熟,想当然丢进 RKDevTool,结果点「打开固件」直接失败,或者打开了分区表是空的。不是工具坏了,是格式就不对。
更绕的一件事:SD 包和 eMMC 包的文件头都是 RKFW。RKFW 只告诉工具「我是瑞芯微整包」,不告诉它「我该进 SD 还是 eMMC」。两份包的差别在文件系统镜像里面的 fstab:SD 版把分区写成 fe2b0000.dwmmc,eMMC 版写成 fe310000.sdhci。控制器路径写错,内核能起来,init 挂 system 超时,十六秒 panic;或者第一阶段侥幸挂上了,第二阶段挂 /data 失败,五十八秒再 panic。启动链那篇会把这两次死亡时间对上号。
所以区分介质的办法是 文件名:
| 文件名 | 刷到哪 | 用哪个工具 |
|---|---|---|
| 含 `emmc`,例如 `emmc-hdmi.img` | 核心板 eMMC | RKDevTool「升级固件」 |
| `sd_image*.img`,或不含 emmc 的 RKFW | Micro SD 卡 | SDDiskTool,勾选 SD 启动 |
有人做了个小工具:扫一个目录,按文件名含不含 emmc 判断该唤起哪个刷机软件。没有这个小工具也没关系,你自己按上表选就行。小工具能防的是手滑——把 emmc-xxx.img 丢进 SDDiskTool,或者把 sd_image.img 当 eMMC 包升级。fstab 和介质一旦错配,串口看起来像「系统坏了」,其实是挂载路径指错盘。
为什么不在文件头里编码介质?因为瑞芯微的 RKFW 格式比开源鸿蒙老得多,它只关心「整包能不能按 parameter.txt 写进 NAND/eMMC/SD」,不关心开源鸿蒙的 fstab 用哪条总线。介质信息是我们自己在包外面用文件名约定的。约定一旦破,自动化选择器和人脑都会选错。
4. SD 卡整包刷:SDDiskTool
SD 卡是第一次点亮最省事的介质。坏了扔掉一张卡,不碰核心板上的 eMMC。产线、演示、来回切换「电机版 / 超声波版」这种互斥镜像,也是刷卡更快。
工具叫 SDDiskTool,常见 v1.69。它干的事情很粗暴:把 RKFW 按 parameter.txt 的分区表,从卡的开头把 loader、GPT、各分区镜像一口气写进去。所以它会覆盖卡上原来的所有东西,包括你以为「只是数据分区」的那部分。
4.1 操作步骤,每一步都有为什么
管理员打开。 不提权,Windows 不允许直接写物理磁盘,工具会在选磁盘或开始写入时失败,报错不一定提到权限。有的版本失败得更安静:进度条走一下就结束,卡里还是旧内容。
勾选「SD 启动」。 不勾的话,工具仍可能把镜像写进卡,但卡开头的启动标志、loader 参数按「这张卡只是存储」来处理。插到板上,板子不一定从这张卡起,可能继续从 eMMC 的旧系统起。你就看见「我明明刷了,怎么还是老桌面」。勾上之后,卡被写成可启动盘。这一勾是 SD 方案的命门,别省。
选固件,必须是 RKFW。 文件对话框什么后缀都给你列。自己用上面的 certutil 看过头的,再选。
选磁盘。 下拉框里会出现电脑的 C: 盘、可能还有第二块机械盘。选错就是把你 Windows 系统抹掉。 认的办法:看容量是不是 SD 卡的容量(64 G、32 G 那种),看是不是「可移动」。认不准就拔掉读卡器,看哪一项从列表消失,消失的那项才是卡。这一段我希望你读两遍。刷机工具不管你,它拿到什么磁盘写什么磁盘。
开始创建 / 恢复磁盘。 弹窗点确定。等进度走完。中途拔卡,这张卡大概率变成读不出的脏盘,重新刷一次通常还能救,但不要依赖这一点。
成功后先「弹出」再拔读卡器。Windows 对可移动磁盘的写缓存不一定立刻落盘,直接拔有极小概率最后几 MB 没写完。loader 区若写残,板上会表现为完全没字,比「系统起一半」更像硬件坏了。
4.2 刷完插到板上,还缺两件事
卡本身有系统了,板子还得同意从 SD 起。底板上常有拨码或跳线,丝印 SD / eMMC。拨到 SD。有的核心板是检测「槽里有卡就优先 SD」,有的不是,以你手头底板说明为准。拨错的表现:串口里 U-Boot 明显在从 eMMC 读分区,你刚刷的卡内容完全没上场。
第二件事:U-Boot 找 boot_linux 分区时,经常去 eMMC 上找,而不是你以为的「当前启动介质」。 新核心板 eMMC 出厂是空的,同一张刚刷好的 SD 卡插上去,串口打:
Cannot find partition 'boot_linux'
FATAL error: cannot load boot_linux image to ram
屏停在 logo,或者连 logo 都没有。同一张卡换到一块 eMMC 里曾经刷过系统的核心板上,立刻能起来。这不是镜像坏了,是 SD 启动暗依赖 eMMC 里也有一份分区表和 boot_linux。新板的正确顺序是:先 USB 刷一次 eMMC,再谈 SD 启动。两盘的 resource(p4)和 boot_linux(p5)建议都写上。
4.3 loader 版本会被 SDDiskTool 覆盖
SDDiskTool 写卡是从磁盘 0 扇区开始的,loader 区在最前面。你卡上原来那份能启动 4 GB 内存板的 MiniLoader(DDR V1.16 @ 1056 MHz),会被镜像自带的 MiniLoader 覆盖。如果镜像里那份是公版 V1.10 @ 1560 MHz,4 GB 板会卡在:
write training result
后面没有 out,没有 U-Boot,没有串口的 Linux。看起来像内存坏了。其实是 DDR 训练频率和这份颗粒不对付。启动链那篇写怎么用 boot_merger 合成 V1.16。这里先记住:刷卡不等于「只更新系统分区」,它连最前面的 DDR 初始化代码一起换。大内存板必须用带正确 loader 的镜像。
strings MiniLoaderAll.bin | grep DDR 能看到版本字符串。镜像打出来之后、刷之前,抽空看一眼。刷完再在串口里对,对不上就是包打错了。
5. eMMC 整包刷:RKDevTool + Maskrom
eMMC 在核心板上,不能拿读卡器写。只能 USB。工具是 RKDevTool。
5.1 为什么走「升级固件」,不走「下载镜像」
RKDevTool 有两个常用页。
升级固件:你丢给它一个 RKFW 整包,它自己解析里面的 MiniLoader、parameter.txt、各分区镜像,按表写。这是整包刷新的正确入口。
下载镜像:你自己在表格里填「这个分区对应哪个 img 文件」,再勾选要写的行。适合已经有系统、只更新某一个分区的人。第一次点亮不要走这页——parameter 填错一行,userdata 偏移越界,或者漏写 MiniLoader,都能把板子写成怪状态。
有的老文档把 RKAF 的 update.img 配一份 config.cfg 走「下载镜像」。本机实践里,RKAF 经常根本加载失败。eMMC 交付也交 RKFW,文件名带 emmc。不要和文档里 dayu 公版那套 RKAF 流程较劲。
5.2 操作
- OTG 线接电脑,进 Maskrom(或 Loader)。左侧出现设备。
- 切到「升级固件」。
- 固件路径选文件名含
emmc的 RKFW。 - 点「升级」。进度一般是:先下载 MiniLoader 让板子从 Maskrom 变成 Loader,再按分区写。
- 等日志窗口新打出「下载固件成功」或「下载完成」。
「新打出」三个字是经验。RKDevTool 的日志窗口不会在每次操作前自动清空。上次成功的那行「下载固件成功」还躺在上面,这次 USB 中途掉了,你扫一眼日志以为又成功了。板子复位之后还是旧系统。我自己吃过这个亏:以为 eMMC 已经是新桌面,其实旧的 RenderService 还在,排查方向全错。
正确习惯:点升级之前把日志清掉,或者看最后一行的时间是不是刚才。成功之后不要立刻拔线,等板子自己复位,或你按复位键。第一次从空 eMMC 起来,比 SD 慢,给它 40~60 秒。串口在刷,比盯着屏猜更准。
5.3 失败怎么读日志
| 日志 / 现象 | 实际含义 |
|---|---|
| 打开固件失败、分区表空 | 你丢的是 RKAF,或者文件截断了(拷贝到一半) |
| 等待设备超时 | 没进 Maskrom / Loader,或驱动没认到 ROCKUSB |
| 写到某个分区 USB 错误 | 线、口、供电;换线换口,关掉占用 USB 的虚拟机 |
| 升级完成但启动停在 DDR | MiniLoader 版本和内存颗粒不匹配 |
| 升级完成,内核 panic 在 wait dwmmc | 你刷了 SD 版 fstab 到 eMMC |
最后一项特别阴险。操作「成功」了,板子也出字了,就是起不来桌面。串口里 wait for file .../fe2b0000.dwmmc/by-name/system 超时。eMMC 的控制器叫 fe310000.sdhci,fstab 却去 SD 控制器下面找 by-name。这就是文件名没带 emmc、或者带了但内容其实是 SD 包。打包那篇会写刷之前怎么 grep dwmmc 验 fstab。
5.4 刷 eMMC 会不会把 SD 槽里的卡弄坏
不会。RKDevTool 升级固件写的是当前 USB 枚举到的存储——Maskrom 下就是芯片接的 eMMC。SD 卡插着也没事,它不在这条 USB 烧录路径上。反过来,SDDiskTool 写的是读卡器里那张卡,不会隔空写 eMMC。两边是隔离的。隔离的代价是:你以为「我刷了 SD,eMMC 里的旧桌面会消失」,不会。两套系统可以同时存在,U-Boot 选谁,谁就上场。这就是为什么改 DTS 之后只刷了 SD 的 p4,板上还在用 eMMC 里那份旧 dtb——U-Boot 去 eMMC 取 resource。刷分区那篇会把「两盘的 p4/p5 都写」当成默认动作。
6. 串口:1500000 8N1,这是这条产品线的法律
开源鸿蒙在这块 RK3568 上,调试控制台就是 UART2。设备节点 ttyS2。内核命令行写死:
console=ttyS2,1500000
1500000 不是笔误,也不是「越高越好」。这是芯片 UART 时钟分频在这块板上的常用值,U-Boot 和内核约定好了。你在串口工具里填 115200,电平和连线全对,窗口里也只是一片乱码或空白。很多人在这里耗一个晚上,换线、换板、怀疑晶振。先把波特率改对。
Windows 上 PuTTY、MobaXterm、安全 CRT 都可以。参数就这五个:
| 项 | 值 | 填错会怎样 |
|---|---|---|
| 端口 | 设备管理器里 USB 转串口的 COMx | 打开失败,或打开了没数据 |
| 波特率 | **1500000** | 乱码,像板子没起 |
| 数据位 | 8 | 偶发错字 |
| 校验 | None | 大量错字 |
| 停止位 | 1 | 错字 |
| 流控 | **None** | 有的工具默认 RTS/CTS,表现为能收几个字然后卡住 |
流控这项容易被忽略。板子 UART2 没接 RTS/CTS。工具若默认硬件流控,TX 会等一个永远不来的 CTS,你敲的回车发不出去,看起来像「串口只能看不能敲」。关掉流控再试。
接线:USB 转 TTL 的 GND 对底板 GND,TX 对底板 RX,RX 对底板 TX。3.3 V 电平。5 V 的 USB-TTL 有可能把 SoC 脚打坏,别用。TX/RX 接反的表现是完全没字,和波特率错、没供电很难一眼分开。所以先确认转接芯片在设备管理器里出现,再确认 GND 通,再对调 TX/RX 试一次。对调是十秒,怀疑芯片损坏是十天。
上电后正常的字大概是这个顺序:
DDR ... V1.16 ...
U-Boot ...
Hit any key to stop autoboot
...
Starting kernel ...
[ 0.000000] Booting Linux on physical CPU 0x0000000000 ...
...
内核起来之后,init 会拉 console 服务。这个服务在不少公版配置里默认 disabled。板级若没在 init.rk30board.cfg 里写 start console,你能看日志,敲回车没人理。板级配置里已经打开。敲回车应出现 # 或 / #。
# uname -a
Linux localhost 5.10.xxx #1 SMP PREEMPT ... aarch64
# param get ohos.boot.hardware
rk30board
ohos.boot.hardware 必须是 rk30board。不是 rk3568,不是板子型号。init 用这个字符串拼文件名:init.rk30board.cfg、fstab.rk30board。你改了 init.rk3568.cfg 当正式文件,开机理都不理。源码树和启动链那两篇会把这个后缀钉死。现在先验证它是 rk30board,证明刷进去的是这份板级,不是某份公版镜像。
串口噪声多、刷屏影响你看字时:
# echo 1 > /proc/sys/kernel/printk
这把控制台日志级别压低。排完障改回去,或者重启就恢复默认。
7. 第一次进桌面:正常长什么样,不正常分哪几类
2 GB 或 4 GB 内存、屏那路已经在设备树里 okay、镜像是对的,时间线大致如下:
0 s 上电。串口出 DDR 训练、U-Boot
2 s 屏上出现 logo。logo 来自 resource 分区,不是 boot_linux
8 s 内核起来,串口开始刷 dmesg
15 s 开机动画(bootanimation)
25 s 动画退,桌面图标出来
30 s OTG 插着的话,hdc list targets 能列出设备号
logo 不是内核画的。U-Boot 从 resource 分区 里取出 logo.bmp 和这份分区里的 rk-kernel.dtb。所以你换了开机画面却只刷 boot_linux,logo 不变;你改了 DTS 却只刷 boot_linux,内核用的还是 resource 里那份旧 dtb。刷分区和设备树那两篇会反复说。先建立直觉:屏上第一张图 = resource,不是内核镜像。
桌面出来之后,图标应是横屏排布。这块板的物理屏是 1024×600 一类的横条。若图标竖着挤在一边,那是窗口取向被写成了 VERTICAL,显示那几篇再处理,不挡现在验收「系统活了」。
7.1 亮一下又黑,桌面其实在
这是真发生过的案子,不是理论。开机动画播完,launcher、foundation、render_service 都起来了,串口里能搜到 wms.fullscreen.ready。再过大约十几秒,屏突然黑。你按复位,又能看到动画,然后又黑。
电源服务里有一个 SuspendController,配置文件 power_suspend.json 里有一个 "timeout" 源。意思是:这么多秒没人点屏,就当用户走开了,关屏。首启要装一堆预装 HAP,CPU 忙,你又在盯串口,没人摸触摸。计时器不会被复位,到点必关。重启之后如果你碰巧点了一下屏,计时器被清掉,又能亮很久——所以这事看起来「偶发」,其实首启无人操作时是必然。
临时办法:摸一下触摸,或按电源键。永久办法:删掉 /system 那份 json 里的 timeout 块。丢到 /vendor/etc/power_config/ 无效,加载函数根本不搜 vendor。启动链那篇给具体文件路径和删哪一段。现在先别被黑屏骗去重刷。
7.2 卡 logo 不动
「卡 logo」是一个筐,里面至少四只不同的野兽,串口才能分开它们。
串口停在 DDR 训练,没有 U-Boot。 loader 版本和内存容量不匹配。见启动链那篇。重刷带 V1.16 loader 的包。
串口 Cannot find partition 'boot_linux'。 U-Boot 去 eMMC 找分区,eMMC 空。先 USB 刷 eMMC。
串口内核起来了,然后 panic,wait for file ... dwmmc 或 sdhci。 fstab 和启动介质错配。确认文件名、确认你用的工具。
串口完全正常,能敲命令,ps 里有 init,没有 render_service,或有但马上退了。 这是图形栈。可能是 vendor 里缺 GPU 库(config.json 没把芯片产品配进去),可能是 SystemUI 起不来导致合成器 layer map 空。先确认串口和 hdc,图形问题交给显示那几篇。不要在这一步开始改 DTS。
只亮背光,没有 logo,串口正常。 显示口在设备树里 okay 了,但 U-Boot / 内核选中的 connector 不是你接的那路,或者时序不对。背光 GPIO 被点亮是独立的,不代表像素在出。显示总论那篇再拆。
7.3 hdc 该出现了,用它确认启动介质
桌面起来,OTG 还插着:
hdc kill
hdc start
hdc list targets
应打出一串十六进制设备号。没有的话:换 OTG 口、确认不是 Host、板上 ps | grep hdcd。系统没进到用户态时 hdcd 不存在,这是正常的,先靠串口。
通了立刻跑这三条,抄下来:
hdc shell "param get ohos.boot.hardware"
hdc shell "cat /proc/partitions"
hdc shell "mount | grep ' on / '"
硬件名必须是 rk30board。
/proc/partitions 告诉你现在内核看见哪些盘:
- 只有
mmcblk0:看得见的是 eMMC。没插 SD,或 SD 没枚举。 - 还有
mmcblk1:SD 卡在位。在位不等于从 SD 启动。
从哪启动看 mount 的 /:
/dev/root on / ...
再配合:
hdc shell "df / /vendor /system"
vendor 若在 mmcblk1p8,你在从 SD 跑;在 mmcblk0p8,从 eMMC 跑。不要用 /dev/block/by-name/vendor 判断——by-name 永远指向 eMMC。这是后面会反复出现的陷阱。从 SD 启动时,ls -l /dev/block/by-name 看起来一切正常,你 dd 到 by-name 的 system,写的是 eMMC 那份,SD 上正在跑的系统纹丝不动。下次重启还是老的。刷分区那篇会把 dd 写成两套完整命令,不要在命令里留 X 这种占位符。
现在只做观察,不 dd。观察清楚「我现在从哪块盘启动」,比什么都重要。
8. 刷之前的核对清单,建议过一遍再动手
闭着眼刷不是勇气,是给自己制造不可解释的现场。
[ ] DriverAssistant 已装,进一次 Maskrom,RKDevTool 左侧有设备
[ ] 串口 1500000 8N1,流控关,GND/TX/RX 没接反,上电有字或至少有电平
[ ] 镜像头是 RKFW(52 4B 46 57),不是 RKAF
[ ] SD 包文件名不含 emmc;eMMC 包文件名含 emmc
[ ] SDDiskTool 勾了 SD 启动;磁盘容量对得上卡,不是 C 盘
[ ] RKDevTool 走「升级固件」;点升级前清空日志;成功判据是本次的「下载固件成功」
[ ] 大内存板:MiniLoader 能 strings 出 DDR V1.16
[ ] 新核心板:计划里包含「至少 USB 刷一次 eMMC」,不要只刷 SD
[ ] OTG 插的是 OTG 口;读卡器只在刷 SD 时插电脑
有一条没打勾就开刷,出了「没反应」,你不知道该回退哪一步。清单的意义是把状态空间缩小。
9. 串口窗口怎么开,才像个长期工位
工具随便选,习惯别随便。我见过有人每次上电重新填一遍波特率,填成 115200,再问我「怎么又乱码了」。把会话存成配置文件,下次只点开。
PuTTY。 Session 里选 Serial,Serial line 填 COMx,Speed 填 1500000。Connection → Serial 里 Data bits 8、Stop bits 1、Parity None、Flow control None。Save 成一个名字,比如 rk3568-uart2。Logging 打开,All session output,路径指到 D:\ohos\log\uart.txt。刷机、首启、卡 logo,事后你都有文本可以搜 panic、wait for file、render_service。人的眼睛在刷屏里抓不住十六秒和五十八秒的差别,文本搜得出。
MobaXterm。 新建 Serial session,同样 1500000、无流控。它的好处是复制粘贴比 PuTTY 顺。坏处是有的版本默认开硬件流控,记得关。
不要用 Windows 自带的「蓝牙」那一类串口助手去碰 1500000,很多只列出到 115200。工具下拉框没有 1500000 就自己填,填不了就换工具。
日志文件会涨得很快,dmesg 在 1500000 下几分钟就是好几 MB。按天切分,或者只在「这次要复现问题」时打开 logging。别把三个月的串口记录丢进聊天里让人帮你看——先自己 findstr panic uart.txt。
串口还能干一件 hdc 干不了的事:在 U-Boot 倒数时敲任意键,停在 U-Boot 提示符。
=> printenv
=> mmc list
=> mmc dev 0
=> mmc part
=> mmc dev 1
=> mmc part
mmc list 能看到当前 U-Boot 认到几块 MMC。mmc part 看分区名里有没有 boot_linux、resource。新核心板在 eMMC(通常是 mmc 0)上 part 是空的或没有这些名字,就和串口里那句 Cannot find partition 'boot_linux' 对上了。这比你在开源鸿蒙里猜「是不是 DTS 错了」要快一个数量级。看完 boot 继续启动,或 reset 重启。
U-Boot 里乱 mmc erase 能把盘清空。这里只 printenv 和看分区,不写。真要在 U-Boot 里写盘,等你后面真的砖到 USB 也进不了 Maskrom——那种情况很少,BootROM 的 Maskrom 不依赖 eMMC 内容。
10. 还没编译源码,镜像从哪来
你现在可能手里已经有一份别人打好的 sd_image.img。可以。目标是「工位通」,不是「从源码复现」。用现成包刷进桌面,后面编出来的包才有对比基线:编坏了,你知道回到这份能进桌面的包。
现成包也要过第 3 节的认包手续。别人拷给你的 update.img、网盘里随便下的 dayu 公版、文件名写着 sd 其实 fstab 是 sdhci 的,都会让你在「工具会用了」的假象下浪费一天。md5 对一下。Linux 编译机那侧会把产物连 md5 一起丢到共享目录,你在 Windows 上:
certutil -hashfile D:\ohos\sd_image.img MD5
和共享目录里那份 .md5 或笔记对上,再刷。拷贝到一半的文件,头四个字节可能仍是 RKFW,刷进去分区写残,表现比「完全没刷」更像软件 bug。md5 是唯一便宜的完整校验。
没有现成包、也不想等自己编译?那就先把串口和 Maskrom 这两件事做完。板子哪怕没有开源鸿蒙,U-Boot 或 BootROM 仍会在串口和 USB 上说话。工位先活,包随后到。
11. 桌面出来之后,先别急着点应用
能进桌面会有一种「大功告成」的错觉。先做三件无聊但值钱的事。
确认横屏、触摸能点到图标。 点得准不准是后话(GT911 被写成 720×1280 时会点不准)。现在只要求:手指点下去,有个图标有反应。完全没反应可能是触摸节点没起来,也可能是你点的是一块没被合成器覆盖的区域。串口 cat /proc/bus/input/devices 看有没有触摸设备。没有就记一笔,不要在这一步改 HCS。
确认 hdc 能进 shell,并且 shell 是板子的。
hdc shell "cat /proc/version"
hdc shell "getprop | grep hardware"
开源鸿蒙上 getprop 不一定有,用 param get ohos.boot.hardware 更靠谱。cat /proc/version 里的编译时间和用户名,后面你自己编内核时要拿来对照:刷了 boot_linux 之后这里必须变。不变,就是 dd 写错盘或写到了假文件。
把分区表存档。
hdc shell "cat /proc/partitions"
hdc shell "ls -l /dev/block/by-name"
hdc shell "df -h"
三份输出粘到笔记。by-name 的目标盘符你现在就该看见全是 mmcblk0p*。df 才能告诉你当前 /vendor 在哪。以后有人(包括你自己)随手写一条 dd of=/dev/block/by-name/vendor,你有笔记可以立刻指出它会写到哪。
不要在这一步装自己的 hap、不要改设置里的显示休眠时间当「修了黑屏」。设置里改的是 settings 数据库,首启那次 timeout 源仍然在。系统层的修法在启动链那篇。现在只要求工位能刷、能看、能进、能 hdc。
12. Windows USB 自己会捣乱的几种方式
不是板子的问题,是 Windows 的 USB 电源管理。笔记本上更常见。
设备管理器 → 通用串行总线控制器 → 每一个 USB Root Hub → 电源管理,把「允许计算机关闭此设备以节约电源」勾掉。不勾掉的表现:RKDevTool 升级到一半设备消失;hdc 用着用着 list targets 变空,拔插恢复。看起来像线松了。
另一个:虚拟机占用 USB 控制器。你如果在同一台 Windows 里开了 VMware / VirtualBox,并且把 OTG 那个控制器勾给了虚拟机,宿主机的 RKDevTool 就看不见 Maskrom。刷机时把虚拟机里的 USB 设备断开,或直接暂停虚拟机。调试那篇会把 Linux 编译机和 Windows 刷机机分开,就是为了少踩这种抢设备。
还有一个:hdc 和 RKDevTool 同时占着 OTG。系统已经起来时,hdcd 占用着 USB 功能。你这时候想进 Maskrom 刷 eMMC,要先让板子离开 Linux——按 Maskrom 键复位。不复位,电脑看到的仍是 hdc 设备,RKDevTool 左侧空白。不是驱动丢了。
选择性暂停、USB 3.0 口对 ROCKUSB 枚举不稳,也可以试 USB 2.0 口。我遇到过同一根线,蓝口失败、黑口成功。没有理论可讲,换口比改驱动快。
踩过的坑
假成功的「下载固件成功」。 日志窗口有历史。以本次新行为准。
RKAF 当整包。 update.img 能用十六进制打开,工具不一定能加载。只交 RKFW。eMMC 也交 RKFW,靠文件名带 emmc。
SD 包刷进 eMMC,或反过来。 操作成功,启动 panic。死亡时间 16 秒对 fstab.required,58 秒对 fstab.rk30board。串口搜 wait for file 和 ExecReboot。
波特率 115200。 乱码。先改 1500000。这是被问次数最多的问题,没有之一。
流控开着。 能看不能敲。关 RTS/CTS。
OTG 插到 Host。 Maskrom 没设备,hdc 没设备,板子可能在给 U 盘供电。
新板只刷 SD、eMMC 空白。 Cannot find partition 'boot_linux'。先 USB 刷 eMMC。
SDDiskTool 选成电脑硬盘。 这不是「坑」,这是事故。选磁盘时拔插读卡器对照。
覆盖 loader 把 V1.16 写成 V1.10。 4 GB 板卡 DDR 训练。刷卡前看 MiniLoader 字符串。
以为 by-name 是当前启动盘。 现在如果只观察还没事;一旦开始 dd,假成功会让你改 DTS 却看不见效果。
首启黑屏当砖。 摸一下屏。再考虑重刷。
dd 到 /dev/mmcblk1p5 而不是 /dev/block/mmcblk1p5。 现在还不用 dd。你要是自己搜到命令去试:节点不存在时 dd 会在 /dev 下建普通文件,打印成功,md5 还能对上镜像,分区没动。刷分区那篇专门拆这个假成功。
工位通了,下一步才是在 Linux 上把这棵树编出来。Windows 编不了这份标准系统。
刷之前自己过一遍:DriverAssistant 能进 Maskrom;串口 1500000 无流控;头是 RKFW;文件名和工具匹配;SDDiskTool 勾了 SD 启动且磁盘不是 C 盘;RKDevTool 清空日志后再认成功;大内存板 MiniLoader 是 V1.16;新核心板至少 USB 刷过一次 eMMC。
桌面起来立刻把这几条抄下来,后面写分区会用:
hdc shell "param get ohos.boot.hardware"
hdc shell "cat /proc/partitions"
hdc shell "mount | grep ' on / '"
hdc shell "df | grep vendor"
硬件名应是 rk30board。vendor 落在 mmcblk0p8 还是 mmcblk1p8,决定你以后 dd 走哪套命令。
系列第 5 篇 · 芯片:瑞芯微 RK3568 · OpenHarmony 4.1(API 11) · Linux 5.10
更多推荐




所有评论(0)