FBDEV
Framebuffer device
社區(qū)參與度不高,基本轉(zhuǎn)移到了DRM。
DRM/KMS
Direct Rendering Manager / KernelMode Setting
主流的圖形顯示方法,社區(qū)參與度高,支持圖形系統(tǒng)精細(xì)化操作,基本形成了一套圖顯系統(tǒng)開(kāi)發(fā)的生態(tài)標(biāo)準(zhǔn)。
V4L2
Video For Linux 2
主要用于視頻捕獲的應(yīng)用場(chǎng)景,并且需要特定輸出設(shè)備,對(duì)復(fù)雜圖顯控制器的支持不佳
DRM系統(tǒng)組成 2 kernel層面的DRM系統(tǒng)包含兩大部分,一部分是圖顯設(shè)備的DRM抽象,另外一部分是圖顯設(shè)備的顯存控制。涵蓋了linux系統(tǒng)中DRM系統(tǒng)組成,kernel為用戶層提供標(biāo)準(zhǔn)的DRM接口,在用戶層依據(jù)DRM庫(kù)構(gòu)建各種圖顯協(xié)議,圖顯應(yīng)用層基于這些中間件完成應(yīng)用程序的開(kāi)發(fā)。
##顯存Framebuffer
申請(qǐng)的一塊用于存儲(chǔ)顯示數(shù)據(jù)的內(nèi)存區(qū)域,主要包括:
1)內(nèi)存區(qū)域大小范圍
2)內(nèi)存中待顯示數(shù)據(jù)的幀格式
3)內(nèi)存中有效的區(qū)域,該部分是待顯示數(shù)據(jù)
其實(shí)現(xiàn)方法主要有3種:
1)基于CMA的
drivers/gpu/drm/drm_fb_cma_helper.c
2)基于Scatter Gather
drivers/gpu/drm/tegra/
3)基于IOMMU
drivers/gpu/drm/exynos/exynos_drm_iommu.c
顯存區(qū)域定義
幀格式定義
支持的幀格式以FOURCC格式來(lái)呈現(xiàn),其定義形式如下:
1/*24bppRGB*/
2#defineDRM_FORMAT_RGB888fourcc_code('R','G','2','4')
3#defineDRM_FORMAT_BGR888fourcc_code('B','G','2','4')
4
5/*32bppRGB*/
6#defineDRM_FORMAT_XRGB8888fourcc_code('X','R','2','4')
7#defineDRM_FORMAT_XBGR8888fourcc_code('X','B','2','4')
8#defineDRM_FORMAT_RGBX8888fourcc_code('R','X','2','4')
9#defineDRM_FORMAT_BGRX8888fourcc_code('B','X','2','4')
創(chuàng)建FRAME BUFFER
創(chuàng)建成功可在dev下看見(jiàn)fb設(shè)備
##CRTC
CRTC funcs
1staticconststructdrm_crtc_funcsade_crtc_funcs={
2.destroy=drm_crtc_cleanup,
3.set_config=drm_atomic_helper_set_config,
4.page_flip=drm_atomic_helper_page_flip,
5.reset=drm_atomic_helper_crtc_reset,
6 .atomic_duplicate_state=drm_atomic_helper_crtc_duplicate_state,
7.atomic_destroy_state=drm_atomic_helper_crtc_destroy_state,
8.enable_vblank=ade_crtc_enable_vblank,
9.disable_vblank=ade_crtc_disable_vblank,
10};
CRTC helper funcs
1staticconststructdrm_crtc_helper_funcsade_crtc_helper_funcs={
2.mode_fixup=ade_crtc_mode_fixup,
3.mode_set_nofb=ade_crtc_mode_set_nofb,
4.atomic_begin=ade_crtc_atomic_begin,
5.atomic_flush=ade_crtc_atomic_flush,
6.atomic_enable=ade_crtc_atomic_enable,
7.atomic_disable=ade_crtc_atomic_disable,
8};
##PLANE
PLANE funcs
1staticstructdrm_plane_funcsade_plane_funcs={
2.update_plane=drm_atomic_helper_update_plane,
3.disable_plane=drm_atomic_helper_disable_plane,
4.destroy=drm_plane_cleanup,
5.reset=drm_atomic_helper_plane_reset,
6.atomic_duplicate_state=drm_atomic_helper_plane_duplicate_state,
7.atomic_destroy_state=drm_atomic_helper_plane_destroy_state,
8};
PLANE helper funcs
1staticconststructdrm_plane_helper_funcsade_plane_helper_funcs={
2.atomic_check=ade_plane_atomic_check,
3.atomic_update=ade_plane_atomic_update,
4.atomic_disable=ade_plane_atomic_disable,
5};
##ENCODER/CONNECTOR
ENCODER負(fù)責(zé)將CRTC輸出的timing時(shí)序轉(zhuǎn)換成外部設(shè)備所需要的信號(hào)的模塊,如HDMI轉(zhuǎn)換器。CONNECTOR 連接物理顯示設(shè)備的連接器,如HDMI、DisplayPort、DSI總線,通常和Encoder驅(qū)動(dòng)綁定在一起。
ENCODER/helper funcs
1staticconststructdrm_encoder_helper_funcsdw_encoder_helper_funcs={
2.atomic_check=dsi_encoder_atomic_check,
3.mode_valid=dsi_encoder_mode_valid,
4.mode_set=dsi_encoder_mode_set,
5.enable=dsi_encoder_enable,
6.disable=dsi_encoder_disable
7};
8
9staticconststructdrm_encoder_funcsdw_encoder_funcs={
10.destroy=drm_encoder_cleanup,
11};
CONNECTOR/helper funcs
1staticconststructdrm_connector_helper_funcs
2panel_bridge_connector_helper_funcs={
3.get_modes=panel_bridge_connector_get_modes,
4};
5
6staticconststructdrm_connector_funcspanel_bridge_connector_funcs={
7.reset=drm_atomic_helper_connector_reset,
8.fill_modes=drm_helper_probe_single_connector_modes,
9.destroy=drm_connector_cleanup,
10.atomic_duplicate_state=drm_atomic_helper_connector_duplicate_state,
11.atomic_destroy_state=drm_atomic_helper_connector_destroy_state,
12};
##ioctl注冊(cè)
component組件系統(tǒng) 3kernel中的component框架是為了subsystem能夠按照一定的順序初始化設(shè)備而提出的架構(gòu)。subsystem中由較多設(shè)備模塊組成,而內(nèi)核加載每個(gè)模塊時(shí)間不定。則需要component框架來(lái)保證需最后初始化的設(shè)備加載前,所需設(shè)備全部加載完畢。在component中,包含兩個(gè)基本概念,master和component。
master是設(shè)備樹(shù)中的“超級(jí)設(shè)備(superdevice)”,負(fù)責(zé)管理該超級(jí)設(shè)備下的普通設(shè)備。component是由master管理的普通設(shè)備,要先初始化。
#初始化分為兩部分
master即超級(jí)設(shè)備,執(zhí)行probe使用component_master_add_with_match函數(shù)注冊(cè)自己到component框架中。component即普通設(shè)備,執(zhí)行probe使用component_add函數(shù)注冊(cè)自己到component框架中。
##Master初始化
1staticintkirin_drm_platform_probe(structplatform_device*pdev)
2{
3structdevice*dev=&pdev->dev;
4structdevice_node*np=dev->of_node;
5structcomponent_match*match=NULL;
6structdevice_node*remote;
7
8remote=of_graph_get_remote_node(np,0,0);
9if(!remote)
10return-ENODEV;
11
12drm_of_component_match_add(dev,&match,compare_of,remote);
13of_node_put(remote);
14
15returncomponent_master_add_with_match(dev,&kirin_drm_ops,match);
16}
##Component初始化
1staticintdsi_probe(structplatform_device*pdev)
2{
3structdsi_data*data;
4structdw_dsi*dsi;
5structdsi_hw_ctx*ctx;
6intret;
7
8data=devm_kzalloc(&pdev->dev,sizeof(*data),GFP_KERNEL);
9if(!data){
10DRM_ERROR("failedtoallocatedsidata.
");
11return-ENOMEM;
12}
13dsi=&data->dsi;
14ctx=&data->ctx;
15dsi->ctx=ctx;
16
17ret=dsi_parse_dt(pdev,dsi);
18if(ret)
19returnret;
20
21platform_set_drvdata(pdev,data);
22
23returncomponent_add(&pdev->dev,&dsi_ops);
24}
##設(shè)備樹(shù)定義
圖顯系統(tǒng)設(shè)備樹(shù)定義要遵循component框架的定義,使得各個(gè)組件能夠組成一個(gè)完成的拓?fù)浣Y(jié)構(gòu)。
1ade:ade@f4100000{
2compatible="hisilicon,hi6220-ade";
3reg=<0x00xf41000000x00x7800>;
4reg-names="ade_base";
5hisilicon,noc-syscon=<&medianoc_ade>;
6resets=<&media_ctrl?MEDIA_ADE>;
7interrupts=<01154>;/*ldiinterrupt*/
8
9clocks=<&media_ctrl?HI6220_ADE_CORE>,
10<&media_ctrl?HI6220_CODEC_JPEG>,
11<&media_ctrl?HI6220_ADE_PIX_SRC>;
12/*clockname*/
13clock-names="clk_ade_core",
14"clk_codec_jpeg",
15"clk_ade_pix";
16
17assigned-clocks=<&media_ctrl?HI6220_ADE_CORE>,
18<&media_ctrl?HI6220_CODEC_JPEG>;
19assigned-clock-rates=<360000000>,<288000000>;
20dma-coherent;
21status="disabled";
22
23port{
24ade_out:endpoint{
25remote-endpoint=<&dsi_in>;
26};
27};
28};
29
30dsi:dsi@f4107800{
31compatible="hisilicon,hi6220-dsi";
32reg=<0x00xf41078000x00x100>;
33clocks=<&media_ctrl??HI6220_DSI_PCLK>;
34clock-names="pclk";
35status="disabled";
36
37ports{
38#address-cells=<1>;
39#size-cells=<0>;
40
41/*0forinputport*/
42port@0{
43reg=<0>;
44dsi_in:endpoint{
45remote-endpoint=<&ade_out>;
46};
47};
48};
49};
modetest
4是由libdrm提供的測(cè)試程序,可以查詢顯示設(shè)備的支持狀況,進(jìn)行基本的顯示測(cè)試,以及設(shè)置顯示的模式。
編輯:jq
-
控制器
+關(guān)注
關(guān)注
112文章
16332瀏覽量
177806 -
數(shù)據(jù)
+關(guān)注
關(guān)注
8文章
7002瀏覽量
88941 -
Linux
+關(guān)注
關(guān)注
87文章
11292瀏覽量
209326 -
DRM
+關(guān)注
關(guān)注
0文章
46瀏覽量
15108
原文標(biāo)題:Linux 中基于 DRM 的圖形顯示系統(tǒng)概述
文章出處:【微信號(hào):LinuxHub,微信公眾號(hào):Linux愛(ài)好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論