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 显示简单介绍 的相关文章

  • arm64和armhf有什么区别?

    Raspberry Pi Type 3 具有 64 位 CPU 但其架构不是arm64 but armhf 有什么区别arm64 and armhf armhf代表 arm hard float 是给定的名称Debian 端口 https
  • 无法使用 wget 在 CentOS 机器上安装 oracle jdk

    我想在CentOS上安装oracle java jdk 8 我无法安装 java jdk 因为当我尝试使用命令安装 java jdk 时 root ADARSH PROD1 wget no cookies no check certific
  • 两种情况或 if 哪个更快? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我必须制作一个 非常 轻的脚本 它将接受用户的选项并调用脚本中的函数来执行一些任务 现在我可以使用 IF 和 CASE 选项 但我想知道两
  • PHP 从命令行启动 gui 程序,但 apache 不启动

    首先 我阅读了有类似问题的人的一些帖子 但所有答案都没有超出导出 DISPLAY 0 0 和 xauth cookies 这是我的问题 提前感谢您的宝贵时间 我开发了一个小库 它使用 OpenGL 和 GLSL 渲染货架 过去几天我将它包装
  • CentOS:无法安装 Chromium 浏览器

    我正在尝试在 centOS 6 i 中安装 chromium 以 root 用户身份运行以下命令 cd etc yum repos d wget http repos fedorapeople org repos spot chromium
  • 将 PDF 转换为 600dpi 的 TIFF 和 jpg 96 dpi

    我想使用 ImageMagick 从 Python 脚本将 pdf 转换为 600 dpi 的 tiff 和 96 dpi 的 jpg 我使用 imagemagick 命令行完成了这项任务 但我想使用python中的Imagemagick将
  • Linux 可执行文件与 OS X“兼容”吗?

    如果您在基于 Linux 的平台上用 C 语言编译一个程序 然后将其移植以使用 MacOS 库 它会工作吗 来自编译器的核心机器代码在 Mac 和 Linux 上兼容吗 我问这个问题的原因是因为两者都是 基于 UNIX 的 所以我认为这是真
  • jpegtran 优化而不更改文件名

    我需要优化一些图像 但不更改它们的名称 jpegtran copy none optimize image jpg gt image jpg 但是 这似乎创建了 0 的文件大小 当我对不同的文件名执行此操作时 大小仍然完全相同 怎么样 jp
  • 为arm构建WebRTC

    我想为我的带有arm926ej s处理器的小机器构建webrtc 安装 depot tools 后 我执行了以下步骤 gclient config http webrtc googlecode com svn trunk gclient s
  • 检测 Widevine DRM HDCP 保护级别

    我目前正在切换到使用 Dash Widevine DRM 的 ExoPlayer 通过测试 我发现很大比例的设备没有启用 HDCP 保护 由于合同协议 这是一个问题 我必须在允许播放之前检测到并记录它 I took inspiration
  • 查找哪些页面不再与写入时复制共享

    假设我在 Linux 中有一个进程 我从中fork 另一个相同的过程 后forking 因为原始进程将开始写入内存 Linux写时复制机制将为进程提供与分叉进程使用的不同的唯一物理内存页 在执行的某个时刻 我如何知道原始进程的哪些页面已被写
  • 查找哪个程序运行另一个程序

    我有一个 NAS 运行在 Redhat Linux 的有限版本上 我按照指示破解了它 这样我就可以访问 shell 这很有帮助 我还做了一些修改 其他人也做过修改 除了一个问题之外 它们似乎都工作得很好 不知何故 每隔 22 天 系统就会关
  • 在脚本内使用不带密码的 sudo

    由于某种原因 我需要作为用户在没有 sudo 的情况下运行脚本 script sh 该脚本需要 root 权限才能工作 我认为将 sudo 放入 script sh 中是唯一的解决方案 让我们举个例子 script sh bin sh su
  • Linux 上有关 getBounds() 和 setBounds() 的 bug_id=4806603 的解决方法?

    在 Linux 平台上 Frame getBounds 和 Frame setBounds 的工作方式不一致 这在 2003 年就已经有报道了 请参见此处 http bugs java com bugdatabase view bug do
  • 是否可以创建一个脚本来保存和恢复权限?

    我正在使用 Linux 系统 需要对一组嵌套文件和目录进行一些权限实验 我想知道是否没有某种方法可以保存文件和目录的权限 而不保存文件本身 换句话说 我想保存权限 编辑一些文件 调整一些权限 然后将权限恢复到目录结构中 将更改的文件保留在适
  • 按进程名称过滤并记录 CPU 使用情况

    Linux 下有选项吗顶部命令 https www man7 org linux man pages man1 top 1 html我可以在哪里按名称过滤进程并将每秒该进程的 CPU 使用情况写入日志文件 top pgrep 过滤输出top
  • 监视目录的更改

    很像一个类似的问题 https stackoverflow com questions 112276 directory modification monitoring 我正在尝试监视 Linux 机器上的目录以添加新文件 并希望在这些新文
  • 如果在等待“read -s”时中断,在子进程中运行 bash 会破坏 tty 的标准输出吗?

    正如 Bakuriu 在评论中指出的那样 这基本上与BASH 输入期间按 Ctrl C 会中断当前终端 https stackoverflow com questions 31808863 bash ctrlc during input b
  • Urwid:使光标不可见

    我正在使用 urwid 它是一个用于在 ncurses 中设计终端用户界面的 Python 框架 但有一件事我在 urwid 中无法做到 而这在 Curses 中很容易做到 使光标不可见 现在 选择按钮时光标是可见的 而且看起来很丑 有办法
  • NUMA 在虚拟内存中是如何表示的?

    有许多资源 https en wikipedia org wiki Non uniform memory access从硬件角度描述NUMA的架构性能影响 http practical tech com infrastructure num

随机推荐

  • 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 学东西不仅仅是自己学