一、项目背景与目标
本项目旨在构建一个完整的 AI 图像显示系统,核心流程如下:
- 使用 USB 摄像头采集图像;
- 基于 Chromium 浏览器展示 AI 页面(例如模型识别结果);
- 通过 Vivante GPU 实现硬件加速渲染;
- 最终在 LVDS 接口的 LCD 屏幕上输出画面。
关键要求是:必须确保 Weston 合成器使用 Vivante GPU 实现 EGL 硬件渲染,避免退回 Pixman 软件栈。
整个过程中,涉及 GPU 驱动初始化、seat 权限设置、内核与用户态接口兼容性等多个关键点。本文将从硬件、驱动、系统配置、调试与验证等角度全面讲解。
二、Vivante GPU 的硬件结构:为什么原理图中看不到?
i.MX8MP 集成了 Vivante GC7000UL GPU,它作为 SoC 内部的固定功能模块(硬核 IP)存在:
- 与 CPU、NPU、VPU 等并列,共享系统总线与内存;
- 不通过外部引脚与电路连接,因此不会在硬件原理图中体现;
- 所有图像渲染处理均通过 SoC 内部的 AXI 总线传输。
这种设计在现代 SoC 中十分常见。例如 GPU 的渲染结果会通过 LCDIF(图像显示控制器)输出到 LVDS/HDMI 接口,这部分才会出现在电路图中。
SoC 内部图形输出逻辑结构:
[ DDR DRAM ]
▲
│(共享内存)
▼
[ Vivante GPU (GC7000UL) ]
│
▼
[ LCDIF Controller / HDMI CRTC ]
│
▼
[ LVDS Bridge / HDMI PHY ]
│
▼
[ 屏幕显示设备(LVDS/HDMI) ]
三、软件栈结构:Weston 与 Vivante GPU 的交互路径
1. 用户空间软件栈
[ 应用程序:Weston / Chromium / GTK+ ]
↓
[ 图形库:libEGL.so / libGAL.so / libGLESv2.so (来自 imx-gpu-viv) ]
↓
[ DRM 设备节点:/dev/dri/card0, /dev/dri/renderD128 ]
2. 内核空间软件栈
[ /dev/dri/card0 / renderD128 ]
↓
[ etnaviv DRM 驱动(drivers/gpu/drm/etnaviv/) ]
↓
[ GPU 寄存器 + 内部命令队列 + AXI 总线访问 ]
↓
[ 输出至 LCDIF → LVDS/HDMI 接口 ]
四、Weston 的 seat 权限管理机制
Weston 必须获取输入设备(/dev/input/)、显卡设备(/dev/dri/)的权限,这依赖 “seat 权限控制”。嵌入式系统中常见两种方案:
权限方案 | 描述 | 使用场景 |
---|---|---|
systemd-logind | 基于 D-Bus 的完整权限控制 | Desktop Linux(如 Ubuntu) |
seatd | 轻量级 socket 权限控制,Yocto 官方推荐 | 无 systemd 的嵌入式系统 |
seatd 的使用方式
- 使用
seatd-launch
启动 weston(推荐方式):
seatd-launch -- weston --log=/tmp/weston.log
- 手动启动 seatd 并设置环境变量:
seatd &
export XDG_RUNTIME_DIR=/run/user/0
export WESTON_LAUNCHER=seatd
weston --backend=drm-backend.so --log=/tmp/weston.log
五、常见问题分析与调试手段
问题一:seatd 启动无效,Weston 报错 “should provide logind or seatd”
错误现象:
seatd-launch
报错invalid option -- '-'
→ 是裁剪版或 busybox shell 替代品;seatd --group=root
报invalid option
→ seatd 被裁剪,无法传参;
✅ 正确做法:
seatd &
export WESTON_LAUNCHER=seatd
export XDG_RUNTIME_DIR=/run/user/0
weston --backend=drm-backend.so --log=/tmp/weston.log
问题二:Weston 崩溃,日志显示 G2D 初始化失败(g2d_open status -24)
HAL user version: 6.4.11.658245
HAL kernel version: 6.4.11.684571
g2d_open: fail with status -24
Segmentation fault (SEGV)
解释:GPU 用户空间库(libg2d-viv.so)与内核 galcore 模块版本不匹配。
✅ 正确做法:
- 所有 GPU 相关组件(libGAL、libEGL、libg2d、内核驱动)必须版本匹配;
- 在 Yocto 中锁定版本,建议添加:
PREFERRED_VERSION_imx-gpu-viv = "6.4.11.p1-aarch64"
PREFERRED_VERSION_imx-gpu-viv-bin-mx8 = "6.4.11.p1-aarch64"
- 禁止混用不同 BSP 分支或 layer 来源。
✅ 临时调试手段(不使用 GPU):
weston --use-pixman # 启用软件渲染
六、Yocto 构建建议(支持 seatd + GPU + Weston)
在 local.conf
中添加:
DISTRO_FEATURES:append = " wayland opengl pam systemd"
IMAGE_INSTALL:append = " \
weston \
seatd \
seatd-launch \
imx-gpu-viv \
libgal-imx \
imx-gpu-viv-tools \
"
说明:
weston
:Wayland 合成器;seatd
:权限管理器;imx-gpu-viv
:包含 libEGL/libGAL/GPU 用户态库;libgal-imx
:GPU 功能封装;imx-gpu-viv-tools
:工具集,包括g2d_test
等测试工具。
建议构建 imx-image-multimedia
或 fsl-image-qt5-validation-imx
镜像,避免自定义镜像缺包。
七、GPU 启动验证方法
1. 验证 Weston 使用硬件渲染:
cat /tmp/weston.log | grep renderer
输出应包含:
renderer: EGL hardware (Vivante GC7000xxxx)
2. 检查 GPU 节点是否创建:
ls /dev/dri/
应包含:
/dev/dri/card0
/dev/dri/renderD128
3. 检查内核驱动是否初始化成功:
dmesg | grep -i vivante
期望输出示例:
[drm] Initialized vivante 1.0.0 20170808 for 40000000.mix_gpu_ml on minor 0
八、总结与实战建议
- Yocto 中 GPU 驱动问题多来自 版本不匹配或裁剪缺失;
- 推荐使用 NXP 官方 BSP,避免混合不同 layer;
- Weston 启动失败大多与权限管理或用户态库不兼容有关;
- seat 权限系统在嵌入式中推荐使用
seatd
,配置简单、体积小; - 在开发初期,
--use-pixman
可以作为故障隔离手段。
本项目从硬件架构、GPU 驱动、seat 权限、Yocto 配置到 weston 启动机制进行了全面梳理,为后续浏览器运行 AI 模型、图形显示打通底层图形加速通路。
视频教程请关注 B 站:“嵌入式 Jerry”