• STM32MP157A驱动开发 | 04 - Linux DRM显示驱动框架


    Linux中主流的显示框架有两种:DRM框架和FB框架。

    • DRM框架:Direct Rendering Module,可以统一管理GPU显示
    • FB框架:Frame Buffer,不能处理基于3D加速的GPU显卡

    一、DRM框架简介

    1. 整体架构

    DRM框架包含两部分:DRM core和DRM driver。

    DRM core提供了一个基本的框架,DRM driver可以注册进DRM框架,同时为用户空间提供一组ioctl。

    libdrm对底层接口(DRM driver提供的ioctl)进行封装,向上层提供统一的API接口。

    DRM driver包含了GEM模块和KMS模块。

    2. DRM driver

    • GEM:Graphics Execution Manager,图形执行管理器,是一个内存管理器,主要负责内存的分配与释放,可以调用GPU
    • DUMB:是一个dumb缓冲区,负责一些简单的buffer显示,可以通过CPU直接渲染
    • KMS:Kernel Mode Setting,内核显示模式设置,主要负责显示的控制,包括屏幕分辨率、屏幕刷新率、颜色深度等
    • CRTC:显示控制器,在DRM里有多个显存,可以通过操作CRTC来控制要显示的那个显存
    • Encoder:负责从CRTC里输出的timing时序转换成外部设备所需要的信号的模块,也负责控制LCD的显示
    • Connector:连接物理显示设备的连接器,比如DSI、HDMI等
    • Plane:负责获取显存,再输出到CRTC里
    • FB:帧缓冲,能够显示图层的buffer

    3. GEM和KMS如何连接显示器

    二、ST官方的DRM驱动框架

    DRM驱动的核心是drm_driver结构体

    1. ltdc设备树描述

    在stm32mp1芯片级通用描述文件中:

    2. ltdc驱动

    通过兼容性找到ltdc驱动为:drivers/gpu/drm/stm/drv.c,绑定文档为:Documentation/devicetree/bindings/display/st,stm32-ltdc.yaml

    可以看到,这是一个标准的platform驱动,当设备和驱动匹配以后,probe函数就会执行。

    重点看一下drv_load函数:

    其中最核心的是ltdc_load函数,其中通过drm_pannel结构体来获取屏幕参数。

    3. drm_panel结构体

    drm_panel结构体定义在include/drm/drm_bridge.h

    /**
     * struct drm_panel - DRM panel object
     */
    struct drm_panel {
    	/**
    	 * @dev:
    	 *
    	 * Parent device of the panel.
    	 */
    	struct device *dev;
    
    	/**
    	 * @backlight:
    	 *
    	 * Backlight device, used to turn on backlight after the call
    	 * to enable(), and to turn off backlight before the call to
    	 * disable().
    	 * backlight is set by drm_panel_of_backlight() and drivers
    	 * shall not assign it.
    	 */
    	struct backlight_device *backlight;
    
    	/**
    	 * @funcs:
    	 *
    	 * Operations that can be performed on the panel.
    	 */
    	const struct drm_panel_funcs *funcs;
    
    	/**
    	 * @connector_type:
    	 *
    	 * Type of the panel as a DRM_MODE_CONNECTOR_* value. This is used to
    	 * initialise the drm_connector corresponding to the panel with the
    	 * correct connector type.
    	 */
    	int connector_type;
    
    	/**
    	 * @list:
    	 *
    	 * Panel entry in registry.
    	 */
    	struct list_head list;
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45

    三、RGB LCD屏幕驱动

    在文件drivers/gpu/drm/panel/panel-simple.c中,可以是标准的platorm驱动:

    匹配表如下:

    匹配表中给出了兼容性和对应的屏幕参数数据,比如"ampire,am-1280800n3tzqw-t00h"这块屏幕,对应的屏幕参数如下:

    四、内核配置——使能DRM

    -> Device Drivers
    	-> Graphics support
    	[*] Direct Rendering Manager (XFree86 4.1.0 and higher DRI support)
    	[*] DRM Support for STMicroelectronics SoC Series
    	-> Display Panels
    	[*] support for simple panels
    	-> Backlight & LCD device support
    	[*] Generic GPIO based Backlight Driver
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8



  • 相关阅读:
    webGL编程指南 第五章 TexturedQuad_Clamp_Mirror
    物联网浏览器(IoTBrowser)-使用深度学习开发防浸水远程报警
    判断密码是否包含键盘连续字母
    uniapp使用renderjs实现echarts
    物联网-物联前端安全加密技术简介
    归并排序算法(思路分析) [数据结构][Java]
    【进阶C语言】C语言文件操作
    促科技创新:高德数据优化篇之OceanBase最佳实践
    如何根据mysql表生成结构体|一个开源小工具的探索之旅
    用预训练好的VGG16网络+ImageNet(用于图像分类的1000个类别标签)对图片类别做出预测
  • 原文地址:https://blog.csdn.net/Mculover666/article/details/126195274