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);
	[...]
};
相关推荐
小鹏linux18 小时前
Ubuntu 22.04 部署开源免费具有精美现代web页面的Casdoor账号管理系统
linux·前端·ubuntu·开源·堡垒机
在角落发呆19 小时前
Linux转发配置:解锁网络互联的核心密码
linux·运维·网络
齐潇宇19 小时前
Zabbix 7 概述与配置
linux·zabbix·监控告警
LuminousCPP21 小时前
数据结构 - 线性表第四篇:C 语言通讯录优化升级全记录(踩坑 + 思考)
c语言·开发语言·数据结构·经验分享·笔记·学习
江公望21 小时前
Ubuntu htop命令,10分钟讲清楚
linux·服务器
哎呦,帅小伙哦21 小时前
Linux 时间:从原子钟到 clock_gettime 的每一面
linux·运维·服务器
张小姐的猫21 小时前
【Linux】多线程 —— 线程互斥
linux·运维·服务器·c++
YuanDaima20481 天前
Linux 进阶运维与 AI 环境实战:进程管理、网络排错与 GPU 监控
linux·运维·服务器·网络·人工智能
lolo大魔王1 天前
Linux 数据文件处理实战:排序、搜索、压缩、归档一站式详解
linux·运维·服务器
starvapour1 天前
Ubuntu切换到Fcitx5中文输入法
linux·运维·ubuntu