RK3568驱动指南|第九篇 设备模型-第105章 platform总线设备注册流程实例分析实验

news2025/6/8 8:08:50

瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码,支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU,可用于轻量级人工智能应用。RK3568 支持安卓 11 和 linux 系统,主要面向物联网网关、NVR 存储、工控平板、工业检测、工控盒、卡拉 OK、云终端、车载中控等行业。


【公众号】迅为电子

【粉丝群】824412014(加群获取驱动文档+例程)

【视频观看】嵌入式学习之Linux驱动(第九期_设备模型_全新升级)_基于RK3568

【购买链接】迅为RK3568开发板瑞芯微Linux安卓鸿蒙ARM核心板人工智能AI主板


第105章  platform总线设备注册流程实例分析实验

在上个章节中,我们详细分析了设备是如何注册到总线上的过程,在本章节中,我们将进一步探讨platform设备是如何注册到platform总线上的。

在平台设备驱动中,我们使用platform_device_register函数注册平台总线设备。platform_device_register函数实现如下所示:

int platform_device_register(struct platform_device *pdev)
{
	device_initialize(&pdev->dev);
	arch_setup_pdev_archdata(pdev);
	return platform_device_add(pdev);
}

device_initialize函数在上个章节重点分析过,在此不作过多解释。我们重点来看platform_device_add函数,函数实现如下所示:

int platform_device_add(struct platform_device *pdev)
{
	u32 i;
	int ret;

	// 检查输入的平台设备指针是否为空
	if (!pdev)
		return -EINVAL;

	// 如果平台设备的父设备为空,将父设备设置为 platform_bus
	if (!pdev->dev.parent)
		pdev->dev.parent = &platform_bus;

	// 将平台设备的总线设置为 platform_bus_type
	pdev->dev.bus = &platform_bus_type;

	// 根据平台设备的 id 进行不同的处理
	switch (pdev->id) {
	default:
		// 根据设备名和 id 设置设备的名字
		dev_set_name(&pdev->dev, "%s.%d", pdev->name, pdev->id);
		break;
	case PLATFORM_DEVID_NONE:
		// 如果 id 为 PLATFORM_DEVID_NONE,则只使用设备名作为设备的名字
		dev_set_name(&pdev->dev, "%s", pdev->name);
		break;
	case PLATFORM_DEVID_AUTO:
		/*
		 * 自动分配的设备 ID。将其标记为自动分配的,以便我们记住它需要释放,
		 * 并且为了避免与显式 ID 的命名空间冲突,我们附加一个后缀。
		 */
		ret = ida_simple_get(&platform_devid_ida, 0, 0, GFP_KERNEL);
		if (ret < 0)
			goto err_out;
		pdev->id = ret;
		pdev->id_auto = true;
		dev_set_name(&pdev->dev, "%s.%d.auto", pdev->name, pdev->id);
		break;
	}

	// 遍历平台设备的资源列表,处理每个资源
	for (i = 0; i < pdev->num_resources; i++) {
		struct resource *p, *r = &pdev->resource[i];

		// 如果资源的名称为空,则将资源的名称设置为设备的名字
		if (r->name == NULL)
			r->name = dev_name(&pdev->dev);

		p = r->parent;
		if (!p) {
			// 如果资源没有指定父资源,则根据资源类型设置默认的父资源
			if (resource_type(r) == IORESOURCE_MEM)
				p = &iomem_resource;
			else if (resource_type(r) == IORESOURCE_IO)
				p = &ioport_resource;
		}

		// 如果父资源存在,并且将资源插入到父资源中失败,则返回错误
		if (p && insert_resource(p, r)) {
			dev_err(&pdev->dev, "failed to claim resource %d: %pR\n", i, r);
			ret = -EBUSY;
			goto failed;
		}
	}

	// 打印调试信息,注册平台设备
	pr_debug("Registering platform device '%s'. Parent at %s\n",
		 dev_name(&pdev->dev), dev_name(pdev->dev.parent));

	// 添加设备到设备层级中,注册设备
	ret = device_add(&pdev->dev);
	if (ret == 0)
		return ret;

failed:
	// 如果设备 ID 是自动分配的,需要移除已分配的 ID
	if (pdev->id_auto) {
		ida_simple_remove(&platform_devid_ida, pdev->id);
		pdev->id = PLATFORM_DEVID_AUTO;
	}

	// 在失败的情况下,释放已插入的资源
	while (i--) {
		struct resource *r = &pdev->resource[i];
		if (r->parent)
			release_resource(r);
	}

err_out:
	// 返回错误码
	return ret;
}

上述函数表示向平台总线中添加平台设备。下面是函数的执行过程及注释:

  • 第6~8行代码中,检查传入的平台设备指针是否为空,如果为空则返回无效参数错误码。
  • 第11行代码中,如果平台设备的父设备为空,则将父设备设置为 platform_bus。将平台设备的总线设置为 platform_bus_type。
  • 第17行~39行代码中,根据平台设备的ID进行不同的处理:默认情况下,根据设备名称和ID设置设备的名称。如果ID为PLATFORM_DEVID_NONE,则只使用设备名称作为设备的名称。如果ID为PLATFORM_DEVID_AUTO,则自动分配设备ID。使用ida_simple_get函数获取一个可用的ID,并将设备ID标记为自动分配。设备名称将附加一个后缀以避免与显式ID的命名空间冲突。

设置设备的名字,名字有三种格式,如下图所示:

图105-1

图105-2

  • 第42行~64行代码中,遍历平台设备的资源列表,处理每个资源。如果资源的名称为空,则将资源的名称设置为设备的名称。如果资源没有指定父资源,则根据资源类型设置默认的父资源。如果父资源存在,并且将资源插入到父资源中失败,则返回忙碌错误码。
  •     在Linux操作系统中,为了方便管理设备资源,所有设备资源都会添加到资源树中。每个设备资      源都会有一个父资源,用于表示该设备资源所属的资源的根。
  • 第67行代码,打印调试信息,注册平台设备。
  • 第71行代码,调用device_add函数将设备添加到设备层级结构中进行设备注册。如果注册成功,则返回0。

到此,platform总线设备注册流程分析完毕。


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

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

相关文章

1月4日代码随想录对称二叉树

101.对称二叉树 101. 对称二叉树 - 力扣&#xff08;LeetCode&#xff09; 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true示例 2&#xff1a; 输入&#xff1a;root [1,2,2…

面试算法89:房屋偷盗

题目 输入一个数组表示某条街道上的一排房屋内财产的数量。如果这条街道上相邻的两幢房屋被盗就会自动触发报警系统。请计算小偷在这条街道上最多能偷取到多少财产。例如&#xff0c;街道上5幢房屋内的财产用数组[2&#xff0c;3&#xff0c;4&#xff0c;5&#xff0c;3]表示…

【JVM面试题】Java中的静态方法为什么不能调用非静态方法

昨晚京东大佬勇哥在群里分享了一道他新创的JVM面试题&#xff0c;我听完后觉得还挺有意思的&#xff0c;分享给大家 小佬们先别急着看我的分析&#xff0c;先自己想想答案 你是不是想说 因为静态方法是属于类的&#xff0c;而非静态方法属于实例对象 哈&#xff0c;有人这样回答…

【解决openGauss无法使用gs_check等服务器端命令问题】

【解决openGauss无法使用gs_check等服务器端命令问题】 一、问题描述二、问题原因三、解决方法 一、问题描述 [ommopengauss03 ~]$ gs_check -i CheckCPU Parsing the check items config file successfully [GAUSS-53026]: ERROR: Execute SSH command on host 192.168.56.19…

什么是设备树?

一. 简介 前面只是简单使用过设备树文件&#xff0c;接下来详细谈一谈设备树。掌握设备树是 Linux 驱动开发人员必 备的技能&#xff01; 因为在新版本的 Linux 中&#xff0c;ARM 相关的驱动全部采用了设备树(也有支持老式驱动的&#xff0c;比较少)&#xff0c;最新出的 CP…

打地鼠python程序设计说明,打地鼠游戏界面设计

这篇文章主要介绍了打地鼠python程序设计说明&#xff0c;具有一定借鉴价值&#xff0c;需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获&#xff0c;下面让小编带着大家一起了解一下。 Pygame库是专门为了帮助做出的游戏和其他多媒体应用Python编程语言的一个开放源代…

PyQt学习笔记

文章目录 1 环境搭建1.1 安装PyQt51.1.1 安装1.1.2 验证 1.2 安装PyInstaller1.3 安装PySide1.4 安装InnoSetup1.5 PyCharm配置外部工具1.5.1 PyCharm配置PyLUpdate1.5.2 PyCharm配置QtLinguist1.5.3 PyCharm配置QtDesigner1.5.4 PyCharm配置PyUIC1.5.5 PyCharm配置PyRCC1.5.6 …

SCPMA最新研究论文推荐!中国移动玻色量子发布联合研究成果

《中国科学&#xff1a;物理学 力学 天文学》英文版(SCIENCE CHINA Physics, Mechanics & Astronomy, SCPMA)出版中移(苏州)软件技术有限公司闻经纬和钱岭团队与北京玻色量子文凯团队的研究成果&#xff0c;文章题为“Optical experimental solution for the multiway numb…

win10搭建keras深度学习框架

在Win10系统上安装Keras&#xff0c;你可以按照以下步骤进行&#xff1a; 安装Python环境--建议安装Anaconda3&#xff0c;可以从官方网站下载对应版本的安装程序进行安装。一步一步的next就行了。安装完成后把根目录下的scripts目录加入path系统变量。 使用pip命令安装Tensor…

d3dcompiler_43.dll丢失怎么修复?怎么解决

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“找不到d3dcompiler_43.dll文件”。那么&#xff0c;d3dcompiler_43.dll是什么文件&#xff1f;它的作用是什么&#xff1f;如果缺失了该如何修复呢&#xff1f;本文将详细介绍d3dcompiler_…

《Linux系统与网络管理》复习题库---简答题

1、简述这些分区的名字以及各自的作用。 答&#xff1a; /boot 存放内核镜像的地方&#xff0c;这个文件夹独立分区的意义在于降低不能开机的风险。 /根目录&#xff0c;一般采用 ext3 文件系统&#xff0c;分区的容量一定要大于安装软件包的容量。 /usr 多数软件的默认安装的地…

如何对APP进行安全加固

引言 如今&#xff0c;移动应用市场蓬勃发展&#xff0c;APP数量呈现爆炸性增长。随着5G技术的广泛应用&#xff0c;APP的增长趋势持续增强。然而&#xff0c;由于APP的泛滥&#xff0c;网络攻击者的目标也在逐渐转移&#xff0c;数亿的移动互联网用户面临着病毒攻击的威胁&am…

Mysql 重要知识点1(含面试题1)

Mysql 知识点较多&#xff0c;这里涵盖了基本知识点&#xff0c;包括SQL语句 、重要面试题等。后面还有几章Mysql的知识点&#xff0c;分别是刷题总结与进阶优化SQL 面试题等。 目录 Mysql 安装Mysql 重要知识点SQL 重要语句面试题精选 Mysql 安装 1.官网下载mysql5.7版本压缩…

Vue 中的 ref 与 reactive:让你的应用更具响应性(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

张驰咨询:ZENNER真兰标杆展示——2023年六西格玛DMAIC项目出色落下帷幕

告别了旧年&#xff0c;我们跨入了新的一年&#xff01;ZENNER在23年初启动的DMAIC项目在2023年12月25日迎来了总结、收获成果的发布会。 ZENNER真兰集团中国区总裁杨燕明先生&#xff0c;张驰咨询公司的两位精益六西格玛黑带大师专家张驰老师和朱成朝老师&#xff0c;以及真诺…

【教学类-09-04】20240102《游戏棋N*N》数字填写,制作棋子和骰子

作品展示 背景需求&#xff1a; 最近在清理学具材料库&#xff0c;找到一套1年多前的《N*N游戏棋》&#xff0c;把没有用完的棋盘拿出来&#xff0c;&#xff0c;想给大4班换花样&#xff0c;并把它们用掉。 程序代码在这里 【教学类-09-03】20221120《游戏棋10*10数字如何直接…

马蹄集oj赛(双周赛第十八次)

目录 幸运的3 打靶 照亮街道 九次九日九重色 寻找串 竹鼠的白色季节 捉迷藏 好的三连 三角数 买马 可怜的小码哥 花园浇水 高次方程 幸运的3 难度:黄金时间限制: 1秒四占用内存:128M 你有 n 个数&#xff0c;可以将它们两两匹配(即将两数首尾相连)&#xff0c;每个…

基于springboot公租房申请管理系统

开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven…

【mujoco】Ubuntu20.04中解决mujoco报错raise error.MujocoDependencyError

【mujoco】Ubuntu20.04中解决mujoco报错raise error.MujocoDependencyError 文章目录 【mujoco】Ubuntu20.04中解决mujoco报错raise error.MujocoDependencyError1. 报错的具体情况2. 解决过程3. 其他问题3.1 ModuleNotFoundError: No module named OpenGL3.2 ModuleNotFoundEr…

固定差价没有发展起来,Anzo Capital一语道破

正所谓没有对比就没有伤害&#xff0c;固定差价被浮动差价所取代那也是时代发展的必然结果。固定差价没有发展起来&#xff0c;Anzo Capital今天一语道破。 其实在今天很少有外汇经纪人提供固定的差价。浮动差价变得如此受欢迎&#xff0c;以至于它几乎完全取代了固定差价。那…