drm 和 sysfs

devtools/2024/9/24 2:19:16/

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.ppmy.cn/devtools/41033.html

相关文章

免费思维13招之九:时间型思维

免费思维13招之九:时间型思维 免费思维的另一大战略思维——时间型思维。 什么是时间型思维呢?就是在某一个规定的时间内对消费者进行免费,比如一个月中的某一天,或一周中的某一天或一天中的某一个时间段对消费者进行免费。 就在去年,有一个电影院老板弟子,他的电影院营…

Python3 笔记:Python的常量

常量(constant):跟变量相对应,指第一次赋予值后就保持固定不变的值。 Python里面没有声明常量的关键字,其他语言像C/C/Java会有const修饰符,但Python没有。 Python中没有使用语法强制定义常量&#xff0c…

Shell生成支持x264的ffmpeg安卓全平台so

安卓 FFmpeg系列 第一章 Ubuntu生成ffmpeg安卓全平台so 第二章 Windows生成ffmpeg安卓全平台so 第三章 生成支持x264的ffmpeg安卓全平台so(本章) 文章目录 安卓 FFmpeg系列前言一、实现步骤1、下载x264源码2、交叉编译生成.a3、加入x264配置4、编译ffmp…

《Mybatis》系列文章目录

什么是 MyBatis? MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO&#xff…

鸿蒙HarmonyOS开发:List列表组件的使用详解及案例演示(二)

文章目录 一、List组件简介1、List组件2、ListItem组件3、ListItemGroup组件 二、使用ForEach渲染列表三、设置列表分割线四、设置List排列方向五、索引值计算规则六、示例演示1、AlphabetIndexer组件2、代码3、效果 一、List组件简介 在我们常用的手机应用中,经常…

【Ajax零基础教程】-----第四课 简单实现

一、XMLHttpRequest对象 通过XMLHttpRequest对象来向服务器发送异步请求,从服务器获取数据。然后用JavaScript来操作DOM而更新页面。XMLHttpRequest是ajax的核心机制,它是IE5中首先引入的,是一种支持异步请求的技术。 简单的说,也…

八、e2studio VS STM32CubeIDE之内存使用情况窗口

目录 一、概述/目的 二、STM32CubeIDE Build Analyzer 三、e2studio Memory Usage 八、e2studio VS STM32CubeIDE之内存使用情况窗口 一、概述/目的 1、嵌入开发最大特点之一就是资源受限,关注芯片资源使用详情是优秀工程师的技能之一 2、Keil和IAR都不支持内存…

Oracle redo 日志损坏的几种情况下的恢复方式

Oracle redo 日志损坏的几种情况下的恢复 第一种情况:损坏的redo不是当前正在使用的redo 1、归档模式,不是当前正在使用的日志损坏(INACTIVE),数据库处于活动状态。 模拟损坏: SQL> select * from v$log; SQL> !rm redo02.log SQL> !ls -l 日志提示错误: ORA-2…