尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

OpenHarmony硬件调试三板斧:串口日志、设备树与hdc/hilog实战指南

OpenHarmony硬件调试三板斧:串口日志、设备树与hdc/hilog实战指南 搞过OpenHarmony开发的人都有过这种经历板子拿到手固件烧完摁下电源键屏幕不亮、串口没有输出、hdc也连不上这时候大部分人第一反应是怀疑板子坏了或者固件有问题。但根据我做过的几十块RK系列板卡调试经验来看绝大多数“看起来玄学”的硬件问题根源都出在三个非常基础的地方串口日志没看全、设备树选错、运行态信息没抓到。这就是为什么我一直跟团队里的人说OpenHarmony硬件调试真正管用的就是三板斧——串口日志、设备树、hdc加hilog组合。这套方法不高级但能覆盖日常开发中八成以上的硬件问题。这篇教程就把这三板斧怎么磨、怎么用、怎么看日志、怎么定位问题完整讲清楚适合刚从应用开发转到系统开发的人也适合第一次拿RK3568开发板跑OpenHarmony的嵌入式老手。1. 先定调子硬件调试的本质是缩小搜索空间1.1 三板斧到底解决了什么很多人把硬件调试想得很复杂觉得必须示波器、逻辑分析仪、协议分析仪全套上阵才能开工。其实在OpenHarmony这种系统级开发场景里绝大多数问题发生在软件配置和硬件之间的适配层真正需要测信号完整性的场景反而少见。所谓三板斧对应的是三层问题串口日志解决的是“系统到底跑到哪一步了”让你知道是DDR初始化失败、U-Boot没起来、内核panic还是用户态服务崩溃。设备树解决的是“软件认为硬件长什么样”RK3568这种引脚复用极其灵活的芯片一个引脚既能做I2C又能做GPIO还能做PWM配置错一个pinctrl外设就不工作。hdc加hilog解决的是“系统起来了之后运行态发生了什么”比如某个服务起不来、某个硬件节点注册失败、IPC通信超时这些在启动日志里往往看不到。把这三板斧用熟练你不需要猜只需要按顺序收集信息问题范围就能从“整块板子”缩小到“某一个寄存器”甚至“某一个GPIO引脚”。1.2 为什么示波器和逻辑分析仪不是首选不是说示波器没用而是要区分场景。在OpenHarmony开发中真正需要示波器的场景是MIPI-DSI屏幕闪屏、音频信号失真、电源纹波过大、高速信号眼图问题。这些属于模拟域和信号完整性范畴软件配置无论怎么改都解决不了。但在实际开发里遇到更多的其实是“I2C设备读不到地址”“触摸屏没有中断上报”“以太网PHY link不上”这类问题看着像硬件坏了实际上八成是设备树里地址写错、GPIO复用冲突、中断号对不上。先用三板斧把软件配置问题排除干净再去动用示波器效率比直接上仪器高得多。我见过不少新手一上来就怀疑硬件把板子寄回给厂商厂家测了一圈说没问题结果回来发现是设备树里i2c频率配置过高导致通信不稳定。这不是板子的问题是调试思路的问题。2. 第一板斧串口日志——一根USB转串口线穿透整个系统2.1 接线和工具准备串口是整个OpenHarmony硬件调试的底线无论上层用什么调试工具串口永远是最后一条退路。RK3568开发板的标准调试串口一般是3.3V TTL电平板上会留一组调试排针或测试点常见的丝印标注是TX、RX、GND部分板子还有VCC。接线规则很简单板子的TX接USB转串口模块的RX板子的RX接模块的TXGND接GND。千万别接VCCTTL模块的VCC一般是给需要供电的板子准备的接了反而可能烧掉调试接口。USB转串口芯片推荐CP2102或CH340便宜稳定FT232也行但性价比不高。实测下来CP2102在长时间抓日志时不容易掉线。连接好之后确认设备节点。Linux下用ls /dev/ttyUSB*查看Windows下在设备管理器里看COM口号。打开串口工具有两个常用选择Linux/macOS推荐minicom或picocom轻量稳定。Windows推荐MobaXterm或PuTTY都支持串口会话。关键参数是波特率RK3568平台的OpenHarmony调试串口默认波特率一般是15000001.5Mbps但也有部分板子用115200具体看板卡说明书。串口参数设置为波特率1500000或115200、8位数据位、1位停止位、无校验、无流控。流控必须关闭不少新手卡在这一步打开RTS/CTS之后只能出不能收。minicom配置命令minicom -s进入配置界面选择Serial port setup把串口设备改成/dev/ttyUSB0波特率改成1500000关闭硬件流控保存退出。2.2 抓启动日志判断卡死在哪个阶段接线完成后先打开串口工具再给板子上电。完整的启动日志大致分三个阶段每个阶段卡住都有不同的典型原因我整理了一个对照表日志阶段出现的关键字卡死在这里的常见原因U-Boot之前DDR、ddr、bl31、bl2DDR配置错误、电源时序异常、固件不匹配U-Boot阶段U-Boot 2017.09、Hit any key to stop autoboot启动介质不对、boot分区损坏、dtb加载失败Kernel阶段Booting Linux、Init、Freeing unused kernel memory设备树不匹配、驱动初始化失败、根文件系统挂载失败用户态阶段init、service、SA某个系统服务崩溃、selinux权限拒绝、HDF驱动注册失败实际操作中最常见的情况是日志走到一半就停住了。这时候先不要急着下结论说“死机了”要区分两种情况一种是系统真的卡住另一种是console没有输出但系统还在跑。区分方法很简单等几秒看串口是否还会有零星输出或者直接看板子上的LED是否还在闪烁。如果确认是卡死根据停住的位置判断方向。比如日志停在DDR初始化直接没有任何输出优先查电源和DDR配置如果U-Boot起来但加载内核失败优先查boot分区烧录是否正确如果内核解压完成但卡在某个驱动的probe函数优先查设备树配置。有个排查启动阶段问题的实用技巧在U-Boot阶段打断启动进入命令行执行printenv查看启动参数确认console参数是否指向了正确的串口。RK平台常见配置是consolettyFIQ0,1500000n8如果被改成了别的串口或者波特率不对内核日志就会“消失”。2.3 串口没有输出的常见原因串口接上之后什么都没有这是新手遇到最多的状况。按照出现频率排序逐个排查TX/RX接反。这是概率最高的错误尤其是有的人习惯用排针母座转接的时候容易搞混方向。把TX和RX对调再试。GND没接。串口通信是共地协议不接GND大概率收不到任何数据。波特率不对。板子写的是1500000你用了115200去收输出就是乱码或者完全没有。还有部分板子的调试串口从U-Boot到内核会切换波特率注意观察。串口芯片驱动没装。ls /dev/ttyUSB*什么都看不到先确认这个。console参数被禁用。这种情况系统其实正常运行只是串口不输出可以先用hdc连上系统再dmesg看日志确认。检查工具本身是否正常的小技巧把USB转串口模块的TX和RX直接短接然后打开串口工具随便发几个字符如果能收到自己发的字符说明模块和工具链路没问题问题出在板子端。注意RK平台的调试串口设备节点是/dev/ttyFIQ0不是/dev/ttyS0。如果修改内核cmdline或者看代码时注意区分偶尔有人在这里绕晕。3. 第二板斧设备树——RK3568源码里那一堆dts别靠猜3.1 为什么RK3568会有这么多设备树文件第一次下载OpenHarmony内核源码编译RK3568的开发者打开kernel/linux/arch/arm64/boot/dts/rockchip/目录大概率会懵一下里面密密麻麻摆着几十个rk3568-*.dts文件有rk3568-evb1-ddr4-v10.dts有rk3568-evb2-lpddr4-v10.dts还有一堆rk3568-xxx-demo.dts。为什么同一个芯片需要这么多设备树原因有两点第一RK3568本身定位是工控和消费级通用的芯片下游厂商用它做NAS、做平板、做盒子、做边缘计算设备同样的SoC搭配不同的DDR颗粒、不同的PMIC电源方案、不同的屏幕、不同的外设接口组合就必须有不同的设备树来描述这些差异。第二OpenHarmony社区和芯片厂商的BSP会同时维护EVB参考板、第三方厂商量产板、以及各种自研板卡的设备树。这些文件从底层看差异其实不大但细节上每一个都对应一款真实存在的硬件配置。所以“到底选哪个”这个问题不能靠猜而是要逆着设备树的生成和加载链路去找。3.2 选错设备树会踩到哪些坑选错设备树不是“启动不了”这么简单很多问题表面上跟设备树毫无关系实际根因却在设备树。我列几个亲测过的屏幕不亮选了不带特定MIPI-DSI panel节点的设备树内核不会初始化显示控制器屏幕自然没反应。触摸屏无响应触摸IC的I2C地址在设备树里配置错误或者中断GPIO和实际硬件不匹配。千兆以太网速率异常PHY芯片的寄存器配置或reset引脚不对导致link起来速率变成百兆甚至不通。WiFi无法扫描SDIO接口的pinctrl复用冲突或者电源使能GPIO没正确配置。系统启动到一半反复重启DDR类型或频率配置与板载颗粒不匹配内核起来后内存访问异常触发panic。这些问题的共同特点是编译、烧录都能完成启动日志也不一定有明显的错误关键字但外设就是工作不正常。这时候不要怀疑硬件先去核对设备树。3.3 正确选定设备树的链路确定设备树不是拍脑门而是沿着一条链路去追。完整的链路是产品配置 - 编译产物 - 烧录打包 - U-Boot加载。第一步从产品配置确认编译目标。OpenHarmony的编译是通过productdefine和device/board下的配置文件驱动的。以标准RK3568 EVB板为例产品配置在vendor/rockchip/rk3568/目录下编译时会根据config.json里的配置决定使用哪个内核和哪个设备树。如果用的是官方开发板直接参考社区默认配置即可。第二步从编译产物确认实际生成的dtb。编译完成后内核编译产物目录下会生成对应的.dtb文件。比如默认配置编译出来的是rk3568-evb1-ddr4-v10.dtb那烧录包里带的就是它U-Boot也会加载这个名字对应的dtb。换句话说你不需要自己在那一堆dts里挑编译系统已经帮你选好了前提是你没改错配置文件。第三步U-Boot阶段确认加载的dtb。板子上电后进U-Boot命令行执行printenv重点看fdtfile变量这个变量直接指定U-Boot加载哪个dtb文件。如果这里面的值和你的板子实际硬件不匹配那就是问题根源。第四步烧录后验证系统实际使用的设备树。系统起来之后执行hdc shell cat /proc/device-tree/model cat /proc/device-tree/compatible如果打印出来的model名称和你的板卡对不上比如跑的是Rockchip RK3568 EVB1 DDR4 V10 Board但你的板子实际是EVB2或者自研板那就说明设备树用错了。还有一个更直观的命令ls /proc/device-tree/目录下的顶层节点就能看出这个设备树为哪些外设预留了配置。如果没有现成设备树怎么办。自研板卡是最常见的情况。不建议从头写dts正确姿势是从官方EVB的dts中选一个最接近的作为模板在此基础上改差异点。改的优先级是DDR类型和频率这个错了起不来。调试串口号和波特率改错了看不到日志。电源IC型号和I2C地址错了系统会在内核初始化阶段挂掉或无法调节电压。各外设的I2C地址、reset/irq gpio号、pinctrl配置错了对应外设无响应。每次只改一个模块保存后编译、烧录、验证这样在哪一步出了错能快速定位。提示OpenHarmony内核编译时修改设备树后需要重新编译内核并重新烧录boot分区或dtb分区。有些时候你会发现改了dts重新编译后效果没变化先确认一下有没有单独烧写dtb分区或者U-Boot里是不是还缓存着旧的dtb。4. 第三板斧hdc与hilog——系统起来之后的运行态诊断4.1 hdc连接与常用调试姿势系统能正常启动到桌面或者shell之后串口的使命就基本完成了运行态的调试主力切换到hdc。hdc是OpenHarmony的开发者调试工具功能和Android的adb类似但命令体系和协议完全不一样别拿adb的思路硬套。连接方式分两种USB连接和网络连接。USB连接是默认方式开发板通过USB线连接电脑后在系统设置中开启开发者模式然后在电脑上执行hdc list targets能列出设备说明连接正常。如果列不出来优先检查三件事USB线是不是纯充电线换一根数据线试试。开发板的USB调试开关是否打开。hdc服务是否在运行执行hdc kill再hdc start重启服务。网络连接用于多设备联调或USB不稳定的时候在hdc shell里面执行hdc tconn 192.168.1.100:5555IP换成开发板的实际IP端口默认5555。USB模式和网络模式可以共存但要注意如果USB先连着网络tconn可能会连接失败先拔掉USB再试。hdc最常用的几个命令组合hdc shell # 进入系统shell hdc file recv /data/log /tmp/ # 从设备拉取日志文件 hdc file send ./xxx /data/ # 推送文件到设备 hdc hilog # 抓取hilog日志 hdc shell dmesg # 查看内核日志建议第一次拿到板子就把这几条命令跑一遍确认基本链路通畅后续调试会顺很多。4.2 hilog过滤在茫茫日志里捞出关键信息hilog是OpenHarmony的系统日志工具对应Android的logcat。刚上手的时候容易犯一个错误直接执行hilog然后被海量日志淹没什么都看不出来。正确的做法是先加过滤条件。按服务标签过滤hilog | grep POWER hilog | grep DISPLAY hilog | grep SOFTBUS按日志级别过滤排查错误时最有用的命令hilog | grep E 只显示Error级别以上的日志能滤掉绝大多数噪音。如果系统某个服务反复重启用这个命令能快速看到报错内容。按进程名或进程号过滤先通过ps -ef找到对应服务的pid然后hilog | grep 进程名对于硬件调试还有一个很有用的组合把hilog重定向到文件完整记录一段时间然后拉回PC分析hilog -w start # 复现问题 hilog -w stop hdc file recv /data/log/hilog/ /tmp/日志文件比较大拉回来之后用grep配合关键字去查比在设备上实时盯屏幕高效。实测一次完整启动到桌面的日志量在50MB左右用文件方式不会漏信息。4.3 内核态与硬件状态查看用户态日志看完了硬件相关的问题要下探到内核态。dmesg是最基础的手段hdc shell dmesg | grep -i fail\|error\|timeout但这个命令只显示错误很多外设问题是“没报错但不工作”。这时候需要主动查看内核为外设建立的设备节点和sysfs信息。查询I2C总线上挂了哪些设备ls /sys/bus/i2c/devices/如果某个传感器芯片的设备树地址配错或者I2C通信失败这个目录下就不会出现对应的设备节点。查询GPIO状态cat /sys/kernel/debug/gpio这个文件会列出当前所有GPIO的占用情况和电平状态能确认外设的复位脚、中断脚是否被正确拉高拉低。查询中断触发情况cat /proc/interrupts看对应的中断号计数是否在增加如果不增加说明中断没有产生问题可能出在设备树的中断配置或硬件连接上。这一套组合下来系统起来了但外设不工作的问题基本都能定位到具体是“设备没被注册”还是“注册了但通信失败”还是“通信正常但中断不触发”再往下就是查看对应驱动代码和寄存器配置的问题了。5. 三板斧之外的必要补刀分布式联调与x86模拟器的差异5.1 分布式硬件调试场景OpenHarmony最被看重的能力是分布式但在分布式场景下调试硬件问题很多人会掉进同一个坑单板调试没问题多板组网之后功能异常不知道该查哪边。先说结论分布式硬件调试仍然是用三板斧的逻辑只是把范围从单板扩展到多板。每一步排查都要先确认“当前这个问题发生在哪块板上、是硬件层还是传输层”。举例来说手机和开发板组网后发现远程调用开发板的传感器数据超时。先不要急着查软总线源码按照顺序做三件事第一分别确认两块板的hilog里有没有SOFTBUS相关的error日志hilog | grep SOFTBUS | grep E 第二确认两块板的网络连通性hdc shell ip addr show第三确认传感器在开发板上单独测试是否正常hdc shell sensor --list绝大多数分布式硬件问题最终都会被定位到某一端的硬件节点配置错误或者网络链路不稳定真正需要深入分布式通信协议底层去排查的频率并不高。三板斧的逻辑在分布式场景下依然成立先把每一端的硬件问题排除干净再怀疑分布式框架本身。5.2 x86模拟器与真机硬件调试的区别社区里经常有人问“能不能用电脑模拟器跑OpenHarmony做硬件开发”。答案是可以跑但只能做应用层开发和部分HDF驱动框架的验证硬件调试必须回到真机。x86模拟器环境下没有真实的GPIO、I2C、SPI、传感器这些硬件设备树的作用被极大弱化启动流程里也没有DDR训练、PMIC配置这些环节。它的调试重点是验证三个层面应用逻辑和UI是否正常系统服务之间的IPC通信是否正常标准HDF驱动接口的调用链路是否正常在模拟器里做调试串口基本用不上串口输出直接重定向到了虚拟终端hdc可以通过网络连接模拟器hilog的用法和真机完全一致。所以如果是在模拟器里做开发串口这一板斧可以直接放下聚焦设备树其实没有太多的设备树概念和hilog这两板斧就够了。但这里有一个重要提醒很多在模拟器上验证正常的HDF驱动代码搬到真机上不一定能跑通。因为硬件配置信息在模拟器里是假的到了真机才真正走设备树匹配、中断申请、引脚复用的流程。所以如果你最终目标是真机硬件产品模拟器只适合做功能验证硬件调试的主战场永远是带着串口线和真实开发板的工作台。5.3 调试环境搭建的投资回报每次带新人入门OpenHarmony我都要求他们做的第一件事不是读代码而是花十五分钟把串口、hdc、hilog这三条链路全部打通并且把这几个命令背下来minicom或者个人习惯的串口工具打开串口hdc list targets确认设备在线hdc shell dmesg | grep -i error确认内核干净hilog | grep E 确认系统服务干净这套环境搭完之后你做的每一步修改——改设备树、换驱动、调参数——都可以用这几条命令快速验证效果形成“改动-验证-再改动”的闭环。很多人在开发中后期被莫名其妙的稳定性问题折磨回头反思往往是最开始没有建立一个干净的基线环境导致后续所有改动都无法对照。单板、x86模拟器、分布式多板联调这三个环境下的调试方式有明显差异先把适用范围搞清楚比多做几步调试动作更重要。6. 实战收尾三板斧组合定位一次屏幕点不亮6.1 故障描述与初始排查最后用一个真实案例把三板斧串起来走一遍这个案例非常有代表性症状是“RK3568开发板跑OpenHarmony系统可以启动到桌面HDMI输出正常但MIPI-DSI屏幕点不亮”。接到这个问题先按第一板斧检查串口启动日志关键看显示相关驱动的初始化信息。在串口输出里找到显示链路相关的关键字dmesg | grep -i drm\|dsi\|panel\|lvds日志显示rockchip-drm有初始化但mipi_dsi相关的panel驱动没有匹配成功具体报错是panel not found。到这里问题范围缩小到了设备树对屏幕panel节点的配置。6.2 从设备树到运行态的逐层定位第二板斧上场检查当前系统实际加载的设备树cat /proc/device-tree/model确认加载的设备树是rk3568-evb1-ddr4-v10.dtb这个板子做的硬件修改恰好是把默认的HDMI方案换成了MIPI-DSI屏但dts里没有添加对应的panel节点。找到内核源码里的dsi节点配置在/sys/firmware/devicetree/下查看显示器节点的存在情况ls /proc/device-tree/果然没有看到dsi相关的panel子节点。于是重新修改设备树在dsife060000节点下补充panel配置指定正确的compatible字符串、复位GPIO、初始化序列重新编译内核烧录boot分区。6.3 第三板斧验证结果系统重启后用hdc连上设备先用hilog验证驱动是否match成功还是用过滤命令hilog | grep DRM这次能看到panel驱动的probe调用日志说明panel节点被正确识别了。再查显示链路状态cat /sys/class/drm/card0-HDMI-A-1/status cat /sys/class/drm/card0-DSI-1/statusDSI节点的状态从disconnected变成了connected屏幕点亮问题解决。整个排查过程没有用到示波器也没有改一行驱动代码纯粹靠串口定位方向、靠设备树确定配置、靠hilog验证结果三板斧走一遍就结束了。这个案例不是特殊情况外设相关的问题十有八九都是这个模式。屏幕、触摸、WiFi、声卡、传感器、以太网全部适用。6.4 三板斧解决不了的情况必须说明的是三板斧不是万能的。如果上述排查已经确认设备树配置完全正确、运行态日志干净、驱动probe成功但外设依然不工作这时候才轮到示波器和逻辑分析仪上场。比如触摸屏有中断上报但坐标乱跳可能是I2C时钟线信号质量差音频有输出但底噪大可能是电源纹波问题屏幕偶尔闪屏可能是MIPI信号线等长没做好。这一类模拟域问题软件配置改不动必须用硬件仪器去量。所以在团队协作中三板斧的真正价值是帮助你把问题尽可能往前推把所有软件能排除的变量全部排除干净最后剩下的硬件问题再交给仪器和处理手段去解决。这也是一种分工逻辑软件工程师先用三板斧定位确认不是软件问题再转给硬件工程师避免大家一开始就在错误的方向上消耗时间。
返回列表