图显系统DRM ENCODER和CONNECTOR完全解析

2023-11-16


0. 引言

DRM ENCODER 和 CONNECTOR 模块由图显外设抽象而来,从传统意义上来讲,ENCODER 包含外设控制器的功能,而 CONNECTOR 包含外设 PHY 或者显示器参数。但是这两部分又紧密关联,因此,软件 DRM 架构下的 ENCODER 和 CONNECTOR 需要按照一个整体来理解和实现。
HDMI驱动的DRM注册
目前的图显外设接口主要有 MIPI、HDMI、LVDS、DP、VGA、DVI、RGB 等等,同时,又可以通过转接卡来实现各种接口之间的转换。目前,市面上的处理器 SoC 又同时具备以上接口。

SoC集成多种图显外设接口
因此,DRM 架构为了统一管理、无差别化对待不同芯片厂商的 IP,抽象出了 ENCODER 和 CONNECTOR 两部分内容。

2. 功能

ENCODER 作为图显外设的逻辑控制器,从图显处理器接收并行的 RGB 数据,并按照接口类型对 RGB 数据进行编码,例如 HDMI 通过 encoder 将 RGB 数据编码为 TMDS 类型的数据。
在软件层面的 DRM 架构中规定了使用下面两个数据结构,注册 DRM ENCODER 相关功能。
encoder 控制

struct drm_encoder_funcs {
	void (*reset)(struct drm_encoder *encoder);
	void (*destroy)(struct drm_encoder *encoder);
	int (*late_register)(struct drm_encoder *encoder);
	void (*early_unregister)(struct drm_encoder *encoder);
};

encoder 配置

struct drm_encoder_helper_funcs {
	void (*dpms)();
	enum drm_mode_status ();
	bool (*mode_fixup)();
	void (*prepare)();
	void (*commit)();
	void (*mode_set)();
	void (*atomic_mode_set)();
	struct drm_crtc *(*get_crtc)();
	enum drm_connector_status ();
	void (*atomic_disable)();
	void (*atomic_enable)();
	void (*disable)();
	void (*enable)();
	int (*atomic_check)();
};

图显外设 IP 厂商需要提供相关的例化代码,如下:

static const struct drm_encoder_funcs exynos_hdmi_encoder_funcs = {
	.destroy = drm_encoder_cleanup,
};

static const struct drm_encoder_helper_funcs exynos_hdmi_encoder_helper_funcs = {
	.mode_fixup	= hdmi_mode_fixup,
	.enable		= hdmi_enable,
	.disable	= hdmi_disable,
};

mode_fixup()会将上层应用下发的图显参数进行校验,可以对参数进行修正也可以终止不符合显示要求的请求。若显示参数符合要求,将其拷贝给 struct drm_display_mode。

static bool hdmi_mode_fixup(struct drm_encoder *encoder,
			    const struct drm_display_mode *mode,
			    struct drm_display_mode *adjusted_mode)
{
...
	  mode_ok = hdmi_mode_valid(connector, adjusted_mode);
...
	  drm_mode_copy(adjusted_mode, m);
...

CONNECTOR 包含 PHY 或者显示屏的参数,接收 ENCODER 发送过来的编码数据后,按照显示接口类型发送给显示器。例如 HDMI PHY 内部集成 Serializer,将 TMDS 数据转换成高速串行 bit 流发送到差分数据通道。
DRM 架构中 connector 需要提供支持的显示参数以及显示屏的连接状态等。规定使用下面两个数据结构,注册 DRM CONNECTR 相关功能。
connctor 控制

struct drm_connector_funcs {
	int (*dpms)();
	void (*reset)();
	enum drm_connector_status ();
	void (*force)();
	int (*fill_modes)();
	int (*set_property)();
	int (*late_register)();
	void (*early_unregister)();
	void (*destroy)();
	struct drm_connector_state *();
	void (*atomic_destroy_state)();
	int (*atomic_set_property)();
	int (*atomic_get_property)();
	void (*atomic_print_state)();
};

connector 配置

struct drm_connector_helper_funcs {
	int (*get_modes)();
	int (*detect_ctx)();
	enum drm_mode_status (*mode_valid)();
	struct drm_encoder *(*best_encoder)();
	struct drm_encoder *(*atomic_best_encoder)();
	int (*atomic_check)();
	void (*atomic_commit)();
	int (*prepare_writeback_job)();
	void (*cleanup_writeback_job)();
};

图显外设 IP 厂商需要提供相关的例化代码,如下:

static const struct drm_connector_funcs hdmi_connector_funcs = {
	.fill_modes = drm_helper_probe_single_connector_modes,
	.detect = hdmi_detect,
	.destroy = hdmi_connector_destroy,
	.reset = drm_atomic_helper_connector_reset,
	.atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
	.atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
};

static const struct drm_connector_helper_funcs hdmi_connector_helper_funcs = {
	.get_modes = hdmi_get_modes,
	.mode_valid = hdmi_mode_valid,
};

对于显示参数等信息需要通过某种方式从外部获取的图显 IP,如 HDMI、MIPI,hdmi_get_modes 是一个很关键的函数。
对于 HDMI 而言,通过 DDC 总线从外部显示屏中获取显示参数 EDID,以此决定是否支持当前显示要求。若无法获取 EDID 信息,那么是无法点亮屏幕的。DRM 也规定了获取 EDID 的统一标准接口,即 drm_get_edid()。

static int hdmi_get_modes(struct drm_connector *connector)
{
  ...

	  edid = drm_get_edid(connector, hdata->ddc_adpt);
	  if (!edid)
		  return -ENODEV;
  ...
}

SoC 芯片能够同时连接、同时工作的 ENCODER 和 CONNECTOR 数量,取决于内部集成的图显处理器的数量以及每个图显处理器的端口数,当然,SoC 芯片的时钟系统也是影响多个接口能否同时显示的一个关键要素。

3. 初始化

图显外设使用 component_add()注册进 DRM 系统,关于 component_add()
链接
encoder 的初始化包含两部分内容,分别是:

  • drm_encoder_init()
  • drm_encoder_helper_add()

DRM通过数据结构struct drm_encoder来描述ENCODER设备信息及同其他DRM组件之间的关系。

struct drm_encoder {
	struct drm_device *dev;
	struct list_head head;
	struct drm_mode_object base;
	char *name;
	int encoder_type;
	unsigned index;
	uint32_t possible_crtcs;
	uint32_t possible_clones;
	struct drm_crtc *crtc;
	struct drm_bridge *bridge;
	const struct drm_encoder_funcs *funcs;
	const struct drm_encoder_helper_funcs *helper_private;
};

DRM ENCODER初始化流程如下图所示,其主要实现了drm_encoder的例化以及注册drm_encoder_funcs、drm_encoder_helper_funcs两个数据结构。
ENCODER初始化流程
DRM CONNECTOR初始化流程如下图所示,其主要实现了drm_connector的例化以及注册drm_connector_funcs、drm_connector_helper_funcs两个数据结构。
CONNECTOR初始化流程

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

图显系统DRM ENCODER和CONNECTOR完全解析 的相关文章

随机推荐

  • 路由器与交换机的基本工作原理

    本文介绍路由器与交换机的基本工作原理 在介绍这之前先来看一下OSI七层工作模型 现在开始解释路由器的作用及其基本工作原理 路由器的作用 1 异种网络互连 比如具有异种子网协议的网络互连 2 子网协议转换 不同子网间包括局域网和广域网之间的协
  • 论文排版:Word加入脚注后,分栏的正文就跑到下一页上去了的解决方案

    在论文排版中 在题目或作者处插入了脚注后 再对正文分栏时 或者先分栏 再在题目或作者处插入脚注 分栏后的正文就跑到下一页上去了 这个问题 我抓狂了很久 终于在搜索若干关键字后得以解决 情况一 稿件格式的要求 1 题目和摘要部分不分栏 正文部
  • 【架构】1.2浅谈架构基础-架构设计的目的

    架构设计的目的 架构设计的目的 软件发展历程 如何识别软件的复杂度 高性能 高可用 可扩展 成本价值 安全因素 架构设计的目的 谈及架构设计 应该IT从业者都很经常听到 然而对于架构设计的目的 可能每个人都有自己的理解 例如 因为现在的系统
  • 毕业设计 opencv图像增强算法系统

    文章目录 0 简介 1 基于直方图均衡化的图像增强 2 基于拉普拉斯算子的图像增强 4 基于伽马变换的图像增强 软件实现效果 最后 0 简介 今天学长向大家分享一个毕业设计项目 毕业设计 opencv图像增强算法系统 项目运行效果 毕业设计
  • 8个不可不知的Mac OS X专用命令行工具

    本文转载至 https segmentfault com a 1190000000509514 OS X的终端下通用很多Unix的工具和脚本 如果从Linux迁移到OS X会发现很多熟悉的命令和脚本工具 其实并没有任何区别 但是OS X也提
  • Clamav杀毒软件源码分析笔记[十]

    Clamav杀毒软件源码分析笔记 十 刺猬 http blog csdn net littlehedgehog 客户端处理 服务端已经把主要的工作都已经处理的差不多了 剩下来也就是服务端等待客户端提出请求 然后根据客户端的请求做相应的工作
  • sql注入绕过技巧

    前言 今天斗胆来整理一下sql注入的各种绕过姿势 以后方便查阅 SQL注入的绕过技巧有很多 具体的绕过技巧需要看具体的环境 而且很多的绕过方法需要有一个实际的环境 最好是你在渗透测试的过程中遇到的环境 否则如果仅仅是自己凭空想 那显然是不靠
  • C语言项目——学生信息管理系统

    文章目录 学生信息管理系统 一 项目思路 1 模块化思想 2 流程图 二 功能框架 1 系统菜单 2 其他功能 三 分布实现 0 学生属性 系统属性 1 学生属性 2 系统属性 1 创建系统 2 绘制菜单 3 按键操作 4 录入信息 5 浏
  • 等精度测频原理--频率计

    等精度测频原理 频率计 本系统采用等精度测频的原理来测量频率 其原理如图2所示 图2 等精度测频原理图 图2中的门控信号是可预置的宽度为Tpr的一个脉冲 CNT1和CNT2是两个可控计数器 标准频率信号从CNT1的时钟输入端FS输入 其频率
  • 常见的几种矩阵分解方式

    项目github地址 bitcarmanlee easy algorithm interview and practice 欢迎大家star 留言 一起学习进步 1 三角分解 LU分解 矩阵的LU分解是将一个矩阵分解为一个下三角矩阵与上三角
  • H5浏览器播放RTMP直播流

  • Python编程快速上手

    题目1 编写一个名为collatz 的函数 它有一个名为number的参数 如果参数是偶数 那么collatz 就打印出number 2 如果number是奇数 collatz 就打印3 number 1 def collatz numbe
  • 面试题 ⑥

    1 Java常见的线程池有哪些 它们的使用场景 newSingleThreadExecutor 创建一个单线程的线程池 此线程池保证所有的执行顺序按照任务的提交顺序执行 FIFO 适合顺序处理文件日志等 newFixedThreadPool
  • easyUI datagrid中checkbox选中事件以及行点击事件,翻页之后还可以选中

    DataGrid其中与选择 勾选相关 DataGrid属性 singleSelect boolean 如果为true 则只允许选择一行 false ctrlSelect boolean 在启用多行选择的时候允许使用Ctrl键 鼠标点击的方式
  • MySQL主从复制(Master-Slave)实践

    转载自 https www cnblogs com gl developer p 6170423 html 参考 https blog csdn net lildkdkdkjf article details 10004663 MySQL数
  • Python的pickle模块详解(包括优缺点及和JSON的区别)

    文章目录 一 pickle是什么 1 pickle的优缺点 2 pickle和JSON的区别 3 pickle的应用总结 二 pickle的用法 1 pickle接口 2 pickle实例 结语 一 pickle是什么 在英语中 pickl
  • 批处理一键关闭危险端口(135 137 138 139 445)预防勒索病毒

    一键关闭危险端口 bat echo off color 1f title 关闭常见的危险端口 echo 正在开启Windows防火墙 echo netsh advfirewall set currentprofile state on gt
  • 备份BOM T-SQL

    转载请注明出处 联系我 t39q 163 com 本人热衷于数据库技术及算法的研究 志同道合之士 欢迎探讨 ALTER PROC dbo proc BOM VersionAutoUpgrade company NVARCHAR 20 Par
  • input type=file选择图片按钮样式修改与图片预览

    1 背景 通过上图我们可以看到input type file按钮的默认样式 非常不美观 如果要自定义该按钮的样式 要如何实现呢 2 方式1样式 input覆盖整个按钮区域 并且设置完全透明
  • 图显系统DRM ENCODER和CONNECTOR完全解析

    0 引言 DRM ENCODER 和 CONNECTOR 模块由图显外设抽象而来 从传统意义上来讲 ENCODER 包含外设控制器的功能 而 CONNECTOR 包含外设 PHY 或者显示器参数 但是这两部分又紧密关联 因此 软件 DRM