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

news2025/7/19 12:11:39

视频教程请关注 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 显示系统。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2374208.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C——猜数字游戏

前面我们已经学习了C语言常见概念&#xff0c;数据类型和变量以及分置于循环的内容&#xff0c;现在我们可以将这些内容结合起来写一个有趣的小游戏。下面正式开始我们今天的主题——猜数字游戏的实现。 猜数字游戏的要求&#xff1a; 1.电脑自动生成1~100的随机数。 2.玩家…

C/C++实践(三)深入理解 C++ 三大特性之一:封装

一、封装的概念与核心思想 封装&#xff08;Encencapsulation&#xff09;是 C 面向对象编程&#xff08;OOP&#xff09;的三大核心特性之一&#xff0c;其本质是将数据&#xff08;成员变量&#xff09;和对数据的操作&#xff08;成员函数&#xff09;捆绑在一个逻辑单元&a…

1、RocketMQ 核心架构拆解

1. 为什么要使用消息队列&#xff1f; 消息队列&#xff08;MQ&#xff09;是分布式系统中不可或缺的中间件&#xff0c;主要解决系统间的解耦、异步和削峰填谷问题。 解耦&#xff1a;生产者和消费者通过消息队列通信&#xff0c;彼此无需直接依赖&#xff0c;极大提升系统灵…

vue3 element-plus 输入框回车跳转页面问题处理

问题描述&#xff1a; 当页面搜索条件只有一个的情况下&#xff0c;输入框不管有没有值&#xff0c;回车后会跳转页面 解决办法&#xff0c;给表单添加 submit.prevent <el-form ref"ruleForm" :model"search" label-width"120px" class&qu…

快速入门深度学习系列(2)----损失函数、逻辑回归、向量化

针对深度学习入门新手目标不明确 知识体系杂乱的问题 拟开启快速入门深度学习系列文章的创作 旨在帮助大家快速的入门深度学习 写在前面&#xff1a; 本系列按照吴恩达系列课程顺序发布(说明一下为什么不直接看原笔记 因为内容太多 没有大量时间去阅读 所有作者需要一次梳理…

[超详细,推荐!!!]前端性能优化策略详解

学习记录&#xff0c;部分内容版权归妙码学院 1.优化内容包括那些 其实前端的优化&#xff0c;整体粗略概括下来&#xff0c;白话之&#xff1a; 打开速度怎么变快再次打开速度怎么变快操作怎么才顺滑动画怎么保证流畅 2.性能优化 2.1首屏加载优化 在了解优化方法和策略之…

数据提取之BeautifulSoup4快速使用

文章目录 一、前言二、概述2.1 安装2.2 初始化2.3 对象类型 三、遍历文档树3.1 子节点3.2 父节点3.3 兄弟节点3.4 前后节点3.5 节点内容3.5.1 文本内容3.5.2 属性值3.5.3 标签删除 四、搜索文档树4.1 find_all4.2 find4.3 CSS选择器4.4 更多 一、前言 官方文档&#xff1a;http…

list类的详细讲解

【本节目标】 1. list的介绍及使用 2. list的深度剖析及模拟实现 3. list与vector的对比 1. list的介绍及使用 1.1 list的介绍 1. list 是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。 2. list 的底层是双向链表结构&a…

Linux系统下安装mongodb

1. 配置MongoDB的yum仓库 创建仓库文件 sudo vi /etc/yum.repos.d/mongodb-org.repo添加仓库配置 根据系统版本选择配置&#xff08;以下示例为CentOS 7和CentOS 9的配置&#xff09;&#xff1a; CentOS 7&#xff08;安装MongoDB 5.0/4.2等旧版本&#xff09;&#xff1a; In…

kuka, fanuc, abb机器人和移动相机的标定

基础知识 : 一, 9点标定之固定相机标定: 图1: 固定位置相机拍照 因为相机和机器人的基坐标系是固定的, 所以在海康威视相机的9点标定功能栏中, 填上海康使用“圆查找”捕捉到的坐标值, 再将机器人显示的工具坐标系在基坐标系的实时位置pos_act值填入物理坐标X, Y中即可 图2:…

Android Framework学习四:init进程实现

文章目录 init流程简介init源码执行顺序执行顺序 init进程的具体工作事项挂载文件系统设置 SELinuxSecondStageMaininit.rc启动zygote和serviceManager进程的重要性serviceManager工作原理 Framework学习之系列文章 init流程简介 下面图片主要围绕 Android 系统中init进程的运…

Java引用RabbitMQ快速入门

这里写目录 Java发送消息给MQ消费者接收消息实现一个队列绑定多个消费者消息推送限制 Fanout交换机路由的作用Direct交换机使用案例 Topic交换机声明队列和交换机的方式MQ消息转换器业务改造生产者可靠性设置重连 系统可靠性 Java发送消息给MQ public void testSendMessage() t…

用R语言+随机森林玩转遥感空间预测-基于R语言机器学习遥感数据处理与模型空间预测技术及实际项目案例分析

遥感数据具有高维度、非线性及空间异质性等特点&#xff0c;传统分析方法往往难以充分挖掘其信息价值。机器学习技术的引入为遥感数据处理与模型预测提供了新的解决方案&#xff0c;其中随机森林&#xff08;Random Forest&#xff09;以其优异的性能和灵活性成为研究者的首选工…

Spring Boot 文件上传实现详解

在项目开发过程中&#xff0c;文件上传是极为常见的功能需求。对于熟悉 Spring MVC 文件上传操作的开发者而言&#xff0c;Spring Boot 中的文件上传与之原理基本相通&#xff0c;只是在依赖管理和配置方式上更为简化。接下来&#xff0c;将详细阐述 Spring Boot 项目中文件上传…

查看单元测试覆盖率

文章目录 1、POM文件配置2、编写单元测试3、执行单元测试4、查看单元测试覆盖率 1、POM文件配置 pom文件配置jacoco插件 <!-- 生成JaCoCo覆盖率数据插件 --> <plugin><groupId>org.jacoco</groupId><artifactId>jacoco-maven-plugin</artif…

基于SpringBoot的在线教育管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

C# 方法(方法重载)

本章内容: 方法的结构 方法体内部的代码执行 局部变量 局部常量 控制流 方法调用 返回值 返回语句和void方法 局部函数 参数 值参数 引用参数 引用类型作为值参数和引用参数 输出参数 参数数组 参数类型总结 方法重载 命名参数 可选参数 栈帧 递归 方法重载 一个类中可以有多个…

3、食品包装控制系统 - /自动化与控制组件/food-packaging-control

76个工业组件库示例汇总 食品包装线控制系统 这是一个用于食品包装线控制系统的自定义组件&#xff0c;提供了食品包装生产线的可视化监控与控制界面。组件采用工业风格设计&#xff0c;包含生产流程控制、实时数据监控和逻辑编程三个主要功能区域。 功能特点 工业风格UI设…

初始图形学(7)

上一章完成了相机类的实现&#xff0c;对之前所学的内容进行了封装与整理&#xff0c;现在要学习新的内容。 抗锯齿 我们放大之前渲染的图片&#xff0c;往往会发现我们渲染的图像边缘有尖锐的"阶梯"性质。这种阶梯状被称为"锯齿"。当真实的相机拍照时&a…

线程的一些事(2)

在java中&#xff0c;线程的终止&#xff0c;是一种“软性”操作&#xff0c;必须要对应的线程配合&#xff0c;才能把终止落实下去 然而&#xff0c;系统原生的api其实还提供了&#xff0c;强制终止线程的操作&#xff0c;无论线程执行到哪&#xff0c;都能强行把这个线程干掉…