RK3568 这块板子,最近调 MIPI DSI 屏的时候,遇到一个特别典型的启动异常:uboot 阶段 logo 亮得好好的,一跳到内核,屏幕直接黑掉,串口还看不出明显 panic。这种“一半好一半坏”的问题最磨人,因为它涉及 uboot、内核 DRM、MIPI DSI 控制器、面板驱动和背光时序一整条链路。这篇文章就把我这次从现象到修复的完整排查过程写出来,包括为什么 uboot 能亮而内核不能亮、怎么定位卡点、设备树怎么对齐、屏参和时序参数有哪些坑,以及背光复位这几个“非驱动”环节要怎么处理。不管是 RK3568 还是其他瑞芯微平台,遇到类似“uboot 有 logo、内核黑屏”的 MIPI 屏问题,都可以照着这个思路走一遍。
1. 从 uboot logo 到内核黑屏:这条启动链路上到底发生了什么
先说结论:uboot 阶段能显示,不等于内核阶段就一定能显示。RK3568 这类 SoC 的显示链路,从上电到系统起来,要经历两套完全独立的显示初始化体系。
上电之后,首先是 BootROM 加载 uboot,uboot 自身带了一套独立的显示驱动。它会根据 uboot 设备树里的 panel 配置,直接操作 MIPI DSI 控制器寄存器,把初始化序列发给屏幕,点亮背光,然后显示 logo。这一阶段用的是 uboot 自己的代码和驱动模型,跟内核完全是两回事。
接下来内核启动,此时显示子系统会重新初始化。内核 DRM/KMS 框架接管整个显示链路,它会重新申请内存、重新初始化 DSI 控制器、重新匹配 panel 驱动、重新走一遍 panel 的 probe 和 prepare 流程。如果这一步任何环节出错,就会出现“uboot 亮得好好的,内核一上来就黑屏”的现象。
很多人会问:uboot 不是已经把屏点亮了吗,为什么内核不能直接接着用?原因很简单:uboot 的显示资源在内核初始化时会被释放并重新申请,内核不会信任 uboot 留下的任何寄存器状态,全部重来。如果内核的设备树配置和 uboot 不一致,比如屏参不对、compatible 不匹配、reset 引脚配置不一样,那内核初始化的结果就和 uboot 完全不同,黑屏就成了大概率事件。
这个切换过程里,常见的问题点我归纳了一下,基本跑不出这几类:
- 内核设备树和 uboot 设备树的 panel 配置不一致,包括 compatible、时序参数、lane 数、时钟频率;
- 内核没有正确匹配到 panel 驱动,导致 panel probe 失败;
- DSI 控制器在内核里初始化顺序问题,或者 DSI 时钟配置不对;
- 背光、复位 GPIO 等电源时序问题,导致面板处于未就绪状态;
- 内核 DRM 框架里连接器/面板状态机没走到 on 状态。
所以,遇到这类问题,第一步不是改代码,而是先搞清楚内核到底卡在哪个环节。后面我会按实际排查顺序来讲,先看日志,再查设备树,再查驱动参数,最后查时序。
2. 先抓串口日志再动手:三分钟定位“黑屏到底卡在哪一步”
RK3568 调试显示问题,串口日志是最重要的工具。别上来就改代码、改参数,先看内核日志里显示子系统的输出,确认 LCD 初始化走到了哪一步。
2.1 打开 DRM 调试信息
RK3568 的内核默认 drm.debug 可能是关闭的。如果看不到详细日志,可以在内核启动参数里加 drm.debug=0x1f,或者运行时通过 debugfs 开启。我习惯先在 uboot 环境变量里加上:
在 kernel command line 中追加:
drm.debug=0x1f loglevel=8如果是 android 系统,在 BoardConfig 或 dtb 的 chosen 节点里加也成。
重启之后,串口日志里就能看到 DRM 子系统的启动过程。关键是要确认几件事:rockchipdrm 是否 probe 成功、DSI controller 是否 probe 成功、panel 是否匹配到驱动、mode set 是否完成。
2.2 从日志中判断卡点
把日志打开后,重点看这几类关键词。我整理了一个速查表,实际排查时可以对照着看:
| 日志关键词 | 含义 | 说明 |
|---|---|---|
rockchip-drm | DRM 主设备初始化 | 若 probe 失败,问题在 DRM 框架或内存节点 |
dw-mipi-dsi | DSI 控制器初始化 | 若失败,查 dts 中 dsi 节点配置 |
panel-simple或panel-xxx | panel 驱动 probe 信息 | 若找不到,说明 compatible 没匹配上 |
drm_panel | panel 生命周期日志 | 能看到 prepare/enable 是否被调用 |
fail to get | 获取某个资源失败 | 通常缺 gpio/clock/regulator |
timeout | 等待超时 | 一般是 panel 初始化序列或 DSI 读写失败 |
Connector | 连接器状态 | 能看到 connector 是否 connected,mode 是否有效 |
如果日志里能看到rockchip-drm display-subsystem bound之类的输出,说明 DRM 主链路是通的。接下来看 DSI 的 probe 日志,如果连 DSI 都没绑定,那问题多半在 dts 的 dsi 节点或者时钟配置上。
如果 DSI 已绑定,接下来看 panel 驱动。日志里搜 panel,看有没有成功加载。如果看到类似panel-simple: probe failed或者no panel driver found,那就是 dts 里的 panel compatible 与内核驱动对不上。
2.3 一个典型日志场景:panel 驱动根本没被调用
我这次遇到的问题,日志里就是非常干净,干净到让人抓狂:DRM、DSI 全都正常初始化,日志显示[drm] Initialized rockchip 3.0.0,但死活没有 panel 相关的 probe 信息。
这种情况下说明 panel 节点没有被 DSI 总线扫描到。原因大概率是 dsi 节点下的 panel compatible 写错了,或者 panel 节点 reg 地址不对,又或者 DSI 的子节点格式不对。
在我这个例子里,uboot 和内核的 dts 是从两个仓库拉出来的,uboot 的 dts 上 panel 的 compatible 写的是"xx,yyy",而内核驱动里注册的 compatible 写的是"xx,yyy-v1",差个后缀,内核就匹配不上。这种问题从日志看不出来,只能靠对比 uboot 和内核两边的设备树来定位。
2.4 排查时的一个有效动作:先加打印
如果日志看不出来,我建议在 panel 驱动的 probe 函数里临时加 dev_info,确认有没有走到。比如在 panel_simple_probe 入口加一行:
dev_info(dev, "panel-simple probe enter\n");加了之后启动看串口。如果连这行都没有,说明内核根本没匹配到这个驱动。如果这行有,但后面 enable 没走,那就是状态机或资源的问题。这一步能快速把问题圈定在“匹配”还是“后续初始化”。
3. 设备树对齐与屏参修正:uboot 能亮而内核不亮的头号原因
RK3568 的 uboot 和内核设备树是两套,但它们描述的是同一个硬件。很多“uboot 亮、内核黑”的问题,归根结底就是两套设备树没对齐。
3.1 uboot dts 与内核 dts 的常见差异
先明确一下文件路径:
- uboot 设备树:
u-boot/arch/arm/dts/rk3568-evb.dts这类文件 - 内核设备树:
kernel/arch/arm64/boot/dts/rockchip/rk3568-evb.dts
两个文件可能同源,也可能各自维护。瑞芯微官方 SDK 里 uboot 和内核的 dts 经常是分开的,且同一份 dts 里可能有成百上千行,肉眼对比不现实,建议用 diff 或者 grep 定位。
最容易出问题的几个字段:
| 配置项 | uboot dts | 内核 dts | 不一致的后果 | ||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| compatible | 需匹配 uboot panel 驱动 | 需匹配内核 panel 驱动 | 驱动加载失败 | ||||||||||||||||||||||||||||||
| lane 数 | >cat /sys/kernel/debug/dri/0/state 在 DRM state 里能看到 connector 的 mode 信息,确认活时钟、porch 等参数是不是和 dts 里一致。如果这里显示不对,说明 dts 没生效,可能是编译缓存问题,也可能是 dtb 没更新。 3.5 一个容易被忽略的问题:uboot dts 里的 panel 节点和内核不同名 有的 SDK 里,uboot dts 的 panel 节点叫 我的经验是,在排查时把 dts 相关的关键差异全部列成表,一项项核对,不要凭感觉改。一次改一处,改完重启验证,别一次性改好几个变量,否则出问题都不知道是哪步引入的。 4. panel 驱动与 DSI 时序关键参数:内核 DRM 的初始化顺序和坑设备树对齐之后,接下来要看内核侧 panel 驱动的实现。RK3568 平台最常见的是使用 4.1 panel-simple 驱动的初始化流程 以 panel-simple 为例,内核里它的 probe 流程是:获取 reset gpio、获取 enable gpio、获取 regulator、获取 backlight 设备,然后注册 drm_panel。在 drm_panel_prepare 时,会执行上下电时序,包括设置 regulator、拉 reset、发送初始化序列;在 drm_panel_enable 时,会打开背光。 如果面板是 DSI 接口,且用 panel-simple,通常还需要在 panel 节点中配置 4.2 从 dmesg 确认 prepare/enable 顺序 日志里搜 RK3568 的 DSI video mode 下,内核在 mode_set 阶段会配置 DSI 控制器参数,包括 lane 数、时钟、像素格式。这些参数如果和 panel 实际能力不匹配,屏幕一样不亮。 4.3 常见 DSI 参数核对点 看 dsi 节点的 如果这个值为 0,或者不存在,说明背光驱动没起来。再查 dts 里的 pwm 节点: 如果 pwm 没配 pinctrl,对应引脚可能处于默认状态,背光信号没有输出。还要确认背光电源 GPIO 是否设置为高电平有效,如果背光 enable 脚接的是低有效,而 dts 里没写 5.3 reset 引脚的时序影响 panel 的复位时序要求很严格。有的屏要求复位信号 low 至少 10ms,再拉 high,再等待 120ms 才能发送 DCS 命令。如果 dts 里 我在调试时遇到过一种情况:uboot 拉到 high 的复位引脚,在内核接管后先拉 low 再拉 high 的时序里,low 的时间太短,屏的控制器没完成复位。这个在日志里完全看不出来,最后是拿示波器量复位引脚才发现低电平只维持了 1ms,屏 IC 规格书要求是 10ms。把 5.4 电源轨的完整顺序 有些 MIPI 屏需要多路电源,比如 VCC、VCI、VDDIO,这三路的上下电顺序也有讲究。如果 dts 里 regulator 配置不对,屏幕上电时面板 IC 可能处于欠压状态。检查方法: 看对应 regulator 是否 enable,电压是否正常。如果 regulator 配置没问题但电压不对,可能硬件上电源芯片的反馈电阻有问题,软硬件一起排查。 5.5 从 uboot 到内核的电源交接问题 这是 RK3568 平台特有的一类问题。uboot 里已经把 panel 的电源打开了,内核启动时不会主动关掉,但如果内核重新 probe panel 时,先执行了 unprepare,再执行 prepare,而 unprepare 里把 regulator 关了,之后 prepare 又重新打开,中间时序不够,屏可能没有正确进入 ready 状态。 这类问题比较难查,通常表现为“每次冷启动黑屏,reboot 后正常”,或者反过来。我遇到过一次,是 dts 里 panel 的 5.6 背光与 DPMS 的配合 DRM 的 DPMS 流程中,panel_enable 和 backlight 打开的顺序有讲究。以 rockchip drm 为例,正常是 connector 状态切到 on 时,先调用 排查方法:在 panel 驱动的 enable 函数里加打印,同时把 backlight 驱动的 brightness 写入函数加打印,看两者调用顺序。如果不一致,需要通过 dts 或驱动调用顺序来修正。 6. 常见问题速查表与我的排查心得以下是我在 RK3568 MIPI 屏调试中整理出的高频问题速查表,覆盖了从 uboot 到内核的大部分现象:
6.1 再分享两个排查小技巧 第一,如果手头有逻辑分析仪或示波器,把 MIPI DSI 的 clock lane 拉出来看。黑屏状态下,clock lane 有波形不代表数据正常,但如果有稳定的 HS 时钟波形,至少说明 DSI 控制器是在工作的,问题更可能在 panel 侧的时序或初始化命令上。如果 clock lane 都没有,那就是 DSI 控制器没正常工作,回到 dts 和驱动层面查。 第二,uboot 能点亮的屏,尽量让 uboot 和内核共用一份 panel 配置。瑞芯微平台支持 uboot 和内核用同一个设备树源文件的情况,虽然这在量产中不一定方便,但在调试阶段非常有用。你可以把 uboot 里能正常点屏的 dts 内容复制到内核 dts,然后编译验证,能快速排除大量参数问题。 6.2 我的调试顺序总结 按效率高低,我最后形成的固定排查顺序是:先开 drm.debug 看日志,确认卡点;再对比 uboot 与内核的 dts,统一配置;检查 panel 驱动是否匹配、init seq 是否发送;检查背光与电源时序;最后才考虑修改时序参数。每次只改一个变量,改完必须串口日志复核。这套流程调过 ST7701S、HX8399、NV3052 等多颗常见 MIPI 屏,都能在半天内定位到问题,比之前凭感觉改配置要快得多。 RK3568 的 MIPI 显示链路并不可怕,可怕的是 uboot 和内核两套配置互相“打架”。把这两套配置对齐,再调好上下电时序,黑屏问题基本都能解决。 6.3 最后补一个实用命令清单 调试时我会把下面这些命令放在手边,方便随时确认状态: 每次重启后按顺序抓一遍日志,问题范围基本就能圈定。不要指望看一眼日志就出结论,多抓几次,把正常和不正常的状态对比一下,差异点通常就是问题点。 这篇文章写到这里,核心的排查思路和实操方法都讲完了。我自己实际操作中最大的体会是:RK3568 的 MIPI 屏问题,绝大多数不是“硬件坏了”,而是“两套软件配置的交接没做好”。希望大家调试时能少走弯路,一次点亮。
版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设
2026/9/19 16:29:35
Unity锁帧原理与热管理实战:从功耗控制到VR稳帧1. 项目概述:为什么“锁帧”不是妥协,而是精密的热力学博弈“锁帧的智慧:拿帧率换发热余量”,这个标题里藏着一个被太多开发者轻描淡写、甚至误读的核心动作——Application.targetFrameRate。它不是一句简单的代码,而…
网站建设
2026/9/19 16:28:51
MCP与UE5.8实践:自然语言驱动游戏编辑器,构建AI辅助开发工作流1. 从“对话”到“操作”:MCP在UE里的逻辑起点如果你最近在逛GitHub或技术社区,大概率会撞见MCP(Model Context Protocol)这个词。我第一次看到的时候也犯嘀咕,这不就是一个协议吗,怎么被吹得跟下一个“USB…
网站建设
2026/9/19 16:27:27
TRAE IDE 与 TRAE WORK 历史版本下载及版本回退完整指南1. 为什么历史版本下载这件事值得单独聊做开发工具这行时间长了,你会发现一个规律:新版本发布永远伴随着一批人回退旧版本。TRAE IDE 和 TRAE WORK 这两个工具也不例外。我身边不少朋友在升级之后遇到各种水土不服——有的是新版本改了快捷键映射&#x…
网站建设
2026/9/19 16:24:32
SL/T 793-2020河湖健康评估RHS赋分与Python复算简介:本资源为《河湖健康评估技术导则》SL/T 793—2020的正式发布版本,属于中华人民共和国水利行业标准,面向水利、生态环境、水资源评价领域的科研人员、规划设计人员及高校师生,用于指导河流与湖泊健康状况的系统评估与分级判定…
网站建设
2026/9/19 16:23:29
Gatsby 插件、主题与 Starter 完全指南:概念辨析、能力对比与选型决策Gatsby 插件、主题与 Starter 完全指南:概念辨析、能力对比与选型决策 【免费下载链接】gatsby React-based framework with performance, scalability, and security built in. 项目地址: https://gitcode.com/gh_mirrors/ga/gatsby 本指南以 Gatsby 生态中…
网站建设
2026/9/19 16:22:50
Qt Creator构建套件配置全攻略:双平台工具链实战指南/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … |