1. 程式人生 > >[RK3399][Android7.1] Display系統中的DRM模組介紹

[RK3399][Android7.1] Display系統中的DRM模組介紹

    https://blog.csdn.net/kris_fei/article/details/79046380

OS: Android 7.1 Board: Firefly-RK3399 Kernel: v4.4.55

DRM介紹: DRM全稱 Direct Rendering Manager, 是device-independent核心級別驅動,核心提供直接訪問硬體的許可權, 原本是設計提供給PC使用來支援複雜的圖形裝置,後來也用於嵌入式系統上。 PC一般都有顯示卡並且有自己的video memory,而嵌入式系統沒有。

DRM組成:

    KMS(Kernel Mode Setting): 改變解析度和位深     DRI(Direct Rendering Infrastructure): 直接訪問硬體介面     GEM(Graphics Execution Manager): 記憶體管理     DRM Driver in kernel side: 訪問硬體

沒有DRM,嵌入式系統怎麼實現顯示和記憶體管理?

    Display:基於Linux Framebuffer     Multimedia: 基於V4L2     Buffer Manager: 基於ION, PMEM等

為什麼要選擇DRM?

    社群一直在維護     在顯示部分提供細粒度控制     user-space graphic使用很廣     提供一整套高階features

為什麼不選擇FBDEV或者V4L2?

    FBDEV: 社群維護者較少; 無法提供overlay hw cursor等features; 開發者鼓勵以後遷移到DRM/KMS上。     V4L2: 主要用於video模組,display模組有點大材小用。

DRM優勢在哪裡?

    通過單單一個device node來控制所有硬體裝置     通用訪問硬體介面     通用記憶體管理機制

KMS Framework組成:

    Framebuffer,CRTC,Encoder和Connector,以及Plane和drm device。

各個模組在框架中的位置如下圖:

    Framebuffer:     記憶體資訊如寬,高,bpp等。     程式碼中由 struct drm_framebuffer 表示,     在rockchip_drm_fbdev_create()@rockchip_drm_fbdev.c中建立。

    CRTC:     之前代表的是CRT controller,目前主要用於顯示控制,如用於display timings,     resolution的配置,將framebuffer內容送到display,更新framebuffer等。     在程式碼中由struct drm_crtc_funcs 和 struct drm_crtc_helper_funcs兩個結構來表示。     在vop_create_crtc()@rockchip_drm_vop.c中建立。

    Encoder:     將資料轉換成合適的格式,送給connector,比如HDMI需要TMDS資訊, encoder就將資料轉成HDMI需要的TMDS格式。     在程式碼中由struct drm_encoder_funcs和struct drm_encoder_helper_funcs兩個結構表示。     因為和connnector有相當緊密的關係,所以它的註冊放在各個connector的驅動檔案中,如rockchip_dp_drm_create_encoder()@analogix_dp-rockchip.c

    Connector:     代表具體外部介面,如edp, hdmi, mipi等。用於傳輸訊號給外部硬體顯示裝置,探測外部顯示裝置接入。     在程式碼中由struct drm_connector_funcs 和 struct drm_connector_helper_funcs表示。     目前有rockchip_lvds.c, analogix_dp-rockchip.c, cdn-dp-core.c , dw-mipi-dsi.c, dw_hdmi-rockchip.c這幾個驅動檔案。     analogix_dp-rockchip.c的註冊放在了analogix_dp_core.c 中,會通過rockchip_dp_bind()間接呼叫到。

Encoder和Connector這兩個模組有些內容會重疊在一起,所以很難清晰劃分開來。

Planes: 一個Plane代表一個image layer, 最終的image由一個或者多個Planes組成。 不同型別的Planes:

    DRM_PLANE_TYPE_PRIMARY: 一定要有,由於顯示背景或者影象內容     DRM_PLANE_TYPE_OVERLAY: 用於顯示Overlay     DRM_PLANE_TYPE_CURSOR: 用於顯示滑鼠

程式碼中由struct drm_plane_funcs 表示。 在vop_plane_init()@Rockchip_drm_vop.c中建立註冊。

    drm device:     處理使用者空間的請求。     在程式碼中由struct drm_driver表示執行。     在rockchip_drm_bind()@Rockchip_drm_drv.c 建立和註冊。