
做硬件调试这些年我最大的感受是很多问题不是被“想”出来的而是被“试”出来的。尤其是进入OpenHarmony这类开源系统后硬件的每一处异常小到一个引脚电平不对、大到内核panic都需要一套趁手的调试手段来定位。今天这篇我想把自己在开源鸿蒙实战中反复用到的“硬件调试三板斧”完整梳理一遍——串口、ADB、HiLog这三样东西配合好基本能解决开发板上80%以上的疑难杂症。这篇内容适合两类人一是刚拿到RK3568这类开发板、正准备从 Linux 思维切换到 OpenHarmony 场景的嵌入式工程师二是已经在跑OpenHarmony系统、但遇到“log刷屏找不到头绪”、“串口无输出”、“驱动加载失败”等典型问题想系统提升调试效率的同学。我会把每一斧头的适用场景、操作细节、踩坑记录都摊开讲尽量做到拿过来就能用。1. 硬件调试前的第一道关烧录与存储结构调整先说个很多新手上来就懵的问题RK3568开发板拿到手官网上有好多设备树文件、好几套烧录镜像到底该选哪一套这个问题背后其实是OpenHarmony区别于传统Linux发行版的一个关键点——系统组件按场景裁剪镜像也按硬件配置做了拆分。1.1 设备树选型别被“一堆dtb”吓到我第一次面对RK3568那堆.dtb文件时也头大整理下来其实就三类评估板通用包、特定屏幕/模组适配包、以及你自己编译产物。选型的核心逻辑不是“挑最新的”而是先确认你的硬件属于哪个参考设计。如果你拿的是官方评估板直接选默认的rk3568-evb1-ddr4-v10这类命名最稳。如果你用第三方核心板厂商一般会给出一个“配套 dtb 名称”通常是核心板型号缩写。如果你改了外设引脚比如换了一个I2C触摸屏那就必须自己改dts并重新编译而不是去网上找一个听起来像的dtb凑数。这里有个我踩过的坑之前为省事直接选了个“默认配置”的dtb结果屏幕背光不亮、触摸没反应排查半天发现是某个GPIO被复用成了其他功能。所以设备树选型的原则很朴素跟硬件设计走不跟文件名走。1.2 烧录分区与镜像选择搞清楚“烧到哪里”OpenHarmony的烧录分区和Android类似但又有自己的特点。常用的分区包括boot、system、vendor、userdata还有我们调试时经常要单独更新的uboot、dtbo。实际操作中我不建议每次调试都整包烧录。整包烧一次动辄几分钟迭代效率太低。正确做法是改了内核设备树只烧boot或dtbo。改了HAL层或驱动相关服务只烧vendor。只改系统应用或框架烧system即可。烧录工具方面RK系列官方推荐使用RKDevToolWindows下操作直观。Linux环境下则用upgrade_tool脚本化烧录更方便。不管用哪个第一步都是让板子进入MaskROM或Loader模式——通常是通过按住板子上的RECOVERY按键再上电或者短接特定的测试点。提示烧录前务必确认分区表版本和镜像版本匹配。低版本烧录工具配高版本镜像经常会出现莫名其妙的“烧录成功但起不来”问题。2. 第一板斧串口调试——系统“无声”时的唯一救命稻草我一直觉得串口是硬件调试里最“硬核”的一路通道。为什么因为它是不受系统状态影响的物理链路。哪怕内核还没起来、bootloader还在早期初始化串口都能给出关键信息。2.1 串口连接与参数配置别拿USB转串口乱怼RK3568开发板上的调试串口通常是一组3.3V电平的UART引脚TX、RX、GND。注意这里说的是3.3V电平不是5V。我曾经图省事直接把一个5V供电的USB转串口模块接上去结果板子直接不启动。好在是销毁不严重重新上电后恢复但把这个教训记下了。正确连接方式是TX接RXRX接TXGND接GND。用3.3V电平的USB转串口模块比如CP2102、FT232都行。波特率一般设置为1500000或115200OpenHarmony默认调试串口一般是1500000如果没输出再试试115200。连接好之后在PC端用minicom或MobaXterm打开串口。如果屏幕上没有任何输出先别急着怀疑硬件检查这几项串口号是否选对Linux下是/dev/ttyUSB0或/dev/ttyACM0。电平是否匹配万用表量一下TX引脚有没有波形。是否按住了RECOVERY键上电板子必须处于可交互状态。2.2 串口输出分析从bootloader到内核的“黑白电视”串口拿到输出后怎么看我习惯把启动日志分成三个阶段分别对应不同问题域第一阶段bootloader阶段。如果这里就停了说明DDR初始化失败、时钟配置错误或启动介质有问题。比如打印停在DDR Version后无下文大概率是内存参数不匹配。第二阶段内核早期启动阶段。这里能看清楚设备树是否加载正常、关键驱动是否注册成功。如果出现Unsupported device tree之类的字样多半就是dtb选错了。第三阶段系统服务启动阶段。OpenHarmony的init进程会逐条执行启动脚本这里能看到各类服务是否正常拉起也是日常调试中观察得最多的区域。一个很实用的技巧在bootloader阶段打断自动启动。RK3568的uboot模式下按住空格或按任意键能进入uboot命令行。在这里可以手动执行boot命令也能查看环境变量、手动加载镜像排查启动流程问题非常方便。注意串口只看输出是不够的还要会“注入输入”。在系统完全启动后OpenHarmony的串口通常也保留了shell入口。这意味着哪怕ADB连不上只要串口还能交互就能执行命令做基本诊断。3. 第二板斧ADB调试——从“盲操作”到“可视化操作”串口虽好但它的交互能力太“素”了。想查看文件系统、安装hap包、抓取屏幕截图串口做起来很别扭。这时候ADB就是最趁手的第二板斧。3.1 ADB连接方式与常见坑位OpenHarmony默认集成了ADB调试能力连接方式主要有两种USB连接用Type-C数据线连接开发板和PC注意要选用支持数据传输的线。我遇到过很多次“插上没反应”结果发现是充电线而不是数据线。网络连接开发板连上和PC同一个局域网通过adb connect ip:5555连接。这种方式调试无头设备特别方便不用拖着一根线。连接成功后先执行adb devices确认设备状态。如果设备显示unauthorized需要到开发板屏幕上确认授权弹窗——对无屏设备可以使用串口执行adb kill-server后重试或者检查usb配置是否允许调试。3.2 高频ADB命令查文件、拉日志、装应用、改配置调试OpenHarmony我的常用命令清单如下adb shell进入设备shell相当于远程终端。adb push / adb pull向设备传文件、从设备拉文件。OpenHarmony的System参数、配置文件一般都在/system或/vendor下但普通用户权限不够需要先mount -o rw,remount /重新挂载。adb install xxx.hap安装应用包。注意hap包安装失败时先看有没有签名问题再看API版本是否匹配。adb shell hilog抓取系统日志后面第四部分专门讲。adb reboot重启设备调试驱动或系统服务改动后必用。另外几个我特别看重的用法# 查看设备树里某个节点是否存在 adb shell ls /sys/firmware/devicetree/base/ # 查看某个驱动是否加载成功 adb shell ls /sys/bus/platform/devices/这两条命令的价值在于不重启设备就能直接确认设备树有没有生效。比如你改了一个GPIO的别名重新烧了boot分区后通过查看设备树节点下的属性内容能立即判断改动是否贴合预期。3.3 实用场景设备无法开机时怎么用ADB救回来我遇到过几次系统起不来、但uboot和内核都正常的场景。此时串口能看到init进程报错但不知道根因。这时候ADB其实还能用——只要内核起来、网络或USB驱动正常ADB就能连上。这个阶段常用的操作是用adb remount重新挂载分区为读写。adb pull /data/log/拉取系统运行日志。通过adb push替换出问题的配置或库文件。等于是把ADB当成了一个“后门维修通道”比反复烧镜像高效得多。4. 第三板斧HiLog日志——比printf更“懂事”的打印工具串口解决“有没有问题”ADB解决“问题在哪一层”而HiLog解决的是“这个问题为什么发生”。作为OpenHarmony自带的日志系统HiLog比传统printf强在三个地方分类清晰、级别明确、可按域过滤。4.1 HiLog核心概念与抓取姿势HiLog的日志有域Domain和标签Tag两个维度。域一般是一串数字用于区分子系统标签是文本用于区分功能模块。抓日志时最常用的命令是# 实时查看所有日志按时间顺序输出 hilog # 按标签过滤 hilog | grep HiLogSample # 按级别输出级别DEBUG/INFO/WARN/ERROR/FATAL hilog -e ERROR这里有个踩过的坑系统默认的hilog输出可能包含了大量系统服务日志刷屏非常严重。我的建议是先按级别过滤只在排查特定功能时再放开到INFO甚至DEBUG。比如驱动调试就只关注内核驱动上报的日志域hilog -e DEBUG -D 0xD001410这样能把焦点收敛到一个子系统里定位效率高很多。4.2 HiLog在应用层与驱动层联动调试中的用法很多场景是上层应用报错说“找不到设备”但你不清楚是驱动没加载还是HAL层封装出了问题。这时候单看应用日志是不够的。我的排查路径是用HiLog抓应用日志找到错误码和关键打印。看驱动层的日志标签比如某个Sensor驱动是否有注册成功的提示。对比两者时间戳确认调用链在哪一环断裂。举个例子之前调试一块TP触摸屏应用一直报input device not found。抓HiLog后发现内核层已经有goodix_ts_probe成功的日志但HAL层因为上报节点权限不够拒绝打开设备节点。问题定位后改一下SELinux策略就解决了。如果没有HiLog的按域过滤这种跨层问题排查起来会非常痛苦。4.3 让HiLog更好用的3个配置项除了抓日志HiLog还支持按需配置我用得比较多的是持久化日志默认情况下重启后日志就没了。调试启动类问题时可以先用hilog -w start开启日志落盘抓完再关。设置日志级别hilog -L D可以把全局日志级别调到DEBUG但注意会产生大量IO开发阶段可以量产版本千万别开。跨设备日志抓取OpenHarmony支持分布式组网可以用PC侧的hilog工具连接设备抓日志不过需要先完成组网认证。5. 常见问题与排查技巧实录写了这么多最后把我经验里最高频的几个问题整理成一张“速查表”大家遇到类似现象可以直接对照排查。5.1 问题速查表现象可能原因排查手段上电后串口完全无输出串口接地没接好、电平不匹配、DDR初始化卡死先查3.3V电平再测TX脚波形最后换镜像试验卡在bootloader无内核日志设别树选错、启动介质eMMC/SD不对进入uboot命令行手动执行boot查看启动参数内核起来但系统服务起不来某个启动脚本报错、SELinux策略卡住抓HiLog持久化日志看init服务执行序列烧录后系统循环重启镜像不对、分区版本不匹配、驱动崩溃整包烧录一次排除增量烧录导致的不一致ADB连不上设备数据线问题、USB模式不对、未授权换线、重新插拔、串口确认USB配置5.2 排查思路三板斧如何组合使用很多初学者一遇到问题就在串口和ADB之间来回切换效率很低。我现在的套路是第一步先用串口快速判断系统起没起来、死在什么阶段。第二步如果系统能起来立刻切到ADB把文件和配置的状态摸清楚。第三步问题收敛到具体模块后用HiLog按域抓取详细日志定位代码或配置层面的根因。这套流程用熟了一般的问题基本能在十几分钟内定位到模块级别。5.3 几个容易忽视的“软性”问题除了技术问题还有几个“软性”问题也提一下都是实战中常遇到的镜像来源混乱。建议每次开发新建一个镜像目录按日期和用途命名记录烧录分区和工具版本避免“不知道当前板上跑的是哪套东西”的尴尬。开发板供电不足。RK3568满载运行功耗不小用USB供电时经常出现低电、外设异常。建议用12V/2A以上的电源适配器。日志文件无限增长。某些版本的hilog持久化日志默认不清理时间长了占满userdata分区导致系统卡顿。定期用hilog -w stop清理或配置日志轮转。6. 实操总结与扩展思路最后分享一点我这两年做OpenHarmony硬件调试的个人体会。串口、ADB、HiLog这三板斧其实对应了硬件调试的三个层次物理链路层、系统交互层、应用逻辑层。很多新手喜欢一上来就抓日志、翻代码但忘了先确认“板子最基本的状态是否正常”。我自己也犯过这个毛病拿着HiLog盯了半小时最后发现是串口转接板接触不良导致的假故障。所以调试的第一要务永远是先把设备和工具的基础链路确认好再去深挖问题本身。这三板斧之外OpenHarmony还有一些更进阶的调试手段比如hidumper系统信息导出、hdc_std标准调试工具、内核层trace事件跟踪等后面可以在实战开发系列里单独展开。如果你在实操中也遇到过特别刁钻的硬件调试问题欢迎在评论区把现象和排查过程丢出来大家一起把“三板斧”打磨得更锋利。