1. 课程导入

车载 HMI(Human Machine Interface,人机交互界面)已经从早期的物理按键与单色小屏,演进为覆盖仪表、中控、副驾、HUD、后排娱乐的多屏融合交互系统。今天,一辆智能汽车上的图形界面往往同时运行十几个渲染进程,涉及 2D/3D 仪表、导航地图、倒车影像、语音助手、空调控制等不同安全等级与帧率要求的场景。理解这一演进过程,是掌握车载 Linux Wayland HMI 工程的前提。

一、车载 HMI 的四个演进阶段

从图形系统的技术视角看,车载 HMI 大致经历了四个阶段,每个阶段的核心矛盾都不同:

  • 阶段一:分立 ECU + 段码屏。仪表、空调、收音机各自独立,图形能力极弱,几乎没有“界面框架”的概念,软件与硬件强绑定。
  • 阶段二:单 SoC + Qt/OpenGL 全屏应用。中控开始使用 Linux 或 QNX,单个全屏应用直接占用显示控制器,多应用共存困难,切换靠进程抢占。
  • 阶段三:多屏多应用 + 窗口系统。引入 Weston、Android SurfaceFlinger 等合成器,实现多窗口、多图层、多屏输出,但合成器与安全域、实时性之间的矛盾开始凸显。
  • 阶段四:域控集中 + 混合关键性合成。仪表与中控合并到同一 SoC,通过 Wayland 合成器实现“安全域独占图层 + 非安全域共享合成”,兼顾功能安全与丰富生态。

这四个阶段并非简单替代,而是长期共存。入门级车型可能仍停留在阶段二,而高端车型已进入阶段四。工程实践中,最需要掌握的是阶段三到阶段四的图形栈设计能力。

二、为什么车载领域选择 Linux 与 Wayland

Linux 在车载领域的优势主要体现在三点:可裁剪性(从最小 rootfs 到完整发行版均可定制)、驱动生态(GPU、显示控制器、摄像头 ISP 的 DRM/KMS 支持成熟)、长期维护(内核 LTS 与 AGL、GENIVI 等车规发行版提供长周期支持)。

而 Wayland 相比传统 X11,更适合车载场景:

对比维度 X11 Wayland
合成模型 客户端直接绘制到共享窗口,合成器可选 客户端渲染到独立 buffer,合成器统一合成
安全隔离 客户端可读取其他窗口内容,隔离弱 客户端之间默认不可见,隔离强
输入延迟 路径长,事件需经 X Server 转发 路径短,输入直接由合成器分发
多屏与图层 依赖 Xinerama/RandR,硬件图层控制弱 与 DRM/KMS 图层直接映射,支持硬件合成
车载适配 历史包袱重,实时性差 Weston/AGL Compositor 可裁剪、可定制

Wayland 的核心思想是“合成器即显示服务器”:客户端只负责把内容渲染到自己的 buffer,合成器决定这些 buffer 如何被合成、缩放、旋转并最终送到 DRM/KMS 的硬件图层。这种模型天然适合车载的多屏、多图层、混合关键性需求。

关键认知:Wayland 不是“另一个图形库”,而是一套协议 + 合成器架构。协议定义客户端与合成器如何通信,合成器决定渲染与显示策略。车载工程的重点,往往不在协议本身,而在合成器的图层分配、安全域划分与性能调优。

三、课程整体知识框架

本课程围绕“从协议到量产”的主线展开,整体分为五个层次,可以用下面的结构图表示:

车载 Linux Wayland HMI 知识框架 ① 基础层:Linux 图形栈 DRM/KMS · GBM · EGL/GLES · DMA-BUF · 输入子系统 evdev/libinput ② 协议层:Wayland 核心 wl_surface · wl_buffer · xdg-shell · 输入事件 · 共享内存与 DMA-BUF ③ 合成层:Weston / AGL Compositor 图层分配 · 硬件合成 · 多屏输出 · 安全域隔离 · 启动与生命周期 ④ 应用层:HMI 框架与工具链 Qt/Wayland · Flutter Embedded · 渲染管线 · 资源与主题 · 调试工具 ⑤ 量产层:性能、安全与验证 帧率与延迟 · 内存带宽 · 功能安全 · 启动时间 · 自动化测试与回归 底层 上层

这五层不是孤立的:底层的 DMA-BUF 决定合成层能否零拷贝;协议层的 buffer 管理决定应用层的渲染效率;合成层的图层策略直接决定量产层的帧率与功耗。课程会沿着这条链路逐层展开,并在每一层给出可运行的代码与调试方法。

四、典型场景:仪表与中控共存的合成路径

假设一个域控 SoC 同时驱动仪表屏和中控屏。仪表由安全域进程渲染,要求 60fps 且不能被中控应用阻塞;中控由多个普通应用组成,允许动态创建窗口。一个合理的 Wayland 合成路径如下:

  1. 仪表进程通过 DRM 独占图层直接扫描输出,不经过合成器混合,保证实时性与功能安全。
  2. 中控应用通过 xdg-shell 创建 surface,合成器将其分配到共享合成图层。
  3. 合成器根据屏幕与图层能力,决定哪些 surface 走 GPU 合成、哪些走硬件 overlay。
  4. 输入事件由 libinput 采集,合成器按焦点与安全策略分发到对应客户端。

这条路径中,任何一个环节配置错误都会导致黑屏、撕裂或输入失效。例如,若仪表图层被错误地纳入 GPU 合成,可能在系统负载高时出现掉帧;若 DMA-BUF 格式不匹配,则会出现花屏。这些正是本课程要解决的实际问题。

学习建议:不要只停留在“会调用 API”。建议在开发板上实际运行 Weston,用 weston-info、modetest、wayland-info 观察图层、格式与输出状态,再逐步替换为自己的合成器逻辑。

五、常见误区与复盘

  • 误区一:把 Wayland 当成“更快的 X11”。Wayland 是架构变化,客户端不再拥有全局坐标与窗口管理权,很多 X11 习惯需要重构。
  • 误区二:忽视 DRM/KMS 图层能力。合成器的性能上限往往由硬件图层数量与格式决定,而不是 GPU 算力。
  • 误区三:安全域与非安全域混用同一合成路径。仪表等安全关键内容应尽量独占图层,避免被普通应用影响。
  • 误区四:只测功能不测时序。车载 HMI 的启动时间、首帧时间、输入延迟都是量产指标,需要从第一天就纳入测试。
# 快速查看当前 Wayland 合成器与输出信息
weston-info
wayland-info

# 查看 DRM 图层与显示模式
modetest -M rockchip -c
modetest -M rockchip -p

# 查看客户端 buffer 格式与合成路径(示例)
WAYLAND_DEBUG=1 ./hmi_app 2>&1 | grep wl_buffer

通过这些命令,可以快速判断当前系统是“硬件合成”还是“GPU 合成”,以及 buffer 是否走了 DMA-BUF 零拷贝路径。掌握这些观察手段,是后续章节进行性能调优与故障排查的基础。

本章小结:车载 HMI 正从单屏单应用走向多屏混合关键性合成;Linux 提供可裁剪、驱动成熟的底座,Wayland 提供隔离强、延迟低、易与 DRM/KMS 图层映射的合成模型。本课程将沿着“基础层 → 协议层 → 合成层 → 应用层 → 量产层”的框架,逐层建立可落地的工程能力。