Drm框架介绍

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

Drm的组成

DRM主要模块可以分为:libdrm、KMS、GEM

drm显示架构 drm框架_linux drm

libdrm

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

KMS

KMS(Kernel Mode Setting)主要负责相关参数的设置(包括分辨率、刷新率、电源状态(休眠唤醒)等)和显示画面的切换(显示buffer的切换,多图层的合成方式,以及每个图层的显示位置)。

GEM

Graphic Execution Manager,主要负责显示buffer的分配和释放,也是GPU唯一用到DRM的地方。

drm的主要元素

元素

说明

CRTC

对显示buffer进行扫描,并产生时序信号的硬件模块,通常指Display Controller(vop)

ENCODER

负责将CRTC输出的timing时序转换成外部设备所需要的信号的模块,如HDMI转换器或DSI Controller

CONNECTOR

连接物理显示设备的连接器,如HDMI、DisplayPort、DSI总线,通常和Encoder驱动绑定在一起

PLANE

硬件图层,有的Display硬件支持多层合成显示,但所有的Display Controller至少要有1个plane

FB Framebuffer

单个图层的显示内容,唯一一个和硬件无关的基本元素

VBLANK

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

property

需要设置的参数,都可以做成property,是DRM驱动中最灵活、最方便的Mode setting机制

DUMB

只支持连续物理内存,基于kernel中通用CMA API实现,多用于小分辨率简单场景

PRIME

连续、非连续物理内存都支持,基于DMA-BUF机制,可以实现buffer共享,多用于大内存复杂场景

fence

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

相关的例子可以参考uboot 显示logo例子,介绍了显示各部分具体内容