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);
	[...]
};
相关推荐
weixin_4568083821 分钟前
【沁恒蓝牙开发】IAP升级流程
c语言·单片机·嵌入式硬件
蚰蜒螟2 小时前
从内核源码看Linux启动:chroot、execve与MS_MOVE的协奏曲
linux·服务器·网络
geats人山人海2 小时前
数据结构第六章c语言 树的存储下二叉树的概念和存储
c语言·数据结构·算法
酷可达拉斯2 小时前
自动化运维-ansible配置文件与主机清单
linux·运维·自动化·ansible
影视飓风TIM3 小时前
Linux下C语言缓冲区原理 + Git版本控制
linux·c语言·git
来者皆善3 小时前
ZYNQ linux上使用 USB CDC ACM
linux·运维·服务器
冻柠檬飞冰走茶4 小时前
PTA基础编程题目集 7-31 字符串循环左移(C语言实现)
c语言·开发语言·数据结构·算法
Dawn-bit5 小时前
Linux磁盘分区与Swap和磁盘故障查询
linux·运维·服务器·网络·云计算
2301_777998345 小时前
C/C++:预处理详解
c语言·c++
无足鸟ICT6 小时前
【RHCA+】$[]
linux·运维·服务器