Linux DRM KMS 驱动简介

2023-05-16

Whoops,上次写完《Linux DRM Graphic 显示简单介绍》博文后,心情还是蛮愉悦的,来来,这次在说说具体的显卡驱动。

1. DRM 框架分解

DRM 框架提供了一系列的 IOCTL 行为,但是绝大部分可以分成两类行为:Graphics Execution Manager (GEM)、Kernel Mode-Setting (KMS)  下面截图 WIKI 上一段总结:

Since then, the scope of DRM has been expanded over the years to cover more functionality previously handled by user space programs, such as framebuffer managing and mode setting, memory sharing objects and memory synchronization.[4][5] Some of these expansions had carried their own specific names, such as Graphics Execution Manager (GEM) or Kernel Mode-Setting (KMS), and the terminology prevails when the functionality they provide is specifically alluded. But they are really parts of the whole kernel DRM subsystem.

前者 GEM 主要是对 FrameBuffer 的管理,如显存的申请释放 (Framebuffer managing) ,显存共享机制 (Memory sharing objects), 及显存同步机制 (Memory synchronization),而后者 KMS 主要是完成显卡配置 (Display mode setting) .
现在将 Rockchip drm 驱动和上面对应一下,rockchip_drm_gem* 对应的当然就是 GEM,rockchip_drm_vop* / analogix_dp-rockchip* / dw_hdmi-rockchip* 肯定指的就是 KMS,而我们这次也先玩玩后者 KMS (Kernel Mode Setting).

2. 显卡设备驱动

我们先引用下 WIKI 的一段话,来简述下显卡设备的组成:

Due to the fact that dies of modern GPUs found on graphics cards for desktop computers integrate “processing logic”, “display controller” and “hardware video acceleration” SIP cores, non-technical people don’t distinguish between these three very different components. SoCs on the other hand, regularly mix SIP from different developers, and, for example, ARM’s Mali SIP does not feature a display controller. For historical reasons, the DRM and the KMS of the Linux kernel were amalgamated into one component. They were split in 2013 for technical reasons.[16]

显卡主要是由三类设备组成:Processing logic 指的是神秘的 GPU 模块,Display controller 指的是 LCDC 控制器,Hardware video acceleration 指的就是具体的显示接口 HDMI / eDP / …
根据上面的设备概念,我们来和具体驱动对应下:

[~/github_projs/linux] (analogix_dp_upstream) 837h28m $ ls drivers/gpu/drm/rockchip/
analogix_dp-rockchip.c  rockchip_drm_fbdev.c
dw_hdmi-rockchip.c      rockchip_drm_fbdev.h
Kconfig                 rockchip_drm_fb.h
Makefile                rockchip_drm_gem.c
rockchip_drm_drv.c      rockchip_drm_gem.h
rockchip_drm_drv.h      rockchip_drm_vop.c
rockchip_drm_fb.c       rockchip_drm_vop.h
  1. Processing logic 很可惜不在我开发的目录中
  2. Display controller 肯定是 VOP 驱动了 rockchip_drm_vop*
  3. Hardware video acceleration 也就是 HDMI / eDP 驱动了 analogix_dp-rockchip* & dw_hdmi-rockchip*

而这次要要介绍的 DRM KMS (Kernel Mode Setting) 的概念,指的就是上面成员的集合,具体就是 VOP (Video Output Processor) / HDMI / eDP 端的驱动。DRM KMS 对于显卡设备驱动有三个概念 CRTC / Encoder / Connector,这三个概念很重要,但是很容易理解。CRTC 就是指 Display Controller,Encoder 就是指具体接口驱动 eDP / HDMI,Connector 指的是具体外接的屏幕 Monitor / Panel

  1. CRTC 的常用行为如下:
    • DPMS (Display Power Manage System) 电源状态管理 (crtc_funcs->dpms)
    • 将 Framebuffer 转换成标准的 LCDC Timing ,其实就是一帧图像刷新的过程(crtc_funs->mode_set)
    • 帧切换,即在 VBlank 消影期间,切换 Framebuffer(crtc_funcs->page_flip)
    • Gamma 校正值调整(crtc_funcs->gamma_set)
  2. Encoder 的常用行为如下:
    • DPMS (Display Power Manage System) 电源状态管理 (encoder_funcs->dpms)
    • 将 VOP 输出的 lcdc Timing 打包转化为对应接口时序 HDMI TMDS / … (encoder_funcs->mode_set)
  3. Connector 的常用行为如下:
    • 获取上报 热拔插 Hotplug 状态
    • 读取并解析屏 (Panel) 的 EDID 信息

我简单以 HDMI Monitor 显示的过程为例,实例解析下 CRTC / Encoder / Connector 的行为:
 1. 首先 HDMI 驱动检测到电视 Plugin 信号,读出电视的 EDID 信号,获取电视的分辨率信息 (DRM Connector)。
 2. Userspace 将需要显示的数据填充在 framebuffer 里面,然后通过 libdrm 接口通知 VOP 设备开始显示。
 3. 接着 VOP 驱动将 framebuffer 里面的数据转换成标准的 LCDC Timing 时序 (DRM CRTC)。
 4. 同时 HDMI 驱动将 HDMI 硬件模块的 LCDC 时序配置与 VOP 输出时序一致,准备将输入的 LCDC Timing 转化为电视识别的 HDMI TMDS 信号 (DRM Encoder)。

具体 CRTC / Encoder / Connector 的驱动 API 细节,这次就不体现了,仅仅做一个概念性的介绍,以后再有机会在逐个分解说吧,最后还是 No Picture Say JB,盗用一张 GPU 同事画的一张 DRM 的框架流程图,整体和细节都把握的非常好。
这里写图片描述




Thanks

- Yakir

这里写图片描述

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

Linux DRM KMS 驱动简介 的相关文章

  • 如何使用 sed 仅删除双空行?

    我找到了这个问题和答案 https stackoverflow com questions 4651591 howto use sed to remove only triple empty lines关于如何删除三重空行 但是 我只需要对
  • 如何更改 Ubuntu 14.04 上的 php-cli 版本?

    我是 Linux 新手 在篡改时破坏了一些 php 设置 如果我执行一个包含以下内容的 php 脚本 phpinfo 它显示 php 版本为 5 6 但通过命令行 如果我运行php v它返回 7 0 版本 我想让两个版本匹配 我怎样才能修复
  • 嵌入式Linux poll()不断返回

    我有一个特别的问题 当我知道没有什么可读时 民意调查不断返回 因此设置如下 我有 2 个文件描述符 它们构成fd设置民意调查监视 一种用于引脚从高到低的变化 GPIO 另一个用于代理输入 代理输入出现问题 处理的顺序是 启动main函数 然
  • xsel -o 对于 OS X 等效项

    是否有一个等效的解决方案可以在 OS X 中抓取选定的文本 就像适用于 Linux 的 xsel o 一样 只需要当前的选择 这样我就可以在 shell 脚本中使用文本 干杯 埃里克 你也许可以安装xsel在 MacOS 上 更新 根据 A
  • 在 Mac OS X 上构建 Linux 内核

    我正在做一个修改Linux内核的项目 我有一台桌面 Linux 机器 在上面构建内核没有问题 不过 我要去旅行 我想在途中工作 我只有一台 MacBook 当我尝试构建 Linux 内核时 它抱怨说elf h was not found 我
  • 何时使用 pthread 条件变量?

    线程问题 看来 只有在其他线程调用 pthread cond notify 之前调用 pthread cond wait 时 条件变量才起作用 如果在等待之前发生通知 那么等待将被卡住 我的问题是 什么时候应该使用条件变量 调度程序可以抢占
  • 从 PL/SQL 调用 shell 脚本,但 shell 以 grid 用户而非 oracle 身份执行

    我正在尝试使用 Runtime getRuntime exec 从 Oracle 数据库内部执行 shell 脚本 在 Red Hat 5 5 上运行的 Oracle 11 2 0 4 EE CREATE OR REPLACE proced
  • Android:ANT 构建失败,并显示 google-play-services-lib:“解析为没有项目的 project.properties 文件的路径”

    我正在尝试使用 ANT 构建我的应用程序 但在包含 google play services lib 库项目后 我惨遭失败 Step 1 我在 project properties 文件中设置了对库项目的引用 android library
  • 无法加载 JavaHL 库。- linux/eclipse

    在尝试安装 Subversion 插件时 当 Eclipse 启动时出现此错误 Failed to load JavaHL Library These are the errors that were encountered no libs
  • Linux 中的无缓冲 I/O

    我正在写入大量的数据 这些数据数周内都不会再次读取 由于我的程序运行 机器上的可用内存量 显示为 空闲 或 顶部 很快下降 我的内存量应用程序使用量不会增加 其他进程使用的内存量也不会增加 这让我相信内存正在被文件系统缓存消耗 因为我不打算
  • 跟踪 Linux 程序中活跃使用的内存

    我想跟踪各种程序在特定状态下接触了多少内存 例如 假设我有一个图形程序 最小化时 它可能会使用更少的内存 因为它不会重新绘制窗口 这需要读取图像和字体并执行大量库函数 这些对象仍然可以在内存中访问 但实际上并没有被使用 类似的工具top它们
  • 如何使用 bash 锁定文件

    我有一个任务从远程服务器同步目录 rsync av email protected cdn cgi l email protection srv data srv data 为了使其定期运行并避免脚本 reEnter 问题 我使用 rsyn
  • 应用程序无缘无故地被杀死。怀疑 BSS 高。如何调试呢?

    我已经在CentOs6 6中成功运行我的应用程序 最近 硬件 主板和内存 更新了 我的应用程序现在毫无理由地被杀死 root localhost PktBlaster PktBlaster Killed 文件和 ldd 输出 root lo
  • 为什么内核需要虚拟寻址?

    在Linux中 每个进程都有其虚拟地址空间 例如 32位系统为4GB 其中3GB为进程保留 1GB为内核保留 这种虚拟寻址机制有助于隔离每个进程的地址空间 对于流程来说这是可以理解的 因为有很多流程 但既然我们只有 1 个内核 那么为什么我
  • Linux中的定时器类

    我需要一个计时器来以相对较低的分辨率执行回调 在 Linux 中实现此类 C 计时器类的最佳方法是什么 有我可以使用的库吗 如果您在框架 Glib Qt Wx 内编写 那么您已经拥有一个具有定时回调功能的事件循环 我认为情况并非如此 如果您
  • fopen 不返回

    我在 C 程序中使用 fopen 以只读模式 r 打开文件 但就我而言 我观察到 fopen 调用没有返回 它不返回 NULL 或有效指针 执行在 fopen 调用时被阻止 文件补丁绝对正确 我已经验证过 并且不存在与权限相关的问题 任何人
  • Android 时钟滴答数 [赫兹]

    关于 proc pid stat 中应用程序的总 CPU 使用率 https stackoverflow com questions 16726779 total cpu usage of an application from proc
  • 所有平台上的java

    如果您想用 java 为 Windows Mac 和 Linux 编写桌面应用程序 那么所有这些代码都相同吗 您只需更改 GUI 即可使 Windows 应用程序更像 Windows 等等 如果不深入细节 它是如何工作的 Java 的卖点之
  • arm64和armhf有什么区别?

    Raspberry Pi Type 3 具有 64 位 CPU 但其架构不是arm64 but armhf 有什么区别arm64 and armhf armhf代表 arm hard float 是给定的名称Debian 端口 https
  • 如何在 Linux shell 中将十六进制转换为 ASCII 字符?

    假设我有一个字符串5a 这是 ASCII 字母的十六进制表示Z 我需要找到一个 Linux shell 命令 它将接受一个十六进制字符串并输出该十六进制字符串代表的 ASCII 字符 所以如果我这样做 echo 5a command im

随机推荐

  • 使用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 学东西不仅仅是自己学
  • Linux DRM KMS 驱动简介

    Whoops xff0c 上次写完 Linux DRM Graphic 显示简单介绍 博文后 xff0c 心情还是蛮愉悦的 xff0c 来来 xff0c 这次在说说具体的显卡驱动 1 DRM 框架分解 DRM 框架提供了一系列的 IOCTL