Advertisement

C C++最全Linux 中基于 DRM 的图形显示系统概述_atomic_enable(2),2024年最新腾讯架构师首发

阅读量:
img
img

网上学习资料虽然丰富,但若所学知识缺乏系统性,在遇到技术问题时往往只能做到蜻蜓点水式的了解,并且无法深入探究其本质和深层原因,则难以实现专业能力的提升.

建议有需求的读者点击此处获取详细整理的资料

建议有需求的读者点击此处获取详细整理的资料

单个人的能力有限, 但团队合作的重要性更加凸显!无论你是IT行业的资深从业者还是新手初学者, 都诚挚邀请您加入我们的平台(专业交流, 优质资源库, 工作感悟分享区, 企业内推渠道, 求职指导服务), 让我们共同成长进步!

7 .atomic_disable = ade_crtc_atomic_disable,
8};

复制代码
    
    **##PLANE**
![]()
    
    
    *图片来源于网络* ***========================***
    
    
    
    PLANE funcs

1static struct DRM PLANE FUNCs ADE PLANE FUNCs = {
2 .updatePlane : DRM_ATOMIC_HELPER_UPDATE_PLANE,
3 .disablePlane : DRM_ATOMIC_HELPER_DISABLE_PLANE,
4 .destroy : DRM_PLANE_Cleanup,
5 .reset : DRM_ATOMIC_HELPER_PLANE_RESET,
6 ._atomic_duplicateState : DRM_ATOMIC_HELPER_PLANE_DUPLICATE_STATE,
7 ._atomic_destroyState : DRM_ATOMIC_HELPER_PLANE_DESTROY_STATE,
8};

复制代码
    
    PLANE helper funcs

1static const type DRMPlaneHelperFuncs = {
2 DRMPlaneHelperFuncs::AtomicCheck = adePlaneAtomicCheck,
3 DRMPlaneHelperFuncs::AtomicUpdate = adePlaneAtomicUpdate,
4 DRMPlaneHelperFuncs::AtomicDisable = adePlaneAtomicDisable,
5};

复制代码
    
    **##ENCODER/CONNECTOR**
    
    
    ENCODER负责将CRTC输出的timing时序转换成外部设备所需要的信号的模块,如HDMI转换器。CONNECTOR   连接物理显示设备的连接器,如HDMI、DisplayPort、DSI总线,通常和Encoder驱动绑定在一起。
![]()
    
    
    *图片来源于网络* ***========================***
    
    
    
    ENCODER/helper funcs

1static const struct drm_encoder_helper_funcs dw_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
9static const struct drm_encoder_funcs dw_encoder_funcs = {
10 .destroy = drm_encoder_cleanup,
11};

复制代码
    
    CONNECTOR/helper funcs

1static const HelperFuncs< panel_bridge_connector >& panel_bridge_connector_helper_funcs
2{
3 .get_modes() = panel_bridge_connector_get_modes,
4};
5
6static const struct DRMConnectorFuncs< panel_bridge_connector >& panel_bridge_connector_HELPER_funcs = {
7 .reset() = DRMHelperConnectorAtomicReset(),
8 .fill_modes() = DRMHelperProbeSingleConnectorModes(),
9 .destroy() = DRMCleanUpConnector(),
10 .atomic_duplicate_state() = AtomicHelperConnectorDuplicateState(),
11 .atomic_destroy_state() = AtomicHelperConnectorDestroyState(),
12};

复制代码
    
    **##ioctl注册**
![]()
    
    
    
    **component组件系统** **3**kernel中的component框架是为了subsystem能够按照一定的顺序初始化设备而提出的架构。  
     subsystem中由较多设备模块组成,而[QQ购买]()内核加载每个模块时间不定。则需要component框架来保证需最后初始化的设备加载前,所需设备全部加载完毕。
    
    
    
    在component中,包含两个基本概念,master和component。
    
    
    master是设备树中的“超级设备(superdevice)”,负责管理该超级设备下的普通设备。component是由master管理的普通设备,要先初始化。
    
    
    
    **#初始化分为两部分**
    
    
    master即超级设备,执行probe使用component\_master\_add\_with\_match函数注册自己到component框架中。
    
    
    component即普通设备,执行probe使用component\_add函数注册自己到component框架中。
    
    
    
    **##Master初始化**

1static int kirin_drm_platform_probe(struct platform_device *pdev)
2{
3 struct device *dev = &pdev->dev;
4 struct device_node *np = dev->of_node;
5 struct component_match *match = NULL;
6 struct device_node *remote;
7
8 remote = of_graph_get_remote_node(np, , );
9 if (!remote)
10 return -ENODEV;
11
12 drm_of_component_match_add(dev, &match, compare_of, remote);
13 of_node_put(remote);
14
15 return component_master_add_with_match(dev, &kirin_drm_ops, match);
16}

复制代码
      
    **##Component初始化**

1static int dsi_probe(struct platform_device *pdev)
2{
3 struct dsi_data *data;
4 struct dw_dsi *dsi;
5 struct dsi_hw_ctx *ctx;
6 int ret;
7
8 data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL);
9 if (!data) {
10 DRM_ERROR(“failed to allocate dsi data.\n”);
11 return -ENOMEM;
12 }
13 dsi = &data->dsi;
14 ctx = &data->ctx;
15 dsi->ctx = ctx;
16
17 ret = dsi_parse_dt(pdev, dsi);
18 if (ret)
19 return ret;
20
21 platform_set_drvdata(pdev, data);
22
23 return component_add(&pdev->dev, &dsi_ops);
24}

复制代码
    
    **##设备树定义**
    
    
    图显系统设备树定义要遵循component框架的定义,使得各个组件能够组成一个完成的拓扑结构。

1ade: address f4100000 register named ade
2 compatible: set to hisilicon, hi6220-ade
3 reg: configuration for clock at 8 bits with value 8.3.1
4 reg-names: name of register group is ade_base
5 hisilicon,noc-syscon: pointer to medianoc_ade structure
6 resets: pointer to media_ctrl MEDIA_ADE structure
7 interrupts: pointer to interrupt vector at address 115 4 with ldi interrupt /
8
9 clocks assigned to media ctrl HI6220_ADE_CORE, media ctrl HI6220_CODEC_JPEG and media ctrl HI6220_ADE_PIX_SRC
13 clock-names: list of clock names includes clk_ade_core, clk_codec_jpeg and clk_ade_pix
17 assigned-clocks: media ctrl HI6220_ADE_CORE and media ctrl HI6220_CODEC_JPEG clock rates are assigned as 3.6e9 and 3.8e9 Hz respectively
...
port { ade_out as endpoint with rem-endpoint dsi_in }
...
port { address-cells set to one size-cells left empty }
...
port { /
for input port */ dsi_in as endpoint with rem-endpoint ade_out }

复制代码
    
    **modetest** **4**是由libdrm提供的测试程序,可以查询显示设备的支持状况,进行基本的显示测试,以及设置显示的模式。
![]()
    
    
    
    填充不同的数据格式显示结果如下:
![img]()
![img]()
    
    **既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!** **由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新** **[如果你需要这些资料,可以戳这里获取]()**
    
    ...(img-IbAAVjOE-1715694394753)]
    [外链图片转存中...(img-8yxyIZdX-1715694394753)]
    
    **既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!** **由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新** **[如果你需要这些资料,可以戳这里获取]()**

全部评论 (0)

还没有任何评论哟~