RK3568平台(显示篇)显示系统基本概念

一.显示系统概述

linux内核中包含两类图形显示设备驱动框架:

  • FB设备:Framebuffer图形显示框架;
  • DRM:直接渲染管理器(Direct Rendering Manager),是linux目前主流的图形显示框架;

在实际场景中,具体选择哪一种图形设备驱动框架取决于我们自己的业务需求。

Frambebuffer驱动

Frambebuffer驱动具有以下特征:

直接控制显卡的帧缓冲区,提供基本的显卡输出功能;

使用一些内核数据结构和API来管理图形界面,并提供一组接口与用户空间的应用程序进行通信;

相对简单,适合于嵌入式系统或者不需要高性能图形的应用场景。

DRM驱动

DRM驱动具有以下特征:

相比FB(Framebuffer)架构,DRM更能适应当前日益更新的显示硬件;

提供一种分离的图形驱动架构,将硬件驱动程序、内核模块和用户空间驱动程序进行分离;

支持多个应用程序同时访问显卡,并提供了更丰富的图形功能,例如硬件加速和3D加速;

提供了一些内核接口,可以让用户空间应用程序与驱动程序进行交互;

支持多显示器(Display)和多GPU的配置;

总之,一句话,DRMLinux目前主流的图形显示框架,相比FB架构,DRM更能适应当前日益更新的显示硬。尽管FB退出历史舞台,但是并未将其遗弃,而是集合到DRM中,供部分嵌入式设备使用。

二.DRM框架

DRM子系统的软件架构

DRM框架从上到下依次为应用程序、libdrmDRM driverHW

(1) 应用程序:上图中并没有画出;应用程序可以直接操纵DRMioctl进行显示相关操作,后来封装成了libdrm库,让用户可以更加方便的进行显示控制;

(2) libdrmlbdrmDRM框架提供的位于用户空间操作DRM的库,提供了DRM驱动的用户空间接口;对底层接口进行封装,向上层应用程序提供通用的API接口,本质上是对各种ioctl接口进行封装;

(3) DRM coreDRM核心层,由GEMKMS组成;

  • KMSKernel Mode Setting,所谓内核显示模式设置,其实说白了就两件事:更新画面和设置显示参数;
    • 更新画面:显示buffer的切换,多图层的合成方式,以及每个图层的显示位置;
    • 设置显示参数:包括分辨率、刷新率、电源状态(休眠唤醒)等;
  • GEMGraphic Execution Manager(图形执行管理器),它提供了一种抽象的显存管理方式,使用户空间应用程序可以更方便地管理显存,而不需要了解底层硬件的细节;
    • 实际上,在DRM中包含两个内存管理器,TTMTranslation Table Manager)和GEMGraphic Execution Manager),TTM是第一个开发的DRM内存管理器,关于TTM我们就不做过多的介绍了,知道有这么一个东西就好了。

(4) HW:硬件设备;

KMS

KMS主要负责显示相关功能,在DRM中将其进行抽象,包括:CRTCENCODERCONNECTORPLANEFramebufferVBLANKproperty;它们之间的关系如下图所示:

HDMI接口为例说明,Soc内部一般包含一个Display模块,通过总线连接到HDMI接口上;

  • Display模块对应CRTC
  • HDMI接口对应Connector
  • Framebuffer对应的是显存部分;
  • Plane是对Framebuffer进行描述的部分;
  • Encoder是将像素转化为HDMI接口所需要的信号,一般EncoderConnector放到一块初始化。
GEM

GEM主要负责显示buffer的分配和释放,在DRM中将其进行抽象,包括:DUMPPRIMEfence

三.元素介绍

 CRTC:

Framebuffer中读取待显示的图像,并按照响应的格式输出给encoder,其主要承担的作用为
(1)配置适合显示的显示模式、分辨率、刷新率等参数,并输出相应的时序;
(2)扫描Framebuffer发送到一个或多个显示器;
(3)更新Framebuffer
概括下就是,对显示器进行扫描,产生时序信号的模块、负责帧切换、电源控制、色彩调整等等。

Encoder:

编码器。它的作用就是将内存的pixel像素编码(转换)为显示器所需要的信号。
简单理解就是,如果需要将画面显示到不同的设备(Display Device)上,需要将画面转化为不同的电信号,例如DVIDVGAYPbPrCVBSMIPIeDP 等。
EncoderCRTC之间的交互就是我们所说的Mode Setting,其中包含了前面提到的色彩模式、还有时序(Timing)等

Connector:

连接器。它常常对应于物理连接器 (例如VGA,DVIFPD-LinkHDMIDisplayPortS-Video等) ,它不是指物理线。
DRM中,Connector 是一个抽象的数据结构,代表连接的显示设备,从Connector中可以得到当前物理连接的输出设备相关的信息 ;例如连接状态,EDID数据,DPMS状态、支持的视频模式等。

Plane:

图层,实际输出的图像是多个图层叠加而成的,比如主图层、光标图层。其中有些图层由硬件加速模块生成,每个CRTC至少一个plane
plane一共有三种,分别是:DRM_PLANE_TYPE_PRIMARYDRM_PLANE_TYPE_OVERLAYDRM_PLANE_TYPE_CURSOR。这是配置plane的三个枚举,标注主图层、覆盖图层、光标图层;

Framebuffer:

Framebuffer,用于存储单个图层(Plane)要实现的内容
它是一块内存区域,可以理解为一块画布,驱动程序和应用都能访问它。绘画前需要将它格式化,设定绘制的色彩模式(例如RGB888YUV等)和画布的大小(分辨率)。

Vblank:

软件和硬件的同步机制,RGB时序中的垂直消影区,软件通常使用硬件VSYNC来实现。

四.目录结构

linux内核将DRM驱动相关的代码都放在drivers/gpu/drm目录下,这下面的文件还是比较多的,我们大概了解一下即可;

linux-6.3# ls drivers/gpu/drm/ -I "*.o"
amd                         drm_fbdev_generic.c             drm_print.c                logicvc
arm                         drm_fb_dma_helper.c             drm_privacy_screen.c       Makefile
armada                      drm_fb_helper.c                 drm_privacy_screen_x86.c   mcde
aspeed                      drm_file.c                      drm_probe_helper.c         mediatek
ast                         drm_flip_work.c                 drm_property.c             meson
atmel-hlcdc                 drm_format_helper.c             drm_rect.c                 mgag200
bridge                      drm_fourcc.c                    drm_scatter.c              modules.order
built-in.a                  drm_framebuffer.c               drm_self_refresh_helper.c  msm
display                     drm_gem_atomic_helper.c         drm_shmem_helper.ko        mxsfb
drm_agpsupport.c            drm_gem.c                       drm_shmem_helper.mod       nouveau
drm_aperture.c              drm_gem_dma_helper.c            drm_shmem_helper.mod.c     omapdrm
drm_atomic.c                drm_gem_framebuffer_helper.c    drm_simple_kms_helper.c    panel
drm_atomic_helper.c         drm_gem_shmem_helper.c          drm_syncobj.c              panfrost
drm_atomic_state_helper.c   drm_gem_ttm_helper.c            drm_sysfs.c                pl111
drm_atomic_uapi.c           drm_gem_vram_helper.c           drm_trace.h                qxl
drm_auth.c                  drm_hashtab.c                   drm_trace_points.c         radeon
drm_blend.c                 drm_internal.h                  drm_ttm_helper.ko          rcar-du
drm_bridge.c                drm_ioc32.c                     drm_ttm_helper.mod         rockchip
drm_bridge_connector.c      drm_ioctl.c                     drm_ttm_helper.mod.c       scheduler
drm_buddy.c                 drm_irq.c                       drm_vblank.c               shmobile
drm_bufs.c                  drm_kms_helper_common.c         drm_vblank_work.c          solomon
drm_cache.c                 drm_lease.c                     drm_vma_manager.c          sprd
drm_client.c                drm_legacy.h                    drm_vm.c                   sti
drm_client_modeset.c        drm_legacy_misc.c               drm_vram_helper.ko         stm
drm_color_mgmt.c            drm_lock.c                      drm_vram_helper.mod        sun4i
drm_connector.c             drm_managed.c                   drm_vram_helper.mod.c      tegra
drm_context.c               drm_memory.c                    drm_writeback.c            tests
drm_crtc.c                  drm_mipi_dbi.c                  etnaviv                    tidss
drm_crtc_helper.c           drm_mipi_dsi.c                  exynos                     tilcdc
drm_crtc_helper_internal.h  drm_mm.c                        fsl-dcu                    tiny
drm_crtc_internal.h         drm_mode_config.c               gma500                     ttm
drm_damage_helper.c         drm_mode_object.c               gud                        tve200
drm_debugfs.c               drm_modes.c                     hisilicon                  udl
drm_debugfs_crc.c           drm_modeset_helper.c            hyperv                     v3d
drm_displayid.c             drm_modeset_lock.c              i2c                        vboxvideo
drm_dma.c                   drm_of.c                        i915                       vc4
drm_drv.c                   drm_panel.c                     imx                        vgem
drm_dumb_buffers.c          drm_panel_orientation_quirks.c  ingenic                    virtio
drm_edid.c                  drm_pci.c                       Kconfig                    vkms
drm_edid_load.c             drm_plane.c                     kmb                        vmwgfx
drm_encoder.c               drm_plane_helper.c              lib                        xen
drm_encoder_slave.c         drm_prime.c                     lima                       xlnx

其中:

  • drm_drv.cDRM core核心实现;

  • drm_gem.c:提供了GEM相关的API

其中rockchipRockchip官方的实现代码:

linux-6.3# ls drivers/gpu/drm/rockchip/ -I "*.o"
analogix_dp-rockchip.c  inno_hdmi.c         rockchip_drm_drv.h   rockchip_drm_vop.h
built-in.a              inno_hdmi.h         rockchip_drm_fb.c    rockchip_lvds.c
cdn-dp-core.c           Kconfig             rockchip_drm_fb.h    rockchip_lvds.h
cdn-dp-core.h           Makefile            rockchip_drm_gem.c   rockchip_rgb.c
cdn-dp-reg.c            modules.order       rockchip_drm_gem.h   rockchip_rgb.h
cdn-dp-reg.h            rk3066_hdmi.c       rockchip_drm_vop2.c  rockchip_vop2_reg.c
dw_hdmi-rockchip.c      rk3066_hdmi.h       rockchip_drm_vop2.h  rockchip_vop_reg.c
dw-mipi-dsi-rockchip.c  rockchip_drm_drv.c  rockchip_drm_vop.c   rockchip_vop_reg.h

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/50201.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

打通“链上数据脉络” 欧科云链数字生态建设成果凸显

7月25日,据Coindesk报道,全球领先的区块链技术和服务提供商欧科云链宣布旗下OKLink浏览器与Polygon Labs正式达成合作,成为AggLayer首个区块链搜索引擎及Web3数据分析平台,将为开发者提供精简易用的链上数据访问和开发工具&#x…

MATLAB学习教程(一)

目录 1.常见函数基本运算 2.二维绘制: plot(​..) 3.三维绘制: plot3(​..) / mesh(​..) 4.绘图美化 标题及标签 绘图命令:color 绘图命令:Line 5.代码 1.常见函数基本运算 方根函数sqrt() 自然指数函数exp() 以10为底的对数函…

巴斯勒相机(Basler) ACE2 dart 系列说明和软件

巴斯勒相机(Basler) ACE2 dart 系列说明和软件

了解高防 IP

一、高防 IP 的基本概念 高防 IP 是指拥有强大防御能力的 IP 地址。它主要通过将攻击流量引流到高防机房进行清洗和过滤,再将正常的流量回注到源站,从而保障源站服务器的稳定运行。 二、高防 IP 的工作原理 当用户的服务器遭受 DDoS 攻击时&#xff0…

Ubuntu22.04手动安装fabric release-2.5版本

这个过程稍微有点复杂,但完整操作完成以后会对Fabric网络有更加深入的理解,方便后续自己手动搭建Fabric网络。这个过程需要手动逐个下载Fabric源代码、使用命令下载Fabric镜像和用Git下载例子程序。 Fabric源代码主要用途是用来编译cryptogen、configtx…

redis的使用场景

目录 1. 热点数据缓存 1.1 什么是缓存? 1.2 缓存的原理 1.3 什么样的数据适合放入缓存中 1.4 哪个组件可以作为缓存 1.5 java使用redis如何实现缓存功能 1.5.1 需要的依赖 1.5.2 配置文件 1.5.3 代码 1.5.4 发现 1.6 使用缓存注解完成缓存功能 2. 分布式锁…

【Python Web】Flask扩展开发指南

Flask是一个轻量级的Python Web框架,它提供了丰富的扩展库和工具,可以帮助开发者快速构建Web应用。本篇博客将介绍如何进行Flask扩展开发,包括扩展的创建、配置、使用等方面的内容。 目录 Flask扩展开发指南 一、Flask扩展简介 二、创建Fl…

原子操作类(持续更新,未完结)

目录 基本类型原子类数组类型原子类引用类型原子类对象的属性修改原子类原子操作增强类LongAdder 高性能原理说明LongAdder源码深度解析LongAdder小总结 相关文献 分组来给大家讲解相关原子类的常用api使用,不会全部都讲完,只是抽取几个比较经典的讲一下…

c++树(三)重心

目录 重心的基础概念 定义:使最大子树大小最小的点叫做树的重心 树的重心求解方式 例题: 重心的性质 性质1:重心点的最大子树大小不大于整棵树大小的一半。 性质1证明: 性质1的常用推导 推导1: 推导2&#x…

AI绘画SD中 ControlNet 组件 IP-Adapter 实现风格迁移,AI绘画垫图神器!

大家好,我是画画的小强 今天给大家介绍一下AI绘画SD中ControlNet 的 IP-Adapter 组件,该组件可以方便快捷的帮我们对图片的风格进行迁移,简而言之就是可以参考你放置的图片风格来生成其他图片。 它的效果和reference only有点类似&#xff…

了解网络是如何运作

“Web 的工作原理”提供了一个简化的视图,用于了解在计算机或手机上的 Web 浏览器中查看网页时发生的情况。 这个理论对于短期内编写 Web 代码来说并不是必需的,但不久之后,你就会真正开始从理解后台发生的事情中受益。 客户端和服务器 连接到 Internet 的计算机称为客户端和…

四、面向对象2(30小时精通C++和外挂实战)

四、面向对象2(30小时精通C和外挂实战) B-01-对象的内存B-02-构造函数B-04-成员变量的初始化B-05-析构函数B-06-内存管理B-07-类的声明和实现分离B-08-命名空间B-09-继承B-10-成员访问权限 B-01-对象的内存 在C中对象可以自由的放在3中地方,而…

【算法】插入排序 与 希尔排序 概念+图解+代码【Python C C++】

1.插入排序 1.1概念 插入排序(InsertionSort),一般也被称为直接插入排序。 对于少量元素的排序,它是一个有效的算法。插入排序是一种最简单的排序方法,它的基本思想是将一个元素插入到已经排好序的有序表中,从而构造出一个新的…

mathtype7.4永久激活码(mathtype7永久注册码网盘下载)

大家好,我是你们的数学小能手!今天我要安利一款超实用的工具——MathType,让你在数学的世界里游刃有余,轻松搞定各种公式和计算。准备好被种草了吗?跟我一起来瞧瞧吧! MathType是理科生专用的必备工具&…

EXCEL 排名(RANK,COUNTIFS)

1.单列排序 需求描述:如有下面表格,需要按笔试成绩整体排名。 解决步骤: 我们使用RANK函数即可实现单列整体排名。 Number 选择第一列。 Ref 选择这一整列(CtrlShift向下箭头、再按F4)。 "确定"即可计算…

一键解锁百变发型!上交联合Tiamat震撼发布Stable-Hair发型移植黑科技!

Stable-Hair 是一种基于扩散的新型发型转移方法,可以稳健地转移各种现实世界的发型。在各种具有挑战性的发型上实现了高度详细和高保真度的转移,效果令人印象深刻,同时保留了原始身份内容和结构。 相关链接 论文链接: https://arxiv.org/pdf…

案例实践 | 基于长安链的福建省气象综合治理区块链平台

案例名称-【福建省气象综合治理区块链平台】 ■ 实施单位 福建福链科技有限公司 ■ 业主单位 福建省气象信息中心 ■ 上线时间 2023年10月 ■ 用户群体 福建省气象、防灾减灾相关单位 ■ 用户规模 全省2100余个气象站、气象局以及防灾减灾部门 案例背景与解决痛点 …

跟代码执行流程,读Megatron源码(四)megatron初始化脚本initialize.py之initialize_megatron()分布式环境初始化

在前文中,我们讲述了pretrain函数的执行流程,其首要步骤是megatron分组的初始化与环境的配置。本文将深入initialize_megatron函数源码,剖析其初始化分布式训练环境的内部机制。 注:在此假设读者具备3D并行相关知识 一. initiali…

【MARL】MADDPG + attention 实现(+论文解读)

文章目录 前言注意力机制论文里的attention回顾知识-MADDPG讲解1.Q的定义2.Q的恒等式3.论文里的attention4.好处 实现 和 修改结果展示原论文代码 翻改版修改后原maddpg代码 前言 导师让在MADDPG上加一个注意力机制,试了很多种,下面的参考的论文的效果最…

C++——保持原有库头文件不变的情况下,成功编译运行工程

问:想要保持原来库方式,应该怎么操作呢? 答:如果想保持原来的方式,则只需要将 库所在路径 tracker/detector/rknn_model_zoo/utils 加入到 工程库包含中即可。