DRM KMS 子系统(4)Planes/Encoder/Connector

文章目录

  • [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);
	[...]
};
相关推荐
改一下配置文件14 分钟前
Ubuntu24.04安装NVIDIA驱动完整指南(含Secure Boot解决方案)
linux
深紫色的三北六号10 小时前
Linux 服务器磁盘扩容与目录迁移:rsync + bind mount 实现服务无感迁移(无需修改配置)
linux·扩容·服务迁移
SudosuBash14 小时前
[CS:APP 3e] 关于对 第 12 章 读/写者的一点思考和题解 (作业 12.19,12.20,12.21)
linux·并发·操作系统(os)
哈基咪怎么可能是AI1 天前
为什么我就想要「线性历史 + Signed Commits」GitHub 却把我当猴耍 🤬🎙️
linux·github
十日十行2 天前
Linux和window共享文件夹
linux
木心月转码ing2 天前
WSL+Cpp开发环境配置
linux
祈安_2 天前
C语言内存函数
c语言·后端
崔小汤呀3 天前
最全的docker安装笔记,包含CentOS和Ubuntu
linux·后端
何中应3 天前
vi编辑器使用
linux·后端·操作系统
何中应3 天前
Linux进程无法被kill
linux·后端·操作系统