加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專(zhuān)業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長(zhǎng)期合作伙伴
立即加入
  • 正文
    • 一、準(zhǔn)備工作
    • 二、modetest 使用示例
    • 三、編寫(xiě)最簡(jiǎn)單的 DRM 應(yīng)用
    • 四、DRM 應(yīng)用如何呼叫到 Rockchip DRM driver?
    • 五、相關(guān)參考
    • 思考技術(shù),也思考人生
  • 推薦器件
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

RK3399探索之旅 Display子系統(tǒng) 從modetest 到 DRM driver

2021/01/05
2066
閱讀需 12 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

modetest 是由 libdrm 提供的測(cè)試程序,可以查詢顯示設(shè)備的特性,進(jìn)行基本的顯示測(cè)試,以及設(shè)置顯示的模式。

我們可以借助該工具來(lái)學(xué)習(xí) Linux DRM 應(yīng)用編程,另外為了深入分析 Rockchip DRM driver,有必要先了解一下這個(gè)工具的使用方法和內(nèi)部實(shí)現(xiàn)。

本文目錄:

一、準(zhǔn)備工作

二、modetest?使用示例
?1.?查看幫助信息
?2.?查看組件的信息
?3.?在?HDMI?上顯示
?4.?在?eDP?上顯示


三、編寫(xiě)最簡(jiǎn)單的?DRM?應(yīng)用


四、DRM 應(yīng)用如何呼叫到 Rockchip DRM driver?


五、相關(guān)參考

一、準(zhǔn)備工作

在 NanoPC T4 + Linux-4.4 上:

接好 eDP 屏以及 HDMI 顯示器;

退出所有占用 /dev/dri/card0 的程序;

編譯 modetest

$?git?clone?https://gitlab.freedesktop.org/mesa/drm
$?apt-get?install?meson
$?meson?builddir/
$?ninja?-C?builddir/?install

二、modetest 使用示例

1. 查看幫助信息

$?modetest?-h
usage:?modetest?[-acDdefMPpsCvrw]

Query?options:

-c??????list?connectors
-e??????list?encoders
-f??????list?framebuffers
-p??????list?CRTCs?and?planes?(pipes)

Test?options:
????...
Generic?options:

-d??????drop?master?after?mode?set
-M?module???????use?the?given?driver
-D?device???????use?the?given?device

Default?is?to?dump?all?info.

2. 查看組件的信息

$?modetest?-M?rockchip
Encoders:
id??????crtc????type????possible?crtcs??possible?clones
76??????54??????TMDS????0x00000001??????0x00000000
78??????0???????TMDS????0x00000003??????0x00000000
80??????65??????TMDS????0x00000002??????0x00000000

Connectors:
????...

參數(shù)說(shuō)明:

  • -M:用于指定訪問(wèn) rockchip DRM driver

關(guān)鍵內(nèi)容:

Encoders / Connectors / CRTCs / Planes 的 id,modetest 通過(guò) id 來(lái)用于引用這些組件。

Connectors 的 modes/props:

CRTCs 的 props;

Planes 的 formats/props;

  • prop: 任何你想設(shè)置的參數(shù),都可以做成 property,是 DRM 驅(qū)動(dòng)中最靈活、最方便的 Mode setting 機(jī)制;

modes: 顯示模式,mode 里包含分辨率 / 刷新率等顯示相關(guān)的信息;

各組件的 id:

$?modetest?-M?rockchip?|?cut?-f1?|?grep?-E?^[0-9A-Z]|id

Encoders:
?id
?90,?edp?encoder
?92,?hdmi?encoder
?100,?dp?encoder
Connectors:
?id
?91,?edp?connector
?93,?hdmi?connector
?101,?dp?connector
CRTCs:
?id
?64,?vop?crtc
?83,?vop?crtc
Planes:
?id
?58
?61
?65
?68
?80
?84
Frame?buffers:
?id

3. 在 HDMI 上顯示

$?modetest?-M?rockchip?-s?93@64:1920x1080
$?modetest?-M?rockchip?-s?93@64:#1???//?相同的效果

參數(shù)說(shuō)明:

-s [,][@]:[#][-][@

]

:用于在指定的 pipeline 上以某個(gè) mode 顯示某個(gè) pattern 的畫(huà)面。

93:HDMI connector id

64:某個(gè) VOP 的 crtc id

1920x1080:顯示 mode;

HDMI connector 下其他可選的 mode:

#0?1920x1080?60.00
#1?1920x1080?59.94
#2?1920x1080i?30.00
#3?1920x1080i?29.97
...
#24?640x480?60.00
#25?640x480?59.94
#26?720x400?70.08

顯示效果:

點(diǎn)擊查看大圖

4. 在 eDP 上顯示

$?modetest?-M?rockchip?-s?91@83:1920x1080

參數(shù)說(shuō)明:

91:eDP connector id

83:另外一個(gè) VOP 的 crtc id

1920x1080:顯示 mode;

顯示效果:

點(diǎn)擊查看大圖

三、編寫(xiě)最簡(jiǎn)單的 DRM 應(yīng)用

主程序

int?main(int?argc,?char?**argv)
{
?int?fd;
?drmModeConnector?*conn;
?drmModeRes?*res;
?uint32_t?conn_id;
?uint32_t?crtc_id;

????//?1.?打開(kāi)設(shè)備
?fd?=?open("/dev/dri/card0",?O_RDWR?|?O_CLOEXEC);

????//?2.?獲得?crtc?和?connector?的?id
?res?=?drmModeGetResources(fd);
?crtc_id?=?res->crtcs[0];
?conn_id?=?res->connectors[0];

????//?3.?獲得?connector
?conn?=?drmModeGetConnector(fd,?conn_id);
?buf.width?=?conn->modes[0].hdisplay;
?buf.height?=?conn->modes[0].vdisplay;

????//?4.?創(chuàng)建?framebuffer
?modeset_create_fb(fd,?&buf);

????//?5.?Sets?a?CRTC?configuration,這之后就會(huì)開(kāi)始在?crtc0?+?connector0?pipeline?上進(jìn)行以?mode0?輸出顯示
?drmModeSetCrtc(fd,?crtc_id,?buf.fb_id,?0,?0,?&conn_id,?1,?&conn->modes[0]);

?getchar();

?//?6.?cleanup
?...

?return?0;
}

modeset_create_fb():

該函數(shù)用于分配 framebuffer,目前不需要太關(guān)心,大致就是 3 個(gè)步驟:

  • Allocating memory;Preparing a mapping;Mapping memory;

運(yùn)行效果:

程序運(yùn)行后,eDP 屏顯示全屏白色,等待用戶輸入按鍵;當(dāng)用戶按下任意按鍵后,程序退出,顯示黑屏。

四、DRM 應(yīng)用如何呼叫到 Rockchip DRM driver?

drmModeSetCrtc() 到 CRTC driver:

點(diǎn)擊查看大圖

每一個(gè) DRM CRTC Driver(例如 Rockchip VOP driver) 里都會(huì)定義一個(gè) struct drm_crtc_funcs 結(jié)構(gòu)體,其中的 .set_config 都指向 drm_atomic_helper_set_config(),接下來(lái)就是 DRM core 開(kāi)始工作了。

五、相關(guān)參考

《RK3399 探索之旅 / Display 子系統(tǒng) / 基礎(chǔ)概念》

小龍兄的博客:https://blog.csdn.net/hexiaolong2009/article/details/83721242

nvidia 的文檔:https://docs.nvidia.com/drive/nvvib_docs

Linux man 手冊(cè):man 7 drm

思考技術(shù),也思考人生

要學(xué)習(xí)技術(shù),更要學(xué)習(xí)如何生活。

你和我各有一個(gè)蘋(píng)果,如果我們交換蘋(píng)果的話,我們還是只有一個(gè)蘋(píng)果。但當(dāng)你和我各有一個(gè)想法,我們交換想法的話,我們就都有兩個(gè)想法了。

對(duì) 嵌入式系統(tǒng) (Linux、RTOS、OpenWrt、Android) 和 開(kāi)源軟件 感興趣,關(guān)注公眾號(hào):嵌入式 Hacker。

覺(jué)得文章對(duì)你有價(jià)值,不妨點(diǎn)個(gè) 在看和贊。

推薦器件

更多器件
器件型號(hào) 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊(cè) ECAD模型 風(fēng)險(xiǎn)等級(jí) 參考價(jià)格 更多信息
PL500-16SC 1 Microchip Technology Inc VCXO, CLOCK, LVCMOS OUTPUT
暫無(wú)數(shù)據(jù) 查看
DS2431P+ 1 Maxim Integrated Products EEPROM, 1KX1, Serial, CMOS, PDSO6, ROHS COMPLIANT, TSOC-6
$5.42 查看
LTC6993HS6-1#TRMPBF 1 Analog Devices Inc LTC6993HS6-1#TRMPBF

ECAD模型

下載ECAD模型
$5.14 查看

相關(guān)推薦

電子產(chǎn)業(yè)圖譜