3. 多屏显示基础

显示链路这东西,说白了就是数据从 GPU 出来,怎么跑到屏幕上的那条路。很多团队觉得不就是接几根线嘛,结果点亮屏幕才发现——要么闪屏,要么撕裂,要么刷新率死活上不去。我当年第一次调 8295 的三屏显示,光同步问题就折腾了两周。

这一章,咱们把显示链路的几个关键节点拆开讲。你跟着我的思路走一遍,至少能少踩一半的坑。

3.1 显示控制器配置:别被寄存器淹死

高通 8295 内部集成了多个显示控制器(Display Controller),每个控制器对应一条显示管道。配置的时候,我习惯先理清楚三个东西:

  • 管道路径:数据从哪个 DPU(Display Processing Unit)出来,走哪个接口(DSI / DP / eDP)
  • 图层叠加:几个图层要混在一起,每个图层的格式、透明度、Z-order
  • 输出时序:HFP、HBP、VFP、VBP 这些参数,一个不对屏幕就花

核心原则:每个显示控制器独立配置,但共享同一个 DPU 时钟域。这意味着——你改了一个控制器的时序参数,可能会影响另一个。

我在项目中遇到过一件事:客户要求主屏 60fps,副屏 30fps。我一开始分别配了两个控制器的时序,结果副屏一直闪。查了半天,发现是主屏的垂直消隐期太长,把 DPU 的带宽占满了。后来我把两个控制器的消隐期对齐,问题就解决了。

3.2 显示时钟与同步机制:一个时钟,多个屏幕

8295 的显示时钟架构是这样的:一个 PLL 产生基础时钟,然后分给多个显示控制器。每个控制器可以有自己的分频系数,但基础时钟只有一个。

为什么会这样?说白了,芯片内部走的是同步设计,所有显示管道必须在一个时钟域下工作。如果你非要让两个屏幕用完全独立的时钟,那就得走异步 FIFO,延迟和抖动都会变大。

同步方式 适用场景 注意事项
全局同步 多屏显示相同内容 所有屏幕共用 VSYNC,延迟最低
主从同步 主屏控制副屏刷新 主屏 VSYNC 触发副屏,适合仪表+中控
异步独立 各屏独立刷新 需要独立 FIFO,带宽开销大

嗯,这里要注意:主从同步是车载多屏最常见的方案。主屏(比如中控)的 VSYNC 信号作为触发源,副屏(比如仪表)跟着它走。这样既能保证画面同步,又不会因为副屏刷新率低导致主屏卡顿。

3.3 多屏独立刷新率设置:30fps 和 60fps 共存

很多方案商跟我说,8295 支持每个屏幕独立设置刷新率。这话没错,但有个前提——你得算好带宽。

我举个例子:主屏 1920x1080 @60fps,副屏 1280x720 @30fps,第三屏 1920x720 @60fps。你算算总像素吞吐量是多少?

主屏:1920 × 1080 × 60 = 124.4 MP/s
副屏:1280 × 720 × 30 = 27.6 MP/s
第三屏:1920 × 720 × 60 = 82.9 MP/s
总计:124.4 + 27.6 + 82.9 = 234.9 MP/s

8295 的 DPU 理论带宽是 300 MP/s 左右。看起来够用对吧?但别忘了,还有图层叠加、旋转、缩放这些操作,每个都会吃掉额外的带宽。我建议你留 20% 的余量,也就是实际负载不要超过 240 MP/s。

避坑指南:我曾经在一个项目里,副屏设了 30fps,但实际跑起来只有 20fps。查到最后发现,是副屏的 DSI 接口时钟配错了,导致实际刷新率被硬件限制了。所以设完刷新率之后,一定要用示波器量一下 VSYNC 的实际频率。

3.4 显示带宽计算与优化:每一兆都是钱

带宽计算其实不复杂,但容易漏项。我列一个完整的公式:

总带宽 = Σ(每屏像素吞吐量 × 每像素比特数 × (1 + 图层叠加系数))

其中:
- 像素吞吐量 = 分辨率宽 × 分辨率高 × 刷新率
- 每像素比特数 = 24bit (RGB888) 或 30bit (RGB101010)
- 图层叠加系数 = 1 + 0.2 × (图层数 - 1)  // 经验值

举个例子,一个 1920x1080 @60fps 的屏幕,RGB888,2 个图层叠加:

像素吞吐量 = 1920 × 1080 × 60 = 124.4 MP/s
每像素比特 = 24bit = 3 Byte
图层系数 = 1 + 0.2 × (2 - 1) = 1.2
总带宽 = 124.4 × 3 × 1.2 = 447.8 MB/s

你看,一个屏幕就要 447 MB/s。如果三屏同时跑,轻松超过 1 GB/s。这时候就得优化了。

优化手段

  1. 减少图层数:能合并的图层尽量合并,少一层省 20% 带宽
  2. 降低色深:仪表盘用 RGB565,人眼根本看不出区别
  3. 压缩传输:DSI 接口支持 DSC 压缩,压缩比 3:1,带宽直接降到 1/3
  4. 调整消隐期:适当增加 HBP/HFP,让数据有更多时间传输

我的习惯:先按最坏情况算一遍带宽,然后逐项优化。优化完再算一遍,确保不超过硬件上限。最后留 10% 的余量给突发场景。

3.5 显示链路整体架构

下面这张图,是我自己总结的 8295 多屏显示链路架构。你照着这个搭,基本不会出大问题。

高通 8295 多屏显示链路架构 GPU / DPU 显示控制器 0 显示控制器 1 显示控制器 2 DSI / DP 接口 0 DSI / DP 接口 1 DSI / DP 接口 2 主屏 (中控) 1920x1080 @60fps 副屏 (仪表) 1280x720 @30fps 第三屏 (HUD) 1920x720 @60fps 全局时钟同步域 (PLL → 分频 → 各控制器) 说明:每个显示控制器独立配置,但共享同一个 PLL 时钟域;接口类型根据屏幕规格选择 DSI 或 DP

3.6 调试与验证清单

最后,我列一个调试清单。每次调显示链路,我都会对着这个清单过一遍:

检查项 验证方法 常见问题
时钟频率 示波器量 VSYNC/HSYNC 频率偏差超过 1% 会导致闪屏
时序参数 读寄存器值 vs 屏幕规格书 HBP/HFP 配反会导致画面偏移
带宽占用 DPU 性能计数器 超过 80% 就要考虑优化
图层叠加 逐层关闭测试 透明图层顺序错误导致黑屏
同步延迟 双屏播放同一视频,肉眼观察 延迟超过 2 帧需要调整同步策略

嗯,差不多就这些。显示链路这块,说白了就是算清楚、配准确、验证到位。你按这个思路走,8295 的多屏显示基本稳了。