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;
};

三、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



  • 3
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Linux DRM(Direct Rendering Manager)提供了一个通用的框架,用于开发LCD驱动程序。下面是Linux DRM LCD驱动框架的一般概述: 1. DRM核心框架Linux内核中的DRM核心框架提供了与图形和显示相关的基本功能,如模式设置、缓冲管理和DMA传输等。它还提供了与用户空间交互的接口,允许应用程序通过DRM设备节点与LCD驱动程序通信。 2. CRTC(Cathode Ray Tube Controller):CRTC是DRM框架中的一个重要组件,负责控制LCD的时序和显示参数。在LCD驱动程序中,您可以通过配置CRTC来设置分辨率、刷新率和时序参数等。 3. Encoder和Connector:Encoder和Connector是DRM框架中用于连接CRTC和显示设备(如LCD)的中间组件。Encoder负责将CRTC中的图像数据编码为特定格式,并将其发送到Connector上。Connector则负责与显示设备进行物理连接,并将编码后的图像数据传输到显示设备。 4. Plane:Plane是DRM框架中用于管理图像平面(如主显示平面、叠加平面等)的组件。它允许您在LCD上叠加多个图像或进行其他图像处理操作。 5. Framebuffer和Gem:Framebuffer是DRM框架中用于管理显存的组件,用于存储和管理显示数据。Gem(Graphics Execution Manager)是DRM框架中的内存管理器,用于分配和管理显存。您可以通过Framebuffer和Gem来设置和操作LCD的显示数据。 6. KMS(Kernel Mode Setting):KMS是DRM框架中的一项功能,它允许用户空间应用程序通过DRM接口来设置和管理显示模式。通过KMS,应用程序可以动态地更改分辨率、刷新率和旋转等显示参数。 以上是Linux DRM LCD驱动框架的一般概述。在编写LCD驱动程序时,您需要理解DRM框架的相关概念和组件,并根据LCD设备的特性和规格来配置和操作这些组件。具体的实现细节可能因您使用的硬件平台和LCD控制器而有所不同。建议您参考Linux内核文档、示例代码和相关社区资源,以获取更具体和针对性的指导。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mculover666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值