1、 DRM簡(jiǎn)介(Direct Rendering Manager)
傳統(tǒng)linux顯示設(shè)備驅(qū)動(dòng)開(kāi)發(fā)時(shí),通常使用FB驅(qū)動(dòng)架構(gòu),隨著顯卡性能升級(jí):顯示覆蓋(菜單層級(jí))、GPU加速、硬件光標(biāo),傳統(tǒng)FB架構(gòu)無(wú)法很好支持,此外,對(duì)于多應(yīng)用的訪問(wèn)沖突也無(wú)法很好控制。在這樣的背景下,DRM應(yīng)用而生。
DRM是linux內(nèi)核中負(fù)責(zé)與顯卡交互的管理架構(gòu),用戶空間很方便的利用DRM提供的API,實(shí)現(xiàn)3D渲染、視頻解碼和GPU計(jì)算等工作。
1.1 DRM發(fā)展歷史
1999年,Precision Insight公司首次為 XFree86 4.0 Server 開(kāi)發(fā) DRI 顯示框架,用于更好的適配 3DFX 公司顯卡,初版DRM代碼產(chǎn)出后,接下來(lái)的幾年時(shí)間里,DRM 所支持的顯卡列表不斷被擴(kuò)充。
2008年10月,Linux kernel 2.6.27 進(jìn)行了一次重大的源碼重組:DRM 的整套源碼被放到了/drivers/gpu/drm/目錄下,不同的GPU廠商代碼也被放到了各自子目錄下。
2014年6月,Atomic API 被添加到Linux 3.16,許多驅(qū)動(dòng)也都轉(zhuǎn)而使用這些新的 API。
2018年,又有10個(gè)基于 atomic 框架的 DRM 新增驅(qū)動(dòng)被添加到Linux kernel。
1.2 DRM架構(gòu)對(duì)比FB架構(gòu)優(yōu)勢(shì)
DRM是目前Linux的主流圖形顯示框架,相比于傳統(tǒng)FB架構(gòu),DRM允許多個(gè)程序同時(shí)使用視頻硬件資源,管理多個(gè)程序的資源請(qǐng)求、訪問(wèn),綜上所述DRM更能適應(yīng)日益更新的顯示硬件,DRM優(yōu)勢(shì)主要體現(xiàn):
DRM原生支持多圖層合成,F(xiàn)B原生不支持多層合成。
FB不支持VSYNC、DMA-BUF、異步更新和fence機(jī)制,但DRM原生都支持。
DRM統(tǒng)一管理GPU和Display驅(qū)動(dòng),讓軟件升級(jí)、維護(hù)和管理更加方便。
1.3 DRM圖形顯示框架
DRM檢測(cè)到的每個(gè)GPU都作為DRM設(shè)備,并為之創(chuàng)建一個(gè)設(shè)備文件/dev/dri/cardX與之連接,從整體架構(gòu)上來(lái)看主要分為3個(gè)主要部分:
libdrm (接口庫(kù))
對(duì)底層接口進(jìn)行封裝,向上層提供通用的API接口,主要是對(duì)各種IOCTL接口進(jìn)行封裝,便于重用與代碼共享。
KMS (Kernel Mode Setting)
正常工作時(shí),需要設(shè)置顯卡或者圖形適配器的模式,主要體現(xiàn)在以下兩個(gè)方面:
更新畫(huà)面:顯示buffer的切換,多圖層的合成方式控制,以及每個(gè)圖層的顯示位置。
設(shè)置顯示參數(shù):包括分辨率、刷新率、電源狀態(tài)(休眠喚醒)等。
GEM (Graphics Execution Manager)
提供內(nèi)存管理方法,主要負(fù)責(zé)顯示buffer的分配和釋放。
圖1.1 DRM圖形顯示框架總覽
1.4 DRM圖形顯示框架涉及元素
本章節(jié)介紹DRM框架中的一些重點(diǎn)模塊的功能與在顯示鏈路中的作用,下圖為APP調(diào)用DRM到屏幕顯示的流程框圖。
圖1.2 DRM圖形顯示框架框圖
下表對(duì)DRM中KMS和GEM兩個(gè)模型的不同組件進(jìn)行概述性說(shuō)明,輔以高通平臺(tái)代碼層級(jí)的對(duì)應(yīng)關(guān)系說(shuō)明,以加深架構(gòu)與流程之間的對(duì)應(yīng)聯(lián)系。
2 、DRM驅(qū)動(dòng)框架
2.1 DRM驅(qū)動(dòng)對(duì)象介紹
DRM內(nèi)部的Objects是組成DRM框架的核心,下圖中藍(lán)色部分為物理硬件的抽象,棕色部分則為軟件的抽象,其中GEM結(jié)構(gòu)體為:drm_gem_object,其余部分位于結(jié)構(gòu)體drm_mode_object中.
PS:drm_panel不屬于object范疇,只是為了降低LCD驅(qū)動(dòng)與encoder驅(qū)動(dòng)間的耦合,是一堆回調(diào)函數(shù)集合。
圖2.1 DRM核心組件介紹
2.2 DRM抽象硬件如何關(guān)聯(lián)DRM Object
DRM的objects并不難理解,重要的是如何將實(shí)際的硬件與這些object進(jìn)行關(guān)聯(lián),下面會(huì)以MIPI DSI接口為例進(jìn)行介紹軟件架構(gòu)與DRM object的對(duì)應(yīng)關(guān)系。
圖2.2 典型MIPI DSI接口硬件連接圖
圖2.3 硬件與DRM Objects對(duì)應(yīng)圖
其中組件說(shuō)明:
3 、DRM簡(jiǎn)單示例
DRM代碼非常龐大,顯卡邏輯也非常復(fù)雜,在學(xué)習(xí)DRM架構(gòu)時(shí),需要通過(guò)實(shí)踐對(duì)DRM的流程進(jìn)行理解,以達(dá)到事半功倍的效果。
下面會(huì)以模式設(shè)置案例,對(duì)DRM架構(gòu)的流程進(jìn)行解析。modeset主要流程如下:
圖3.1 DRM Modeset流程總覽
3.1 打開(kāi)DRM設(shè)備文件
DRM框架成功加載后,會(huì)創(chuàng)建一個(gè)設(shè)備文件/dev/dri/card0,上層用戶應(yīng)用可以通過(guò)該文件節(jié)點(diǎn),獲取顯卡的各種操作。
3.2 獲取顯卡資源句柄
打開(kāi)DRM設(shè)備文件后,通過(guò)以下函數(shù)獲取顯卡的資源句柄,進(jìn)而進(jìn)行顯卡資源的操作。
3.3 獲取connectorId
獲取了drmModeRes后,獲取它的連接對(duì)象。
3.4 創(chuàng)建FrameBuffer
創(chuàng)建FrameBuffer后,然后映射一片內(nèi)存,對(duì)這塊內(nèi)存進(jìn)行像素?cái)?shù)據(jù)填充。
3.5 設(shè)置Crtc模式
FB創(chuàng)建成功并進(jìn)行清0操作,可以在里面填充任何數(shù)據(jù),然后設(shè)置CRTC后,F(xiàn)B的內(nèi)容就可以顯示在屏幕。
CRTC模式設(shè)置函數(shù):drmModeSetCrtc(),參數(shù)為:fd、crtc句柄、FB句柄、XY坐標(biāo)等。
3.6 資源清理工作(非必需)
顯示完成后,GUI會(huì)一直運(yùn)行,一般不必實(shí)施資源清理工作。
本章小結(jié)
本文介紹了DRM架構(gòu)的發(fā)展歷史、驅(qū)動(dòng)框架以及簡(jiǎn)單示例,旨在幫助讀者了解DRM架構(gòu)的形成、功能流程實(shí)現(xiàn),DRM代碼龐大且復(fù)雜,想要深入理解它的內(nèi)涵,最好的辦法就是根據(jù)實(shí)際需求來(lái)進(jìn)行代碼流程梳理,后續(xù)章節(jié)也會(huì)對(duì)該部分進(jìn)行展開(kāi)講解。
此外,DRM架構(gòu)符合功能日益強(qiáng)大的現(xiàn)代顯示設(shè)備,但仍有很多老的設(shè)備以及軟件需要FB支持,在目前DRM框架中,會(huì)存在模擬FB設(shè)備的代碼。
審核編輯:郭婷
-
Linux
+關(guān)注
關(guān)注
87文章
11292瀏覽量
209326 -
API
+關(guān)注
關(guān)注
2文章
1499瀏覽量
61962 -
DRM
+關(guān)注
關(guān)注
0文章
46瀏覽量
15108
原文標(biāo)題:DRM架構(gòu)介紹(一)
文章出處:【微信號(hào):LinuxDev,微信公眾號(hào):Linux閱碼場(chǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論