驱动开发硬核特训 · 专题篇: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-viv | mesa, 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 显示系统。
相关文章:

驱动开发硬核特训 · 专题篇:Vivante GPU 与 DRM 图形显示体系全解析(i.MX8MP 平台实战)
视频教程请关注 B 站:“嵌入式Jerry”。 一、背景导读:GPU 与 DRM 到底谁负责“显示”? 在嵌入式 Linux 图形系统中,“画面怎么显示出来”的问题,表面看似简单,实则涉及多个内核子系统与用户态组件的协同&…...

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

C/C++实践(三)深入理解 C++ 三大特性之一:封装
一、封装的概念与核心思想 封装(Encencapsulation)是 C 面向对象编程(OOP)的三大核心特性之一,其本质是将数据(成员变量)和对数据的操作(成员函数)捆绑在一个逻辑单元&a…...
Filecoin存储管理:如何停止Lotus向特定存储路径写入新扇区数据
Filecoin存储管理:如何停止Lotus向特定存储路径写入新扇区数据 引言背景问题场景解决方案步骤1:修改sectorstore.json文件步骤2:重新加载存储配置步骤3:验证更改 技术原理替代方案最佳实践结论 引言 在Filecoin挖矿过程中&#x…...

1、RocketMQ 核心架构拆解
1. 为什么要使用消息队列? 消息队列(MQ)是分布式系统中不可或缺的中间件,主要解决系统间的解耦、异步和削峰填谷问题。 解耦:生产者和消费者通过消息队列通信,彼此无需直接依赖,极大提升系统灵…...

vue3 element-plus 输入框回车跳转页面问题处理
问题描述: 当页面搜索条件只有一个的情况下,输入框不管有没有值,回车后会跳转页面 解决办法,给表单添加 submit.prevent <el-form ref"ruleForm" :model"search" label-width"120px" class&qu…...
常见WEB漏洞----暴力破解
什么是暴力破解 暴力破解 (Brue Force) 是一种攻击方法 (穷举法),简称为“爆破”,黑客通过反复猜解和实验,旨在以暴力手段登入、访问目标主机获取服务,破坏系统安全,其属于 ATT&CK技术中的一种,常利用…...

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

[超详细,推荐!!!]前端性能优化策略详解
学习记录,部分内容版权归妙码学院 1.优化内容包括那些 其实前端的优化,整体粗略概括下来,白话之: 打开速度怎么变快再次打开速度怎么变快操作怎么才顺滑动画怎么保证流畅 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 更多 一、前言 官方文档:http…...

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

Linux系统下安装mongodb
1. 配置MongoDB的yum仓库 创建仓库文件 sudo vi /etc/yum.repos.d/mongodb-org.repo添加仓库配置 根据系统版本选择配置(以下示例为CentOS 7和CentOS 9的配置): CentOS 7(安装MongoDB 5.0/4.2等旧版本): 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进程的运…...
Linux计划任务与进程
at 命令使用方法 at 命令可在指定时间执行任务,适用于一次性任务调度。以下是基本用法: 安装 atd 服务(如未安装) # Debian/Ubuntu sudo apt-get install at# CentOS/RHEL sudo yum install at启动服务 sudo systemctl start atd…...

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

用R语言+随机森林玩转遥感空间预测-基于R语言机器学习遥感数据处理与模型空间预测技术及实际项目案例分析
遥感数据具有高维度、非线性及空间异质性等特点,传统分析方法往往难以充分挖掘其信息价值。机器学习技术的引入为遥感数据处理与模型预测提供了新的解决方案,其中随机森林(Random Forest)以其优异的性能和灵活性成为研究者的首选工…...
【许可证】Open Source Licenses
长期更新 扩展:shield.io装饰 开源许可证(Open Source Licenses)有很多种,每种都有不同的授权和限制,适用于不同目的。 默认的ISC🟰MIT License是否可商用是否要求开源衍生项目是否必须署名是否有专利授权…...

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

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

基于SpringBoot的在线教育管理系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…...
交叉编译 opencv-4.10
编译说明 opencv 下包含很多模块,各个模块的作用可以参考Opencv—模块概览. 嵌入式考虑有限存储等因素会对模块进行裁剪,我这里主要保留图像拼接(stitching)图片编解码(imgcodecs)与特征点匹配(…...

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

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

初始图形学(7)
上一章完成了相机类的实现,对之前所学的内容进行了封装与整理,现在要学习新的内容。 抗锯齿 我们放大之前渲染的图片,往往会发现我们渲染的图像边缘有尖锐的"阶梯"性质。这种阶梯状被称为"锯齿"。当真实的相机拍照时&a…...
Linux NVIDIA 显卡驱动安装指南(适用于 RHEL/CentOS)
📌 一、禁用 Nouveau 开源驱动 NVIDIA 闭源驱动与开源的 nouveau 驱动冲突,需先禁用: if [ ! -f /etc/modprobe.d/blacklist-nouveau.conf ]; thenecho -e "blacklist nouveau\noptions nouveau modeset0" | sudo tee /etc/modpr…...

线程的一些事(2)
在java中,线程的终止,是一种“软性”操作,必须要对应的线程配合,才能把终止落实下去 然而,系统原生的api其实还提供了,强制终止线程的操作,无论线程执行到哪,都能强行把这个线程干掉…...
数据可视化:艺术与科学的交汇点,如何让数据“开口说话”?
数据可视化:艺术与科学的交汇点,如何让数据“开口说话”? 数据可视化,是科技与艺术的结合,是让冰冷的数字变得生动有趣的桥梁。它既是科学——讲究准确性、逻辑性、数据处理的严谨性;又是艺术——强调美感…...

使用lldb看看Rust的HashMap
目录 前言 正文 读取桶的状态 获取键值对 键值对的指针地址 此时,读取数据 读取索引4的键值对 多添加几个键值对 使用i32作为键,&str作为值 使用i32作为键,String作为值 前言 前面使用ldb看了看不同的类型,这篇再使用…...
Oracle版本、补丁及升级(12)——版本体系
12.1. 版本体系 Oracle作为最流行的一款关系数据库软件产品,其拥有自己一套成熟的版本管理体系。具体版本体系以12c为分界线,前后版本体系分别不同。 12.1.1. 12c之前版本 12c之前的Oracle,版本共有5位阿拉伯数字组成,其中的每位数字,都有各自的含义,具…...