ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

OpenHarmony硬件调试三板斧:串口日志、设备树与系统工具实战

2026/9/6 9:49:41 拓冰建站 浏览量
OpenHarmony硬件调试三板斧:串口日志、设备树与系统工具实战 拿到一块全新的 OpenHarmony 开发板时我最先做的事情并不是急着点亮屏幕而是先找串口线。原因很简单板子刚上电屏幕、网络、触摸屏都可能处于“不干活”的状态这时候唯一还愿意跟我说实话的往往就是串口。OpenHarmony 系统开发调试了一段时间后我把日常排障手段收敛成了三件事习惯叫它们“硬件调试三板斧”——第一板斧是串口日志第二板斧是设备树排查第三板斧是系统级调试工具。这套方法在 RK3568、RK3566 这类常见开发板上屡试不爽放到 x86 版本的 OpenHarmony 环境里也一样成立只是设备树路径和串口设备名略有区别。这篇就围绕开发 OpenHarmony 系统时最常遇到的硬件问题把这“三板斧”的使用思路和实操细节一次讲清楚。如果你是刚接触 OpenHarmony 的嵌入式工程师或者正在被“板子起不来”“外设没反应”“驱动 probe 失败”这类问题折磨这篇文章应该能帮你快速建立一套可复用的排障框架。我会尽量把命令、日志现象、排查顺序都写出来也会把那些在普通文档里查不到的坑单独拎出来说。1. 硬件调试三板斧先从整体上想明白1.1 OpenHarmony 硬件调试到底在调什么OpenHarmony 不是一个简单的裸机程序它是一整套分层系统。从最底层的 bootloader、内核到中间的 HDFHardware Driver Foundation驱动框架再到上面各种系统服务和应用每一层都有自己出问题的姿势。电源没起来可能是硬件设计问题bootloader 卡住可能是内存参数不对内核启动到一半可能是设备树选错了驱动加载失败可能是 GPIO 复用冲突你在这块板上调好的代码换一块板可能又要重新查一遍。这些都算“硬件调试”的范畴。我经常打一个比方调 OpenHarmony 硬件就像给一栋楼验收。串口日志相当于施工方每天写的工地日志设备树相当于建筑图纸系统调试工具相当于你拿着尺子去现场量。只看图纸不看现场会踩坑只量现场不看图纸会迷路三者配合才是完整的验收流程。所以在开始敲命令之前我建议你先想清楚当前要解决的问题大概率发生在哪一层是系统根本没启动还是启动后某个外设没有被内核识别还是驱动已经加载但上层服务调用失败这个判断会直接决定你从“三板斧”里先抽出哪一把。1.2 三板斧是什么、为什么够用“三板斧”不是三个孤立命令而是三种互补的调试能力。第一板斧串口日志。它解决“系统现在到底跑到哪一步”的问题。屏幕上可能什么都没显示但串口能告诉你内核解压到哪个地址、设备树在哪一步 parse、init 进程有没有起来。没有串口OpenHarmony 底层调试基本就是盲人摸象。第二板斧设备树。它解决“系统认为这块板子上有什么硬件”的问题。同一个芯片可以做出几十种开发板屏幕不一样、内存不一样、外设 GPIO 不一样全靠设备树区分。很多驱动 probe 不成功根源不是代码写错而是设备树里某个节点的 status 还是 disabled或者引脚复用跟另一个外设打架了。第三板斧系统级调试工具。它解决“驱动加载之后系统服务运行得对不对”的问题比如 hdc shell、hilog、sysparam、hidumper 这些。到这个阶段系统已经跑起来了你再通过串口看启动日志已经不够必须在运行中的系统里主动去问、去查、去验证。为什么这三板斧够用因为它们覆盖了硬件问题从“看不见”到“看得见”、再到“摸得着”的完整链条。下面我就按这三板斧的顺序一套一套拆开来讲。2. 第一板斧串口日志——调试的生命线2.1 串口怎么接、波特率怎么定这块要是不对后面所有日志都无从谈起。串口接线看似简单但我见过太多人死在这里。标准接法就是三根线开发板的 TX 接调试串口工具的 RX开发板的 RX 接工具的 TX然后 GND 必须共地。对GND 一定不能省不共地时偶尔能收到数据但大概率是乱码或者时通时断。电平匹配也要注意。OpenHarmony 开发板上的调试串口绝大多数是 3.3V TTL 电平直接用 USB 转 TTL 模块没问题千万别拿 RS232 电平的线直接怼上去。如果你用开发板自带的 DB9 或者 Type-C 调试口那另当别论按板卡手册来接就行。其次是波特率。OpenHarmony 常见平台里海思、瑞芯微这类 SoC 的调试串口默认波特率可能不一样。RK3568 系列的 OpenHarmony 固件很多默认是 1500000也就是 1.5Mbps也有不少 SDK 默认是 115200。你第一次连上串口如果发现满屏乱码先别怀疑线坏了大概率是波特率不对。建议直接按官方文档确认或者把 1500000、115200、921600 这几个常用值轮流试一遍。终端工具我用得最多的是 minicom 和 picocom。picocom 更轻量一条命令就能起picocom -b 1500000 /dev/ttyUSB0退出的时候按 CtrlA 然后 CtrlX。minicom 则要提前配置串口设备第一次用稍微麻烦点但胜在可以保存多个配置。Windows 下用 MobaXterm 或者 PuTTY 都可以选 Serial 连接类型填上 COM 口号和波特率。接线正确、波特率对上之后开发板上电串口应该会开始吐日志。如果一点输出都没有回头检查三件事线有没有接反、GND 有没有共地、模块的驱动有没有装好。2.2 怎么从日志判断卡在哪个阶段OpenHarmony 的启动日志是有明显阶段划分的这也是串口日志最值钱的地方。学会“按阶段切分日志”基本就掌握了启动类问题的定位方法。第一阶段是 bootloader。RK 平台常见的是 U-Boot 或 mini loader日志里会打印 DDR 初始化、固件校验、启动介质选择这些信息。如果日志打印到某个地址就停住或者反复重启大概率是内存参数、启动介质配置有问题。第二阶段是内核。能看到内核版本、设备树解压、各个驱动的初始化过程。这里最典型的错误是 kernel panic日志里会有一大段寄存器现场和调用栈。看到 panic 先别慌往上翻几行找 “Kernel panic - not syncing” 后面的原因描述比如 “Unable to handle kernel paging request at virtual address ...”这种通常指向设备树里某个外设的寄存器地址配错了或者访问了不存在的内存区域。第三阶段是 init 和系统服务。内核起来之后OpenHarmony 的 init 进程开始解析启动配置逐个拉起服务。日志里会出现 service 名称、启动结果、失败原因。很多上层功能问题其实在这一阶段比如某个驱动服务起不来或者依赖的服务启动超时。这时候需要结合 hilog 一起看但至少在串口上你能确认“系统到底有没有起来”。我自己的习惯是串口日志默认全开电源一上就开始录录完再慢慢看。通常启动 10 秒内的日志就能定位绝大部分启动类问题。你不必逐行读先看停在哪一行、报什么错再往上下文去搜。2.3 用户态日志补充hilog 与内核日志一起看串口日志主要是内核和 init 阶段的“话”进入用户态之后很多系统服务的日志不会直接打到串口上这时就要靠 OpenHarmony 的 hilog 日志系统。hilog 和内核日志是两套体系。内核日志通过 dmesg 查看hilog 负责用户态和 HDF 驱动框架的日志。调试硬件相关问题时这两个不能偏废。驱动 probe 阶段的错误往往 dmesg 有记录而驱动注册成功之后业务报错则要看 hilog。假设系统已经能通过 hdc 连接这部分后面细说就可以这样抓用户态日志hdc shell hilog -x这个命令会持续输出 hilog 日志想看内核日志则用hdc shell dmesg如果系统还没完全起来hdc 连不上那就只能靠串口上的早期日志先判断卡点。所以我说串口是第一板斧因为它能覆盖最底层、最早期、最没办法用其他手段介入的阶段。而 hilog 是串口日志的延伸负责系统起来之后的“下半场”。3. 第二板斧设备树与硬件配置排查3.1 设备树是什么、怎么选对 RK3568 设备树设备树Device TreeDTS这套东西简单说就是告诉内核“这块板子上接了什么东西、接在哪个引脚、用哪个地址”。驱动代码是通用的板级差异全部丢到设备树里去描述。很多朋友问“OpenHarmony 的 RK3568 有许多设备树到底咋选”。这是实话。你随便打开一个内核源码目录下的 arch/arm64/boot/dts/rockchip/能看到 rk3568-evb.dts、rk3568-evb1.dts、rk3568-evb2.dts、rk3568-nas.dts 之类一堆文件。它们对应不同品牌、不同配置的开发板甚至同一块板子的不同版本。选错了最典型的现象就是内核启动早期直接 panic或者某个外设怎么都 probe 不上。怎么选才不容易错我按优先级排一下第一看开发板厂商提供的 SDK 说明。正规的开发板都会明确告诉你编译时使用哪个 dts这个最可靠。第二看 SDK 的默认构建配置。比如 kernel 的 defconfig 和构建脚本里通常会指定 dtb 名。第三看串口启动日志。有些 bootloader 会把实际加载的 dtb 名称打印出来或者在 kernel command line 里看到 “rockchip,board” 等标识。选好 dts 之后实体文件和实际硬件是否匹配还要靠下面这些检查点来验证。3.2 三个最重要的设备树检查点在实际排查中我一般重点看设备树节点的三个地方status、pinctrl 和 reg/interrupt。status 是最容易踩的坑。很多 SDK 默认把用不到的外设节点 status 写成 disabled你在驱动里调试半天其实设备树压根没使能。比如 I2C 触摸屏没反应先看 i2c 节点的状态是不是 okay再看触摸屏节点有没有被 include 进来。查法是在目标板上直接读设备树运行时视图hdc shell cat /proc/device-tree/i2cff130000/statuspinctrl 是第二个高发问题。RK 平台每个 GPIO 往往有多个复用功能同一个引脚既可以是 UART也可以是 I2C当设备树里有两个外设都配置了同一个引脚时后加载的驱动可能申请失败。日志里常出现 “pin ... already requested” 或 “failed to get pinctrl”。这种情况不是代码逻辑错而是 dts 层面引脚打架了。reg 和 interrupt 相对隐蔽但只要地址或中断号对不上驱动一旦访问就会出现总线错误中断注册失败。核对 reg 地址时要对照芯片手册和原理图而不是凭感觉改。尤其是从其他平台移植过来的 dts地址猜差一个 0 都有可能。3.3 修改设备树后如何正确生效改完 dts 不是重启就生效你要重新生成 dtb再打包进 boot 镜像最后烧录。以 RK 平台为例大致流程是这样的修改 dts 文件后单独编译内核得到对应 dtb比如make ARCHarm64 rockchip/rk3568-evb.dtb然后把新生成的 dtb 替换到 kernel 镜像里或者打包成 boot.img / resource.img再通过烧写工具烧到开发板对应分区。这里要特别提醒有些 SDK 会把 dtb 单独放到 resource 分区烧录时别只烧 boot 分区否则你改了 dts 却始终不生效会怀疑人生。另外注意 dtbo 叠加的情况。部分 OpenHarmony 平台支持 device tree overlay系统起来后还会叠加一小段 dtbo。如果你的修改明明已经编进去了但运行时的 /proc/device-tree 还是老样子检查一下是不是有 dtbo 覆盖了你的配置。4. 第三板斧系统级交互工具4.1 hdc 是 OpenHarmony 的调试入口hdcHarmonyOS Device Connector在 OpenHarmony 里的地位基本等同于 Android 里的 adb。系统起不来的时候只能靠串口但系统一旦起来hdc 就是你最高效的调试通道。先用 USB 连接开发板和电脑确保开发板开启了 hdc 服务。然后电脑端执行hdc list targets能看到设备序列号说明连接成功。如果看不到先检查 USB 线是不是数据线再确认开发板系统里 hdc daemon 有没有起来。网络连接也能用开发板和电脑在同一局域网时可以用 hdc tconn ip:port 方式连接。hdc 连上之后最重要的命令是hdc shell这会进入开发板的 shell 环境。接下来你可以执行各种 Linux 命令也可以调用 OpenHarmony 特有的调试工具。很多 OpenHarmony 调试场景都必须经过 hdc比如抓取用户态日志、查看系统参数、导出设备信息。它让你从“只能看日志”的被动状态变成“可以直接在系统里翻箱倒柜”的主动状态。4.2 hilog 过滤与故障现场前面提过 hilog 是用户态日志的核心入口。实际使用中你不应该傻傻地把所有日志都打出来否则刷屏速度远超你的阅读速度。要按 tag、按级别过滤。比如我怀疑某个 HDF 驱动有问题一般是先看这个驱动的 tag然后执行hdc shell hilog -e tag只显示包含特定 tag 或关键词的日志。还想看更早的日志可以加上历史缓冲区读取。hilog 默认会缓存一部分历史日志所以现场没抓到也没关系起来之后再翻也能找到线索。真正让我觉得 hilog 值钱的是它能把崩溃现场完整记录下来。当某个系统服务 crashhilog 里通常能看到 faultlog 相关的提示甚至能看到异常线程的调用栈。这类信息在串口上经常被海量内核日志淹没而用 hilog 按 pid 或按服务名过滤之后问题原因往往一下就暴露了。4.3 sysparam、hidumper 与驱动节点第三板斧的另外几个工具也很有用。sysparam 是用来读写系统参数的。硬件调试时我常用 sysparam 确认系统是不是读到了正确的配置比如屏幕分辨率、序列号、硬件版本hdc shell param get const.product.manufacturer hdc shell param get const.product.modelhidumper 是 OpenHarmony 的信息采集工具。用它可以列出服务、内存状态、外设状态比如hdc shell hidumper -s这个命令可以查看当前系统里注册了哪些服务对排查“某个能力没生效”非常有用。驱动节点则在 /dev/hdf_xxx 这类路径下配合 ls -l 和 cat 去验证设备节点是否存在。节点不存在说明驱动根本没加载成功节点存在但读写报错那大概率是业务逻辑或硬件链路的问题。一句话总结三板斧的关系串口日志告诉你“到哪一步挂了”设备树告诉你“硬件应该长什么样”hdc/hilog/hidumper 告诉你“跑起来的系统实际怎么看”。三者组合才是完整的硬件调试手法。5. 三板斧组合实战三个高频场景复盘5.1 场景一OpenHarmony 开发板开机卡在 logo这种问题我用串口日志就能解决。卡 logo 的本质是显示服务起来了但画面没有更新或者说系统停在某个阶段。先用串口看最后几行日志比如停在 “Start init” 之前的驱动初始化阶段那多半是某个内核驱动阻塞了如果停在某个 service 启动超时那就是用户态服务的问题。实际操作中我遇到过卡在 logo 是因为 GPU 驱动初始化失败。设备树里 GPU 的频率表配了超出芯片规格的参数驱动在初始化时直接 hang 住。把设备树里 gpu opp table 改回 SDK 默认值后问题消失。这个例子典型的“三板斧”协作日志定位阶段设备树找原因最终验证再串口确认。还有一种是 init 进程等待某个服务超时。这时虽然屏幕上有 logo但系统事实上没有完全启动。排查时串口日志会不断重试某个 service比如 “Start service failed, retry...”顺着服务名去查 hilog基本能找到根因。5.2 场景二I2C 触摸屏 probe 失败触摸屏不工作很多人第一反应是驱动代码问题但实际上大概率出在设备树和硬件链路上。我会这样走流程先串口观察内核日志。probe 失败通常会打印 “i2c transfer error” 或者 “failed to probe” 之类。这时候去检查 i2c 节点的 status 是否 okay地址是否正确I2C 引脚复用有没有冲突。然后再通过 /dev/i2c-x 节点做一次主动读写测试比如用 i2c-tools 里的 i2cdetect 扫描总线上的设备地址。如果扫描能发现触摸屏芯片地址那说明硬件链路没问题问题在驱动和设备树匹配如果扫描不到回头查电平、供电、I2C 上拉电阻这些硬件因素。这套流程下来绝大多数触摸屏问题都能锁定在“设备树配置错”还是“硬件没通”两个方向而不是在驱动源码里乱翻。5.3 场景三网络不通在 OpenHarmony 开发板上调试网络我的习惯是先从设备树确认 MAC 和 PHY 的匹配关系。很多板子的网口用的是内部 MAC 加外部 PHY 芯片PHY 的地址、复位引脚、模式都要在设备树里写对。PHY 没配好现象就是网口 link 不上ifconfig 里看不到 UP。确认设备树没问题后进系统用命令排查。先看网卡是否存在hdc shell ifconfig -a如果没有对应网卡节点说明驱动没加载回到 dmesg 看 PHY 驱动报错。如果网卡存在但状态是 DOWN手动配置 IP 或用 udhcpc 拿地址。内网环境里先 ping 网关不通就检查交换机、网线能通再往下查上层服务。这个场景经常被忽略的是复位引脚。PHY 的 reset GPIO 如果没在设备树里配置或者复位时序不对PHY 可能处于异常状态表现为“偶尔能通、重启后不通”。在 dts 里给 PHY 节点加上 reset-gpios并把延时调合适能解决一批奇怪的网络问题。6. 常见问题与避坑实录6.1 问题速查表为了方便带板调试时快速对照我整理了一张速查表按现象找原因再按三板斧去定位。现象可能原因优先排查手段串口完全无输出接线错误、波特率不对、模块没装驱动确认 GND/TX/RX换波特率换终端工具串口输出乱码波特率不匹配、电平不匹配按 SDK 确认波特率检查电平转换内核启动 panic设备树选错、内存参数不对、外设地址配错看 panic 前最后几行核对 dts 与原理图启动卡在某条日志该阶段驱动阻塞或等待超时串口日志定位阶段再查对应驱动驱动 probe 失败节点 disabled、pinctrl 冲突、reg/中断错误检查 dts 节点状态查看 dmesg 错误hdc 连接不上USB 线问题、hdc daemon 未启动list targets确认系统已完全启动应用层日志刷屏hilog 过滤条件太宽用 tag/pid/级别过滤配合 grep6.2 几个值得养成的调试习惯最后分享几个比较个人的建议。第一先看电源再看日志。很多人一上来就盯代码结果最后发现是某路供电没上或者电压不对。量一下关键电源轨的电平成本很低收益很高。第二每次都从干净基线开始。修改之前先烧一版确认能正常工作或正常复现问题的固件保留原始日志。不然你改了一堆东西问题没解决连“是哪个改动引起的”都说不清。第三串口线接反是高频事故。我至少有三四次把 TX 和 RX 接反现象就是没有任何输出。后来我习惯在线上贴标签开发板侧和调试器侧都写清楚省很多事。第四对新手最实用的一点不要一次只用一个工具。正确的姿势是串口日志一直录着设备树和 hilog 同时查改一个变量验证一个变量。OpenHarmony 的硬件调试本质上是不断缩小“嫌疑范围”的过程三板斧的目的不是让你炫技而是让你在任何一种奇怪问题面前都有一套不慌的套路。把这三个工具练熟了大部分硬件相关的问题你都能在几分钟内给出一个大致方向剩下的就是顺着方向一路挖到根。