4. 显示子系统软件栈

在Snapdragon车载平台上,一块SoC往往要同时驱动中控屏、仪表屏、副驾娱乐屏和HUD,这些屏幕的分辨率、刷新率、安全等级和内容来源各不相同。应用层看到的只是“把画面画出来”,而真正决定画面如何被合成、由哪个硬件通道输出、以什么时序送到屏幕的,是一条自下而上贯通的显示软件栈。理解这条栈,是排查黑屏、撕裂、掉帧、多屏错位等问题的前提。

一、从应用到像素:显示通路的整体分层

Android侧自下而上的关键层次是:应用通过Surface提交图形缓冲,SurfaceFlinger负责全局合成,HWC(Hardware Composer)决定哪些图层交给显示处理器DPU硬件叠加、哪些必须由GPU合成,最终通过DRM/KMS把图层配置和显示模式下发到内核显示驱动,由DPU扫描输出到MIPI DSI或DP接口的屏幕。Wayland/Weston则主要出现在仪表、部分QNX/Linux域或容器化座舱方案中,作为另一套合成器与Android并存,共享同一套DRM/KMS底层。

可以把这条通路理解为“合成决策层”和“显示控制层”两段:SurfaceFlinger与Weston属于合成决策层,决定最终画面内容;HWC与DRM/KMS属于显示控制层,决定画面如何被硬件搬运和定时输出。Snapdragon平台的适配工作,核心就是让这两段在多个显示控制器、多个安全域之间正确对接。

Snapdragon车载显示软件栈与显示通路 应用 / 系统UI / 仪表HMI / 视频播放器 通过 Surface / BufferQueue 提交图形缓冲(BufferQueue 生产者-消费者模型) Android 合成决策层 SurfaceFlinger 图层管理 · 合成策略 · VSYNC调度 Client合成(GPU) / Device合成(HWC) 多屏输出 · 虚拟显示 · 安全图层标记 Wayland/Weston 合成器 仪表域 / Linux容器 / 部分座舱方案 Weston compositor · DRM后端 与Android共享DRM/KMS设备节点 独立显示控制器或分时复用 HWC (Hardware Composer) — 硬件合成抽象层 图层校验 validateDisplay · 合成方式决策 presentDisplay · 叠加层数量与格式约束 · 安全通道标记 DRM/KMS — 内核显示模式设置与图层提交 CRTC · Plane · Encoder · Connector · Atomic Commit · 显示模式(分辨率/刷新率) · 色彩管理 DPU 显示处理器 → MIPI DSI / DP 接口 → 中控屏 · 仪表屏 · 副驾屏 · HUD 合成决策 显示控制

二、SurfaceFlinger与HWC的协作机制

SurfaceFlinger收到各应用提交的图层后,会调用HWC的validateDisplay(),由HWC根据当前硬件能力判断每个图层能否由DPU的Plane直接叠加。Snapdragon的DPU通常支持多个视频层和图形层,但受限于Plane数量、像素格式、缩放比例和跨屏约束,HWC可能返回“部分图层需要GPU合成”。此时SurfaceFlinger会把这些图层先合成到一张GPU纹理,再作为单个图层交给HWC,这就是Client合成与Device合成的切换。

在车载多屏场景中,一个典型约束是:中控屏和仪表屏可能由不同的CRTC驱动,HWC需要为每个显示设备独立决策。如果仪表屏要求安全图层(如报警灯、车速)必须走硬件叠加且不能被GPU合成,就需要在HWC配置中标记该图层为安全层,并确保DPU对应Plane支持安全通道。适配时常见的做法是在hwc_display配置中为每个物理屏指定safe_mode和plane_restriction,避免安全内容被错误地GPU合成。

三、DRM/KMS的原子提交与多屏管理

HWC最终通过DRM/KMS的Atomic API把图层配置提交给内核。一次Atomic Commit包含CRTC、Plane、Connector和Mode的完整状态,内核驱动会检查状态合法性后一次性生效,避免中间态导致的闪烁。Snapdragon平台的DRM驱动通常暴露多个CRTC,每个CRTC对应一个显示控制器,可独立驱动一个物理接口。

多屏适配的关键是资源分配:哪个CRTC接中控、哪个接仪表、哪个接副驾,以及每个CRTC可用的Plane数量和类型。例如,某Snapdragon座舱平台有4个CRTC,其中CRTC0支持4个Plane(2视频+2图形),CRTC1支持2个Plane,CRTC2/3各支持1个。如果副驾屏只做视频播放,可以只分配1个视频Plane;如果中控需要导航+媒体+状态栏三层叠加,就需要至少3个Plane,否则会触发GPU合成,增加功耗和延迟。

# 查看DRM资源分配(示例)
cat /sys/kernel/debug/dri/0/state
# 输出示例:
# crtc[0]: mode=1920x720@60, planes=4, connector=DSI-1
# crtc[1]: mode=1280x480@60, planes=2, connector=DSI-2
# crtc[2]: mode=1920x1080@60, planes=1, connector=DP-1

通过该调试节点可以确认每个CRTC当前绑定的Connector、显示模式和Plane占用情况。如果发现某个屏的Plane数量不足,就需要调整图层策略或更换CRTC分配。

四、Wayland/Weston在车载平台的定位

Wayland/Weston在Snapdragon车载平台中通常不替代Android,而是用于仪表域、Linux容器或与Android并存的混合架构。Weston作为Wayland合成器,通过DRM后端直接操作KMS,可以绕过Android的SurfaceFlinger,减少一层合成开销。在虚拟化方案中,Android运行在Guest VM,Weston运行在Host或另一个Guest,两者通过显示虚拟化模块共享物理显示资源。

适配Weston时,需要配置weston.ini指定DRM设备、输出模式和图层分配。例如,将仪表屏分配给Weston的drm-backend,并设置mode=1280x480、transform=normal。如果Weston与Android共享同一个DRM设备,必须通过lease机制或虚拟化层隔离CRTC和Plane,避免两个合成器同时操作同一显示控制器导致冲突。

在多屏项目中,建议先用modetest或kmscube验证每个CRTC和Connector的独立输出能力,再接入SurfaceFlinger或Weston,这样可以快速定位是显示通路问题还是合成策略问题。

五、典型问题与排查思路

当出现某块屏黑屏时,排查顺序应从下往上:先确认DRM层Connector是否检测到屏幕、CRTC是否绑定成功;再确认HWC是否收到该显示设备的validate请求;最后检查SurfaceFlinger是否把图层分配到了该显示设备。如果出现画面撕裂,通常是VSYNC同步或Atomic Commit时序问题,需要检查HWC的present超时和DRM的page flip回调。如果多屏内容错位,重点检查每个CRTC的Plane坐标映射和缩放配置是否与屏幕物理分辨率一致。

掌握这条从应用到像素的完整通路,才能在Snapdragon车载平台上高效地完成多屏显示适配与问题定位。