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