LCD DRM驱动框架分析一

2023-11-17

本文是基于rk3566 / rk3568平台 从概念和框架上对LCD DRM驱动框架进行分析。

一、DRM(Direct Rendering Manager)简介

DRM 是 Linux 目前主流的图形显示框架,相比 FB 架构,DRM 更能适应当前日益更新的显示硬件。比如 FB 原生不支持多层合成,不支持 VSYNC,不支持 DMA-BUF,不支持异步更新,不支持 fence 机制等等,而这些功能 DRM 原生都支持。同时 DRM 可以统一管理 GPU 和 Display 驱动,使得软件架构更为统一,方便管理和维护。

DRM 全称是 Direct Rendering Manager,进行显示输出管理、buffer 分配、帧缓冲。对应 userspace 库 为 libdrm,,libdrm 库提供了一系列友好的控制封装,使用户可以方便的进行显示的控制和 buffer 申请。DRM 的设备节点为 "/dev/dri/cardX", X 为 0-15 的数值,默认使用的是/dev/dri/card0。

1、DRM显示通路介绍

04c1d9e9b86d468689789bddcfc17cb5.png

各部分说明:

1)DRM Framebuffer

是一块内存区域,可以理解为一块画布,驱动和应用层都能访问它。绘制前需要将它格式化,设定绘制的色彩模式(例如RGB24,YUV 等)和画布的大小(分辨率),不负责显存的分配释放。

2)CRTC

阴极摄像管上下文(显示控制器),也可以理解为扫描仪(对显示buffer进行扫描,并产生时序信号(RGB timing)的硬件模块)。CRTC对内连接 Framebuffer 地址,对外连接 Encoder,会扫描 Framebuffer 上的内容,叠加上 Planes 的内容,最后传给Encoder。在 rockchip 平台是 SOC 内部 VOP(部分文档也称为 LCDC)模块的抽象。如图:

0452b6c900ab4c5095cae5e0cbdd67ba.png

83b9ae47158b4486803adc807a9d6f16.png

注:crtc代码层面的作用:

2.1)DPMS (Display Power Manage System) 电源状态管理 (crtc_funcs->dpms)。

2.2)将 Framebuffer 转换成标准的 LCDC Timing ,其实就是一帧图像刷新的过程(crtc_funs->mode_set)。

2.3)帧切换,即在 VBlank 消影期间,切换 Framebuffer(crtc_funcs->page_flip)。

2.4)gamma校正值调整(crtc_funcs->gamma_set)。

3)Encoder

编码器/输出转换器,负责将CRTC输出的timing时序转换成外部设备所需要的信号的模块。它的作用就是将内存的 pixel 像素编码(转换)为显示器所需要的信号(因为画面显示到不同的设备(Display Device)上,需要将画面转化为不同的电信号)。如指 RGB、LVDS、DSI、eDP、HDMI、CVBS、VGA 等显示接口。另外 Encoder 和 CRTC 之间的交互就是我们所说的 ModeSetting,其中包含了前面提到的色彩模式、还有时序(Timing)等。

注:Encoder代码层面的作用:

3.1)DPMS (Display Power Manage System) 电源状态管理 (encoder_funcs->dpms)

3.2)将 VOP 输出的 lcdc Timing 打包转化为对应接口时序 HDMI TMDS / … (encoder_funcs->mode_set)

4)Connector

连接器,指 encoder 和 panel 之间交互的接口部分。对应于物理连接器 (例如 VGA, DVI, FPD-Link, HDMI, DisplayPort, S-Video等) ,它不是指物理线,在 DRM中,Connector 是一个抽象的数据结构,代表连接的显示设备,从Connector中可以得到当前物理连接的输出设备相关的信息。

注:Connector代码层面的作用

4.1)获取上报 热拔插 Hotplug 状态

4.2)读取并解析屏 (Panel) 的 EDID 信息

5)Bridge

桥接设备,一般用于注册 encoder 后面另外再接的转换芯片,如 DSI2HDMI 转换芯片。桥接ic所处位置,如图:

2e32dc90c57a459293dd91ea5d235943.png

6)Panel

泛指屏,各种LCD, HDMI等显示设备的抽象。用于获取LCD mode参数,并提供LCD休眠唤醒的回调接口,供encoder调用。

7)Fence

buffer 同步机制,基于内核 dma_fence 机制实现,用于防止显示内容出现异步问题。

8)Plane

硬件图层, 和 Framebuffer 一样是内存地址。在 rockchip 平台是 SOC 内部 VOP(LCDC)模块 win 图层的抽象。一个Plane代表一个image layer, 最终的image由一个或者多个Planes组成。
 
plane的几种类型:
 

6.1)DRM_PLANE_TYPE_PRIMARY: 一定要有,由于显示背景或者图像内容

6.2)DRM_PLANE_TYPE_OVERLAY: 用于显示Overlay

6.3)DRM_PLANE_TYPE_CURSOR: 用于显示鼠标

 

小结:

实例解析下 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)。

2、DRM模块介绍

DRM 从模块上划分,可以简单分为 3 部分:libdrmKMSGEM。

DRM驱动 和 libdrm 交互过程如下:

f19a62b8e12a44a285ea2f3ee4e146e6.png

 各部分说明:

1)libdrm

对底层接口进行封装,向上层提供通用的API接口(主要是对各种IOCTL接口进行封装)。

如下例子:

drmModeSetCrtc -》DRM_IOCTL(fd, DRM_IOCTL_MODE_SETCRTC, &crtc)-》drm_mode_setcrtc

drmModeAtomicCommit-》DRM_IOCTL(fd, DRM_IOCTL_MODE_ATOMIC, &atomic)-》drm_mode_atomic_ioctl

drmModeGetConnector()-》DRM_IOCTL(fd, DRM_IOCTL_MODE_GETCONNECTOR, &conn)-》drm_mode_getconnector

2)kms

kernel mode setting,即mode setting。作用:更新画面和设置显示参数。

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

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

KMS包括:CRTCENCODERCONNECTORPLANEFBVBLANKproperty

3)gem

Graphic Exection Manager,主要是对 FrameBuffer 的管理,如显存的申请释放 (Framebuffer managing) ,显存共享机制 (Memory sharing objects), 及显存同步机制 (Memory synchronization),也是GPU唯一用到DRM的地方。

GEM包括:DUMBPRIMEfence

三、其他

1、DRI

Direct Rendering Infrastructure,直接访问硬件接口

2、EDID

Extended Display Identification Data,扩展显示标识数据,共有128字节。其中包含有关显示器及其性能的参数,包括供应商信息、最大图像大小、颜色设置、厂商预设置、频率范围的限制以及显示器名和序列号的字符串。

3、DDC

Display Data Channel,显示数据通道,顾名思义,它是一个通道,DDC是用来传送EDID信息的。EDID信息包含了显示器需要的128字节,128个字节的附加块可以存储在初始的EDID块之后的EDID扩展块VDIF,这些块包含addtional具体的时序信息

4、关系

plane 是连接 framebuffer 和 crtc 的纽带,而 encoder 则是连接 crtc 和 connector 的纽带。与物理 buffer 直接打交道的是 gem 而不是 framebuffer。

 

 

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

LCD DRM驱动框架分析一 的相关文章

随机推荐

  • Python Flask+Echarts+sklearn+MySQL(评论情感分析、用户推荐、BI报表)项目分享

    Python Flask Echarts sklearn MySQL 评论情感分析 用户推荐 BI报表 项目分享 项目背景 随着互联网的快速发展和智能手机的普及 人们越来越倾向于在网上查找餐厅 购物中心 酒店和旅游景点等商户的点评和评分信息
  • 掌握 Ajax,第 5 部分:操纵 DOM

    Brett McLaughlin 作者 编辑 O Reilly Media Inc 2006 年 4 月 27 日 如果阅读过本系列的 上一篇文章 那么您就非常清楚当 Web 浏览器显示网页时幕后发生的一切了 前面已经提到 当 HTML 或
  • 实验室云平台架构学习笔记

    这些日子学习了实验室云平台的体系架构 在多次与小孟哥请教后对该架构有了一定了解 首先应明白建立云平台的目的 与传统的服务器相比 云平台可以将物理资源虚拟化为虚拟机资源池 灵活调用软硬件资源 实现对用户的按需访问 而且在运行过程中根据用户并发
  • LeetCode刷题笔记-压缩字符串

    压缩字符串 给你一个字符数组 chars 请使用下述算法压缩 从一个空字符串 s 开始 对于 chars 中的每组 连续重复字符 如果这一组长度为 1 则将字符追加到 s 中 否则 需要向 s 追加字符 后跟这一组的长度 压缩后得到的字符串
  • 10个程序员常用的代码简写技术,看懂一种是入门,全懂就是大神

    今天小编我给大家整理了一份10个程序员常用的代码简写技术 看懂一种是入门 全懂就是大神 你能知道几个呢 这篇文章分享之前我还是要推荐下我自己的前端群 595549645 不管你是小白还是大牛 小编我都挺欢迎 不定期分享干货 包括我自己整理的
  • Qt 模型视图编程之自定义只读数据模型

    背景 Qt 中的模型视图架构是用来实现大量数据的存储 处理及其显示的 主要原理是将数据的存储与显示分离 模型定义了标准接口对数据进行访问 视图通过标准接口获取数据并定义显示方式 模型使用信号与槽机制通知视图数据变化 QModelIndex
  • asm.js 和 Emscripten 入门教程

    文章转载自 http www ruanyifeng com blog 2017 09 asmjs emscripten html Web 技术突飞猛进 但是有一个领域一直无法突破 游戏 游戏的性能要求非常高 一些大型游戏连 PC 跑起来都很
  • Webpack5 搭建Vue项目(进阶版)

    Webpack5 搭建Vue项目 进阶版 提示 中间隔了好长时间 我胡汉三又回来继续更新了 文章目录 Webpack5 搭建Vue项目 进阶版 前言 一 进阶版本有哪些特点 二 主要的文件代码如下 1 设置一个公共配置 webpack co
  • 使用小工具QuickLook的使用

    终于期末考试结束了 正式步入科研生活 今天正好看到了quicklook这个软件 就顺便下载一下来试试 经常我们困难会为了简单的查看一个文件 却要等待一个大型软件的缓慢加载过程 比如 m ppt文件 在使用这个软件后 不必等待 重型 的 Of
  • 快速从网页爬取图片数据

    1 代码实现 import os import re import time from selenium import webdriver from bs4 import BeautifulSoup from urllib request
  • 数据采集与埋点简介之 代码埋点、可视化埋点与无痕埋点

    转自 https sensorsdata cn blog shu ju jie ru yu mai dian 博主做移动手机系统中的数据采集与埋点也有近两年 那段时间内一方面是集中在具体的开发和问题细节处理 另外一方面则是在把采集系统适配到
  • 数据库性能

    1 建立合理的索引 2 优化SQL语句 3 优化表结构 能用小字段类型就用小字段类型 如能用short就不用int 能用数据类型就不用字符串类型 4 拆分表 横向拆分不更改表结构 重复多建立几张表 纵向拆分影响表结构 通过索引连接多个表 5
  • 2021-03-18-C++学习之17-stack、queue、list

    一 stack容器 1 stack基本概念 stack是一种先进后出 First In Last Out FILO 的数据结构 它只有一个出口 只有顶部元素才可以被外界使用 因此栈不允许有遍历行为 通常有empty函数来判断容器是否为空 s
  • LeetCode 49. 字母异位词分组

    Description 题目大意 给定一个字符串数组 返回字母相同的字符串数组 解题思路 算法标签 哈希表 1 将排序好的字符串设置为key 2 然后存储对应的字符串 代码 class Solution public vector
  • JDBC定义及编程步骤

    0目录 1 JDBC定义 2 为什么需要JDBC 3 JDBC的工作原理 4 JDBC API 5 JDBC编程模板 6 JDBC编程步骤 7 JDBC实战 1 JDBC定义 定义 Java连接数据库的一种能力或者技术 2 为什么需要JDB
  • macos 安装rust

    官方建议使用rustup来安装 rustup可以方便的在不同的rust版本之间切换 brew install rustup 使用rustup安装Rust编译器 rustc 和Rust包管理器 cargo rustup init 执行完上述两
  • 文件上传漏洞靶场upload-labs学习(pass1-pass5)

    Upload Labs学习 0x00 upload labs简介 0x01 upload labs环境搭建 0x02 Pass1 前端判断绕过 0x03 Pass2 content type类型绕过 上传测试 源代码阅读 0x04 Pass
  • 第六篇 VGGNet——模型精讲

    文章目录 模型介绍 网络组成 VGG16 VGG16 pytoch代码实现 版本一 版本二 VGG16详细参数 模型特性 关于dense evaluation 与multi cr
  • 2022 第十四届蓝桥杯模拟赛第一期(题解与标程)

    第十四届蓝桥杯模拟赛第一期 1 二进制位数 问题描述 答案提交 参考答案 2 晨跑 问题描述 答案提交 参考答案 3 调和级数 问题描述 答案提交 参考答案 程序验证 4 山谷 问题描述 答案提交 参考答案 5 最小矩阵 问题描述 答案提交
  • LCD DRM驱动框架分析一

    本文是基于rk3566 rk3568平台 从概念和框架上对LCD DRM驱动框架进行分析 一 DRM Direct Rendering Manager 简介 DRM 是 Linux 目前主流的图形显示框架 相比 FB 架构 DRM 更能适应