DRM框架(vkms)分析(3)----connector->func && connector->helper_private的使用

2023-11-10

一 connector->func

drm_connector_funcs类型的对象实例,其中有些对象实例可直接使用helper函数,有些可以自定义, 还有一些可以忽略掉不赋值的

/**
 * struct drm_connector_funcs - control connectors on a given device
 *
 * Each CRTC may have one or more connectors attached to it.  The functions
 * below allow the core DRM code to control connectors, enumerate available modes,
 * etc.
 */
struct drm_connector_funcs {

	int (*dpms)(struct drm_connector *connector, int mode);
	
    void (*reset)(struct drm_connector *connector);
	
    enum drm_connector_status (*detect)(struct drm_connector *connector,
					    bool force);
	void (*force)(struct drm_connector *connector);
	
	int (*fill_modes)(struct drm_connector *connector, uint32_t max_width, uint32_t max_height);

	int (*set_property)(struct drm_connector *connector, struct drm_property *property,
			     uint64_t val);
	
    int (*late_register)(struct drm_connector *connector);
	
    void (*early_unregister)(struct drm_connector *connector);
	
    void (*destroy)(struct drm_connector *connector);
	
    struct drm_connector_state *(*atomic_duplicate_state)(struct drm_connector *connector);
	
    void (*atomic_destroy_state)(struct drm_connector *connector,
				     struct drm_connector_state *state);
	
    int (*atomic_set_property)(struct drm_connector *connector,
				   struct drm_connector_state *state,
				   struct drm_property *property,
				   uint64_t val);

	int (*atomic_get_property)(struct drm_connector *connector,
				   const struct drm_connector_state *state,
				   struct drm_property *property,
				   uint64_t *val);

	void (*atomic_print_state)(struct drm_printer *p,
				   const struct drm_connector_state *state);
};

vkms实例如下, 这里仅初始化了其中几项:

static const struct drm_connector_funcs vkms_connector_funcs = {
	.fill_modes = drm_helper_probe_single_connector_modes,
	.destroy = vkms_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,
};

分析下常用的函数接口:

(1) dpms

电源管理相关,connector的dpms主要赋值为drm_helper_connector_dpms, 其会依次调用crtc及encoder的dpms接口(如果有的话), crtc和encoder的dpms一般都是自定义直接操作硬件了

drm_helper_connector_dpms
    //获取crtc自定义的dpms接口,并调用
    struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private;
    (*crtc_funcs->dpms)(crtc, drm_helper_choose_crtc_dpms(crtc))
    drm_helper_encoder_dpms(encoder, encoder_dpms)
        //获取encoder自定义的dpms接口,并调用
        struct drm_encoder_helpers_funcs * encoder_funcs = encoder->helper_private
        encoder_funcs->dpms(encoder, mode);

dpms的设置,目前找到一个,如下:

drm_connector_set_obj_prop
    if (property == connector->dev->mode_config.dpms_property)
    {
        //如果设置connecotr的dpms属性,需要调用dpms接口
        ret = (*connector->funcs->dpms)(connector, (int)value);
    }

(2)reset

复位connector的state(drm_connector_state类型), 一般直接赋值为drm_atomic_helper_connector_reset, 该接口会复位state状态

其调用逻辑一般在plane/crtc/connector/encoder等初始化后, 通过drm_mode_config_reset调用:

vkms_output_int
    drm_mode_config_reset
            //遍历所有connector,并调用reset接口
            drm_connector_list_iter_begin(dev, &conn_iter);
            drm_for_each_connector_iter(connecotr, &conn_iter)
                connecotr->funcs->reset(connector)

(3)detect

检测connector连接状态的,可以参考如下xlinx芯片的接口:

struct drm_connector_funcs zynqmp_dp_connector_funcs = {
    .detect = zynqmp_dp_connector_detect,//该接口直接读寄存器获取连接状态

}

调用逻辑:


(1)drm_helper_probe_single_connector_modes
            ret = drm_helper_probe_detect(connector, &ctx, true);

(2)drm_helper_hpd_irq_event
    connector->status = drm_helper_probe_detect(connector, NULL, false);
                            return drm_helper_probe_detect_ctx(connector, force)
                                             connctor->funcs->detect(connector, force);
                            connctor->funcs->detect(connector, force);

(4)force

貌似是用来强制设置connector的状态,待确认?

//drm_connector_funcs.fill_modes = drm_helper_probe_single_connector_modes
drm_helper_probe_single_connector_modes
        if ( connector->force )
        {
            if (connector->force == DRM_FORCE_ON || ...)
                connector->status = connector_status_connected;
            if (connector->funcs->force)
                connector->funcs->force(connector);
        
        }

(5) fill_modes

用于输出模式的检测和过滤。一般会被赋值为drm_helper_probe_single_connector_modes

如下:

static const struct drm_connector_funcs vkms_connector_funcs = {
	.fill_modes = drm_helper_probe_single_connector_modes,
    ...
}

具体梳理下函数内部逻辑:

drm_helper_probe_single_connector
    if (connector->force )
    {
        //force connector的status
        if (connector->funcs->force)
            connecotr->funcs->force(connector)
    }
    else
         //探测connector的连接状态,主要调用connector->funcs->detect[_ctx]
         ret = drm_helper_probe_detect(connector, &ctx, true);
    //connector_funcs = connetor->helper_private
    // .get_modes = vkms_conn_get_modes
    //这里调用的就是drm_connector_helper_funcs的.get_modes函数,由drm设备驱动自行定义
    count = (*connector_funcs->get_modes)(connector);
            //vkms_conn_get_modes
                    //直接添加mode信息
                    count = drm_add_modes_noedid(connector, XRES_MAX, YRES_MAX)
                    drm_set_perferred_mode(connector, XRES_DEF, YRES_DEF)
    //通过edid增加mode到connect->probed_modes链表中
    count = drm_add_override_edid_modes(connector);
    count = drm_add_modes_noedid(connector, 1024, 768);
    //通过cmdline的参数增加mode到probed_modes链表中
    coutn = drm_helper_probe_add_cmdline_mode(connector);、
    //将probed_modes链表中的modes添加到connector->modes中
    drm_connector_list_update(connector);

    list_for_each_entry(mode, &connector->modes, head)
    {    
        //过滤验证所有modes以确认mode的status
        drm_mode_validate_driver(dev, mode);
        drm_mode_validate_size(mode, maxX, maxY);
        drm_mode_validate_flag
        //严重该mode在connector的管道有效性(crtc connector encoder)
        drm_mode_pipe_line(mode, connector, &ctx, &mode->status)
    }
    mode->status = drm_mode_validate_ycbcr
    //将mode->status != MODE_OK的 mode从connector->modes链表中删除掉
    drm_mode_prune_invalid
    //给connector->modes排序
    drm_mode_sort(&connector->modes)
    
    list_for_each_entry(mode, &connector->modes, head)
    {
        //更新mode->crtc_*参数
        drm_mode_set_crtcinfo(mode, )
    }

其调用逻辑如下:


//用户态
drmModeGetConnector()
    conn.connector_id = connector_id;
    drmIoctl(fd, DRM_IOCTL_MODE_GETCONNECTOR, &conn)
//内核态
DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETCONNECTOR, drm_mode_getconnector, 0)
    drm_mode_getconnector
        //也就是说在用户态调用drmModeGetConnector时会探测获取connector的modes
        connector->funcs->fill_modes(connector, max_width, max_height);

(6)late_register && early_unregister        

这两个接口是为了在drm_connector_register后(late_register)/前(early_unregister)做一些额外的操作

(7)atomic_duplicate_state && atomic_destory_state

用于复制connector的state(drm_connector_state类型)和销毁state

一般会被赋值为helper接口,如下

.atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
.atomic_destroy_state = drm_atomic_helper_connector_destroy_state,

调用逻辑如下:


 
//atomic方式获取connector state
drm_atomic_get_connector_state
        connector_state = connector->funcs->atomic_duplicate_state(connector);
//清除connector state
drm_connector_cleanup
    connector->funcs->atomic_destroy_state

(8)atomic_set_property && atomic_get_property

设置/获取driver-private属性值,也就是驱动自定义的非通用属性。一般是驱动自定义实现

其调用逻辑如下:

//用户态
int drmModeAtomicCommit
    ret = DRM_IOCTL(fd, DRM_IOCTL_MODE_ATOMIC, &atomic);

//内核态
DRM_IOCTL_DEF(DRM_IOCTL_MODE_ATOMIC, drm_mode_atomic_ioctl, DRM_MASET)

    drm_atomic_set_property
    {
        swtich(obj->type)
        {
            case DRM_MODE_OBJECT_CONNECTOR:
             //设置connector的属性
            drm_atomic_connector_set_property
            connector->funcs->atomic_set_property
        }
      
    }
        

(9)atomic_print_state

打印当前connector的state

在cat /sys/kernel/debug/dri/0/state时,会以此遍历设备的所有plane /crtc/connector并打印其state信息

实现逻辑如下:

 

const struct drm_info_list drm_atomic_debugfs_list[] = {
    {"state", drm_state_info, 0},
};

//drm_state_info
    __drm_state_dump
        //遍历plane 并打印其state
        list_for_each_entry(plane, &config->plane_list, head)
                drm_atomic_plane_print_state
        //遍历crtc, 并打印其state
        list_for_each_entry(crtc, &config->crtc_list, head)
                drm_atomic_crtc_print_state
        //遍历connector, 并打印其state
        drm_connector_list_iter_begin(dev, &conn_iter)
        drm_for_each_connector_iter(connector, &conn_iter)
                drm_atomic_connectgr_print_state
        drm_connector_list_iter_end(&conn_iter)
    

(10)

二 connector->helper_private

drm驱动自定义的接口,一般有connector->func回调. 其类型是drm_connector_helper_funcs类型

/**
 * struct drm_connector_helper_funcs - helper operations for connectors
 *
 * These functions are used by the atomic and legacy modeset helpers and by the
 * probe helpers.
 */
struct drm_connector_helper_funcs {

	int (*get_modes)(struct drm_connector *connector);
	int (*detect_ctx)(struct drm_connector *connector,
			  struct drm_modeset_acquire_ctx *ctx,
			  bool force);
	enum drm_mode_status (*mode_valid)(struct drm_connector *connector,
					   struct drm_display_mode *mode);

	int (*mode_valid_ctx)(struct drm_connector *connector,
			      struct drm_display_mode *mode,
			      struct drm_modeset_acquire_ctx *ctx,
			      enum drm_mode_status *status);

	struct drm_encoder *(*best_encoder)(struct drm_connector *connector);

	struct drm_encoder *(*atomic_best_encoder)(struct drm_connector *connector,
						   struct drm_atomic_state *state);

	int (*atomic_check)(struct drm_connector *connector,
			    struct drm_atomic_state *state);

	void (*atomic_commit)(struct drm_connector *connector,
			      struct drm_atomic_state *state);

	int (*prepare_writeback_job)(struct drm_writeback_connector *connector,
				     struct drm_writeback_job *job);
	
	void (*cleanup_writeback_job)(struct drm_writeback_connector *connector,
				      struct drm_writeback_job *job);
};

(1)get_modes

用于设置connector的output mode, 由drm_helper_probe_single_connector_modes调用

举例如下:

static const struct drm_connector_helper_funcs vkms_conn_helper_funcs = {
    //用于设置connector的output mode, 由drm_helper_probe_single_connector_modes调用
    .get_modes = vkms_conn_get_modes,
}

(2)atomic_check

//用来检查state, 不过没找到connector的atomic_check实例

(3)atomic_commit

//用来实现回写任务的,具体参考:

struct drm_connector_helper_funcs vkms_wb_conn_helper_funcs = {

    .get_modes = vkms_wb_connector_get_modes,
    .prepare_writeback_job = vkms_wb_prepare_job,
    .cleanup_writeback_job = vkms_wb_cleanup_job,
    .atomic_commit = vkms_wb_atomic_commit,
}

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

DRM框架(vkms)分析(3)----connector->func && connector->helper_private的使用 的相关文章

  • Linux DRM KMS 驱动简介

    Whoops xff0c 上次写完 Linux DRM Graphic 显示简单介绍 博文后 xff0c 心情还是蛮愉悦的 xff0c 来来 xff0c 这次在说说具体的显卡驱动 1 DRM 框架分解 DRM 框架提供了一系列的 IOCTL
  • 数字无线广播(DAB、DRM)

    1 什么是数字广播 数字化技术指的是运用0和1两位数字编码 xff0c 通过电子计算机 光缆 通信卫星等设备 xff0c 来表达 传输和处理所有信息的技术 数字化技术一般包括 数字编码 数字压缩 数字传输 数字调制 与解调 等技术 所谓的数
  • 【DRM】DRM Display Driver Guide

    https zhuanlan zhihu com p 534267979 目录 收起
  • DRM驱动代码分析:图层参数更新

    前言 无业居家 闭门造车 非常欢迎大家帮忙指正 有些代码流程是看代码分析的 没有去验证是否正确 我对DRM框架的很多东西都不了解 所以有些地方会比较生硬 熟悉学习需要时间 文章一直堆在草稿箱可能会降低我的积极性 所以我还是先发布了文章 后面
  • dma-buf 由浅入深(一) —— 最简单的 dma-buf 驱动程序

    dma buf 由浅入深 一 最简单的 dma buf 驱动程序 dma buf 由浅入深 二 kmap vmap dma buf 由浅入深 三 map attachment dma buf 由浅入深 四 mmap dma buf 由浅入深
  • drm 学习笔记-2:DRM介绍

    声明 文章从DRM WIKI翻译过来的 可以帮忙英语不好同学更好的了解 刚过4级的英语水平 能力有限 原文地址 https en wikipedia org wiki Direct Rendering Manager 正文 Direct R
  • 图显系统DRM CRTC完全解析

    目录 CRTC 工作原理和意义 CRTC 模块的初始化和功能 0 引言 DRM 下的 CRTC 代表 RGB 数据管道 从 drm plane 接收像素数据并将其混合到一起 传输给下级显示设备 drm encoder 由 drm displ
  • 关于 DRM 中 DUMB 和 PRIME 名字的由来

    前言 在上一篇 DRM驱动程序开发 VKMS 文章里 我们学习了如何编写一个最简单的 KMS 驱动 而本篇 我将以叙述的形式为大家讲解 DRM GEM 的相关概念 代码留到下一篇进行讲解 我知道 大多数的 DRM 初学人员 在刚接触到 GE
  • 最简单的DRM应用程序 (single-buffer)

    在上一篇DRM Direct Rendering Manager 学习简介 中 我们学习了DRM的基本概念以及基本组成元素 从本篇开始 我将以示例代码的形式 给大家分享学习DRM驱动开发的整个学习过程 在学习DRM驱动之前 应该首先了解如何
  • LWN 翻译:Atomic Mode Setting 设计简介(下)

    译者注 紧接上篇文章 本篇翻译起来有难度 同时对读者的技术背景有一定要求 适合深入研究 DRM 驱动的开发人员阅读 通过阅读本文 你将了解如下内容 DRM MODE ATOMIC ALLOW MODESET 标志位的由来及其作用 驱动中随处
  • DRM(Direct Rendering Manager)学习简介

    DRM DRM是Linux目前主流的图形显示框架 相比FB架构 DRM更能适应当前日益更新的显示硬件 比如FB原生不支持多层合成 不支持VSYNC 不支持DMA BUF 不支持异步更新 不支持fence机制等等 而这些功能DRM原生都支持
  • DRM框架(vkms)分析(3)----connector->func && connector->helper_private的使用

    一 connector gt func drm connector funcs类型的对象实例 其中有些对象实例可直接使用helper函数 有些可以自定义 还有一些可以忽略掉不赋值的 struct drm connector funcs co
  • DRM驱动(七)之atomic_commit

    上节已经把应用的参数check了一遍 这次就可以把对应的参数配置到硬件里进行刷图操作了 int drm atomic commit struct drm atomic state state struct drm mode config c
  • 直播系统源码平台内容安全与版权维护技术:DRM

    在数字化的时代 人们的生活中已深入到网络中来 许多人加入了直播系统源码平台中来 直播系统源码平台为用户们提供了一个发布图文短视频 开启直播 获取最新资讯的地方 这也衍生出了许多网红 主播等用户 他们会在直播系统源码平台发布高质量 受众多粉丝
  • MIPI DSI的linux kernel驱动原理

    为了点亮一块MIPI屏幕 我们除了要了解MIPI DSI的工作原理之外 大前提是要了解整个MIPI DSI图显系统的组成 更需要清楚点亮一块MIPI屏幕需要做哪些事情 本文会捋顺各个环节所实现的功能以及基于RK3399来分析各个环节实现的原
  • Delphi Win32 的最佳共享软件锁 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 与我上一个问题相同的介绍 我正在重写和 或合并一堆我的 应用程序框架 类 基本主窗体 关于框 锁定例程和购买链接 自动更新 数据模块初始化程序等 基
  • 三星智能电视通过 PlayRead 串流 MPEG DASH

    我尝试在 Orsay TV Tizen 之前的三星电视 上播放流 带有 PlayReady 的 MPEG DASH 未加密的 DASH 工作正常 我试图严格按照 DRM Today 手册 即我的 DRM 提供商 获取许可证 但播放无法开始
  • 有没有办法在 HTML5 视频上使用 DRM?

    由于 Flash 正在节节败退 我想知道是否有办法通过 DRM H264 ogg 和 WebM 保护 html5 视频 On the HTML5 上的 W3C 常见问题解答 http www w3 org html wiki FAQs Is
  • 如何在 Cast Receiver Player 中续订过期的 DRM 许可证?

    我基于以下内容开发自定义 Cast Receiver 应用程序Google Cast 应用程序框架 https developers google com cast docs caf receiver 接收器应用程序负责播放 Widevin
  • 检测 Widevine DRM HDCP 保护级别

    我目前正在切换到使用 Dash Widevine DRM 的 ExoPlayer 通过测试 我发现很大比例的设备没有启用 HDCP 保护 由于合同协议 这是一个问题 我必须在允许播放之前检测到并记录它 I took inspiration

随机推荐

  • 登录时发起的请求是Get还是Post?Get和Post的区别

    为了保证信息的安全性 注册 登录等操作通常都会使用POST请求 GET请求一般用来获取信息 1 根据HTTP规范 GET用于信息获取 GET请求的数据会附在URL之后 就是把数据放置在HTTP协议头中 以 分割URL和传输数据 参数之间以
  • CSS总结第七天

    day09 前端基础CSS第七天 学习目标 能够使用精灵图 能够使用字体图标 能够写出 CSS 三角 能够写出常见的 CSS 用户界面样式 能够说出常见的布局技巧 1 精灵图 重点 1 1 为什么需要精灵图 一个网页中往往会应用很多小的背景
  • IDEA 类名及方法名为红色,但是能正常启动-处理办法

    今天在切换分支过后 idea里面很多类名 方法名报红 提示类等找不到 但是不影响功能 解决办法 点击 idae 的 File gt Invalideate Caches Restart 清除缓存并重启即可 UG7O9VKKH6 eyJsaW
  • Spark:常用算子总结大全

    目录 park的算子的分类 从大方向来说 Spark 算子大致可以分为以下两类 1 Transformation 变换 转换算子 这种变换并不触发提交作业 完成作业中间过程处理 2 Action 行动算子 这类算子会触发 SparkCont
  • 小白的高德地图初体验(二)——聚合点

    小白的高德地图初体验 二 聚合点 说到高德地图 肯定要推荐官方文档 传送门 走你 小白的高德地图初体验 一 打点 小白的高德地图初体验 二 点聚合 小白的高德地图初体验 三 轨迹 小白的高德地图初体验 四 矢量图形 小白的高德地图初体验 五
  • Handler processing failed; nested exception is java.lang.NoClassDefFoundError: Could not initialize

    最近把项目中es 从1 7 3 升级 到 2 2 2 遇到如下异常 exception org springframework web util NestedServletException Handler processing faile
  • Android Studio 2.4 Preview(译文)

    原文地址 http tools android com tech docs android profiler Android的探查Android Studio中预览2 4 新的Android探查器在Android 2 4工作室预览窗口代替了
  • Palindrome Partitioning

    Given a string s partition s such that every substring of the partition is a palindrome Return all possible palindrome p
  • pip 和conda

    区别 pip是Python包的通用管理器 conda是一个与语言无关的跨平台环境管理器 pip在任何环境中安装python包 conda需要安装在conda环境中装任何包 Pip代表Pip Installs Packages 是Python
  • seaborn palette参数各配色方案及显示效果

    使用方法 以采用Paired r配色方法为例 通过调用barplot palette Spectral r 来使用配色 Paired r Accent Accent r Blues Blues r BrBG BrBG r BuGn BuGn
  • STM32 基础系列教程 5 – 系统定时器

    前言 学习stm32 systime的使用 用基本定时器产生定时1ms定时中断 用于参生1ms系统时钟节拍 并实现将1ms 节拍改成500us 或其它时间功能 并实产生的时间节拍为机基准实现控制LED闪烁 示例详解 基于硬件平台 STM32
  • Centos7.5 防火墙关闭但是除22端口其他端口无法访问问题

    centos7系统 关闭 firewalld防火墙 但是除了22端口 其余端口无法被外界访问 本地访问正常 我这里是服务器缓存问题 将服务器防火墙重启刷新一下就可以正常使用了 根据下面命令 操作 firewalld 防火墙 启动 syste
  • 关于前后台日期格式化问题 ,@JsonFormat、@JSONField、@DateTimeFormat

    大家都知道可能前台表单提交后台 或者后台 实体类json 序列化到前台可能格式不是我们想要的情况 这时候可能就需要上面三个注解来帮忙 但是 本人在项目使用过程中 使用 JsonField 一直失效 百思不得其解 难道是 在springboo
  • 爬虫之添加代理(五)

    验证代理是否可用 try telnetlib Telnet 221 15 192 96 port 1080 timeout 3 except print ip无效 else print ip有效 添加代理 添加proxy属性 import
  • 【机器学习】GRU 讲解

    有任何的书写错误 排版错误 概念错误等 希望大家包含指正 在阅读本篇之前建议先学习 RNN 讲解 LSTM 讲解 3 GRU 3 1 网络结构 GRU 是循环神经网络的一种 和 LSTM 一样 是为了解决长期依赖问题 GRU 单元结构如下
  • Overleaf使用tips(自己随手记)

    使用中文输入 导入包 usepackage UTF8 ctex 切换编译器为XeLatex 另起一段 直接空几个行就行 比如 注释 选中后ctrl 标题的使用 section 这是一级标题 subsection 这是二级标题 subsubs
  • TVM编译安装

    本文是在已大致了解tvm功能和架构的基础上 根据官方文档 在x86 64 Ubuntu 18 04 GPU Pytorch1 8 0上安装TVM的流程 参考文档 TVM安装官方文档 llvm下载链接 1 下载源代码 从tvm官网下载源代码
  • 基于粒子群算法优化支持向量机(PSO-SVM)的时间序列预测。模型评价指标包括:R2、MAE、MSE、RMSE和MAPE等,代码质量极高,方便学习和替换数据。

    清空环境变量 warning off 关闭报警信息 close all 关闭开启的图窗 clear 清空变量 clc 清空命令行 tic 导入数据 f xlsread windspeed xls Sheet1 B2 B1001 x y da
  • Jina AI x 矩池云

    近 5 年以来 图片 视频 语音等非结构化数据的数量 出现了爆发式增长 随着深度学习技术的不断升级 深度表征学习 迁移学习 对比学习等技术日益成熟 非结构化数据的搜索也逐渐形成可能 在此背景下 专注于神经搜索技术的商业开源软件公司 Jina
  • DRM框架(vkms)分析(3)----connector->func && connector->helper_private的使用

    一 connector gt func drm connector funcs类型的对象实例 其中有些对象实例可直接使用helper函数 有些可以自定义 还有一些可以忽略掉不赋值的 struct drm connector funcs co