Linux DRM Graphic 显示简单介绍

2023-05-16

 好久没有写过博客了,工作之后平时都没有总结,感觉像做了学到很多东西,但是又感觉什么都没有学到,似懂非懂(真尼玛纠结)。突然别人说的一句话,学东西不仅仅是自己学会就好了,要尝试把你知道的讲给别人听,然而在讲诉的过程中,自己就会清楚自己到底懂还是不懂。好了,言归正传,来介绍下我最近一年都在做的东西,Linux DRM 显示驱动。

刚开始收到任务准备接手 DRM 工作的时候,直接先看下代码路径,

[~/github_projs/linux] (analogix_dp_upstream) 817h40m $ ls drivers/gpu/drm/
amd                    drm_edid.c            drm_panel.c         msm
armada                 drm_edid_load.c       drm_pci.c           nouveau
ast                    drm_encoder_slave.c   drm_plane_helper.c  omapdrm
ati_pcigart.c          drm_fb_cma_helper.c   drm_platform.c      panel
atmel-hlcdc            drm_fb_helper.c       drm_prime.c         qxl
bochs                  drm_flip_work.c       drm_probe_helper.c  r128
bridge                 drm_fops.c            drm_rect.c          radeon
cirrus                 drm_gem.c             drm_scatter.c       rcar-du
drm_agpsupport.c       drm_gem_cma_helper.c  drm_sysfs.c         rockchip
drm_atomic.c           drm_global.c          drm_trace.h         savage
drm_atomic_helper.c    drm_hashtab.c         drm_trace_points.c  shmobile
drm_auth.c             drm_info.c            drm_vma_manager.c   sis
drm_bridge.c           drm_internal.h        drm_vm.c            sti
drm_bufs.c             drm_ioc32.c           exynos              tdfx
drm_cache.c            drm_ioctl.c           fsl-dcu             tegra
drm_context.c          drm_irq.c             gma500              tilcdc
drm_crtc.c             drm_legacy.h          i2c                 ttm
drm_crtc_helper.c      drm_lock.c            i810                udl
drm_crtc_internal.h    drm_memory.c          i915                vgem
drm_debugfs.c          drm_mipi_dsi.c        imx                 via
drm_dma.c              drm_mm.c              Kconfig             virtio
drm_dp_helper.c        drm_modes.c           Makefile            vmwgfx
drm_dp_mst_topology.c  drm_modeset_lock.c    mga
drm_drv.c              drm_of.c              mgag200

好特么高端,直接就放在了 “gpu/” 路径下。GPU 这东西一直很神秘,说说当时我心里飘过的关键字:"高逼格"、"ARM Mali"、"代码不开源"。心里一顿暗爽,这么高端的东西肯定很好玩。老习惯先百度几篇中文的资料来看看,结果一搜,出来的全特么是什么 "数字版权保护" 的叽叽。不开森啊、不开森  :/  难道是这个东西太新了,git log 一看,提交时间也是 2008 年啊,看来只能说当时关键字匹配不好。

commit c0e09200dc0813972442e550a5905a132768e56c
Author: Dave Airlie <airlied@redhat.com>
Date:   Thu May 29 10:09:59 2008 +1000

    drm: reorganise drm tree to be more future proof.
    
    With the coming of kernel based modesetting and the memory manager stuff,
    the everything in one directory approach was getting very ugly and
    starting to be unmanageable.
    
    This restructures the drm along the lines of other kernel components.
    
    It creates a drivers/gpu/drm directory and moves the hw drivers into
    subdirectores. It moves the includes into an include/drm, and
    sets up the unifdef for the userspace headers we should be exporting.
    
    Signed-off-by: Dave Airlie <airlied@redhat.com>


当时也不会翻墙,所以就硬着头皮,直接以 HDMI 开始,代码里面加 LOG 来看看这是个什么鬼。换在现在,我就不用这种方法来坑大家了(不然写这个博客,也就太没意思了)。首先 WIKI 搜下 "Linux DRM",出来的内容不错,原文贴出来:

The Direct Rendering Manager (DRM) is a subsystem of the Linux kernel responsible for
interfacing with GPUs of modern video cards. DRM exposes an API that user space programs
can use to send commands and data to the GPU, and perform operations such as configuring
the mode setting of the display. DRM was first developed as the kernel space component of
the X Server's Direct Rendering Infrastructure,[1] but since then it has been used by other
graphic stack alternatives such as Wayland.

WIKI 里面概括的还是比较清楚的,如上面英文所诉,DRM 由两个部分组成:一是 Kernel 的子系统,这个子系统对硬件 GPU 操作进行了一层框架封装。二是提供了一个 libdrm 库,里面封装了一系列 API,用来进行图像显示。整体看来和在 Android 上用的 Direct Frame Buffer 差不多嘛,Android Kernel 走的是 FB 的框架,然后 Android HAL 层那边抽象出了一个 FBDEV,用来进行 FB IOCTRL 的统一管理。然而 DRM 就相当于对图形设备进行集中处理,并且多出了个漂亮的 libdrm 库。都说没图说个 JB,来来贴两张 WIKI 上面的对比图片 (左边是 Without DRM,右边是 With DRM,点击图片可以看大图)

Without DRM
With DRM
DRM allows multiple programs concurrently access to the 3D video card avoiding collisions
现在应该知道 DRM 大概的流程是什么样子了,那继续看看我当时真正需要开发的部分:
[~/github_projs/linux] (analogix_dp_upstream) 817h21m $ ls drivers/gpu/drm/rockchip/
analogix_dp-rockchip.c  rockchip_drm_drv.h    rockchip_drm_gem.c
dw_hdmi-rockchip.c      rockchip_drm_fb.c     rockchip_drm_gem.h
Kconfig                 rockchip_drm_fbdev.c  rockchip_drm_vop.c
Makefile                rockchip_drm_fbdev.h  rockchip_drm_vop.h
rockchip_drm_drv.c      rockchip_drm_fb.h

  

  

乍眼一看,跟 GPU 没毛线关系(有点伤心),看起来更像是显示接口的开发(但是也挺有意思的)。其中的 VOP(Video Output Processor) 又指 SoC 的 LCDC 模块,主要可以完成图层渲染、色彩信号转换(YUV - > RGB)、LCDC Timing 输出,而 HDMI / eDP 则具体的显示接口。而 GEM / FBDEV 我猜是和硬件 IOMMU 内存管理相关的东西,drm_drv 则应该是 Rockchip Drm Platform 和 DRM 大框架对接的部分。


好勒,今天介绍的差不多了,以后有机会再具体介绍下具体 DRM 具体的显卡驱动怎么写,以及问问神秘的 GPU 小组,看看 DRM 和 GPU 有没有配合起来。


Thanks,

- Yakir

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux DRM Graphic 显示简单介绍 的相关文章

  • 内核驱动程序从用户空间读取正常,但写回始终为 0

    因此 我正在努力完成内核驱动程序编程 目前我正在尝试在应用程序和内核驱动程序之间构建简单的数据传输 我使用简单的字符设备作为这两者之间的链接 并且我已成功将数据传输到驱动程序 但我无法将有意义的数据返回到用户空间 内核驱动程序如下所示 in
  • linux新手关于嵌入式linux设备驱动的问题

    最近在研究linux驱动 正如我读过的那些文章所说 设备驱动程序模块很可能会根据内核的需要自动加载 因此我想知道内核如何确定为特定设备 声卡 I2C spi 设备 等 我也无法彻底想象内核如何在启动时检测每个硬件设备 与嵌入式linux相关
  • 如果文件没有行尾字符,则 wc -l 不计算文件的最后一个

    我需要计算 unix 文件的所有行数 该文件有 3 行 但是wc l仅给出 2 个计数 我知道它不计算最后一行 因为它没有行尾字符 任何人都可以告诉我如何计算这一行吗 grep c返回匹配行的数量 只需使用一个空字符串 作为您的匹配表达式
  • Pthreads - 高内存使用率

    我正在用 C 编写一些东西 在 256Mb 系统上的 Linux 中创建大量 Pthread 我通常有 200Mb 的免费空间 当我使用少量线程运行该程序时 它可以工作 但是一旦我让它创建大约 100 个线程 它就会出现错误 因为系统内存不
  • PIL 的 Image.show() 带来*两个*不同的查看器

    在 python shell 中处理图像时 我使用 image show 其中 image 是 Image 的实例 很久以前什么也没发生 但在定义了一个名为 xv 的 Mirage 符号链接后 我很高兴 最近几天 show 将显示 Imag
  • 应用程序中两个不同版本的库

    考虑一个场景 其中有两个不同版本的共享库 考虑 A 1 so 链接到 B so A 2 so 链接到 C so 现在 B so 和 C so 都链接到 d exe 当 B so 想要调用 A 1 so 中的函数时 它最终会调用 A 2 so
  • 使用 shell 脚本发送 HTML 邮件

    如何使用 shell 脚本发送 HTML 电子邮件 首先 您需要撰写消息 最低限度由这两个标头组成 MIME Version 1 0 Content Type text html 以及适当的消息正文 p Hello world p 获得后
  • 使用脚本检查 git 分支是否领先于另一个分支

    I have branch1 and branch2我想要某种 git branch1 isahead branch2 这将显示如果branch1已承诺branch2没有 也可能指定这些提交 我无法检查差异原因branch2 is在之前br
  • Vagrant 遇到问题 - “404 - 未找到”

    我正在尝试使用 Vagrant 制作一个 LAMP 盒子 有人告诉我它使用起来非常简单 我对网络和虚拟机完全陌生 对 Linux Ubuntu 的经验也很少 我目前已尝试按照官方文档页面上的教程进行操作 http docs vagrantu
  • 在 Linux 中重新启动时,新创建的文件变为 0 kb(数据被覆盖为空)

    我遇到了一个奇怪的问题 这让我发疯 当前的任务是在 root 用户第一次登录时启动一组文件 并在同一用户第二次登录时启动另一组文件 我决定使用 profile 和 bashrc 文件 并在第一次登录期间发生的任务结束时重新加载 bashrc
  • 更新Linux中的包含路径

    我的 my path to file 文件夹中有几个头文件 我知道如何将这些文件包含在新的 C 程序中 但每次我都需要在包含它之前输入头文件的完整路径 我可以在linux中设置一些路径变量 以便它自动查找头文件吗 您可以创建一个 makef
  • Bash:将字符串添加到文件末尾而不换行

    如何将字符串添加到文件末尾而不换行 例如 如果我使用 gt gt 它将添加到文件末尾并换行 cat list txt yourText1 root host 37 echo yourText2 gt gt list txt root hos
  • Docker忽略limits.conf(试图解决“打开文件太多”错误)

    我正在运行一个 Web 服务器 该服务器正在处理数千个并发 Web 套接字连接 为了实现这一点 在 Debian linux 我的基本镜像是 google debian wheezy 在 GCE 上运行 上 打开文件的默认数量设置为 100
  • bash while 循环的布尔表达式中的 -lt 意味着什么?

    我猜测它代表小于基于输出 但是我在哪里可以找到有关此语法的文档 bin bash COUNTER 0 while COUNTER lt 10 do echo The counter is COUNTER let COUNTER COUNTE
  • 如何在 Linux 和 C 中使用文件作为互斥体?

    我有不同的进程同时访问 Linux 中的命名管道 并且我想让此访问互斥 我知道可以使用放置在共享内存区域中的互斥体来实现这一点 但作为一种家庭作业 我有一些限制 于是 我想到的是对文件使用锁定原语来实现互斥 我做了一些尝试 但无法使其发挥作
  • 如何从 C++ 程序中重新启动 Linux?

    我有一个 Qt 4 GUI 我需要在下拉菜单中提供一个选项 允许用户选择重新启动计算机 我意识到这对于以其他方式重新启动计算机的能力来说似乎是多余的 但选择需要保留在那里 我尝试使用 system 来调用以下内容 suid root she
  • 如何才能将 TCP 连接返回到同一端口?

    机器是 RHEL 5 3 内核 2 6 18 有时我在 netstat 中注意到我的应用程序有连接 建立了 TCP 连接本地地址 and 国外地址是一样的 其他人也报告了同样的问题 症状与链接中描述的相同 客户端连接到本地运行的服务器的端口
  • awk 在循环中使用时不打印任何内容[重复]

    这个问题在这里已经有答案了 我有一堆使用 file 1 a 1 txt 格式的文件 如下所示 A 1 B 2 C 3 D 4 并使用以下命令添加包含每个文件名称的新列 awk print FILENAME NF t 0 file 1 a 1
  • 为什么 Linux 原始套接字的 RX 环大小限制为 4GB?

    背景 我试图mmap 我的原始套接字的 RX 环形缓冲区64 bitLinux 应用程序 我的环由 4096 个块组成 每个块大小为 1MB 总共 4GB 请注意 每个 1MB 块中可以有许多帧 如果您好奇 请参阅此文档了解背景信息 htt
  • 仅使用containerd(不使用Docker)修剪容器镜像

    如果我刚刚containerd安装在 Linux 系统上 即 Docker 是not安装 如何删除未使用的容器映像以节省磁盘空间 Docker 就是这么方便docker system prune https docs docker com

随机推荐

  • Shell(一):功能、配置和插件(附iTerm 2(for mac) && Oh My Zsh教程)

    关于shell xff0c 一个广义的解释就是在用户与操作系统之间 xff0c 提供一个工具或接口给用户来操作计算机系统 xff1b 用户在shell中通过输入命令行 xff0c 按下回车键 xff0c shell执行命令后就能返回结果 x
  • 使用git rebase合并多次commit

    将多次commit合并 xff0c 只保留一次提交历史 1 首先使用git log查看一下提交历史 demo 64 ubuntu1204 zh cn bugfix ycs MOS 1503 notify template table cen
  • Redis性能测试——redis-benchmark使用教程

    谨以此作为读书摘要 xff0c 无它 xff0c 唯以后快速查阅 Redis 自带了一个叫 redis benchmark 的工具来模拟 N 个客户端同时发出 M 个请求 xff08 类似于 Apache ab 程序 xff09 你可以使用
  • pycharm配置本地python虚拟环境

    Python的版本众多 在加上适用不同版本的Python Package 这导致在同时进行几个项目时 xff0c 对库的依赖存在很大的问题 这个时候就牵涉到对Python以及依赖库的版本管理 xff0c 方便进行开发 xff0c virtu
  • Unix环境高级编程读书笔记之一——Unix基础知识

  • Unix环境高级编程读书笔记之二——文件I/O

  • VNC连接ubuntu10.04出现白屏问题解决

    使用vnc登陆界面如下 解决办法 xff1a 将 vnc xstartup文件中最后一行x window manager amp 使用 注释掉 xff0c 然后添加一行gnone session amp 然后退出所有的XWINDOWS xf
  • vnc viewer上的分辨率

    问题 xff1a 用vnc远程连接时的系统屏幕即便最大化之后 xff0c 屏幕也只是中间的一小块屏幕 xff0c 并没有跟着vnc的最大化而最大化 解决办法 xff1a 连接窗口时点选option xff0c 或者VNC窗口标题栏右键 gt
  • 在Linux中Oracle安装成功后,首次启动使用时,会出现的一些问题总结和解决办法

    注意 xff1a oracle安装不能用root用户安装 xff0c 必须新建用户安装 1 sqlplus 命令不识别问题 xff08 bash xff1a sqlplus command not found xff09 当你首次安装ora
  • 树莓派安装系统和系统备份还原

    最近有使用到树莓派做一些项目 xff0c 下面整理了下树莓派烧录系统到系统镜像备份还原的一些方法 在操作中尝试了windows和ubuntu两个系统下的烧录方式 1 树莓派官网下载Raspberry Pi Imager 登录树莓派官网 找到
  • Gazebo仿真环境中odom和baselink关联一起

    在Gazebo仿真环境中使用slam gmapping采图时发现 xff0c 没有odom数据 xff0c topic map没有数据 通过tf tree发现 odom没有和base link建立关联 日志上可以看到odom完全没有 这需要
  • 相机的变焦,对焦和景深的理解和照相機的成像原理

    首先认识焦距 xff1a 是指平行光线经透镜折射或曲面镜反射后的会聚点 xff0c 点到镜片中心的距离就是f焦距 相机成像时最清晰的位置就是感光阵列位于焦点处 焦距的作用 xff1a 焦距的大小决定着相机视野的范围大小 xff0c 一般焦距
  • 内参、外参、畸变参数三种参数与相机的标定方法与相机坐标系的理解

    有国才有家 xff0c 支持国产 xff0c 生活中点滴做起 xff0c 买手机就买华为 xff0c 这是我们国家IT界的脊梁 xff01 xff01 xff01 1 相机参数是三种不同的参数 相机的内参数是六个分别为 xff1a 1 dx
  • 基于ubuntu16.04配置VNC远程连接

    VNC官网下载https www realvnc com en connect download vnc linux 下载后的文件是VNC Server 6 3 1 Linux x86 deb xff0c 执行命令 xff1a sudo d
  • 关于Ubuntu与Debian的关系,了解!

    饮水思源 xff1a Ubuntu用户应关注Debian 当今最热门的桌面Linux非Ubuntu莫属 xff0c 它已经拥有数量众多的爱好者 xff0c 已经成为PC用户的主流操作系统之一 尽管Ubuntu相对还比较年 轻 xff0c 但
  • 最优化问题及其分类

    优化技术是一种以数学为基础 xff0c 用于求解各种工程问题优化解的应用技术 归纳而言 xff0c 最优化问题分为函数优化问题和组合优化问题两大类 xff0c 其中函数优化的对象是一定区间的连续变量 xff0c 而组合优化的对象则是解空间中
  • 50个有趣的休闲网站 (外国)

    有选择的余地是件好事 xff0c 但是如果选择太多了也让人烦恼 我们在网络上进行了搜索 xff0c 挑出了50个最有用而有趣的网站 今天互联网已经是很大的生意 无论你是想要购买一辆汽车 出售家庭产品 做生意或者收集难以找到的信息 xff0c
  • 一个不错的技术面试官是怎么样的?

    一个不错的技术面试官是怎么样的 xff1f 转载自 xff1a http t cn AiWwBM2b 作者 Jartto 作为技术面试官 xff0c 面试过程很少考虑候选人的感受 上来就是问 xff0c 不合适就送走 虽然技术环节我很专业
  • SVN update 返回值的含义

    本文来自网络 当你从代码库里面更新自己本地的工作拷贝的时候 xff0c update返回的值意思如下 xff1a u foo 文件foo更新了 xff08 从服务器收到修改 xff09 A foo 文件或目录foo被添加到工作拷贝 D fo
  • Linux DRM Graphic 显示简单介绍

    好久没有写过博客了 xff0c 工作之后平时都没有总结 xff0c 感觉像做了学到很多东西 xff0c 但是又感觉什么都没有学到 xff0c 似懂非懂 xff08 真尼玛纠结 xff09 突然别人说的一句话 xff0c 学东西不仅仅是自己学