当前位置: 首页 > article >正文

DRM系列三:drm core模块入口

本系列文章基于linux 5.15

一、drm_core_init

执行一些drm core的初始化工作

static int __init drm_core_init(void)
{
	int ret;

	drm_connector_ida_init();
	idr_init(&drm_minors_idr);
	drm_memcpy_init_early();

	ret = drm_sysfs_init();
	if (ret < 0) {
		DRM_ERROR("Cannot create DRM class: %d\n", ret);
		goto error;
	}

    /*在/sys/kernel/debug/下创建dri目录*/
	drm_debugfs_root = debugfs_create_dir("dri", NULL);
	/*为drm申请主设备号,这里是DRM_MAJOR*/
	ret = register_chrdev(DRM_MAJOR, "drm", &drm_stub_fops);
	if (ret < 0)
		goto error;

	drm_core_init_complete = true;

	DRM_DEBUG("Initialized\n");
	return 0;

error:
	drm_core_exit();
	return ret;
}

1.drm_connector_ida_init

为每个连接器类型分配一个独立的 IDA,IDA(ID Allocator,ID 分配器) 是一种用于分配和管理唯一 ID 的机制,通常用于内核中需要分配唯一标识符的场景。其好处是:内核开发者可以方便地管理唯一 ID 的分配和释放,从而避免 ID 冲突和资源浪费。

static struct drm_conn_prop_enum_list drm_connector_enum_list[] = {
	{ DRM_MODE_CONNECTOR_Unknown, "Unknown" },
	{ DRM_MODE_CONNECTOR_VGA, "VGA" },
	{ DRM_MODE_CONNECTOR_DVII, "DVI-I" },
	{ DRM_MODE_CONNECTOR_DVID, "DVI-D" },
	{ DRM_MODE_CONNECTOR_DVIA, "DVI-A" },
	{ DRM_MODE_CONNECTOR_Composite, "Composite" },
	{ DRM_MODE_CONNECTOR_SVIDEO, "SVIDEO" },
	{ DRM_MODE_CONNECTOR_LVDS, "LVDS" },
	{ DRM_MODE_CONNECTOR_Component, "Component" },
	{ DRM_MODE_CONNECTOR_9PinDIN, "DIN" },
	{ DRM_MODE_CONNECTOR_DisplayPort, "DP" },
	{ DRM_MODE_CONNECTOR_HDMIA, "HDMI-A" },
	{ DRM_MODE_CONNECTOR_HDMIB, "HDMI-B" },
	{ DRM_MODE_CONNECTOR_TV, "TV" },
	{ DRM_MODE_CONNECTOR_eDP, "eDP" },
	{ DRM_MODE_CONNECTOR_VIRTUAL, "Virtual" },
	{ DRM_MODE_CONNECTOR_DSI, "DSI" },
	{ DRM_MODE_CONNECTOR_DPI, "DPI" },
	{ DRM_MODE_CONNECTOR_WRITEBACK, "Writeback" },
	{ DRM_MODE_CONNECTOR_SPI, "SPI" },
	{ DRM_MODE_CONNECTOR_USB, "USB" },
};

void drm_connector_ida_init(void)
{
	int i;

	for (i = 0; i < ARRAY_SIZE(drm_connector_enum_list); i++)
		ida_init(&drm_connector_enum_list[i].ida);
}

2.drm_sysfs_init

创建class类drm_class,同时会在/sys/class/目录下创建一个新的文件夹drm,并设置设备节点

int drm_sysfs_init(void)
{
	int err;
/*创建设备类,此函数的执行会在/sys/class/目录下创建一个新的文件夹drm*/
	drm_class = class_create(THIS_MODULE, "drm");
	if (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;
	return 0;
}

2.1 drm_devnode

在/sys/class/drm下创建节点,例如/sys/class/drm/dri/card0、/sys/class/drm/dri/card1

static char *drm_devnode(struct device *dev, umode_t *mode)
{
	return kasprintf(GFP_KERNEL, "dri/%s", dev_name(dev));
}

二、drm_core_exit

针对drm_core_init做的一些注销工作

static void drm_core_exit(void)
{
	unregister_chrdev(DRM_MAJOR, "drm");
	debugfs_remove(drm_debugfs_root);
	drm_sysfs_destroy();
	idr_destroy(&drm_minors_idr);
	drm_connector_ida_destroy();
}

http://www.kler.cn/a/528893.html

相关文章:

  • 一文大白话讲清楚webpack基本使用——17——Tree Shaking
  • go-zero学习笔记(一)
  • Android记事本App设计开发项目实战教程2025最新版Android Studio
  • Office / WPS 公式、Mathtype 公式输入花体字、空心字
  • CAN总线数据采集与分析
  • Spring Boot 实例解析:从概念到代码
  • 40. SPI实验
  • 《解锁AI黑科技:数据分类聚类与可视化》
  • 1979-2021年 全国各省、地级市、区县空气流通系数
  • Google Chrome-便携增强版[解压即用]
  • DeepSeek模型与OpenAI模型原理和技术架构的异同分析
  • 深度学习 Pytorch 神经网络的学习
  • npm 和 pip 安装中常见问题总结
  • xss-labs靶场
  • 基于 STM32 的智能电动车防盗与管理系统
  • 基于YOLO11的肺结节检测系统
  • 【博弈论 学习】Chapter1. 策略式博弈与Nash均衡
  • sqli-labs靶场通关
  • 深入理解Java中的String
  • 2025年1月个人工作生活总结
  • 86.(2)攻防世界 WEB PHP2
  • 14-9-1C++STL的set容器
  • Android --- CameraX讲解
  • AI开发之 ——Anaconda 介绍
  • Easy系列PLC尺寸测量功能块ST代码(激光微距仪应用)
  • 动态规划DP 背包问题 完全背包问题(题目分析+C++完整代码)