十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

OpenHarmony硬件调试三板斧:串口、HDC与设备树实战指南

OpenHarmony硬件调试三板斧:串口、HDC与设备树实战指南 1. 先搞清楚三板斧为什么是“三板斧”1.1 硬件调试的整体思路拆解把一块RK3568开发板从“上电点不亮”调到“OpenHarmony系统正常跑起来”这个过程我经历过太多次了。你拿到的板子可能来自润和、开源大师兄或者自己画的底板无论哪一块硬件调试的思路其实都一样都有套路可循。我给这个系列起名“硬件调试三板斧”是因为我在实际开发中反复验证过遇到问题时真正管用的调试手段就三样串口日志、HDC远程调试、设备树核查。这三样东西分别对应系统启动的三个阶段硬件上电后内核能不能起来系统起来后应用能不能跑外设资源匹配对不对。把它们用熟了OpenHarmony开发中八成的硬件相关问题都能自己定位。这套调试方法论的核心逻辑其实很简单就是“逐层屏蔽问题”先用串口确认最小系统有没有正常工作再用HDC确认系统服务和应用层有没有异常最后通过设备树确认外设和板级配置对不对。每一层都有对应的工具和日志哪一层出问题就锁在哪一层解决。对于刚入坑OpenHarmony硬件开发的朋友我非常建议先花一个下午把这三板斧练熟。这比一开始就去翻内核源码、研究驱动框架要实用得多。因为绝大多数情况下你遇到的“不通”“不动”“不对”并不是原理层面的问题而是某个配置细节没到位、某个日志没抓到、某个资源被占用了。三板斧就是用来快速暴露这些具体问题的。1.2 三板斧分别用在什么阶段三把斧头各有分工我具体说一下使用时机。串口日志是系统还没有完全起来时的唯一信息来源。从bootloaderU-Boot到内核启动再到init进程和关键服务拉起这一路所有信息都会从串口输出。如果板子按了电源键没反应或者OpenHarmony logo出现之前就卡住了你必须靠串口日志判断卡在哪个环节。HDC是OpenHarmony的调试通道类似Android的ADB。系统跑起来之后你可以通过HDC接入设备的shell查看进程状态、查询系统服务、抓取应用日志、推送文件、修改配置。遇到应用崩溃、服务异常、功能不符合预期这些问题用HDC去现场翻日志是最快的方式。设备树核查解决的是板级适配问题。OpenHarmony内核启动时会读取设备树device tree文件根据里面的描述来初始化内存、GPIO、时钟、串口、网口、显示等硬件资源。热词里有人问“RK3568有许多设备树到底咋选”这个问题问得非常实在设备树选错了板子可能根本起不来或者起来后某个外设就是不通。这部分我会在后面的第三节详细讲。这三板斧从低到高覆盖了整个调试链路你不需要一次性全上。按照“先硬件、再系统、再外设”的顺序逐个排查大部分问题都能在三步之内定位到根因。2. 第一板斧串口日志是起死回生的关键2.1 串口接线与终端配置串口调试的第一步是接线这里有个非常经典的坑USB转串口模块的TX要和开发板的RX相连RX要和TX相连GND一定要共地。绝大多数人第一次接反就是没注意交叉连接结果屏幕上什么都没有还以为是板子坏了。开发板上的调试串口一般会标注UART0或者DEBUG字样四个引脚分别是VCC、TX、RX、GND。实际接线时VCC可以不接只用GND、TX、RX三根线。不要接VCC因为串口模块的3.3V和开发板的电源域可能有冲突接上反而会出问题。终端软件我推荐用MobaXterm或者PuTTY参数配置很简单波特率115200数据位8停止位1无校验位无流控。这个参数在OpenHarmony的官方文档里也是默认值绝大多数开发板都适用。连接完成后先给开发板上电如果终端能看到启动信息说明串口通路没问题。如果没有任何输出先检查以下几点USB转串口模块的驱动装没装好在设备管理器里确认认到的是COM口、开发板有没有正常供电、串口软件里选的对不对COM口号。用排查串口的经验来说这一类问题九成出在“线没接对”和“COM口选错”上反而硬件本身极少坏。2.2 串口日志里到底看什么串口日志内容丰富但不是所有内容都要逐行去读。我的做法是分三段看。第一段是U-Boot启动阶段主要看内存识别是否正确、启动介质eMMC或SD卡是否找到。如果日志停在这里不动通常是DDR初始化失败或者启动介质有问题。第二段是内核启动阶段这是信息量最大的部分。从“Starting kernel ...”开始内核会打印版本信息、设备树解析结果、各驱动的初始化情况。重点关注有没有“FAILED”“error”“timed out”这些字样。比如某个设备树的GPIO编号对不上内核会报GPIO相关的错误这能直接引导你去看设备树配置。第三段是OpenHarmony用户态启动阶段可以看到init进程拉起各种系统服务的过程。这一段如果出现反复重启通常和某个服务的依赖关系或者selinux策略有关。一个非常实用的操作习惯是在串口终端里把输出自动保存到文件。MobaXterm有日志记录功能PuTTY也有“Log all session output”选项。不要小看这个习惯很多问题看滚动日志发现不了规律把完整日志存下来搜索关键字来回比对才能找到线索。2.3 实战启动崩溃的定位过程我举一个真实案例。有一块RK3568板子上电后串口打印到内核启动阶段就卡住了最后几行日志反复出现类似“Unable to handle kernel NULL pointer dereference”的信息然后系统自动重启形成无限循环。这种情况下我先用串口日志判断是内核panic而不是看门狗复位。接着把输出保存下来搜索panic之前的最后几条正常日志。结果发现是一个与LCD显示相关的驱动在初始化时访问了空指针进一步查看设备树发现这块板子用的MIPI屏幕参数和另一个型号的屏幕混淆了导致驱动拿到的初始化序列数据不对。问题的根因是设备树文件选错了。我把dts文件里的显示节点参数改成这块板子实际使用的屏幕型号后内核正常启动OpenHarmony界面顺利出图。整个过程如果没有串口日志几乎不可能定位到具体是哪个驱动、哪个节点出了问题。这就是第一板斧的价值。3. 第二板斧HDC远程调试系统跑起来后的万能遥控器3.1 HDC工具的准备与连接系统正常启动之后串口虽然还能用但真正高效的调试手段是HDC。HDC全称是OpenHarmony Device Connector功能上你可以把它理解成ADB的孪生兄弟用法也高度相似。HDC工具分为设备端和主机端两部分。设备端hdcd守护进程在OpenHarmony系统里默认是开机自启的不需要额外配置。主机端需要从OpenHarmony SDK里获取路径一般在SDK的toolchains目录下。建议把hdc的路径加到系统环境变量里这样在任何目录下都能直接调用。连接方式有两种USB连接和网络连接。USB连接最常用用Type-C数据线把开发板和电脑连起来然后在终端执行hdc list targets如果能列出设备的IP地址或者串号说明连接成功。列不出来先检查usb调试开关有没有打开设置-关于-连续点击版本号可以开启开发者模式然后在开发者选项里打开USB调试以及电脑的设备管理器里有没有识别到设备。网络连接适合设备已经部署在固定环境、不方便插线的情况。先确保设备和电脑在同一局域网然后执行hdc tconn 192.168.1.100:5555其中5555是OpenHarmony默认的调试端口。实际使用中网络连接偶尔会掉线但胜在方便不用来回拔插数据线。3.2 日志抓取与过滤技巧HDC下最常用的是日志相关的命令。OpenHarmony的日志系统叫hilog功能对标Android的logcat。日常调试我常用的几条命令如下。hdc shell hilog这个命令会实时打印日志内容非常多直接看会刷屏。一定要配合过滤使用实际开发中最常用的方式是按关键字过滤hdc shell hilog | grep 你的关键字比如你想看某个应用崩溃时的报错信息可以先用hdc shell ps -ef找到应用的进程号再过滤对应进程号输出的日志。另外hilog还支持按日志级别过滤hilog -l 0是DEBUG级别-l 1是INFO-l 2是WARN-l 3是ERROR。平时排查问题先把级别调到3过滤出ERROR再看效率会高很多。抓取日志时还有一个重要操作先把旧的日志清空再复现问题这样能保证你抓到的日志是问题出现那一刻的现场记录。清空命令是hdc shell hilog -r我自己的习惯是三步走先清空再复现最后抓取。这样操作虽然多了一两步但拿到的日志干净、可信排查问题能省很多时间。3.3 实战应用层问题定位的完整流程再举一个实际案例。有一次开发一个基于OpenHarmony的分布式数据同步功能两个设备之间数据同步偶尔会失败而且不是必现。这种问题如果靠肉眼观察基本没法定位。我用HDC走了一遍标准流程先通过hdc shell进入设备命令行用ps -ef找到数据同步服务对应的进程号。接着用hilog -r清空日志然后在两个设备上同时触发同步操作。操作完成后分别抓取两端设备的ERROR级别日志交叉比对后发现同步失败发生时两个设备之间的网络通道有一个非正常的关闭事件原因是对端主动发起了RST。再结合内核级别的网络状态检查发现是由于某个网卡的多队列配置导致数据包偶尔乱序进而触发了连接重置。最后通过调整网卡的中断绑核参数解决了问题。这个过程里我用的所有工具其实都是HDC自带的没有写一行额外代码。HDC的价值就在这里它用最小的成本让你拿到设备内部的实时状态。系统级的服务异常、应用崩溃、网络问题、资源占用全部能通过HDC远程查看和处理。4. 第三板斧设备树选型与硬件资源配置核查4.1 RK3568设备树这么多到底怎么选热词里问“OpenHarmony的RK3568有许多设备树到底咋选”这应该是很多刚接触开发板适配的开发者共同的困惑。OpenHarmony代码仓库中RK3568相关的设备树文件分布在device/board/目录下不同厂商、不同开发板的dts文件确实很多光看文件名字会晕。选设备树的第一个原则是看你的开发板是哪个厂商出的就优先选该厂商对应的设备树目录。OpenHarmony官方代码仓里常见的RK3568适配有hihope润和的版本、DAYU开发板版本等。如果你的开发板是兼容这些官方开发板的直接用对应的dts就能跑起来。第二个原则是对照开发板原理图来选不要靠猜。拿到一块板子先确认主控型号是RK3568J还是RK3566、内存颗粒大小2G还是4G、存储介质eMMC还是SD卡 NAND、屏幕接口MIPI DSI还是HDMI还是LVDS、摄像头型号、网口数量。然后打开候选dts文件逐项对照节点配置。比如你的板子内存是4Gdts里reg 0x0 0x40000000 0x1 0x0这样的描述是2G内存那就要找到对应的内存描述正确的版本。一个非常关键的经验是选错了设备树很多时候不会直接报错而是表现为某个外设异常。比如网口不通、触屏没反应、声音输出异常。遇到这类“看起来没大问题但外设功能不对”的情况第一反应应该是怀疑设备树配置和实际硬件不匹配。另外现在OpenHarmony已经有不少x86版本和PC版镜像了如果你不是做嵌入式板卡而是在x86的PC或虚拟机上体验OpenHarmony那不需要处理设备树问题直接用官方提供的iso镜像安装即可。但只要你手上拿的是RK3568开发板设备树这一步就绕不开。4.2 设备树里需要重点核查的硬件资源确定使用某个dts文件之后还有几个重点资源必须逐项确认我把它们整理成一份检查表。第一项是内存节点。确认内存大小与实际板卡一致内存参数错误会导致系统启动后内存识别不足严重时直接启动失败。第二项是串口节点。调试串口用的是哪个UART、对应的GPIO配置是否正确。串口在启动早期就要用到配置错了连日志都看不到。第三项是网络节点。RK3568的GMAC以太网控制器需要配置对应的PHY芯片型号、复位GPIO、时钟源。实际开发中网口不通的案例绝大多数是和PHY相关的配置问题。另外OpenHarmony开发也常用hdc tconn走网络调试如果网口不通HDC网络连接就用不了调试体验会大打折扣。第四项是显示相关节点。包括显示控制器的连接方式MIPI DSI、HDMI还是eDP、屏幕分辨率、刷新率、背光控制的GPIO。屏幕相关参数错误的现象很典型有背光无画面、画面花屏、分辨率不对或触摸位置偏移。第五项是GPIO复用。RK3568的引脚功能是可配置的同一组引脚可能被多个外设占用。如果某个外设没工作先查它的GPIO是否和别的外设冲突。这类问题在设备树里查是最直接的两个节点如果引用了同一组引脚内核启动日志里的gpio相关部分会有冲突提示。4.3 修改设备树后的编译与验证流程设备树文件确定之后改动是必然的。修改后的完整验证流程我建议按下面的顺序走。首先修改设备树源文件一般位于device/board/厂商名/开发板名/kernel/dts/目录下文件后缀是.dts或.dtsi。修改时注意缩进语法dts文件是树状结构括号配错一个编译直接报错。然后重新编译内核。OpenHarmony的编译命令一般通过源码根目录下的build.sh执行。RK3568相关的构建命令通常长这样./build.sh --product-name rk3568 --ccache这个过程会根据产品的配置文件重新编译内核和系统镜像。第一次编译时间较长建议用--ccache开启缓存后续增量编译会快很多。编译完成后把生成的镜像烧录到开发板验证。我的习惯是不要一次性把所有改动都烧进去而是每次只改一个变量。比如这次只改内存节点烧录后确认内存识别正确了再改下一个节点。硬件调试最忌讳一次改多个地方出了问题根本不知道是哪个改动导致的。验证阶段重点关注两个地方串口日志中设备树解析相关的输出以及/sys/firmware/devicetree/base/目录下的节点信息。系统起来之后通过HDC进入设备可以实际确认设备树是否按预期生效hdc shell cat /sys/firmware/devicetree/base/model这个命令会输出设备树中的板级型号描述再结合ls /sys/firmware/devicetree/base/查看各节点目录就能确认内核实际加载的设备树是不是你改的这个版本。硬件开发里有个常见误区以为自己烧进去了新的设备树实际内核加载的还是旧的。去/sys/firmware/devicetree/base/看一眼就能立刻确认省去很多无谓的排查。5. 常见问题与排查技巧实录5.1 高频问题速查表把我在实际调试中遇到的问题整理成一张速查表方便大家对照排查。现象可能原因排查方法上电后串口无任何输出串口TX/RX接反、USB转串口模块驱动未装、开发板供电不足检查接线交叉连接、替换串口模块、测量核心板电源内核启动阶段反复重启内核panic、DDR参数错误、设备树内存配置与板卡不符保存完整串口日志搜索panic关键字定位panic前的最后正常打印系统启动但画面黑屏显示节点参数错误、背光GPIO未配置检查dts的display节点、背光控制引脚、屏幕供电网口不通PHY型号配置错误、复位GPIO不对、时钟配置错误检查dts中gmac节点和phy节点的配置对比参考设计原理图hdc list targets看不到设备USB调试未开启、hdcd服务未启动、USB线不支持数据传输检查开发者选项中的USB调试开关、执行hdc shell start hdcd、换数据线应用崩溃但日志信息不够日志级别过滤太高关键进程日志被丢弃用hilog -l 3先看ERROR再调低级别抓取详细上下文屏幕显示正常但触摸位置偏移触摸屏节点配置的分辨率/方向参数错误核对dts里touchscreen节点的坐标信息、旋转方向参数某个外设驱动加载失败设备树节点缺少必需属性或者GPIO冲突查看内核日志中该驱动的probe报错信息检查GPIO是否被其他节点占用这些现象和排查方法都是我踩过的坑总结出来的。尤其要注意的是遇到问题不要只看表面现象就急着改代码先用串口和HDC把现场日志抓全往往答案就在日志里。5.2 日志刷屏、板子休眠等细节坑除了上表里的大类问题还有几个比较隐蔽的细节坑单独拿出来说一下。日志刷屏是一个很常见但容易被忽视的坑。如果某个驱动在内核层持续打印错误日志串口输出会被大量刷屏反而遮挡了关键信息。这种情况下先用hilog -r清空用户态日志再用dmesg单独看内核日志。如果刷屏来自内核驱动的某条打印可以用echo 0 /proc/sys/kernel/printk降低内核打印级别暂时把日志输出压下去等定位到问题再恢复。板子休眠也是一个经典坑。RK3568在OpenHarmony下默认有休眠策略如果调试过程中板子突然“没反应”了先别急着认为是死机有可能是进入休眠状态了。通过串口看日志如果最后一条是suspend相关的信息那就基本确认是休眠。调试期间建议先关闭自动休眠避免干扰hdc shell power-shell setmode 602这个命令会把电源模式设置为正常模式禁止自动休眠。调试完成后再根据需要恢复自动休眠策略。还有一个和日志保存相关的经验串口工具虽然能实时显示日志但一旦板子重启终端里的内容可能被冲刷掉历史记录不全。建议每次调试前先在串口工具里开启日志保存文件名按日期加板卡型号命名比如rk3568-20250115.log这样即使板子在调试中反复重启完整的日志记录也能保留下来方便事后回溯。设备树相关的坑我再补充一个修改dts之后编译内核如果发现改动没有生效先检查编译产物是不是被缓存了。OpenHarmony的增量编译体系里有时候你改了dts但是对应的dtb文件没有被重新生成导致烧录进去还是旧配置。遇到这种情况强制清理后重新编译一次./build.sh --product-name rk3568 --ccache --full-build强制全量编译虽然慢但能排除缓存问题。硬件调试讲究的就是“每一步都有确定的输出”千万不要在这种环节上浪费排查时间。最后再分享一个我个人的习惯每次拿到一块新开发板我不会急着跑功能而是先把串口、HDC、设备树这三个基础环境全部验证一遍。串口能看日志、HDC能连上、设备树型号识别正确这三件事确认好了后面的开发才能顺畅。这块基础工作花上一个小时长期来看能省下无数个“卡住半天找不到原因”的夜晚。
返回列表