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);
	[...]
};
相关推荐
Android系统攻城狮6 小时前
Linux Gstreamer深度解析之gst_audio_ring_buffer_delay调用流程与实战(七十二)
linux·运维·服务器·gstreamer音视频·音视频进阶
快乐的韭菜根根7 小时前
ubuntu 安装slurm并配置
linux·运维·ubuntu
Navigator_Z7 小时前
LeetCode //C - 1289. Minimum Falling Path Sum II
c语言·算法·leetcode
himobrinehacken8 小时前
取模运算的汇编奥秘揭秘
c语言·安全
倒头就睡的小比特9 小时前
Linux基础指令3
linux·服务器
梦帮科技9 小时前
Kali Linux Scapy 畸形报文构造学——深度解剖非法 TCP Flags 与反常序列号
linux·爬虫·神经网络·算法·数学建模·系统架构·模拟退火算法
半杯咖啡半行码10 小时前
Linux 驱动开发入门:内核模块编程基础
linux·服务器·网络
别动我齐刘海10 小时前
Linux 系统调试学习2
linux·运维·c++·人工智能·学习·机器学习·机器人
青岚_Nox11 小时前
C语言实战:带你手写一个带"计时功能"的猜数字小游戏
c语言
龙虾电话11 小时前
语音机器人打断不进去:VAD 双阈值迟滞里一个共用的 bool,和它引发的连锁误判
linux