在 i.MX8MP 平台上使用 Vivante GPU 运行 Weston:原理、配置与完整调试指南

发布于:2025-05-07 ⋅ 阅读:(127) ⋅ 点赞:(0)

一、项目背景与目标

本项目旨在构建一个完整的 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 的使用方式
  1. 使用 seatd-launch 启动 weston(推荐方式):
seatd-launch -- weston --log=/tmp/weston.log
  1. 手动启动 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=rootinvalid 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-multimediafsl-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”


网站公告

今日签到

点亮在社区的每一天
去签到