Linux中主流的显示框架有两种:DRM框架和FB框架。
DRM框架包含两部分:DRM core和DRM driver。
DRM core提供了一个基本的框架,DRM driver可以注册进DRM框架,同时为用户空间提供一组ioctl。
libdrm对底层接口(DRM driver提供的ioctl)进行封装,向上层提供统一的API接口。
DRM driver包含了GEM模块和KMS模块。
DRM驱动的核心是drm_driver结构体。
在stm32mp1芯片级通用描述文件中:
通过兼容性找到ltdc驱动为:drivers/gpu/drm/stm/drv.c
,绑定文档为:Documentation/devicetree/bindings/display/st,stm32-ltdc.yaml
。
可以看到,这是一个标准的platform驱动,当设备和驱动匹配以后,probe函数就会执行。
重点看一下drv_load函数:
其中最核心的是ltdc_load函数,其中通过drm_pannel结构体来获取屏幕参数。
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;
};
在文件drivers/gpu/drm/panel/panel-simple.c
中,可以是标准的platorm驱动:
匹配表如下:
匹配表中给出了兼容性和对应的屏幕参数数据,比如"ampire,am-1280800n3tzqw-t00h"这块屏幕,对应的屏幕参数如下:
-> 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