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

Posted Mculover666

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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



以上是关于STM32MP157A驱动开发 | 04 - Linux DRM显示驱动框架的主要内容,如果未能解决你的问题,请参考以下文章

STM32MP157A驱动开发 | 03-usb host接口的使用(U盘 )

STM32MP157A驱动开发 | 03-usb host接口的使用(U盘 )

STM32MP157A驱动开发 | 05 - 基于LTDC接口驱动RGB LCD

STM32MP157A驱动开发 | 05 - 基于LTDC接口驱动RGB LCD

STM32MP157A驱动开发 | 01- 板载LED作为系统心跳指示灯

STM32MP157A驱动开发 | 01- 板载LED作为系统心跳指示灯