drm 和 sysfs

DRM 全称是Direct Rendering Manager,进行显示输出管理、buffer 分配、帧缓冲。对应userspace 库为libdrm,libdrm 库提供了一系列友好的控制封装,使用户可以方便的进行显示的控制和buffer 申请。

DRM的设备节点为"/dev/dri/cardX", X 为0-15 的数值,默认使用的是/dev/dri/card0。

CRTC

显示控制器,在rockchip 平台是SOC 内部VOP(部分文档也称为LCDC)模块的抽象

Plane

图层,在rockchip 平台是SOC 内部VOP(LCDC)模块win 图层的抽象

Encoder

输出转换器,指RGB、LVDS、DSI、eDP、HDMI、CVBS、VGA 等显示接口

Connector

连接器,指encoder 和panel 之间交互的接口部分

Bridge

桥接设备,一般用于注册encoder 后面另外再接的转换芯片,如DSI2HDMI 转换芯片

Panel

泛指屏,各种LCD、HDMI 等显示设备的抽象

GEM

buffer 管理和分配,类似android 下的ion

drm sysfs  初始化

/*** drm_sysfs_init - initialize sysfs helpers** This is used to create the DRM class, which is the implicit parent of any* other top-level DRM sysfs objects.** You must call drm_sysfs_destroy() to release the allocated resources.** Return: 0 on success, negative error code on failure.*/
int drm_sysfs_init(void)
{int err;drm_class = class_create(THIS_MODULE, "drm");//sys/class/drmif (IS_ERR(drm_class))return PTR_ERR(drm_class);err = class_create_file(drm_class, &class_attr_version.attr);if (err) {class_destroy(drm_class);drm_class = NULL;return err;}drm_class->devnode = drm_devnode;drm_setup_hdcp_srm(drm_class);return 0;
}

connector 注册的时候会注册进去

static DEVICE_ATTR_RW(status);//显示器的连接状态
static DEVICE_ATTR_RO(enabled);//使能
static DEVICE_ATTR_RO(dpms);//dpms 
static DEVICE_ATTR_RO(modes);//分辨率static struct attribute *connector_dev_attrs[] = {&dev_attr_status.attr,&dev_attr_enabled.attr,&dev_attr_dpms.attr,&dev_attr_modes.attr,NULL
};static struct bin_attribute edid_attr = {.attr.name = "edid",.attr.mode = 0444,.size = 0,.read = edid_show,
};static struct bin_attribute *connector_bin_attrs[] = {&edid_attr,NULL
};static const struct attribute_group connector_dev_group = {.attrs = connector_dev_attrs,.bin_attrs = connector_bin_attrs,
};static const struct attribute_group *connector_dev_groups[] = {&connector_dev_group,NULL
};
int drm_sysfs_connector_add(struct drm_connector *connector)
{struct drm_device *dev = connector->dev;if (connector->kdev)return 0;connector->kdev =device_create_with_groups(drm_class, dev->primary->kdev, 0,connector, connector_dev_groups,"card%d-%s", dev->primary->index,connector->name);DRM_DEBUG("adding \"%s\" to sysfs\n",connector->name);if (IS_ERR(connector->kdev)) {DRM_ERROR("failed to register connector device: %ld\n", PTR_ERR(connector->kdev));return PTR_ERR(connector->kdev);}if (connector->ddc)return sysfs_create_link(&connector->kdev->kobj,&connector->ddc->dev.kobj, "ddc");return 0;
}

重要的2个show函数如下,显示器的edid和modes

static ssize_t modes_show(struct device *device,struct device_attribute *attr,char *buf)
{struct drm_connector *connector = to_drm_connector(device);struct drm_display_mode *mode;int written = 0;mutex_lock(&connector->dev->mode_config.mutex);list_for_each_entry(mode, &connector->modes, head) {written += snprintf(buf + written, PAGE_SIZE - written, "%s\n",mode->name);}mutex_unlock(&connector->dev->mode_config.mutex);return written;
}
static ssize_t edid_show(struct file *filp, struct kobject *kobj,struct bin_attribute *attr, char *buf, loff_t off,size_t count)
{struct device *connector_dev = kobj_to_dev(kobj);struct drm_connector *connector = to_drm_connector(connector_dev);unsigned char *edid;size_t size;ssize_t ret = 0;mutex_lock(&connector->dev->mode_config.mutex);if (!connector->edid_blob_ptr)goto unlock;edid = connector->edid_blob_ptr->data;size = connector->edid_blob_ptr->length;if (!edid)goto unlock;if (off >= size)goto unlock;if (off + count > size)count = size - off;memcpy(buf, edid + off, count);ret = count;
unlock:mutex_unlock(&connector->dev->mode_config.mutex);return ret;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/837014.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker运行出现iptables: No chain/target/match by that name报错如何解决?

在尝试重启 Docker 容器时遇到的错误信息表明有关 iptables 的配置出了问题。这通常是因为 Docker 需要配置网络,而 iptables 规则没有正确设置或被意外删除。具体到你的错误信息中,报错 iptables: No chain/target/match by that name 表示 Docker 尝试…

深入理解与应用C++ Vector

1. C Vector 简介与基本使用 C 的 vector 是一个序列容器,用于表示可变大小的数组。它结合了数组的高效元素访问和动态大小调整的灵活性。与静态数组相比,vector 的大小可以根据需要自动调整,这是通过在底层使用动态数组来实现的。当新元素被…

[原创](Modern C++)现代C++的Lambda表达式常规概念以及细节探讨

[简介] 常用网名: 猪头三 出生日期: 1981.XX.XX QQ联系: 643439947 个人网站: 80x86汇编小站 https://www.x86asm.org 编程生涯: 2001年~至今[共22年] 职业生涯: 20年 开发语言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 开发工具: Visual Studio、D…

【Day2:JAVA变量、数据类型、运算符的认识】

目录 1、变量的介绍、定义、使用2、标识符2.1 概念2.2 标识符的命名规则2.3 标识符的命名规范 3、数据类型3.1 基本数据类型3.2 引用数据类型 4、Scanner键盘录入4.1 键盘录入效果介绍4.2 键盘录入的三个步骤 5、运算符5.1 运算符和表达式5.2 算数运算符5.3 自增自减运算符5.4 …

JUC------共享模型------管程

概念 什么是管程 管程(Monitor,直译是”监视器“的意思)是一种操作系统中的同步机制,它的引入是为了解决多线程或多进程环境下的并发控制问题。 翻译为 Java 领域的语言,就是管理类的成员变量和成员方法,…

在vue3中测试执行typescript代码片段

官方推荐的vitest方法 在vue3typescript项目中,一般来说用vite做构建系统。做测试的话,目前官方推荐的是vitest。官方文档在 https://vitest.dev/guide/ 在vue3typescriptvite5项目中,运行安装命令 npm install -D vitest 就可以把vites…

批量获取oracle库存储过程

场景:需要获取oracle库下的存储过程做备份 示例:获取单个存储过程,sql实现如下 SELECT owner,object_name,object_type FROM dba_objects; SELECT DBMS_LOB.SUBSTR(DBMS_METADATA.GET_DDL(FUNCTION,CONCATSTR,TEST)) FROM DUAL; CREATE OR REPLACE EDITIONABLE FUNCTION &quo…

【教学类-55-02】20240512图层顺序挑战(四格长条纸加黑色边框、4*4、7张 、43200张去掉非7色有23040张,去掉重复样式有几种?)

作品展示 背景需求: 之前的代码吗存在几个问题,最大的问题是不能生成“”长条黑边框”” 【教学类-55-01】20240511图层顺序挑战(四格长条纸)(4*4)和“手工纸自制参考图”-CSDN博客文章浏览阅读485次&…

使用Navicat将MySql数据库导入和导出

一,导出数据表 1.使用Navicat打开数据库,右键数据库,点击转储SQL文件,点击结构和数据。 2.选择生成文件的地方 3.等待生成完成 4.生成完成 二,导入数据库表和数据SQL文件 1.新建一个数据库 2.右键选择运行SQl文件 记…

OSPF协议1

OSPF开放式最短路径优先协议 1,OSPF协议因为其传递的是拓扑信息,之后,通过SPF算法将图形结构转换成为树形结构,所以,其计算出的路径不存在环路。并且,OSPF是使用带宽作为开销值的评判标准,所以…

如何利用甘特图来提高资源的是使用效率?

在项目管理中,甘特图是一种常用的工具,用于规划和跟踪项目进度。它通过条形图的形式展示项目的时间表和任务依赖关系,帮助项目经理和团队成员清晰地了解项目的时间线和进度。通过合理利用甘特图,可以显著提高资源的使用效率&#…

一文入门DNS

概述 DNS是一个缩写,可以代表Domain Name System,域名系统,是互联网的一项基础服务。也可以代表Domain Name Server,域名服务器,是进行域名和与之相对应的IP地址相互转换的服务器。DNS协议则是用来将域名转换为IP地址…

1W、2W 3KVAC隔离 宽电压输入 交直两用AC/DC 电源模块 ——TP01(02)AZ 系列

TP01(02)AZ为客户提供一款超小体积模块式开关电源,该系列模块电源输出功率为1W、2W,具有极低的空载损耗,低漏电流仅0.1mA,小体积,隔离耐压高达3KV等特点。产品安全可靠,EMC 性能好,EMC 及安全规…

Ubuntu安装Mysql数据库无法远程连接

1.远程端口未开 2.Mysql 数据库中user表 2.1 用户名root 的host字段味更改为% 允许远程访问; use mysql;SELECT user,host,plugin,authentication_string FROM user;userhostpluginauthentication_stringroot%auth_socketdebian-sys-maintlocalhostcaching_sha2_p…

树莓派配置双网卡分别为AD HOC和AP模式

树莓派配置双网卡分别为AD HOC和AP模式 需求说明:为了实现分级网络管理,将多个无人机分簇,簇间使用AD HOC进行无中心自组织的网络,簇内使用AP-AC模式进行中心化网络。因此,需要配置一台设备,同时完成AD HOC…

Quartz.Net(1)

Quartz 1 Quartz是一个强大的、开源的、轻量级的任务调度框架 Quartz官方文档 2 Quartz中有五个重要的概念 Scheduler 调度器Trigger 触发器Job 工作任务ThreadPool 线程池 ,不是CLI的线程池,而是Quartz特有的线程池JobStrore 调度存储,存…

三、配置带HybridCLR的ARCore开发环境

预告 本专栏将介绍如何使用这个支持热更的AR开发插件,快速地开发AR应用。 专栏: Unity开发AR系列 插件简介 通过热更技术实现动态地加载AR场景,简化了AR开发流程,让用户可更多地关注Unity场景内容的制作。 “EnvInstaller…”支…

【eclipse】如何在IDE里创建一个Java Web项目?

如何在eclipse中创建一个动态Web项目并成功运行? 一、 最终效果 懒得写那么多了…我也不知道该怎么写了,有点乱,有问题可以在评论里留言,我看到会解决的,在这个过程中也踩到了一些坑,但好在有CSDN帮助解决…

【C++杂货铺】红黑树

目录 🌈前言🌈 📁 红黑树的概念 📁 红黑树的性质 📁 红黑树节点的定义 📁 红黑树的插入操作 📁 红黑树和AVL树的比较 📁 全代码展示 📁 总结 🌈前言…

文章模版--测试

学习目标: 提示:这里可以添加学习目标 例如: 一周掌握 Java 入门知识 学习内容: 提示:这里可以添加要学的内容 例如: 搭建 Java 开发环境掌握 Java 基本语法掌握条件语句掌握循环语句 学习时间&#…