天天看點

rk3399drm使用

介紹

1.Direct Rendering Manager

The Direct Rendering Manager (DRM) is a subsystem of the Linux kernel responsible for interfacing with GPUs of modern video cards. DRM exposes an API that user-space programs can use to send commands and data to the GPU and perform operations such as configuring the mode setting of the display. DRM was first developed as the kernel-space component of the X Server Direct Rendering Infrastructure,[1] but since then it has been used by other graphic stack alternatives such as Wayland.

User-space programs can use the DRM API to command the GPU to do hardware-accelerated 3D rendering and video decoding, as well as GPGPU computing.1.DRM - Direct Rendering Manager

DRM是一個核心級的裝置驅動,既可以編譯到核心中也可以作為标準子產品進行加載。DRM最初是在FreeBSD中出現的,後來被移植到Linux系統中,并成為Linux系統的标準部分。

DRM是Linux目前主流的圖形顯示架構,相比FB架構,DRM更能适應目前日益更新的顯示硬體。比如FB原生不支援多層合成,不支援VSYNC,不支援DMA-BUF,不支援異步更新,不支援fence機制等等,而這些功能DRM原生都支援。同時DRM可以統一管理GPU和Display驅動,使得軟體架構更為統一,友善管理和維護。

DRM從子產品上劃分,可以簡單分為3部分:libdrm、KMS、GEM。

  

rk3399drm使用
libdrm
對底層接口進行封裝,向上層提供通用的API接口,主要是對各種IOCTL接口進行封裝。

KMS
Kernel Mode Setting,所謂Mode setting,其實說白了就兩件事:更新畫面和設定顯示參數。
更新畫面:顯示buffer的切換,多圖層的合成方式,以及每個圖層的顯示位置。
設定顯示參數:包括分辨率、重新整理率、電源狀态(休眠喚醒)等。

GEM
Graphic Execution Manager,主要負責顯示buffer的配置設定和釋放,也是GPU唯一用到DRM的地方
           

3.1.基本元素

DRM架構涉及到的元素很多,大緻如下:

KMS:CRTC,ENCODER,CONNECTOR,PLANE,FB,VBLANK,property
GEM:DUMB、PRIME、fence
           
rk3399drm使用
rk3399drm使用

3.2.接口介紹

connector–>encoder–>crtc–>framebuffer的順序倒過來介紹:

3.2.1.Connector

Connector是和顯示器連接配接的實體接口,常見的有VGA/HDMI/DVI/DP等。以HDMI為例,HDMI的接口信号主要由以下幾組信号組成:

1組TMDS clock:差分時鐘用于同步信号驅動;
3組TMDS data:查分資料傳輸視訊信号;
1組I2C:用于EDID的擷取;
1組音頻總線;

注:EDID全稱是Extended Display Identification Data(擴充顯示辨別資料),目的是讓視訊信号輸出裝置輸出前擷取到存儲在顯示器内部的相關參數,如支援的分辨率、幀率、圖像格式:RGB等,是以,整個輸出的控制參數是由以下幾個部分綜合決定的:
1.通過connector讀出的顯示器支援的參數;
2.核心靜态配置或devicetree傳入的參數;
3.使用者空間輸入的參數
           

HDMI類型的connector的任務就是輸出顯示器解碼晶片所需的信号時序(主要是TMDS clock以及TMDS data)。

3.2.2.Encoder

Encoder就是将一定格式的圖像信号(如RGB、YUV等)編碼成connector需要輸出的信号。以HDMI為例,幀/行同步/顯示内容都是通過TMDS data的串行總線輸出的,那麼并行的時序按照HDMI的标準編碼為串行順序則是Encoder的任務。

3.2.3.CRTC

CRTC的任務是從Framebuffer中讀出待顯示的圖像,并按照相應的格式輸出給Encoder。

3.2.4.Planes

Plane其實就是圖層,實際輸出的圖像往往由多個圖層疊加而成,比如主圖層,顯示光标的圖層,其中有些圖層由硬體加速子產品生成,本例中不涉及,是以所有plane的相關操作都由軟體實作,不涉及到任何硬體結構。

3.2.5.Framebuffer

Framebuffer對應着存儲空間中的圖像資料,此處對應硬體為DDR。

rk3399drm使用

1、使用drm如何做多圖層顯示且每個圖層對應一個buffer?

2、如何将解碼資料給到drm進行顯示(dma 零拷貝)?

3、如何更新drm視窗及移動位置?