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。这时候就得优化了。
优化手段
- 减少图层数:能合并的图层尽量合并,少一层省 20% 带宽
- 降低色深:仪表盘用 RGB565,人眼根本看不出区别
- 压缩传输:DSI 接口支持 DSC 压缩,压缩比 3:1,带宽直接降到 1/3
- 调整消隐期:适当增加 HBP/HFP,让数据有更多时间传输
我的习惯:先按最坏情况算一遍带宽,然后逐项优化。优化完再算一遍,确保不超过硬件上限。最后留 10% 的余量给突发场景。
3.5 显示链路整体架构
下面这张图,是我自己总结的 8295 多屏显示链路架构。你照着这个搭,基本不会出大问题。
3.6 调试与验证清单
最后,我列一个调试清单。每次调显示链路,我都会对着这个清单过一遍:
| 检查项 | 验证方法 | 常见问题 |
|---|---|---|
| 时钟频率 | 示波器量 VSYNC/HSYNC | 频率偏差超过 1% 会导致闪屏 |
| 时序参数 | 读寄存器值 vs 屏幕规格书 | HBP/HFP 配反会导致画面偏移 |
| 带宽占用 | DPU 性能计数器 | 超过 80% 就要考虑优化 |
| 图层叠加 | 逐层关闭测试 | 透明图层顺序错误导致黑屏 |
| 同步延迟 | 双屏播放同一视频,肉眼观察 | 延迟超过 2 帧需要调整同步策略 |
嗯,差不多就这些。显示链路这块,说白了就是算清楚、配准确、验证到位。你按这个思路走,8295 的多屏显示基本稳了。