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

资讯详情

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

OpenHarmony硬件调试三板斧:RK3568串口与设备树实战

OpenHarmony硬件调试三板斧:RK3568串口与设备树实战 做OpenHarmony系统开发尤其是刚拿到一块RK3568开发板的时候很多人第一反应是兴奋第二反应就是懵。板子一上电串口没反应屏幕不亮或者内核刚跑起来就卡死在某一行完全不知道从哪里下手。更让人头大的是同一块RK3568芯片官方仓库里铺了一堆设备树文件什么rk3568-evb1-ddr4-v10.dtb、rk3568-evb2-lpddr4-v10.dtb、rk3568-evb2-lpddr4x-v10.dtb光是选哪个来编译就能劝退一批新手。这套“硬件调试三板斧”是我在跑OpenHarmony实战开发过程中沉淀下来的调试方法论专门针对系统层面的硬件问题。核心就三招串口日志定位、设备树配置核查、运行时系统诊断。听起来不复杂但每招背后都有大量的细节和坑用好了可以解决九成以上的板级启动和驱动适配问题。这篇教程不绕弯子直接把这套方法论掰开揉碎讲清楚尤其会重点聊一聊RK3568那几个设备树到底怎么选、怎么改、怎么验证。1. 硬件调试三板斧的整体设计思路1.1 为什么叫“三板斧”而不是“调试大全”做系统开发的人都知道硬件调试的手段其实非常多逻辑分析仪、示波器、JTAG仿真器、内核profiling工具理论上都是可用的。但问题在于很多刚入门的开发者或者从纯软件转过来的朋友一上来就拿这些重型工具砸自己反而把自己砸晕了。我的观点一直很明确在OpenHarmony这种操作系统级别的开发场景里先别急着上示波器先把系统自己能提供的调试手段吃透。串口日志解决的是“发生了什么”的问题设备树解决的是“系统认为硬件长什么样”的问题运行时诊断解决的是“系统实际运行状态如何”的问题。这三者配合起来刚好覆盖了从板级启动到系统运行再到外设驱动的完整链路。拿我做RK3568的第一块板子举例当时遇到的问题是内核启动到[ 1.234567] rk808 0-001b: Failed to get supply就卡死了。如果不懂串口日志就只能干瞪眼如果不懂设备树就不知道这个0-001b的I2C设备地址是谁定义的如果不懂运行时诊断就不知道电源管理芯片到底有没有在I2C总线上响应。三板斧各管一段合起来才是一套完整的打法。1.2 三板斧适用的场景边界并不是所有问题都适合用这三板斧。比如硬件设计的信号完整性问题、高速接口的时序问题该上示波器还是得上示波器。但我可以负责任地说在OpenHarmony适配和日常开发中90%以上的问题都出在软件配置和系统层面真正需要动用硬件仪器的场景其实很少。这套方法最适合的场景包括新板卡首次启动的Bring-up、外设驱动适配失败、休眠唤醒异常、外设枚举不稳定、系统起来后某个功能模块不工作。这些问题的共性是系统本身还能跑或者至少串口还能输出我们有机会从软件侧面去逼近问题本质。说白了三板斧是“软件视角的硬件调试”是系统开发和驱动开发者的第一道防线。1.3 正确的调试心态顺便说一个经验之谈硬件调试最忌讳的就是同时改多个变量。很多朋友发现设备不工作立刻怀疑设备树配错了改一个节点重新编译烧录不行又去改内核config再不行又去换一个电源方案结果问题依然在。最后查出来是排线松了让人哭笑不得。正确做法是一次只动一个变量动完必须能说清楚“为什么改它”和“期望看到什么变化”。三板斧的整套方法论本质上就是在帮你建立这种“可验证的因果链条”看日志发现问题查设备树定位配置改配置重新验证。每一步都是可控、可回退、可解释的。2. 第一板斧串口日志——硬件调试的万能钥匙2.1 串口是OpenHarmony开发者的“第二块屏幕”我在教新人调试OpenHarmony设备时说的第一句话永远是先把串口接好再谈其他。显卡驱动没起来、屏幕点不亮、HDMI没输出这些都不影响串口工作。串口就是系统开发的底线只要板子还在跑串口就一定能告诉我们它在干什么。OpenHarmony底层用的是Linux内核内核日志从左往右看第一列时间戳第二列进程名和CPU编号方括号里是线程ID然后才是日志级别和事件内容。整个过程需要烧录后重新上电保持串口连接从bootloader阶段开始观察。很多人习惯系统跑起来之后才开串口这是不对的因为很多关键信息比如DDR初始化参数、bootloader阶段的选择早就过去了。串口工具方面Linux下推荐minicom或者picocomWindows下可以用MobaXterm或者SecureCRT。波特率默认是1500000也就是1.5Mbps这点和很多传统嵌入式板子常用的115200不同必须注意。注意RK3568的调试串口默认使用UART2对应板子上的调试排针接的时候TX接RX、RX接TXGND一定要共地。这个接反的坑我见得太多了板子启动日志完全没有输出查了半天是杜邦线接反了。2.2 日志分级与关键字过滤串口日志的量是很大的尤其在内核启动阶段几千行输出一瞬间就刷过去了。如果全靠肉眼盯不仅累而且容易漏掉关键信息。我的习惯是先用dmesg -n 7把日志级别调到最大0是最紧急7是debug然后通过串口工具把完整日志保存到文件里再用grep做关键词搜索。高频使用的关键词有这么几类error、fail、failed错误类WARN、WARNING警告类Unable to handle、Oops内核崩溃类stack trace、Call trace异常调用栈regulator、clk、gpio、i2c、spi子系统关键词设备树节点名比如i2c0、sdmmc、hdmi实际排查问题时我通常先跑一个grep -iE error|fail|warn boot.log看看有没有明显的红色标记。如果没有再针对挂死的位置向上回溯上下文日志。内核输出是有因果关系的一个错误往往只是结果真正的原因在它上面的几十行里。2.3 一次串口定位问题的实战复盘以我调试RK3568的EMMC启动问题为例。当时现象是系统启动到一半日志停在[ 2.874182] mmc0: error -110 whilst initialising MMC card再也不动了。-110是-ETIMEDOUT也就是超时。这说明内核和EMMC通信建立不起来。这让我第一时间怀疑EMMC的供电、时钟或者复位信号有问题。于是我去查设备树里sdmmc0节点的配置发现pinctrl-0引用的是sdmmc0_clk和sdmmc0_cmd等引脚跟原理图上的EMMC走线一对照发现有几个引脚被复用成了其他功能。这就是典型的串口日志定位方向、设备树找到原因的配合战。如果把视角只停留在“EMMC不识别”这个表面现象上你会去怀疑硬件坏掉、怀疑焊接问题但通过日志和配置交叉验证很快就能锁定是pinmux配置错误。2.4 串口无输出的基础排查这个问题的出现频率堪比“Hello World”每次培训几乎必有人遇到。排查路径我建议按这个顺序走检查串口工具连接TX/RX是否交叉GND是否共地检查波特率必须和bootloader阶段的配置一致默认1500000检查开发板供电很多板子USB转串口芯片和主控不是同一路电板子没启动时串口自然没输出检查烧录镜像是否成功如果不是自己烧录的先尝试用出厂镜像启动排除镜像本身的问题检查bootloaderRK3568的miniloader阶段如果DDR初始化失败也可能完全没有输出3. 第二板斧设备树与硬件配置核查3.1 为什么RK3568有那么多设备树到底怎么选这是搜索热度最高的一个问题也是新手最容易卡住的地方。RK3568的SDK里设备树文件分布在kernel/arch/arm64/boot/dts/rockchip/目录下打开一看密密麻麻全是rk3568-*.dts什么rk3568-evb1-ddr4-v10.dts、rk3568-evb2-lpddr4-v10.dts、rk3568-evb2-lpddr4x-v10.dts、rk3568-evb-demo.dts加上各种-diff、-backup版本几十个文件是常事。选设备树的根本逻辑只有一个看板子的硬件配置和哪个evb参考设计最接近。RK3568本身支持DDR4和LPDDR4/LPDDR4X两种内存类型板载EMMC的型号和走线也可能不同这些差异都要在设备树里体现。我的选择方法是先看三个维度内存类型板子上用的DDR4还是LPDDR4X这个直接决定了选rk3568-evb1-ddr4-v10.dts还是rk3568-evb2-lpddr4x-v10.dts外设差异你的板子上有哪些外设比如HDMI、MIPI DSI、MIPI CSI、PCIe、USB3.0、千兆网口参考设计上是否一致版本号v10、v11这些版本号对应PCB的改版新板子尽量选最新的版本如果实在拿不准优先选包含-diff.dts文件对应的基础版本。所谓diff版本通常是厂家为了对比改动而生成的增量设备树虽然没有被直接编译但它的存在说明该版本是某个阶段的主线。3.2 设备树的编译与反编译排查法选好了设备树源文件接下来要学会“看最终产物”。很多驱动问题并不是你配错了节点而是设备树在编译时压根没把你需要的节点编进去。RK3568在OpenHarmony中的编译流程会自动处理设备树的编译但如果你想单独验证某个设备树能不能编译通过可以手动执行编译。假设你的内核目录在kernel/下cd kernel make ARCHarm64 rockchip_linux_defconfig make ARCHarm64 dtbs -j$(nproc)编译完会在arch/arm64/boot/dts/rockchip/下生成对应的.dtb文件。如果你想知道系统实际加载的设备树内容是什么可以把/sys/firmware/fdt如果存在或者打包进boot镜像里的dtb导出来反编译# 导出设备树二进制 cat /sys/firmware/fdt /tmp/fdt.dtb # 反编译 dtc -I dtb -O dts -o /tmp/fdt.dts /tmp/fdt.dtb # 查看关键节点 grep -A 30 i2c2 /tmp/fdt.dts反编译出来的fdt.dts就是内核实际看到的硬件配置这比你在源码目录里看的设备树源文件更真实。因为内核可能通过bootloader传参覆盖了一些节点或者编译时通过config裁剪掉了部分节点。提示如果系统中没有/sys/firmware/fdt说明内核配置里没开CONFIG_OF相关选项或者bootloader没有传递设备树。这个节点在排查设备树问题时价值极高。3.3 从设备树反推硬件初始化过程拿到反编译的设备树后有一个非常实用的技能通过/proc/device-tree目录查看运行时设备树的结构。ls /proc/device-tree/ ls /proc/device-tree/i2cfe5c0000//proc/device-tree里的目录名和属性名是去掉特殊字符的但基本能对应上dts源文件里的节点。通过这个目录你可以确认某个外设节点是否被内核识别、节点下的status属性是不是okay、compatible属性是否匹配驱动。举个例子调试I2C触摸屏时我想确认触摸屏的I2C地址是否被正确识别cat /proc/device-tree/i2cfe5c0000/gt9xx14/reg如果这个路径不存在说明设备树里没有这个I2C从设备节点驱动加载时自然扫描不到。如果路径存在但触摸还是没反应再去查interrupt引脚和reset引脚的配置是否正确。3.4 设备树修改与验证闭环修改设备树最忌讳的是“盲改”改完不知道有没有生效、有没有编进去、有没有被bootloader覆盖。我建议的修改闭环是这样的在源码目录中找到目标.dts文件修改前备份原始文件修改后用make dtbs单独编译目标文件用fdtdump或者dtc反编译验证产物中包含修改烧录后通过/proc/device-tree再次确认运行时配置观察串口日志确认驱动加载行为这个闭环听起来繁琐但在实战中能省下大量时间。尤其是在多人协作、代码频繁变动的项目中不经过闭环验证就提交设备树修改很容易出现“在我机器上是好的”这种尴尬情况。4. 第三板斧hdc命令行与运行时系统诊断4.1 hdc是OpenHarmony的“第一入口”如果说串口是硬件层的沟通渠道那么hdcOpenHarmony Device Connector就是系统层的操作入口。它和ADB的作用很像但要注意它们并不是同一个东西不要用ADB命令来操作OpenHarmony设备。连接方式很简单# 查看设备列表 hdc list targets # 连接指定设备 hdc tconn 192.168.1.100:5555 # 进入设备shell hdc shell进入shell之后你会发现很多Linux命令不能用了因为OpenHarmony的运行时环境和标准Linux发行版有差异。但核心的cat、ls、mount、ps、kill、dmesg部分版本可能受限还是可以用的。4.2 通过关键目录快速体检系统状态在hdc shell里有几个目录和文件是我每次排查硬件问题时必看的# CPU核数和在线状态 cat /proc/cpuinfo cat /sys/devices/system/cpu/online # 内存信息 cat /proc/meminfo # 硬件外设的platform设备列表 ls /sys/bus/platform/devices/ # I2C总线上挂载的设备 ls /sys/bus/i2c/devices/ # 中断统计 cat /proc/interrupts这四个信息组合起来基本能判断出一个外设是否被内核识别。以I2C为例如果触摸屏的I2C地址是0x14你希望看到/sys/bus/i2c/devices/下有一个形如0-0014的条目。如果内核识别了设备但没有匹配到驱动/sys/bus/i2c/devices/0-0014目录会存在但driver符号链接指向的却是/sys/bus/i2c/drivers/下的某个通用驱动或者为空。这个细节对驱动调试非常有帮助。4.3 hilogOpenHarmony的系统日志利器内核日志用dmesg应用和框架层的日志则要用hilog。很多只熟悉Linux日志的开发者第一次用OpenHarmony时会到处找logcat这就是走弯路了。# 查看所有日志 hilog # 按关键字过滤 hilog | grep -i touch # 按日志级别过滤 hilog -L DEBUG hilog -L ERRORhilog和dmesg的配合使用非常关键。硬件驱动问题一般看dmesgHDFHardware Driver Foundation驱动框架层和应用框架层的问题看hilog。比如触摸屏没反应先dmesg | grep -i i2c\|goodix\|gt9xx看内核层如果没有异常再hilog | grep -i touch\|input看HDF驱动和应用层是否有事件上报。4.4 hidumper快速获取系统与硬件状态的利器hidumper是OpenHarmony提供的系统信息导出工具功能有点像Linux下的sysfs加上debugfs的口袋版。我用得比较多的是这几个命令# 查看内存整体情况 hidumper --mem # 查看CPU占用 hidumper --cpuusage # 查看电源管理相关信息 hidumper --power # 查看所有系统服务列表 hidumper -ls设备树和串口日志能告诉你“内核看到了什么”hidumper能告诉你“系统在服务层面实际做了什么”。比如一个问题现象是系统休眠后无法唤醒串口上可能只看到内核进入suspend的日志但具体是哪个服务阻止了休眠、哪个外设没有正确进入低功耗状态就需要hidumper --power来进一步排查。4.5 动态调试与打印开关有时候问题只出现在特定驱动模块默认日志级别下根本看不到有效信息。此时可以通过动态调试来打开特定模块的调试输出# 查看动态调试支持 cat /sys/kernel/debug/dynamic_debug/control | grep rk808 # 打开某个文件或函数的调试输出 echo file drivers/regulator/rk808-regulator.c p /sys/kernel/debug/dynamic_debug/control这个操作的作用范围是当前运行的内核重启后失效适合现场调试。如果要永久开启需要修改内核的dynamic_debug配置或者直接改源码里的pr_debug为pr_info。5. 常见问题与排查技巧实录5.1 设备树选错/配错导致的典型现象把设备树选错会引发一系列让人摸不着头脑的现象。我自己遇到过的最典型的几个现象一内核启动正常但DDR容量识别错误系统起来后free -m显示的内存只有512MB但板子明明贴了4GB的DDR。这种问题十有八九是设备树里的memory节点reg属性值是固定的或者内存类型选错了导致rkbin初始化DDR时的参数不对。现象二所有GPIO操作都失败GPIO申请失败通常会报gpio: pin xxx already requested或者干脆是Failed to request GPIO。这类问题的根源通常是设备树里pinctrl节点配置了同一个引脚给多个外设复用内核在pinctrl子系统初始化时产生了冲突。现象三启动阶段卡死最后一个日志是串口相关如果卡在串口或console相关的初始化上检查设备树里chosen节点的stdout-path属性是否正确同时确认serial节点的status是否为okay。为了直观对比我做了一个现象与排查方向的速查表现象优先排查方向三板斧切入点启动卡死无日志输出bootloader、串口接线、波特率串口日志内核启动到一半停止设备树节点冲突、驱动卡死串口日志设备树内存容量识别错误设备树memory节点、DDR初始化参数设备树某个外设不工作I2C/SPI/UART节点状态、pinctrl配置设备树运行时诊断系统能起但触摸/屏幕异常HDF驱动匹配、中断配置运行时诊断hilog休眠唤醒异常regulator、clock、irq唤醒源串口日志hidumper5.2 串口有输出但系统反复重启这是典型的内核panic导致的重启循环。现象是串口不断打印一段日志然后系统自动重启周而复始。处理方法是抓住panic那一刻的信息或者通过pstore/ramoops查看上次崩溃的记录# 查看上次panic日志如果内核配置了pstore ls /sys/fs/pstore/ cat /sys/fs/pstore/console-ramoops-0拿到panic日志后找到Call trace那一节确认崩溃的内核函数是哪个。结合函数名和对应模块基本能判断是驱动兼容性、内存访问越界还是电源管理配置不当引发的问题。5.3 快速恢复与迭代调试流程硬件调试是个反复迭代的过程快速恢复能力非常重要。我的工作流是先用dd把整个系统分区备份到电脑上任何配置改动前都做一个当前状态的镜像这样出了问题可以随时回滚。# 备份用户数据分区 hdc shell dd if/dev/block/platform/fe310000.sdhci/by-name/userdata of/data/userdata.img bs4M hdc file recv /data/userdata.img ./userdata_$(date %Y%m%d_%H%M%S).img改设备树也好改驱动参数也好每次只改一个文件然后重新编译、烧录、验证。同时把每次的改动和现象记录在一个本子里不用很正式自己看得懂就行。这个习惯帮我省掉了大量“重复定位同一个问题”的冤枉时间。5.4 RK3568设备树选择的终极建议回到标题里“rk3568有许多设备树到底咋选”这个问题我再说点掏心窝的建议先别急着改。拿到一块新板子先用厂家预编译好的镜像跑一遍确认硬件本身是好的从evb参考设计入手。用和板子最接近的evb设备树作为起点先让它能启动外设逐个适配。启动没问题了再逐个打开HDMI、MIPI、PCIe等功能每打开一个功能就验证一次不要迷信“最新”。设备树文件不是越新越好而是要匹配板子的实际硬件版本善用全局搜索。不确定某个节点是干什么的直接在源码目录里grep -r 节点名 .看它被哪些地方引用从我的经验来看只要这三板斧用熟了OpenHarmony的硬件调试实际上是可以形成“肌肉记忆”的。遇到问题先打开串口抓日志再对照设备树找配置最后用hdc做运行时验证从启动到运行再到外设驱动的常见问题基本都能覆盖。硬件调试这东西说穿了就是“观察、假设、验证、修正”的循环。三板斧提供的是一套最优先使用的观察和验证手段尤其在OpenHarmony快速迭代的背景下掌握好这套方法论拿到新板子才不会慌遇到新问题才知道第一步该干什么。
返回列表