drm 和 sysfs

2024-05-14 00:04
文章标签 drm sysfs

本文主要是介绍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;
}

这篇关于drm 和 sysfs的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/987188

相关文章

驱动开发系列16 - Linux Graphics DRM和KMS内核模块介绍

一:概述         “直接渲染管理器”(DRM)和“内核模式设置”(KMS)API 是 Linux 图形系统的重要组成部分。然而,关于它们具体是什么的文档非常难以找到——而谷歌搜索到的大部分内容都是完全过时的。看起来在这个领域工作的人们太忙了,无法进行文档编写。这篇文章提供了关于 DRM 内核模块内部实现细节的更详细信息。 二:DRI、DRM和KMS的目的         一开始,所有

Linux创建sysfs属性节点 - DEVICE_ATTR宏、device_create_file()、sysfs_create_group()

目录 简介: 一、DEVICE_ATTR介绍 1、DEVICE_ATTR宏 1.1 参数说明 1.2 调用方法 二、sysfs创建属性文件 1、创建一个sysfs属性文件 1.1 device_create_file()函数 1.2 device_create_file()实例 2、创建多个sysfs属性文件 2.1 sysfs_create_group()函数 2

sysfs系统

自2.6版本开始,linux内核开始使用sysfs文件系统,作用是将设备和驱动程序的信息导出到用户空间,方便了用户读取设备信息,同时支持修改和调整。 与ext系列和fat等文件系统不同的是,sysfs是一个系统在启动时构建在内存中虚拟文件系统,一般被挂载在/sys目录下,既然是存储在内存中,自然掉电不保存,不能存储用户数据。 事实上,在之前也有同样的虚拟文件系统建立了内核与用户系统信息的交

Linux中的DRM 介绍

Linux中的DRM 如果在搜索引擎离搜索 DRM 映入眼帘的尽是Digital Rights Managemen,也就是数字版权加密保护技术。 这当然不是我们想要的解释。在类unix世界中还有一个DRM即The Direct Rendering Manager,它是DRI(Direct Rendering Infrastructure)框架的一个组件。而DRI的作用是为类Unix系统提供

DRM Wayland基本概念

1.linux系统中查看屏幕分辨率(通常是在设备树中进行配置的) #2代设备,实际物理尺寸-1.9英寸$cat /sys/class/graphics/fb0/virtual_size170,320#3代设备,实际物理尺寸-2.97英寸$cat /sys/class/graphics/fb0/virtual_size480,800 2.lcd外设选型参数 (1)物理尺寸(2)硬件

Linux驱动开发笔记(十三)Sysfs文件系统

文章目录 前言一、Sysfs1.1 Sysfs的引入1.2 Sysfs的目录结构1.2 Sysfs的目录详解1.2.1 devices1.2.2 bus1.2.3 class1.2.4 devices、bus、class目录之间的关系1.2.5 其他子目录 二、Sysfs使用2.1 核心数据结构2.2 相关函数2.2.1 kobject_create_and_add2.2.2 kobjec

Linux开发讲课7---Linux sysfs文件系统

一、sysfs文件系统介绍         Sysfs(System Filesystem)是Linux内核提供的一种虚拟文件系统,用于向用户空间公开有关设备和驱动程序的信息。它类似于/proc文件系统,但是专注于设备和驱动程序信息,而非进程信息。         Sysfs通过文件和目录的方式组织信息,其中每个文件或目录对应于系统中的一个设备、驱动程序或者其他内核对象。这些文件通常包含有关设

Android下HWC以及drm_hwcomposer普法(下)

Android下HWC以及drm_hwcomposer普法(下) 引言 不容易啊,写到这里。经过前面的普法(上),我相信童鞋们对HWC和drm_hwcomposer已经有了一定的认知了。谷歌出品,必须精品。我们前面的篇章见分析到啥来了,对了分析到了HwcDisplay::init,然后设置Backend后端来着! 一.如何理解drm_hwcomposer的backend

Android下HWC以及drm_hwcomposer普法(上)

Android下HWC以及drm_hwcomposer普法(上) 引言 按摩得全套,错了,做事情得全套,普法分析也是如此。drm_hwcomposer如果对Android图形栈有一定研究的童鞋们应该知道它是Android提供的一个的图形后端合成处理HAL模块的实现。但是在分析这个之前我们非常有必要了解一下Android的HWC前世今生,然后再来看drm_hwcomposer是如何配合

Linux 文件系统:procfs, sysfs, debugfs 用法简介

1 1 前言 内核中有三个常用的伪文件系统:procfs,debugfs和sysfs。 procfs — The proc filesystem is a pseudo-filesystem which provides an interface to kernel data structures. sysfs — The filesystem for exporting kernel