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);
	[...]
};
相关推荐
todoitbo11 小时前
用虚拟局域网打通 Win/Mac/Linux 三端:跨设备协作的实用方案
linux·运维·macos
源远流长jerry11 小时前
RDMA 基本操作类型详解:从双端通信到单端直访
linux·网络·tcp/ip·ip
Sylvia-girl12 小时前
Linux下的基本指令1
linux·运维·服务器
always_TT12 小时前
C语言中的字符与字符串(char数组)
c语言·开发语言
forAllforMe12 小时前
LAN9252 从机寄存器配置--C语言举例
c语言·开发语言
wyt53142912 小时前
Redis的安装教程(Windows+Linux)【超详细】
linux·数据库·redis
17(无规则自律)12 小时前
【Linux驱动实战】:字符设备之ioctl与mutex全解析
linux·c语言·驱动开发·嵌入式硬件
weixin_5375904512 小时前
《C程序设计语言》练习答案(练习1-4)
c语言·开发语言
炸膛坦客13 小时前
单片机/C/C++八股:(十五)内存对齐、结构体内存对齐
c语言·开发语言·单片机
老约家的可汗13 小时前
C/C++内存管理探秘:从内存分布到new/delete的底层原理
c语言·c++