ARTICLE DETAIL

资讯详情

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

OpenHarmony硬件调试三板斧:串口日志、设备树与烧录工具实战指南

OpenHarmony硬件调试三板斧:串口日志、设备树与烧录工具实战指南 做OpenHarmony系统开发尤其是接触板卡适配和驱动移植的同学最头疼的往往不是业务代码怎么写而是“板子起不来”“外设不工作”“内核莫名崩溃”这类硬件相关问题。我这些年调过的RK3568、RK3399板子不在少数踩过的坑也足够填满一个仓库但回过头总结一下发现问题定位来来回回就那么几板斧。这次就把这套OpenHarmony系统实战中最核心的硬件调试三板斧完整拆给大家串口日志、设备树排查、烧录与调试工具链。这三样熟练了硬件调试基本也就拿下一大半。这套教程适合两类人一类是刚接触OpenHarmony系统移植、被板子各种启动问题折磨的开发者另一类是已经在做应用开发、但想进一步搞懂系统底层到底怎么跟硬件打交道的朋友。不管你用的是RK3568开发板还是在x86电脑上搭系统环境这套方法论都能复用。唯一区别在于ARM板子更依赖串口和设备树x86走的是ACPI那套体系后面我会专门讲两者的差异。1. 硬件调试三板斧是哪三板1.1 为什么硬件调试会卡死人很多做应用开发的人转到系统层面第一反应是“出问题加日志就行”。但硬件调试比纯应用调试麻烦得多因为整条链路太长了电源有没有稳定输出、时钟树配置有没有问题、DDR初始化是否成功、Bootloader能不能跑起来、内核能不能识别到外设、驱动有没有正确probe……任何一个环节出了差错板子都可能毫无反应。更关键的是硬件问题的表现往往带有“连带性”。举个例子某个GPIO的引脚复用配错了表面上看只是这个引脚对应的外设不工作但实际上这个引脚可能同时承担了I2C的SDA功能结果I2C总线上的所有设备都遭了殃。这时候你单纯看业务代码看死也看不出问题必须有一套从底层往上看的排查手段。这套排查手段就是圈内常说的硬件调试三板斧一看串口日志看系统“说到哪一步了”二查设备树看硬件资源“有没有被正确分配”三用烧录与调试工具看镜像“到底跑的是什么”。这三板斧是递进关系串口日志帮你缩小范围设备树帮你定位配置问题烧录工具链帮你确认运行的究竟是哪份代码、什么状态。1.2 三板斧的组成与适用场景先给一张速览表让大家对每个板斧的用途有个直观印象。后面每一章我会展开细讲包括常见参数、操作步骤和踩坑记录。板斧名称核心工具解决的核心问题典型场景第一板斧串口日志串口终端minicom、PuTTY等系统启动到哪一步、卡在哪一步板子不开机、死机、启动重启第二板斧设备树DTS设备树源码、dtc编译器、编译日志外设资源分配错误、引脚冲突、地址不匹配外设不识别、GPIO不输出、I2C/SPI读不到第三板斧烧录与调试工具RKDevTool、upgrade_tool、hdc镜像加载是否正确、运行时崩溃现场镜像起不来、内核panic、应用崩溃熟悉这套组合拳以后不管板卡是哪家的方案思路都一致。先用串口拿到第一现场再拿设备树对照硬件原理图最后用烧录工具和hdc验证结果。下面我按顺序拆。2. 第一板斧串口日志——系统开发的“生命线”2.1 串口日志的配置方法以RK3568为例串口日志在OpenHarmony系统开发里的地位相当于飞机的黑匣子。系统从Bootloader到内核再到用户态每一个阶段的关键信息都会通过串口打印出来。RK3568这样的主流开发板官方资料里一般都会标注串口引脚位置通常是调试UART2也就是我们常说的debug uart。接线这块我多说一句千万别接反了TX和RX。正常来说开发板的调试串口TX要接USB转串口模块的RX开发板的RX接模块的TXGND必须共地。我见过不少新手上来板子没输出排查了半天发现是TX和RX接反了。接好线之后使用minicom或者Windows下的PuTTY连接波特率在OpenHarmony下通常设置为115200。有些板子的Bootloader阶段会设置更高波特率但我实测大多数RK3568方案默认115200就能通吃。如果你用Ubuntu主机最常用的命令是sudo apt install minicom sudo minicom -s在配置界面里选择串口设备比如/dev/ttyUSB0波特率改成115200关闭硬件流控。保存配置后重新打开minicom插上电源正常情况下就应该能看到Bootloader的打印信息了。如果这里没有输出先别急着怀疑系统优先检查串口线、波特率和供电是否稳定。2.2 日志等级与关键信息解读串口日志不像应用日志那样按应用进程区分它更多是内核日志和系统启动日志。OpenHarmony内核侧沿用了Linux内核的日志分级机制从低到高分别有debug、info、warn、error、fatal等。打印到串口的消息一般由earlycon或者console参数控制。以Kernel命令行为例你会在启动参数里看到类似这样的配置consolettyFIQ0,115200n8ttyFIQ0是Rockchip平台特有的快速中断串口在内核启动早期就能输出日志。如果发现系统启动阶段串口只打印到某一行就彻底停住不走了优先怀疑后面的环节出了问题对照日志把停顿点找到基本就是问题所在的模块。读懂日志还有个关键点要能区分Bootloader阶段、内核阶段和init阶段。Bootloader阶段一般打印U-Boot字样内核阶段会出现Starting kernel ...而init阶段能看到Starting init或init service相关的输出。每种阶段卡住的含义完全不一样。Bootloader阶段卡住多半和内存、时钟、存储介质相关内核阶段卡住要考虑设备树是否匹配、驱动是否初始化失败init阶段卡住则要关注系统服务依赖和SELinux权限。2.3 实操定位启动失败问题去年我调过一块基于RK3568的国产板子现象是上电后屏幕一直黑整机看起来毫无反应。当时第一反应就是接串口看输出结果发现Bootloader正常启动内核日志也打到了“Freeing unused kernel memory”但之后再也没有任何输出。顺着日志往下分析卡住的位置其实是init进程启动阶段。没有输出说明不是某个具体服务报错而是系统在创建init进程后没能继续推进。这种问题经验上很大概率是根文件系统没有正确挂载或者system分区镜像损坏。检查了烧录配置后果然发现烧录时system分区镜像路径填错了导致根文件系统不完整。重新烧录镜像后系统正常启动。这类问题用串口日志是最快定位的如果没有串口黑屏状态下你只能靠猜效率天差地别。所以我的习惯是拿到任何一块新板子第一件事就接好串口确认能正常输出日志再考虑其他调试工作。3. 第二板斧设备树DTS排查——硬件资源分配的“户口本”3.1 RK3568那么多设备树到底怎么选如果你用过OpenHarmony在RK3568上的官方发布包打开内核设备树目录后一定会被一堆dts文件搞晕。网上也经常有人问“openharmony的rk3568有许多设备树到底咋选”这个问题确实绕不开。设备树在嵌入式Linux和OpenHarmony中的角色可以理解成硬件资源的“户口本”。它告诉内核这块板子上有哪些外设、接在哪个地址上、用哪个中断号、引脚的复用关系是什么。RK3568同一颗SoC因为各家板卡设计不同内存大小、显示接口、网口PHY、电源管理顺序都可能不一样所以必然需要不同的设备树来描述。挑选设备树的判断依据核心就三点。第一看板卡方案是谁家的。OpenHarmony社区常见的RK3568开发板有润和的DAYU200系列、触觉智能的RK3568系列、优博的RK3568系列等每个厂商对自己的板子都有对应的dts文件。比如DAYU200相关板卡一般用jhj-rk3568.dts这类命名规则触觉智能的方案可能是industio-rk3568.dts系列。拿到板卡之后先找厂商资料里标注的“内核设备树名称”或者看默认烧录镜像中的设备树配置这是最稳妥的路径。第二看外设接口差异。同一个方案下的不同子型号往往在显示屏接口上分叉有的是MIPI DSI屏有的是LVDS屏有的是HDMI输出。RK3568支持多种显示接口但设备树里同一个显示控制器的节点需要绑定对应的输出方式。如果选错了dts最常见的结果就是屏幕不亮但系统其实已经正常启动了。这时候接串口看日志会发现内核日志中显示驱动结构体初始化正常但实际没有检测到屏幕信号。第三看内存容量和型号。RK3568方案有2GB、4GB、8GB等不同配置设备树中的memory节点虽然很多dts里没有硬编码但在一些老版本中会在reg属性里标注初始内存区间。如果dts的内存描述与实际内存颗粒不匹配轻则系统只识别到部分内存重则会在开机阶段DDR初始化后直接卡死。我给一个通用的快速判断模板当时选dts时我常这么自检维度自查问题板卡厂商板子丝印、厂商文档里写了哪套方案SoC型号是RK3568J还是RK3568B2封装型号是否一致版本号官方内核config中默认加载的是哪个dts外设差异屏幕接口、网口芯片、WiFi模组型号是否有差异调试口定义调试串口的复用管脚是否和dts中的pinctrl一致把这几个问题理清楚基本就不会在设备树迷宫里迷路了。3.2 设备树修改与编译流程搞定了“选哪个dts”之后还得知道怎么改、怎么验证。OpenHarmony的设备树分两部分一部分是内核相关路径通常在kernel/linux/linux-5.10/arch/arm64/boot/dts/rockchip/另一部分是HDF驱动相关的描述分布在vendor/目录下的hdf配置中和内核设备树节点通过compatible属性对应起来。修改设备树最典型的操作是调整引脚复用、修改外设地址、增删设备节点。举个例子如果要把某个UART口配置为普通GPIO模式需要修改对应节点的pinctrl-0属性uart2 { status okay; pinctrl-names default; pinctrl-0 uart2m0_xfer; };如果想查看一个节点当前是否使能可以看它的status属性。在设备树调试时“明明配置了但外设没反应”十次有八次是status没有改成okay或者被其他board级dts的disable覆盖了。编译设备树的流程建议在完整OpenHarmony编译环境下执行。以RK3568为例常见的做法是在编译内核时通过make命令指定dtb文件或者直接在构建系统中带上对应产品配置。每次修改dts后只重新编译内核镜像和对应dtb即可不需要重编整个系统./build.sh --product-name rk3568 --build-target kernel编译完成后dtb文件会在内核编译输出目录下。烧录时通常boot分区中已经包含了dtb但有些方案会把dtb单独放到resource分区。这时候需要确认自己板卡的烧录配置明确dtb到底打到了哪个分区否则就会出现“改了dts但没生效”的假象。3.3 实操外设无法工作的排查流程设备树出问题的表现往往是系统起来了、串口也有输出、但某个外设就是一直不工作。最常见的几个场景是GPIO控制的LED不亮、I2C传感器读不到数据、SPI屏幕没有画面。排查流程我一般这么走。第一步先在串口日志中搜索对应驱动有没有执行probe。比如I2C传感器驱动在日志中搜索i2c或者驱动名字看是否打印驱动注册信息。如果驱动根本没有probe基本可以确定是设备树没有正确匹配或者节点status没有打开。第二步检查寄存器地址和中断号。对照原理图确认驱动在设备树中读取的reg地址是否和实际硬件跳线一致。I2C设备经常因为设备地址跳线配置和dts不一致导致驱动在探测阶段直接失败。第三步排查引脚复用冲突。RK3568的GPIO分组很多同一个引脚复用功能复杂。RK3568引入了一个很经典的坑在dts中某个外设节点配置的pinctrl如果和另一个节点配置到了同一个引脚系统启动时不会报错但其中一个外设就无法正常工作。遇到这种情况可以打开内核的pinctrl调试信息在串口日志中搜索pin config或pinmux相关输出确认引脚是否被多个节点抢占。另外还有一个细节很容易被忽略修改设备树后如果你没有重新打包resource分区或boot分区系统加载的仍然是老设备树。这就涉及第三板斧的内容了烧录与调试工具链可以帮助你确认到底跑的是哪份镜像。4. 第三板斧烧录与调试工具链——系统的“最后一公里”4.1 烧录方式与固件打包设备和代码都备齐最终还得通过烧录工具让板子真正跑起来。OpenHarmony在RK3568平台上烧录方式主要有两类Windows下的RKDevTool和Linux下的upgrade_tool。两者的原理一致都是通过USB OTG口让板子进入Loader模式或Maskrom模式再把分区的镜像逐个写入存储介质。实际工作环境如果在Ubuntu下操作最常用的是upgrade_tool。切换到Loader模式的方式是按住板子上的RECOVERY键不放再按一下Reset键然后松开RECOVERY键系统就会进入Loader模式。此时电脑上执行sudo upgrade_tool ld可以看到设备列表里出现一个Loader设备。烧录镜像时OpenHarmony编译产物一般位于out/rk3568/packages/phone/images/目录里面常见的分区包括分区作用loaderRockchip引导器parameter分区表ubootU-Boot引导程序boot内核、ramdisk、dtbvendor厂商私有配置与驱动库systemOpenHarmony系统主体userdata用户数据区烧录时比较稳妥的方式是把整个images目录一次性烧录避免分区表不匹配。使用upgrade_tool全量烧录的命令类似这样sudo upgrade_tool uf out/rk3568/packages/phone/images/update.img或者直接在官方工具界面里导入配置。要注意的是如果新版系统分区表有调整旧烧录工具不认识新parameter就必须通过单独烧录parameter分区后再烧其他分区顺序不能乱。这里很多人会踩坑全量烧录后板子反复重启串口日志停在U-Boot阶段最后发现是parameter分区没有更新分区表错乱导致内核找不到根文件系统。4.2 远程调试与日志抓取板子正常开机进入系统之后并不是所有日志都继续走串口用户态的应用日志主要由hilog日志系统接管。这时候我们会用OpenHarmony自带的hdc工具类似于Android开发中的adb通过USB或者网络连接设备执行shell命令、传输文件、抓取日志。hdc连接设备的基础操作很简单hdc list targets hdc shell hdc hiloghdc shell进入设备终端后可以查看进程信息、文件系统、系统服务状态。hdc hilog会持续输出OpenHarmony应用层和系统服务层的日志配合-e参数可以过滤关键字比如hdc hilog | grep -i sensor这套工具在排查应用层服务加载、HDF驱动服务注册失败、权限问题等场景非常高效。串口日志适合看内核和启动早期的问题hilog则覆盖用户态和HDF框架层两者配合硬件调试的覆盖范围才算完整。4.3 实操抓取内核Crash信息内核崩溃是硬件调试中最让人头疼的问题之一但恰恰是串口加调试工具最能发挥价值的场景。经典的Kernel panic现象是板子突然黑屏重启串口日志最后出现一堆寄存器信息其中包含PC指针、调用栈、panic原因。抓取Crash现场的核心是别急着重启板子而是让系统在panic时保留完整日志。串口输出会打印类似这样的信息Kernel panic - not syncing: FIQ syscall handler CPU: 2 PID: 183 Comm: swapper/0 Not tainted 5.10.x PC is at rk_timer_handler0x3c/0x80看到这类输出不要慌张先记下几个关键字段PC is at后面的函数名和偏移、Call trace上的调用路径、Kernel Offset的基地址。然后结合自己修改过的代码和设备树节点基本能锁定是哪个模块的操作引发了崩溃。碰到比较隐蔽的内存踩踏问题还可以借助内存相关调试选项重新编一个debug版本内核开启slub调试和KASAN地址消毒器后崩溃现场会直接打印出被踩内存的分配栈和释放栈。调试完再把相关配置关掉恢复正式版本。这一套下来90%的Crash问题都能定位到具体函数和调用路径。5. 扩展x86平台下OpenHarmony搭建调试的差异5.1 x86版本如何选择与下载很多朋友没有ARM开发板但想体验OpenHarmony系统于是会搜“开源鸿蒙x86iso下载”“电脑版x86 openharmony”这类关键词。OpenHarmony官方社区比较早就提供了x86_64架构的通用镜像主要用于兼容应用开发、系统开发和UI体验场景可以在普通PC的虚拟机上或者支持UEFI启动的设备上运行。选择x86版本时需要注意区分官方仓库和社区版本更新的节奏不一样一般以OpenHarmony官方发布的主线版本为基准。下载镜像后在VMware或VirtualBox里新建虚拟机时建议选择Linux 64位系统类型内存分配不低于4GB存储空间不低于32GB。启动方式选择UEFI部分老版本镜像对Legacy BIOS支持不好可能出现引导失败。5.2 x86调试与ARM调试的区别同样是OpenHarmony开发x86平台和ARM平台在硬件调试上的差异其实非常大。最核心的差异是设备树的角色。ARM平台靠设备树描述硬件x86平台则依赖ACPI固件表。你在RK3568上用的dts思路在x86上基本派不上用场。x86下的外设资源是固件通过ACPI上报给内核的串口调试的配置也不一样x86的早期串口日志可以通过内核启动参数consolettyS0,115200n8打开。其次是烧录方式。RK3568这种ARM板卡走Loader模式、分区镜像机制x86通用版本则更像传统操作系统镜像以整个磁盘镜像的方式写入或者通过虚拟机加载ISO安装。调试工具上hdc在两者上都能用连接方式和命令基本一致这一点倒是不用重新学。第三是适用场景。如果你目标是做硬件适配、驱动移植、板卡bring-up老老实实买一块RK3568或者其他ARM架构的开发板更有价值因为真实的硬件调试经验和问题场景只能在实际板子上积累。x86版本更适合做应用开发验证、系统UI测试、HDF框架学习和无法获取ARM硬件时的替代方案。两者不冲突但方向要分清。6. 常见问题与排查技巧实录最后把这些年硬件调试中高频遇到的坑整理成一张速查表直接对照定位效率会高很多。问题现象可能原因排查方式解决建议串口无任何输出串口线接反、波特率不对、板子供电异常检查TX/RX/GND接线确认波特率115200测量供电电压换线、换USB口确认电源适配器功率足够串口停在U-Boot分区表损坏、内存配置不对、启动介质没选对查看U-Boot打印中的存储设备信息重新烧录parameter和uboot分区内核启动后反复重启rootfs损坏、system分区镜像不对串口查看挂载日志确认各分区是否正常挂载全量烧录镜像format userdata外设一直不工作设备树节点未使能、引脚冲突、地址不匹配日志搜索驱动probe信息核对dts配置修改dts重新编译boot/resource分区RK3568设备树选错同芯片不同板卡方案差异对照板卡丝印和方案商文档找到对应厂商的dts文件或内核config应用层日志看不到HDF服务没起来、hilog过滤器设置问题使用hdc hilog加关键字过滤检查服务状态确认驱动服务已注册调整日志级别内核panic后无完整栈内核只打了部分日志或panic后立即重启开启内核panic保留串口输出的配置调试版本开启panic_print和KASAN顺手再分享一个排查技巧修改设备树或者内核配置后先不要急着全量烧录很多RK3568板卡支持单独烧录boot分区或resource分区。单独烧录比全量烧录快很多也降低了对其他分区的干扰调试循环效率可以翻倍。等到配置基本稳定再做一次全量烧录验证。我个人的体会是硬件调试这件事经验和手法很重要但更关键的是要有条理。串口日志告诉你“卡在哪一步”设备树告诉你“资源配没配对”烧录和调试工具告诉你“跑的是哪份代码”三步走完大部分问题都能收敛到具体模块。调板子调得多的人都知道调试三板斧不是高深的理论而是把时间花在真正有价值的信息上少做无用功。后续这个系列还会继续讲RK3568各外设的驱动适配、HDF框架实战和系统裁剪大家可以先把手里的板子用这三板斧跑顺后面才好继续深入。
返回列表