文章目录
- [1. Planes](#1. Planes)
-
- [1.1 plane有以下几种不同的类型](#1.1 plane有以下几种不同的类型)
- [1.2 drm_plane_funcs](#1.2 drm_plane_funcs)
- [2. Encoder](#2. Encoder)
- [3. Connector](#3. Connector)
1. Planes

plane 是一个图像图层,它通常有对应硬件,最终由CRTC显示的图像是由一个或多个plane在framebuffer主图像的叠加物:

上图为 背景framebuffe + overlay frambuffer(overlay plane)+ cursor framebuffer( cursor plane),最终输出到显示器图像。如果没有plane硬件图层,也是可以输出这些图像的,那么就需要将这些图像画在背景framebuffe中。
1.1 plane有以下几种不同的类型
- DRM_PLANE_TYPE_PRIMARY(强制的,每个CRTC1个)
- 用于CRTC显示的主图像,典型的为背景图像或图像内容等
- DRM_PLANE_TYPE_CURSOR(可选的, 每个CRTC1个)
- 用于显示光标,如鼠标图形
- DRM_PLANE_TYPE_OVERLAY(可选的, 每个CRTC 0到N个)
- 利用硬件图像复合功能,典型如窗口中显示动态内容如影片播放
如果显示控制器中有多个CRTC, overlay planes可以在需要时动态地通过DRM显示框架attach到指定的CRTC。
- 利用硬件图像复合功能,典型如窗口中显示动态内容如影片播放
1.2 drm_plane_funcs
c
struct drm_plane_funcs {
[...]
int (*update_plane)(struct drm_plane *plane,
struct drm_crtc *crtc,
struct drm_framebuffer *fb,
int crtc_x, int crtc_y,
unsigned int crtc_w, unsigned int crtc_h,
uint32_t src_x, uint32_t src_y,
uint32_t src_w, uint32_t src_h);
[...]
};
更新函数update_plane示意如下图:

src_x 和 src_y 是plane framebuffer 的相对位置,而crtc_x 和 crtc_y 是crtc的 framebuffer 的相对位置;src_w 和 src_h 被 update_plane 更新到crtc framebuffer 的crtc_w 和 crtc_h,长和宽可在硬件支持的范围内进行任意的缩放。
2. Encoder
编码器是和Connector相关度较大的组件,负责转换像素帧为适当的格式,透过Connector进行物理传输,如HDMI connector传输的是TMDS编码数据,相应地需要一个TMDS编码器。

硬件角度看RGB转DVI 视频 Encoder如下:

3. Connector

Connector 代表一个显示连接器如(HDMI, DP, VGA, DVI, ...)
- 传输信号到显示器
- 探测显示连接或移除
- 展示显示支持的模式
通过struct drm_connector_funcs和 struct drm_connector_helper_funcs实现函数
c
struct drm_connector_helper_funcs {
int (*get_modes)(struct drm_connector *connector);
enum drm_mode_status
(*mode_valid)(struct drm_connector *connector,
struct drm_display_mode *mode);
struct drm_encoder *
(*best_encoder)(struct drm_connector *connector);
};
struct drm_connector_funcs {
[...]
enum drm_connector_status
(*detect)(struct drm_connector *connector, bool force);
[...]
};