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

瑞芯微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主板


第102章  platform总线注册流程实例分析实验

在上个章节中,我们详细地从代码的层面分析了总线注册的流程,并深入了解了总线的实现过程。现在,在本章节中,我们将继续承接前文的内容,进一步分析 platform 总线的注册流程。本章节将深入研究 platform 总线注册的关键步骤。揭示 platform 总线注册的内部机制。让我们开始吧!

内核在初始化的过程中调用platform_bus_init()函数来初始化平台总线,调用流程如下所示:

图102-1

我们直接分析platform_bus_init函数。在内核driver/base/platform.c文件中注册了platform文件,platform_bus_init函数如下所示

int __init platform_bus_init(void)
{int error;early_platform_cleanup();  // 提前清理平台总线相关资源error = device_register(&platform_bus);  // 注册平台总线设备if (error) {put_device(&platform_bus);  // 注册失败,释放平台总线设备return error;  // 返回错误代码}error = bus_register(&platform_bus_type);  // 注册平台总线类型if (error) {device_unregister(&platform_bus);  // 注册失败,注销平台总线设备return error;  // 返回错误代码}of_platform_register_reconfig_notifier();  // 注册平台重新配置的通知器return error;  // 返回错误代码(如果有)
}

函数首先清空总线early_platform_device_list上的所有节点。然后使用调用device_register(platform_bus_type) 注册平台总线设备,将platform_bus结构体注册到设备子系统中。然后使用bus_register(&platform_bus_type)函数注册平台总线类型,将 platform_bus_type 结构体注册到总线子系统中。

在上面的函数中使用bus_register(&platform_bus_type)注册了平台总线。platform_bus_type结构体如下所示:


struct bus_type platform_bus_type = {.name		= "platform",.dev_groups	= platform_dev_groups,.match		= platform_match,.uevent		= platform_uevent,.dma_configure	= platform_dma_configure,.pm		= &platform_dev_pm_ops,
};

上述代码定义了一个名为platform_bus_type的struct bus_type结构体变量,表示平台总线类型。

该结构体变量的成员包括:

  • .name = "platform":指定平台总线类型的名称为"platform"。
  • .dev_groups = platform_dev_groups:指定设备组的指针,用于定义与平台总线相关的设备属性组。
  • .match = platform_match:指定匹配函数的指针,用于确定设备是否与平台总线兼容。
  • .uevent = platform_uevent:指定事件处理函数的指针,用于处理与平台总线相关的事件。
  • .dma_configure = platform_dma_configure:指定DMA配置函数的指针,用于配置平台总线上的DMA。
  • .pm = &platform_dev_pm_ops:指定与电源管理相关的操作函数的指针,用于管理平台总线上的设备电源。

我们重点来看看platform_match函数,如下所示:

static int platform_match(struct device *dev, struct device_driver *drv)
{struct platform_device *pdev = to_platform_device(dev);struct platform_driver *pdrv = to_platform_driver(drv);/* When driver_override is set, only bind to the matching driver */if (pdev->driver_override)return !strcmp(pdev->driver_override, drv->name);/* Attempt an OF style match first */if (of_driver_match_device(dev, drv))return 1;/* Then try ACPI style match */if (acpi_driver_match_device(dev, drv))return 1;/* Then try to match against the id table */if (pdrv->id_table)return platform_match_id(pdrv->id_table, pdev) != NULL;/* fall-back to driver name match */return (strcmp(pdev->name, drv->name) == 0);
}

platform_match是一个用于判断设备和驱动程序是否匹配的函数。它接受两个参数:dev表示设备对象指针,drv表示驱动程序对象指针。上述函数的主要逻辑如下:

1首先,将dev和drv分别转换为struct platform_device和struct platform_driver类型的指针,以便后续使用。

2 检查pdev->driver_override是否设置。如果设置了,表示只要与指定的驱动程序名称匹配,即可认为设备和驱动程序匹配。函数会比较pdev->driver_override和drv->name的字符串是否相等,如果相等则返回匹配(非零)。

3 如果pdev->driver_override未设置,首先尝试进行OF风格的匹配(Open Firmware)。调用of_driver_match_device(dev, drv)函数,该函数会检查设备是否与驱动程序匹配。如果匹配成功,则返回匹配(非零)。

4 如果OF风格的匹配失败,接下来尝试进行ACPI风格的匹配(Advanced Configuration and Power Interface)。调用acpi_driver_match_device(dev, drv)函数,该函数会检查设备是否与驱动程序匹配。如果匹配成功,则返回匹配(非零)。

5 如果ACPI风格的匹配也失败,最后尝试根据驱动程序的ID表进行匹配。检查pdrv->id_table是否存在。如果存在,则调用platform_match_id(pdrv->id_table, pdev)函数来检查设备是否与ID表中的任何条目匹配。如果匹配成功,则返回匹配(非零)。

6如果以上所有匹配尝试都失败,最后使用驱动程序名称与设备名称进行比较。比较pdev->name和drv->name的字符串是否相等,如果相等则返回匹配(非零)。

通过上述分析,我们终于明白了为什么在platform总线匹配优先级的时候,of_match_table>id_table>name。

 至此,platform总线注册流程分析完毕。


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

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

相关文章

C# halcon 工业产品尺寸测量

产品检测 这段代码是一个基于HalconDotNet的Windows窗体应用程序,主要用于图像处理和测量。以下是对代码的一些总结: 1. **图像显示与加载:** - 使用HalconDotNet库进行图像处理。 - 通过OpenFileDialog实现图像文件的选择和加载。 …

纯css实现三等分饼图

实现原理,先绘制一个圆,然后把圆分成两份,在绘制一个菱形,最下面的角是120,这样就可以实现三等分啦 关键代码是一个css很少见的属性clip-path clip-path: polygon(24rem 36rem, 48rem 18rem, 24rem 0, 0 18rem); &…

使用Python做个可视化的“剪刀石头布”小游戏

目录 一、引言 二、环境准备与基础知识 三、游戏界面制作 四、游戏逻辑实现 五、代码示例 六、游戏测试与优化 七、扩展与改进 八、总结 一、引言 “剪刀石头布”是一种古老的手势游戏,它简单易懂,趣味性强,适合各个年龄段的人参与。…

Reids在Win下无法远程访问

1.将redis在windows上启动主要做了以下配置 1.1.在redis.windows.conf中修改一下 原:bind 127.0.0.1 改:# bind 127.0.0.1 bind 0.0.0.0 原:protected-mode yes 改:protected-mode no去掉了127.0.0.1,加入0.0.0.0后&…

CC++刷题练习

蓝桥杯[错误的票据] 题目: 某涉密单位下发了某种票据,并要在年终全部收回每张票据有唯一的ID号。全年所有票据的ID号是连续的,但ID的开始数码是随机选定的。因为工作人员疏忽,在录入ID号的时候发生了一处错误,造成了某…

基于ssm+vue搭建的新闻网站论文

目 录 目 录 I 摘 要 III ABSTRACT IV 1 绪论 1 1.1 课题背景 1 1.2 研究现状 1 1.3 研究内容 2 2 系统开发环境 3 2.1 vue技术 3 2.2 JAVA技术 3 2.3 MYSQL数据库 3 2.4 B/S结构 4 2.5 SSM框架技术 4 3 系统分析 5 3.1 可行性分析 5 3.1.1 技术可行性 5 3.1.2 操作可行性 5 3…

百度Apollo:激光雷达检测技术深度解析

🎬 鸽芷咕:个人主页 🔥 个人专栏:《linux深造日志》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! ⛳️ 粉丝福利活动 ✅参与方式:通过连接报名观看课程,即可免费获取精美周边 ⛳️活动链接&#xf…

【Docker】docker部署conda并激活环境

原文作者:我辈李想 版权声明:文章原创,转载时请务必加上原文超链接、作者信息和本声明。 文章目录 前言一、新建dockerfile文件二、使用build创建镜像1.报错:Your shell has not been properly configured to use conda activate.…

快速学习SpringBoot

SpringBoot springboot传统方式构建spring应用程序使用springboot子项目构建起步依赖自动配置其它特性 SpringBoot项目部署Spring项目部署属性配置方式命令行参数方式配置环境变量方式外部配置文件方式 多环境开发-Pofiles多环境开发分组 springboot 传统方式构建spring应用程…

【数据结构】数组实现队列(详细版)

目录 队列的定义 普通顺序队列的劣势——与链队列相比 顺序队列实现方法: 一、动态增长队列 1、初始化队列 2、元素入队 3、判断队列是否为空 4、元素出队 5、获取队首元素 6、获取队尾元素 7、获取队列元素个数 8、销毁队列 总结: 动态增长队列…

whistle+SwitchyOmega前端api代理调试

1、whistle介绍 whistle官网whistle githubwhistle主要用于查看、修改HTTP、HTTPS、Websocket的请求、响应,也可以作为HTTP代理服务器,功能很强大 2、安装教程 官方安装文档 // 全局安装whistle npm install -g whistle// 安装whistle的inspect插件&a…

2024.1.3 关于 Redis 渐进式遍历 和 数据库管理命令

目录 引言 渐进式遍历 SCAN 命令 数据库管理命令 切换数据库 获取数据库 key 个数 删除数据库所有 key 同步删除 SYNC 异步删除 ASYNC 阅读下述文章之前建议点击下方链接熟悉 keys 命令的用法和特点 Redis 全局通用命令 ​​​渐进式遍历 keys * 命令一次性将 Redi…

安全狗入选“2023年福建省信息技术应用创新解决方案”名单

近日,福建省数字福建建设领导小组办公室公布了2023年福建省信息技术应用创新解决方案入选项目评选结果。 作为国内云原生安全领导厂商,安全狗凭借综合且具备突出创新水平的方案入选。 厦门服云信息科技有限公司(品牌名:安全狗&…

栈和队列oj题——232. 用栈实现队列

. 个人主页:晓风飞 专栏:LeetCode刷题|数据结构|Linux|C语言 路漫漫其修远兮,吾将上下而求索 文章目录 题目要求:实现 MyStack 类:注意:示例:解释:提示: 解题核心概念数据…

LeetCode刷题---矩阵置零

解题思路: 本题要求原地置换元素 对矩阵进行第一轮遍历,使用第一行第一列来充当该行该列是否要置换为0的标记位,如果第一行或第一列本身就含有零元素,我们使用colZero和rowZero变量来对其标记。如果第i行第j列的那个元素为0&#…

how2heap-2.23-02-fastbin_dup_into_stack

fastbin_dup_into_stack和fastbin_dup没啥区别 https://blog.csdn.net/u014679440/article/details/135383465 仅仅是欲修改的位置&#xff0c;在栈中 #include <stdio.h> #include <stdlib.h>int main() {fprintf(stderr, "This file extends on fastbin_du…

leetcode13 罗马数字转整数

题目描述&#xff1a;罗马数字由七种字符组成&#xff0c;分别为 I、V、X、L、C、D 和 M&#xff0c;对应的数值分别为 1、5、10、50、100、500 和 1000。在一般情况下&#xff0c;小的数字位于大的数字右边&#xff0c;但有特殊情况&#xff0c;如 IV 表示 4&#xff0c;IX 表…

单线圈无刷直流电机驱动芯片选型分析,可应用于笔记本,显卡风散热风扇,变频冷却风扇,打印机风扇等产品上

单线圈无刷直流电机的电机驱动器。 GC1298R/S&#xff0c;GC1262E/S&#xff0c;GC1298R/S&#xff0c;GC1262R/S具有高效的直接PWM控制方式&#xff0c;它可以控制无刷直流电机转速。它集成了最低速度限制模式、可调速度斜率控制模式、软启动模式、风扇转速计、锁保护、自动重…

《剑指offer》数学第一题:数值的整数次方

题目描述&#xff1a; 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。 思路&#xff1a; 给定一个浮点数求它的整数次方。要考虑到所有的情况&#xff0c;关于指数&#xff0c;如果是0&#xff0c;则结果是1&#xff1b; 指数是1&#xff0c…

CNN——AlexNet

1.AlexNet概述 论文原文&#xff1a;ImageNet Classification with Deep Convolutional Neural Networks 在LeNet提出后&#xff0c;卷积神经网络在计算机视觉和机器学习领域中很有名气。但卷积神经网络并没有主导这些领域。这是因为虽然LeNet在小数据集上取得了很好的效果&am…