FBDEV
Framebuffer device
社区参与度不高,基本转移到了DRM。
DRM/KMS
Direct Rendering Manager / KernelMode Setting
主流的图形显示方法,社区参与度高,支持图形系统精细化操作,基本形成了一套图显系统开发的生态标准。
V4L2
Video For Linux 2
主要用于视频捕获的应用场景,并且需要特定输出设备,对复杂图显控制器的支持不佳
DRM系统组成 2 kernel层面的DRM系统包含两大部分,一部分是图显设备的DRM抽象,另外一部分是图显设备的显存控制。涵盖了linux系统中DRM系统组成,kernel为用户层提供标准的DRM接口,在用户层依据DRM库构建各种图显协议,图显应用层基于这些中间件完成应用程序的开发。
##显存Framebuffer
申请的一块用于存储显示数据的内存区域,主要包括:
1)内存区域大小范围
2)内存中待显示数据的帧格式
3)内存中有效的区域,该部分是待显示数据
其实现方法主要有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
显存区域定义
帧格式定义
支持的帧格式以FOURCC格式来呈现,其定义形式如下:
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')
创建FRAME BUFFER
创建成功可在dev下看见fb设备
##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负责将CRTC输出的timing时序转换成外部设备所需要的信号的模块,如HDMI转换器。CONNECTOR 连接物理显示设备的连接器,如HDMI、DisplayPort、DSI总线,通常和Encoder驱动绑定在一起。
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注册
component组件系统 3kernel中的component框架是为了subsystem能够按照一定的顺序初始化设备而提出的架构。subsystem中由较多设备模块组成,而内核加载每个模块时间不定。则需要component框架来保证需最后初始化的设备加载前,所需设备全部加载完毕。在component中,包含两个基本概念,master和component。
master是设备树中的“超级设备(superdevice)”,负责管理该超级设备下的普通设备。component是由master管理的普通设备,要先初始化。
#初始化分为两部分
master即超级设备,执行probe使用component_master_add_with_match函数注册自己到component框架中。component即普通设备,执行probe使用component_add函数注册自己到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}
##设备树定义
图显系统设备树定义要遵循component框架的定义,使得各个组件能够组成一个完成的拓扑结构。
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提供的测试程序,可以查询显示设备的支持状况,进行基本的显示测试,以及设置显示的模式。
编辑:jq
-
控制器
+关注
关注
112文章
16090浏览量
177016 -
数据
+关注
关注
8文章
6795浏览量
88730 -
Linux
+关注
关注
87文章
11199浏览量
208691 -
DRM
+关注
关注
0文章
46浏览量
15093
原文标题:Linux 中基于 DRM 的图形显示系统概述
文章出处:【微信号:LinuxHub,微信公众号:Linux爱好者】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论