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 的框架流程图,整体和细节都把握的非常好。

Linux DRM KMS 驱动简介相关推荐

  1. linux DRM/KMS 测试工具 modetest、kmscude、igt-gpu-tools (一)

    这里整理几个在学习Linux DRM/KMS中用到的工具,modetest.kmscude.igt-gpu-tools. 简介: modetest 是由libdrm提供的测试程序,可以查询显示设备的支 ...

  2. linux系统网络驱动简介

    网络设备驱动简介 网络设备驱动是linux内核中三大类设备驱动之一,它用来完成高层网络协议的底层数据传输及设备控制. 网络设备与其他两种设备的区别: 网络接口不存在于linux的文件系统中,及/dev ...

  3. STM32MP157A驱动开发 | 04 - Linux DRM显示驱动框架

    Linux中主流的显示框架有两种:DRM框架和FB框架. DRM框架:Direct Rendering Module,可以统一管理GPU显示 FB框架:Frame Buffer,不能处理基于3D加速的 ...

  4. linux UVC摄像头驱动 简介

    1. 如何判断Camera是否为UVC Camera Linux UVC driver(uvc) 该驱动适用于符合USB视频类(USB Video Class)规范的摄像头设备,它包括V4L2内核设备 ...

  5. 转载:linux drm原理及应用

    参考链接 dma:https://blog.csdn.net/abc3240660/article/details/81942190#t6 Linux DRM KMS 驱动简介:https://blo ...

  6. linux drm原理及应用

    参考链接 dma:https://blog.csdn.net/abc3240660/article/details/81942190#t6 Linux DRM KMS 驱动简介:https://blo ...

  7. Linux杂项设备驱动

    一.Linux杂项设备驱动简介 Linux杂项驱动出现的意义在于:有很多简单的外围字符设备,它们功能相对简单,一个设备占用一个主设备号对于内核资源来说太浪费. 所以对于这些简单的字符设备它们共用一个主 ...

  8. Android 系统(4)---Android HAL层与Linux Kernel层驱动开发简介

    Android HAL层与Linux Kernel层驱动开发简介 近日稍微对Android中的驱动开发做了一些简要的了解,稍稍理清了一下Android驱动开发的套路,总结一下笔记. HAL:Hardw ...

  9. Android HAL层与Linux Kernel层驱动开发简介

    Android HAL层与Linux Kernel层驱动开发简介 阅读数:5070 近日稍微对Android中的驱动开发做了一些简要的了解,稍稍理清了一下Android驱动开发的套路,总结一下笔记. ...

  10. 【嵌入式开发】 Linux Kernel 下载 配置 编译 安装 及 驱动简介

    作者 : 韩曙亮 转载请出名出处 : http://blog.csdn.net/shulianghan/article/details/38636827 一. Linux 内核简介 1. 内核功能简介 ...

最新文章

  1. git 删除已经 add 的文件 记录
  2. 一起来学ES —— 浅谈Nested结构
  3. bzoj2561 最小生成树
  4. html中的分页条怎么写,如何写分页(含HTML)
  5. Adobe Edge Animate --异步条件加载框架(yepnop):加载bootstrap之按钮、进度条、菜单效果
  6. iwrite提交不了作业_“iWrite写作中心”使用全攻略
  7. 正则的简单学习与应用
  8. marquee标签、插入百度地图
  9. go 并发的非阻塞缓存
  10. 计算机c盘要满了电脑会卡吗,C盘满了 电脑卡顿了,怎么清理空间
  11. 用PS抽出滤镜让头发溶于背景nbsp;简单…
  12. Win11打印机状态错误怎么解决
  13. 5G网络与5G WiFi有什么区别
  14. Arduino ESP8266 SPI-FFS存储区域
  15. ACT技能编辑器的制作经验
  16. 前端批量下载七牛云文件
  17. Android获取汉字首字母工具类
  18. N1 armbian打造家庭NAS、下载机、aliyun-webdav
  19. 正则表达式“\\s+“ 匹配任意空白字符
  20. 如何弹出QQ临时对话框,实现不添加好友的在线交谈效果。

热门文章

  1. 构建自己的NSZombie
  2. jquery 调用ajax返回json
  3. 通用权限管理系统基类中数据库的连接
  4. 服务器上装的hadoop系统,在Ubuntu Server 18.04.1中安装Hadoop系统环境
  5. mysqlinnodb教程_mysql系列教程 - innodb锁
  6. android中menu菜单扩增_创意菜单效果
  7. java多线程 信号量(Semaphore),死锁
  8. Django index_together设置
  9. Linux的系统程序包管理
  10. javascript 函数的变量与作用域