整理一篇Linux drm显示系统的文章

这篇文章主要是回答一位同学的提问,当然也是做一次总结,我相信关注我号的很多人也有做LCD相关的驱动或者系统开发,即使不是专门做LCD,但是在开发过程中也难免会遇到这样或者那样的问题。

所以找了几篇和drm不错的文章分享给大家,Linux是一个模块化非常明显的系统,每个子系统又会有属于自己的一些特性,学习的时候,最好也是分类学习比较好。

Linux 的 2 种显示方案

包括:

  • FBDEV: Framebuffer Device

  • DRM/KMS: Direct Rendering Manager / Kernel Mode Setting

它们有什么区别?

  • FBDEV:

    • 传统的显示框架;

    • 简单,但是只能提供最基础的显示功能;

    • 无法满足当前上层应用和底层硬件的显示需求;

  • DRM/KMS:

    • 目前主流的显示方案;

    • 为了适应当前日益更新的显示硬件;

    • 软件上能支持更多高级的控制和特性;

简单的说就是FBDEV已经不满足时代的发展需要,然后就出现了DRM这个东西,DRM,英文全称 Direct Rendering Manager, 即 直接渲染管理器。它是为了解决多个程序对 Video Card 资源的协同使用问题而产生的。它向用户空间提供了一组 API,用以访问操纵 GPU。

DRM是一个内核级的设备驱动,可以编译到内核中也可以作为标准模块进行加载。DRM最初是在FreeBSD中出现的,后来被移植到Linux系统中,并成为Linux系统的标准部分。

DRM可以直接访问DRM clients的硬件。DRM驱动用来处理DMA,内存管理,资源锁以及安全硬件访问。为了同时支持多个3D应用,3D图形卡硬件必须作为一个共享资源,因此需要锁来提供互斥访问。DMA传输和AGP接口用来发送图形操作的buffers到显卡硬件,因此要防止客户端越权访问显卡硬件。

 

Linux DRM层用来支持那些复杂的显卡设备,这些显卡设备通常都包含可编程的流水线,非常适合3D图像加速。内核中的DRM层,使得这些显卡驱动在进行内存管理,中断处理和DMA操作中变得更容易,并且可以为上层应用提供统一的接口。

关于以上的更详细内容可以参考下面两篇文章

RK3399 探索之旅 / Display 子系统 / 基础概念

RK3399探索之旅 / Display子系统 / 从modetest 到 DRM driver

DRM 框架引入了 shmem GEM

分别看两种架构的应用程序

FBDEV的测试程序

/** Copyright (C) 2011 The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at**      http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/
#include <stdint.h>
#include <sys/types.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/fb.h>
#include <errno.h>
#include <string.h>
#include <stdio.h>
#ifndef FBIO_WAITFORVSYNC
#define FBIO_WAITFORVSYNC   _IOW('F', 0x20, __u32)
#endif
int main(int argc, char** argv) {int fd = open("/dev/graphics/fb0", O_RDWR);if (fd >= 0) {do {uint32_t crt = 0;int err = ioctl(fd, FBIO_WAITFORVSYNC, &crt);if (err < 0) {printf("FBIO_WAITFORVSYNC error: %s\n", strerror(errno));break;}} while(1);close(fd);}return 0;
}

DRM应用测试程序

int main(int argc, char **argv)
{int fd;drmModeConnector *conn;drmModeRes *res;uint32_t conn_id;uint32_t crtc_id;// 1. 打开设备fd = open("/dev/dri/card0", O_RDWR | O_CLOEXEC);// 2. 获得 crtc 和 connector 的 idres = drmModeGetResources(fd);crtc_id = res->crtcs[0];conn_id = res->connectors[0];// 3. 获得 connectorconn = drmModeGetConnector(fd, conn_id);buf.width = conn->modes[0].hdisplay;buf.height = conn->modes[0].vdisplay;// 4. 创建 framebuffermodeset_create_fb(fd, &buf);// 5. Sets a CRTC configuration,这之后就会开始在 crtc0 + connector0 pipeline 上进行以 mode0 输出显示drmModeSetCrtc(fd, crtc_id, buf.fb_id, 0, 0, &conn_id, 1, &conn->modes[0]);getchar();// 6. cleanup...return 0;
}

DRM 相关的驱动很复杂,我并不敢班门弄斧,如果大家只是想了解个大概,我觉得上面的文章应该能够满足你们的需求,但是如果你们是专门做LCD的,可以找到一些更优秀的资源给你们。

阅读原文链接里面是一个专门做显示驱动相关的同学,这个知识星球也是一个读者朋友分享给我的,研究的非常深入,我现在主要是做音频相关,所以这部分是欠缺的,希望这个分享可以帮助到真正有需要的人。

如果不喜欢知识付费的,可以略过,我并不要求每个人都喜欢篮球,每个人都喜欢吃大白菜。

还下载了一个drm开发文档给大家,喜欢的在后台回复「drm」获取链接


推荐阅读:

专辑|Linux文章汇总

专辑|程序人生

专辑|C语言

我的知识小密圈

关注公众号,后台回复「1024」获取学习资料网盘链接。

欢迎点赞,关注,转发,在看,您的每一次鼓励,我都将铭记于心~

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

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

相关文章

Java实现十进制数转十六进制数

Now~Lets begin our second question~ 如何利用Java语言将十进制数字转换成十六进制数字呢&#xff1f; 我第一次编码出来的效果是酱紫的~ /*** */ package com.succez.task2;import java.util.Scanner;/*** <p>Copyright: Copyright (c) 2018</p>* <p>succe…

[转]JavaScript:只能输入数字(IE、FF)

本文转自&#xff1a;http://www.cnblogs.com/ly5201314/archive/2009/03/04/1402993.htmlJavaScript&#xff1a;只能输入数字(IE、FF) 为了解决只能输入数字的问题&#xff0c;网上有许多资料&#xff0c;现归拢一下。 一、不带负号的输入 这里&#xff0c;没有解决“正负号”…

每日一题(6)—— sizeof用法

已知int a&#xff0c;一下那种写法是错误的&#xff1f; A. sizeof(int); B. sizeof(a); C. sizeof int; D. sizeof a;以下答案是来自《C语言深度剖析》&#xff1a;

现在做硬件工程师还有前途吗?

这个问题是我在知乎看到的。问这个问题的&#xff0c;要么是正在从事硬件工作&#xff0c;要么是准备入行的新人。我工作年限不久&#xff0c;工作4年多。我先发表自己的一些观点&#xff0c;可能不对&#xff0c;勿喷&#xff0c;然后我再截取部分知乎上网友的回答。我大学的专…

58同城沈剑:好的架构是进化来的,不是设计来的

虽然这篇文章写的比较早&#xff0c;但是&#xff0c;还是很有参考意义&#xff0c;值得好好品读思考。看看别人是怎么思考就架构这种事情。 好的架构不是设计出来的而是演进出来的 对很多创业公司而言&#xff0c;在初期的时候&#xff0c;我们很难在初期就预估到流量十倍以后…

[译]5 Mac OS X RSS Readers Worth Giving a Shot

5 Mac OS X RSS Readers Worth Giving a Shot Mac OS X 下5款值得关注的RSS 阅读工具 There was once a time when my favorite RSS reader cost a fair but not insignificant price and the open source alternative wasn’t up-to-snuff. I won’t name any names, though y…

每日一题(7) —— 求余运算符

设有以下语句:int x10;x3x%(-3),则x的值是: A.11 B.12 C.14 D.15分析&#xff1a; 求余运算&#xff0c;除数和被除数都可以是负的&#xff0c;求余后的值 与 被除数 的符号相同&#xff0c;比如 -10 % -3 -1, 10 % -3 1。

一文读懂 Linux 内存分配全过程

在《你真的理解内存分配》一文中&#xff0c;我们介绍了 malloc 申请内存的原理&#xff0c;但其在内核怎么实现的呢&#xff1f;所以&#xff0c;本文主要分析在 Linux 内核中对堆内存分配的实现过程。本文使用 Linux 2.6.32 版本代码内存分区对象在《你真的理解内存分配》一文…

CodeForces - 540D Bad Luck Island —— 求概率

题目链接&#xff1a;https://vjudge.net/contest/226823#problem/D The Bad Luck Island is inhabited by three kinds of species: r rocks, s scissors and p papers. At some moments of time two random individuals meet (all pairs of individuals can meet equiprobabl…

你真的理解内存分配吗?

内存是计算机中必不可少的资源&#xff0c;因为 CPU 只能直接读取内存中的数据&#xff0c;所以当 CPU 需要读取外部设备&#xff08;如硬盘&#xff09;的数据时&#xff0c;必须先把数据加载到内存中。我们来看看可爱的内存长什么样子的吧&#xff0c;如图1所示&#xff1a;一…

每日一练(8)—— 野指针

int *p&#xff1b; int a 20; *p a; printf("%d",*p);运行结果是什么&#xff1f;A.10 B.a 的 地址值 C.编译错误 D.运行异常分析&#xff1a; 一、指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针&#xff0c;它的缺省值是随机的&#xff0…

深信服2021秋招笔试题

来源于读者投稿&#xff0c;作者Angel。笔试时间&#xff1a;2020.08.25&#xff0c;19&#xff1a;00---21&#xff1a;00。岗位&#xff1a;嵌入式软件工程师。题型&#xff1a;5个不定项选择题&#xff0c;16分5个填空题&#xff0c;19分2道编程题&#xff0c;65分不定项选择…

每日一题(9)—— 写一个标准宏MIN,这个宏输入两个参数并返回较小的一个

写一个标准宏MIN&#xff0c;这个宏输入两个参数并返回较小的一个。 分析&#xff1a; 宏定义的注意两点&#xff1a; 1、数据类型是否有溢出的风险&#xff08;如一年有多少个秒的宏&#xff09;&#xff1b; 2、带参宏的每个参数都要用括号括起来。 #define MIN(x,y) ((x)…

用ISA阻挡用户向论坛发贴子

右击访问网站这条策略&#xff0c;点击“配置HTTP”<?XML:NAMESPACE PREFIX V /><?XML:NAMESPACE PREFIX O />找到方法选项&#xff0c;并添加一条阻止的HTTP命令POST应用ISA的配置转载于:https://blog.51cto.com/freemanluo/186829

看我解决Linux下的OTG切换问题

1.硬件原理图看下面的原理图VCC_OTG_EN 引脚&#xff0c;这个脚主要是用来控制给外部OTG设备提供电源控制的。如果设备作为DEVICE设备&#xff0c;这时候VBUS的电是由外部提供的&#xff0c;比如通过USB线和电脑连接&#xff0c;这个时候&#xff0c;VBUS的电压是由电脑提供的。…

每日一题(10)—— 数组与指针

分析下面的代码&#xff0c;求输出结果。 int a[5] {1,2,3,4,5};int *p (int *)(&a 1);printf("%d %d",*(a 1),*(p - 1)); 分析&#xff1a; a —— 数组首元素的地址 等价于 &a[0] &a —— 数组的首地址 int —— 4字节 *(a 1) a[1] 2&…

美图赏析:拆解USB无线网卡,电路方案非常经典

很多台式机没有无线网卡&#xff0c;只能插网线。想要使用WiFi&#xff0c;插个USB无线网卡就行&#xff0c;简单方便&#xff1a;USB无线网卡非常小巧&#xff0c;以至于会好奇&#xff0c;电路板是怎么塞进去的&#xff1a;下面拆解其中某个厂家的一款&#xff1a;另一个角度…

程序员经常说的「设计模式」到底是什么?

当程序员说去「设计模式」时&#xff0c;你是否会一脸懵逼&#xff0c;到底什么是设计模式呢&#xff1f; 很多人应该听说过设计模式&#xff08;Design pattern&#xff09;&#xff0c;又或多或少的看过或用过设计模式&#xff0c;但是实际用在开发过程中总有点心有余而力不足…

每日一题(11)—— 结构体大小

分析下面的代码&#xff0c;求运行结果&#xff08;64位&#xff09;。 #include <stdio.h>struct {int id;unsigned char arg;char *p;void (*func)(void); } test;int main(void) {printf("sizeof(test.id):%d\n", sizeof(test.id));printf("sizeof(tes…

Linux 内存管理之vmalloc

走进vmalloc 根据前面的系列文章&#xff0c;我们知道了buddy system是基于页框分配器&#xff0c;kmalloc是基于slab分配器&#xff0c;而且这些分配的地址都是物理内存连续的。但是随着碎片化的积累&#xff0c;连续物理内存的分配就会变得困难&#xff0c;对于那些非DMA访问…