1、 DRM简介(Direct Rendering Manager)

传统linux显示设备驱动开发时,通常使用FB驱动架构,随着显卡性能升级:显示覆盖(菜单层级)、GPU加速、硬件光标,传统FB架构无法很好支持,此外,对于多应用的访问冲突也无法很好控制。在这样的背景下,DRM应用而生。

DRM是linux内核中负责与显卡交互的管理架构,用户空间很方便的利用DRM提供的API,实现3D渲染、视频解码和GPU计算等工作。

1.1 DRM发展历史

  • 1999年,Precision Insight公司首次为 XFree86 4.0 Server 开发 DRI 显示框架,用于更好的适配 3DFX 公司显卡,初版DRM代码产出后,接下来的几年时间里,DRM 所支持的显卡列表不断被扩充。
  • 2008年10月,Linux kernel 2.6.27 进行了一次重大的源码重组:DRM 的整套源码被放到了/drivers/gpu/drm/目录下,不同的GPU厂商代码也被放到了各自子目录下。
  • 2014年6月,Atomic API 被添加到Linux 3.16,许多驱动也都转而使用这些新的 API。
  • 2018年,又有10个基于 atomic 框架的 DRM 新增驱动被添加到Linux kernel。

1.2 DRM架构对比FB架构优势

DRM是目前Linux的主流图形显示框架,相比于传统FB架构,DRM允许多个程序同时使用视频硬件资源,管理多个程序的资源请求、访问,综上所述DRM更能适应日益更新的显示硬件,DRM优势主要体现:

  • DRM原生支持多图层合成,FB原生不支持多层合成。
  • FB不支持VSYNC、DMA-BUF、异步更新和fence机制,但DRM原生都支持。
  • DRM统一管理GPU和Display驱动,让软件升级、维护和管理更加方便。

1.3 DRM图形显示框架

DRM检测到的每个GPU都作为DRM设备,并为之创建一个设备文件/dev/dri/cardX与之连接,从整体架构上来看主要分为3个主要部分:

  • libdrm (接口库)

对底层接口进行封装,向上层提供通用的API接口,主要是对各种IOCTL接口进行封装,便于重用与代码共享。

  • KMS (Kernel Mode Setting)

正常工作时,需要设置显卡或者图形适配器的模式,主要体现在以下两个方面:

更新画面:显示buffer的切换,多图层的合成方式控制,以及每个图层的显示位置。

设置显示参数:包括分辨率、刷新率、电源状态(休眠唤醒)等。

  • GEM (Graphics Execution Manager)

提供内存管理方法,主要负责显示buffer的分配和释放。

图1.1 DRM图形显示框架总览

资料直通车:Linux内核源码技术学习路线+视频教程内核源码

学习直通车:Linux内核源码内存调优文件系统进程管理设备驱动/网络协议栈

1.4 DRM图形显示框架涉及元素

本章节介绍DRM框架中的一些重点模块的功能与在显示链路中的作用,下图为APP调用DRM到屏幕显示的流程框图。

图1.2 DRM图形显示框架框图

下表对DRM中KMS和GEM两个模型的不同组件进行概述性说明,辅以高通平台代码层级的对应关系说明,以加深架构与流程之间的对应联系。

2 、DRM驱动框架

2.1 DRM驱动对象介绍

DRM内部的Objects是组成DRM框架的核心,下图中蓝色部分为物理硬件的抽象,棕色部分则为软件的抽象,其中GEM结构体为:drm_gem_object,其余部分位于结构体drm_mode_object中.

PS:drm_panel不属于object范畴,只是为了降低LCD驱动与encoder驱动间的耦合,是一堆回调函数集合。

2.2 DRM抽象硬件如何关联DRM Object

DRM的objects并不难理解,重要的是如何将实际的硬件与这些object进行关联,下面会以MIPI DSI接口为例进行介绍软件架构与DRM object的对应关系。

其中组件说明:

3 、DRM简单示例

DRM代码非常庞大,显卡逻辑也非常复杂,在学习DRM架构时,需要通过实践对DRM的流程进行理解,以达到事半功倍的效果。

下面会以模式设置案例,对DRM架构的流程进行解析。modeset主要流程如下:

图3.1 DRM Modeset流程总览

3.1 打开DRM设备文件

DRM框架成功加载后,会创建一个设备文件/dev/dri/card0,上层用户应用可以通过该文件节点,获取显卡的各种操作。

3.2 获取显卡资源句柄

打开DRM设备文件后,通过以下函数获取显卡的资源句柄,进而进行显卡资源的操作。

3.3 获取connectorId

获取了drmModeRes后,获取它的连接对象。

3.4 创建FrameBuffer

创建FrameBuffer后,然后映射一片内存,对这块内存进行像素数据填充。

3.5 设置Crtc模式

FB创建成功并进行清0操作,可以在里面填充任何数据,然后设置CRTC后,FB的内容就可以显示在屏幕。

CRTC模式设置函数:drmModeSetCrtc(),参数为:fd、crtc句柄、FB句柄、X\Y坐标等。

3.6 资源清理工作(非必需)

显示完成后,GUI会一直运行,一般不必实施资源清理工作。

本章小结

本文介绍了DRM架构的发展历史、驱动框架以及简单示例,旨在帮助读者了解DRM架构的形成、功能流程实现,DRM代码庞大且复杂,想要深入理解它的内涵,最好的办法就是根据实际需求来进行代码流程梳理,后续章节也会对该部分进行展开讲解。

此外,DRM架构符合功能日益强大的现代显示设备,但仍有很多老的设备以及软件需要FB支持,在目前DRM框架中,会存在模拟FB设备的代码,参见drivers/gpu/drm/xxx/drv.c文件,会在设备目录下出现:/dev/fb0 。

深入讲解DRM架构介绍(一)相关推荐

  1. DRM架构介绍(一)

    1. DRM简介(Direct Rendering Manager) 传统linux显示设备驱动开发时,通常使用FB驱动架构,随着显卡性能升级:显示覆盖(菜单层级).GPU加速.硬件光标,传统FB架构 ...

  2. 结合丰富示例深入讲解Ajax架构和最佳实践——《深入Ajax:架构与最佳实践》

    媒体评论 "本书不仅介绍了编程技术,而且全面讲解了 Ajax 应用程序的生命周期.如果你想成为一名专业的前端开发人员,一定会被本书中关于架构的真知灼见和最佳实践深深打动." --A ...

  3. Apollo进阶课程㊲丨Apollo自动驾驶架构介绍

    原文链接:进阶课程㊲丨Apollo自动驾驶架构介绍 自动驾驶硬件架构:一般采用激光雷达作为主要感知传感器,同时结合摄像头.GPS/IMU.毫米波雷达.超声波雷达等,以NVIDIA Drive PX2 ...

  4. Pixhawk系统架构介绍

    前段时间导师叫我做扑翼无人机,工程上需要实现的,能够通过程控飞起来,感觉难度挺大.先从研究PX4开始,打算一步步理解透整个PX4的框架,机型的适配.旋翼.固定翼的姿态控制,新机型的添加等等.不知道能不 ...

  5. 数据采集器-架构介绍

    title: 数据采集器-架构介绍 date: 2017-01-10 12:40:39 tags: 数据采集器 说点事 说说数据采集的流程 数据采集一般是一个从硬件设备收集到数据,然后对对数据进行解析 ...

  6. MindSpore Lite整体架构介绍

    MindSpore Lite整体架构介绍 MindSpore Lite框架的总体架构如下所示: • 前端(Frontend): 负责模型生成,用户可以通过模型构建接口构建模型,将第三方模型和MindS ...

  7. MindSpore整体架构介绍

    MindSpore整体架构介绍 MindSpore框架架构总体分为MindSpore前端表示层.MindSpore计算图引擎和MindSpore后端运行时三层. • MindSpore前端表示层(Mi ...

  8. 微服务架构介绍和RPC框架对比

    微服务架构介绍和RPC框架对比 1.微服务架构 1.1 特征 自动化部署,端点智能化,语言和数据的去中心化控制. 1.2架构 一种将一个单一应用程序开发为一组小型服务的方法,每个服务运行在自己的进程中 ...

  9. 伍哥原创之豆荚商城商品搜索架构介绍

    为什么80%的码农都做不了架构师?>>>    豆荚商城(www.dou55.com)商品搜索架构介绍 1,需求分析 伍哥所在的豆荚商城是一个家电行业的B2C网上零售平台.作为这样一 ...

最新文章

  1. 关于TensorFlow你需要了解的9件事
  2. 利用JMF进行多媒体编程
  3. springcloud @EnableDiscoveryClient注解作用
  4. 25q64存储多个数据_一篇文章看懂,存储虚拟化在不同用例中的实践与优势
  5. 实现文件拖放的一种简洁方法
  6. 截取台风后的图片_今年首个台风来袭!“大黄蜂”下,货代如何“防台”?
  7. 计算机辅助翻译 火云译客,中文在线翻译韩语
  8. ib网卡命令_linux安装卸载IB网卡(mellanox)驱动
  9. 基于MATLAB的有源三相滤波器的设计,基于MATLAB的有源滤波器的设计与仿真
  10. 内网服务器软件共享文件,服务器共享文件夹设置软件、局域网共享文件夹加密工具、文件共享服务器软件的选择...
  11. 简单的例子理解正则表达式中的前瞻与后顾
  12. CDH安装服务和下载parcels包
  13. 深度学习21天——卷积神经网络(CNN):实现mnist手写数字识别(第1天)
  14. SQL SERVER 服务器登录名、数据库用户名、服务器角色、数据库角色、DENY、sp_addlogin ETC.
  15. Android Activity中实现Fragment切换功能效果
  16. 顺丰快递单号批量提取
  17. 【深度学习】卷积概念以及卷积核层数
  18. react路由鉴权 / 路由守卫
  19. Google的OR-Tools
  20. 常用的Matlab的函数

热门文章

  1. cesium clock时间轴速度自定义
  2. linux的FHS目录结构简要介绍
  3. eve-ng 自定义linux镜像
  4. 物体跟着鼠标移动旋转
  5. Keepalived 配置详解与主备模式
  6. webpack4编译vue样式时错误
  7. maya如何让控制器跟随模型,不脱节?
  8. python读写excel模块pandas_Windows下Python使用Pandas模块操作Excel文件的教程
  9. Python实用模块(二十二)easydict
  10. python培训推广