当前位置: 首页 > news >正文

驱动开发硬核特训 · 专题篇:Vivante GPU 与 DRM 图形显示体系全解析(i.MX8MP 平台实战)


视频教程请关注 B 站:“嵌入式Jerry”。


一、背景导读:GPU 与 DRM 到底谁负责“显示”?

在嵌入式 Linux 图形系统中,“画面怎么显示出来”的问题,表面看似简单,实则涉及多个内核子系统与用户态组件的协同:

  • DRM 是谁?它真的“驱动”了 GPU 吗?
  • GPU 的 galcore、etnaviv 这些驱动和 DRM 是什么关系?
  • Weston 启动失败,g2d_open 失败,和 /dev/dri/cardX 有关系吗?
  • GPU 是否必须通过 DRM 输出才能工作?是否和 framebuffer 混用?
  • /dev/galcore/dev/dri/card0/dev/fb0 到底该看哪个?

本文将结合 i.MX8MP 平台,从设备树到 Weston 启动日志,带你一次理清 GPU 与 DRM 显示体系的完整层级与职责划分。


二、DRM 与 GPU 的分工逻辑:渲染 vs 显示

先明确核心职责:

子系统/模块类型职责说明
GPU 驱动(galcore)加速器实现图形的“绘制”功能(2D/3D 加速)
DRM/KMS显示控制控制最终“画面”输出到 LVDS/HDMI
Framebuffer旧式输出提供系统级通用显示缓冲(不推荐)

🌟 类比理解

  • GPU:是“画图”的人,绘制位图图像;
  • DRM:是“画框”的人,把图画挂在显示器上;
  • Weston:是“调度者”,调用 GPU 画画,把结果交给 DRM 上墙。

🌐 层级关系图

             ┌─────────────┐│  User App   │ ← Chromium, GTK+└────┬────────┘↓┌───────────────┐│ Weston (Compositor)└────┬──────────┘↓┌────────────┴────────────┐│ libEGL.so / libGAL.so   │ ← G2D 渲染库(用户态)└────────────┬────────────┘↓┌───────┴────────┐│  /dev/galcore  │ ← Galcore 驱动(内核态,G2D)└───────────────┘↓ 另一路┌──────────────┐│ /dev/dri/cardX │ ← DRM 节点(绑定显示控制器)└──────────────┘

在这里插入图片描述


三、Vivante GPU 的两个驱动方案:galcore vs etnaviv

1️⃣ galcore 驱动(专有闭源)

  • 驱动路径:drivers/mxc/gpu-viv/

  • Yocto 包:imx-gpu-viv, imx-gpu-g2d

  • 内核接口:/dev/galcore

  • 配套库:libGAL.so, libg2d-viv.so, libEGL.so, libGLESv2.so

  • 典型配置项:

    CONFIG_MXC_GPU_VIV=y
    
  • 特点:必须使用 NXP 提供的用户空间库,适用于图形 UI 显示,但调试不便

2️⃣ etnaviv 驱动(开源)

  • 驱动路径:drivers/gpu/drm/etnaviv/
  • 内核接口:通过 DRM 框架注册 /dev/dri/cardX
  • Yocto 包:默认含于 mesa GPU 栈,libEGL 是 mesa 实现
  • 特点:开源易调试,兼容性好,但性能和兼容性不如原厂

对比

维度galcore (专有)etnaviv (开源)
用户空间库imx-gpu-vivmesa, gallium etnaviv
DRM 支持❌(通过 framebuffer)
性能中等
易调试性一般,需配套库较好
推荐场景商用项目社区、自定义镜像

四、Weston 如何选用 GPU 渲染?配置实践与失败日志分析

1. weston.ini 关键字段

[core]
use-g2d=true
backend=drm-backend.so

说明:

  • use-g2d=true:使用 libg2d 绑定的硬件 G2D 加速库
  • backend=drm-backend.so:使用 DRM 输出画面(非 framebuffer)

2. 启动失败日志分析(真实日志)

[12:17:48.292] Loading module '/usr/lib/libweston-11/g2d-renderer.so'
[12:17:48.323] g2d_open fail.
[12:17:48.323] failed to initialize g2d render

原因:

  • Weston 调用 libg2d 打开 /dev/galcore 失败
  • 原因可能包括:内核未加载 galcore 模块、设备树中 status = “disabled”

3. /dev/galcore 存在 ≠ 驱动成功加载

务必同时验证:

lsmod | grep galcore  # 是否加载
ls /dev/galcore       # 是否存在节点
dmesg | grep galcore  # 是否报错

五、设备树 + 内核配置:你启用 GPU 驱动了吗?

1. 设备树片段(默认 disabled)

gpu_2d: gpu2d@38008000 {compatible = "fsl,imx8-gpu";status = "disabled";  // ← 需要改为 "okay"
};

必须改为:

status = "okay";

2. 内核 menuconfig 设置

路径:

Device Drivers → MXC support drivers → MXC Vivante GPU support

勾选:

[*] MXC Vivante GPU support (CONFIG_MXC_GPU_VIV)

六、Yocto 配置参考(imx-gpu-viv)

IMAGE_INSTALL:append = " \imx-gpu-viv \imx-gpu-g2d \kernel-module-galcore \weston \seatd \
"
DISTRO_FEATURES:append = " opengl wayland "

确保 BSP 使用的是 NXP 官方 layer,例如:

meta-freescale
meta-freescale-distro

避免使用混合 layer(例如 etnaviv + imx-gpu-viv 混用)


七、验证渲染路径是否启用 GPU

1. 查看 weston 日志:

cat /tmp/weston.log | grep renderer

应输出类似:

renderer: using EGL with Vivante G2D

2. 查看设备节点

ls /dev/galcore        # GPU 渲染
ls /dev/dri/card*      # DRM 显示控制

八、代码级示例:Weston 渲染路径回溯(精简)

简化 weston 源码:

/* g2d-renderer.c */
int g2d_renderer_create(struct weston_compositor *ec) {g2d_fd = open("/dev/galcore", O_RDWR);if (g2d_fd < 0) {weston_log("g2d_open fail.\n");return -1;}...
}

这一段说明:Weston 的 G2D 渲染器直接操作 /dev/galcore,不通过 DRM。

而 DRM 是通过 drm-backend.c 初始化控制显示输出:

drm_fd = open("/dev/dri/card0", O_RDWR | O_CLOEXEC);

九、总结与实战建议

问题分类推荐方案
Weston 启动失败检查 G2D 渲染是否开启失败
GPU 渲染无效检查 galcore 驱动和设备树
DRM 输出失败检查 /dev/dri/cardX 是否存在
Pixman 性能低启用 galcore / use-g2d=true
开发调试使用 etnaviv + Mesa 更易调试

十、结构图总览(核心架构)

[ 应用 ] → [ Weston ] ┬→ libg2d → /dev/galcore(渲染)└→ DRM API → /dev/dri/cardX(显示)

结语

本篇文章尝试从系统结构、内核子系统职责分离、设备树/驱动配置、Yocto 安装策略、Weston 配置与调试日志分析多个维度,完整剖析了 DRM 与 Vivante GPU 驱动的逻辑关系。

不仅回答了“谁负责显示,谁负责渲染”的常见疑惑,更通过实际代码与配置,帮助你在 i.MX8MP 等平台上成功部署 Weston + GPU 显示系统。


相关文章:

  • 50个精选DeepSeek指令
  • QT中connect高级链接——指针、lambda、宏
  • Linux云计算训练营笔记day03(Rocky Linux中的命令)
  • MySQL OCP 认证限时免费活动​ 7 月 31 日 前截止!!!
  • Linux中的线程安全与线程同步详解
  • WordPress个人博客搭建(三):WordPress网站优化
  • vue3:十二、图形看板- 基础准备+首行列表项展示
  • 用go从零构建写一个RPC(仿gRPC,tRPC)--- 版本1(Client端)
  • 国产数据库铸就数字基建新基石,助力农业产业转型升级
  • yolov8n-obb训练rknn模型
  • 矩阵系统源码搭建 UI 设计开发指南,支持OEM
  • 多账号管理、反追踪与自动化测试:我的浏览器实战笔记
  • 1992-2023年全国及31省对外开放度测算数据(含原始数据+计算过程+结果)(无缺失)
  • springboot集成langchain4j记忆对话
  • JavaSE核心知识点01基础语法01-05(字符串)
  • 【信息系统项目管理师】【2017年-2024年】58个案例概念题
  • CODESYS开发环境下的快捷键和软件操作汇总
  • 使用Java NIO 实现一个socket通信框架
  • LangChain第二讲:不设置环境变量也能调用LLM大模型吗?(更简单地调用LLM)
  • 【C++】【数据结构】【API列表】标准库数据结构
  • 中国象棋协会坚决支持司法机关依法打击涉象棋行业的违法行为
  • “用鲜血和生命凝结的深厚情谊”——习近平主席署名文章中的中俄友好故事
  • 又一日军“慰安妇”制度受害者去世,大陆登记在册幸存者仅剩7人
  • 申活观察|演出场次破纪录、入境游导游档期忙,上海文旅商“热力”拉满
  • 胖东来回应“浙江‘胖都来’卖场开业”:已取证并邮寄律师函
  • 首次面向上海、江苏招收本科生,西湖大学接连发布招生简章