linux 驱动的platform机制:

Linux platform 设备驱动实验 本篇文章主要介绍了总线--驱动----设备模型下的platform总线的初始化过程,如何进行设备和驱动的匹配和绑定的?以及从源码的角度解释了为什么会执行驱动中的probe函数。 阅读详情

添加设备阶段:

设备注册的时候Platform_device_register()→platform_device_add()→(pdev→dev.bus = &platform_bus_type)→device_add(),就这样把设备给挂到虚拟的总线上

详细解析这个阶段流程:

在 Linux 中,platform 机制是一种用于管理无明确硬件总线关系的设备(通常是 SoC 上的设备)的框架。platform_device 是 Linux 内核中的一种设备类型,通常用于描述嵌入式系统中的设备。这些设备通常没有标准的硬件总线(如 PCI 或 USB),所以使用虚拟的 platform_bus 来管理。

以下详细解析 Platform_device_register() 添加设备阶段的流程:


1. Platform_device_register()

Platform_device_register() 是注册平台设备的函数,它的实现实际上会调用 platform_device_add():


C

int platform_device_register(struct platform_device *pdev) { device_initialize(&pdev->dev); // 初始化设备结构体 return platform_device_add(pdev); // 添加设备到 platform 总线 }

关键步骤
  1. 调用 device_initialize(&pdev->dev):

    • 初始化设备结构体 pdev->dev,这是一个通用的设备结构体(类型为 struct device)。
    • 主要是准备设备的生命周期管理机制(如 kobject 的引用计数等)。
  2. 调用 platform_device_add(pdev):

    • 将 pdev 添加到 platform_bus 中。

2. platform_device_add()

核心功能是将 platform_device 添加到平台总线中。

函数实现如下:


C

int platform_device_add(struct platform_device *pdev) { int ret; if (!pdev) return -EINVAL; // 设置 platform_device 的总线类型为 platform_bus pdev->dev.bus = &platform_bus_type; // 设置设备名字 if (!pdev->dev.release) { dev_set_name(&pdev->dev, "%s", pdev->name); } // 添加设备到设备模型 ret = device_add(&pdev->dev); // 关键步骤 if (ret == 0) platform_device_add_resources(pdev, pdev->resource, pdev->num_resources); return ret; }

关键步骤
  1. 检查 pdev 的有效性:

    • 确保 pdev 非空,否则返回错误。
  2. 设置设备的总线类型:

    • 将 pdev->dev.bus 设置为 &platform_bus_type,表示该设备属于 platform_bus 类型。
    • platform_bus_type 是一个全局变量,定义了 platform 总线的行为。
    
    

    C

    struct bus_type platform_bus_type = { .name = "platform", .match = platform_match, // 用于设备与驱动匹配 };

  3. 设置设备名字:

    • 如果设备没有定义 release 回调函数,则调用 dev_set_name() 给设备设置一个名字(一般是 pdev->name)。
  4. 调用 device_add(&pdev->dev):

    • 最关键的步骤:将设备添加到设备模型中,建立与内核设备模型的关联。

3. device_add()

device_add() 是设备模型的核心函数,用于将设备注册到内核的设备层。

函数实现如下(核心部分):


C

int device_add(struct device *dev) { int ret; // 检查设备相关字段是否有效 if (!dev->p || !dev->bus) return -EINVAL; // 设置设备的子系统层次关系 dev->parent = get_device(dev->parent); kobject_set_name(&dev->kobj, dev_name(dev)); // 添加设备到设备层 ret = kobject_add(&dev->kobj, dev->parent ? &dev->parent->kobj : NULL, dev_name(dev)); if (ret < 0) goto Error; // 设备和总线关联 ret = device_add_class_symlinks(dev); if (ret) goto Error; ret = bus_add_device(dev); if (ret) goto Error; // 通知驱动和用户层 ret = device_add_groups(dev, dev->groups); if (ret) goto Error; // 通知系统有新设备添加 kobject_uevent(&dev->kobj, KOBJ_ADD); return 0; Error: kobject_put(&dev->kobj); return ret; }

关键步骤
  1. 检查设备字段是否有效:

    • 确保设备结构体中的必要字段(如 dev->p 和 dev->bus)已经初始化。
  2. 设置设备的层次关系:

    • 如果设备有父设备,则设置父子关系。
    • 通过 kobject_set_name() 给设备设置一个唯一的名字。
  3. 添加设备到设备模型:

    • 调用 kobject_add() 将设备的 kobject 添加到内核的设备层次结构中。
  4. 设备与总线关联:

    • 调用 bus_add_device() 将设备添加到总线中。
    • 对于平台设备,总线类型是 platform_bus_type。
    
    

    C

    int bus_add_device(struct device *dev) { struct bus_type *bus = dev->bus; int error = 0; if (bus->p->drivers_autoprobe) { error = device_attach(dev); // 自动匹配驱动 } return error; }

  5. 通知驱动和用户层:

    • 调用 device_add_groups() 添加设备属性(如 sysfs 文件)。
    • 调用 kobject_uevent() 发送 KOBJ_ADD 事件通知用户层。

4. 总线与设备的关联

当调用 device_add() 时,设备会被挂到总线 platform_bus 下:

  • pdev->dev.bus = &platform_bus_type 表示设备属于 platform_bus。
  • device_add() 会调用 bus_add_device() 将设备挂到总线。
  • 在 platform_bus 的结构中定义了 match 函数,用于匹配设备和驱动。

总结流程

  1. 调用 platform_device_register():

    • 初始化设备结构体,调用 platform_device_add()。
  2. 调用 platform_device_add():

    • 设置设备的总线类型为 platform_bus_type。
    • 调用 device_add() 将设备添加到内核设备模型。
  3. 调用 device_add():

    • 将设备添加到内核的设备层次结构中。
    • 与总线关联,触发设备与驱动的匹配流程。
    • 发送 KOBJ_ADD 事件通知用户层。

通过这些步骤,设备最终被挂到虚拟的 platform_bus 总线上,并且可以被匹配到合适的驱动程序。

Linux驱动的platform机制 一、Platform概述     从Linux2.6起,内核引入了一套新的驱动管理和注册机制:Platform_device和 Platform_driver。现在Linux中大部分的设备驱动都可以使用这套机制,总线为platform_bus,设备用platform_device表示,驱动用platform_driver进行注册。     Linux的这种platform driv 阅读详情

相关推荐

基于FSL的DTI数据预处理流程

最近在学习处理DTI数据,总结了一份应用FSL做DTI数据预处理的流程与大家交流交流。如果有错误的地方欢迎大家指正!        我用的数据是Philips的数据,如果是GE或者西门子的数据可能会有所不同。   原始数据:包括3DT1数据和高分辨率DTI数据,均是dicom格式。 工具:MRICRON和FSL,所有的命令均在Linux的终端中运行。   1.格式转换:将后缀名为dcm

zaza_zaza的博客 2万+

platform_device_register 和platform_driver_register;有些驱动里没有platform_device_register

platform_device_register和platform_driver_register是Linux内核中用于注册平台设备和平台驱动程序的函数。platform_device_register函数用于注册平台设备。pdev是一个指向platform_device结构体的指针,表示要注册的平台设备。调用该函数将向内核注册指定的平台设备,并将其添加到平台设备列表中,以便与驱动程序进行匹配和加载。platform_driver_register函数用于注册平台驱动程序。

RyanLee90的博客 1414

逆向实战:手把手教你分析Google DroidGuard虚拟机的加密与反调试(附Python脚本)

本文深入解析Google DroidGuard虚拟机的加密机制与反调试策略,提供从环境配置到逆向分析的完整实战指南。通过IDA Pro、Frida等工具链,详细剖析DroidGuard的信号拦截、内存校验等保护机制,并附Python脚本实现自动化分析,助力Android安全研究人员突破GMS核心组件的安全防护。

weixin_32428571的博客 308

嵌入式Linux之platform设备驱动框架详解

前言 在platform设备驱动模型中,需关心总线、设备和驱动这3个实体,总线将设备和驱动绑定。在系统中每注册一个设备的时候,会寻找与之匹配的驱动;相同的,在系统中每注册一个驱动的时候,会寻找与之匹配的设备,而匹配由总线完成。 设备 设备注册部分的流程图如下图所示: 定义一个platform_device结构体 static struct platform_device led_dev = { .name = "myled", //#1 .id

乐于分享 1303

XGBoost与Embedding混合建模实战解析

在机器学习领域,特征工程与模型融合是提升预测性能的关键技术。Embedding技术通过将高维稀疏特征(如文本、ID类数据)转化为低维稠密向量,有效捕获语义关联;而XGBoost作为强大的集成学习算法,擅长处理结构化特征并进行自动特征组合。两者结合的混合架构(如Semantic Boosted Trees)在金融风控和推荐系统等场景中展现出显著优势,尤其在处理用户行为序列、商品ID等复杂特征时,相比传统方法能获得更好的模型效果。本文通过电商推荐和金融反欺诈等案例,详解如何实现Embedding+XGBoost

weixin_28718641的博客 325

别再只用真彩色了!手把手教你用ENVI主成分分析(PCA)给遥感图像‘美颜’与‘瘦身’

本文详细介绍了如何利用ENVI主成分分析(PCA)技术优化遥感图像处理,实现数据‘美颜’与‘瘦身’。通过PCA的维度压缩、噪声分离和特征增强三大优势,显著提升高光谱数据的可视化效果和分析效率。文章还提供了ENVI操作的最佳实践和常见问题解决方案,帮助读者掌握这一遥感图像处理的游戏规则改变者。

weixin_28465009的博客 275

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); } int platform_device_add(struct platform_device *pdev) { int i, ret; ...

wmzjzwlzs的专栏 1040

CAT24C16 EEPROM的I²C页写与页读底层实现

I²C是一种广泛应用于嵌入式系统的双线同步串行通信协议,其核心在于严格的时序控制、地址寻址机制与主从应答逻辑。理解I²C总线物理层(上拉电阻、SCL/SDA电气特性)、协议层(START/STOP、ACK/NACK、7位地址格式)及外设寄存器操作(如SR1状态标志、CCR时钟分频),是实现可靠通信的基础。在实际工程中,EEPROM类器件(如CAT24C16)因其非易失性、页缓冲区结构和写保护(WP)功能,成为数据持久化关键载体;其16字节页写约束、内部写周期(5–10ms)与地址指针自动递增等特性,直接决定

weixin_42591413的博客 388

platform_device_add()函数分析

int platform_device_add(struct platform_device *pdev) { int i, ret = 0; if (!pdev)    /*验证指针的有效性 */    return -EINVAL; if (!pdev->dev.parent)/*都说总线有两个链表,一个是设备链表(通过device 内嵌)一个是驱动链表(通过device_drive

wxie的Linux人生 4402

树莓派CSI/DSI二合一接口深度玩法:同时驱动MIPI摄像头和屏幕的配置秘籍

本文详细解析了树莓派5上CSI/DSI二合一接口的深度玩法,提供了同时驱动MIPI摄像头和屏幕的完整配置秘籍。从硬件连接到软件设置,包括config.txt的优化配置,帮助用户充分利用树莓派5的双多功能接口,实现高效的双设备工作模式。

weixin_30687051的博客 573

分级 API Key 的使用案例

分级 API Key 的使用案例 1. 背景介绍 1.1 问题由来 随着网络服务的普及,API(Application Programming Interface,应用程序编程接口)成为了连接不同系统和应用的关键桥梁。API Key(API密钥)

欢迎来到我的优快云空间!这里聚焦AI大模型应用实战,分享前沿技术、实战案例与开发经验。 994

Linux Platform 驱动匹配机制

Platform 驱动通过多种匹配方式实现与设备的自动绑定,主要包括设备树匹配、非设备树匹配和名称匹配。设备树匹配通过 compatible 字段与驱动中的 of_match_table 进行匹配,非设备树匹配则通过 platform_device.name 与驱动的 id_table 匹配,若前两者无效,则使用 platform_device.name 与 driver.name 进行最终匹配。匹配优先级依次为设备树匹配、非设备树匹配和名称匹配。在实际应用中,使用设备树时必须提供 .of_match_ta

A344567的博客 950

YOLOv8/YOLOv11目标检测系统与多目标跟踪检测系统,使用PySide6搭建目标检测系统,支持目标检测、分割、姿势估计、旋转框,用户端系统+后台管理系统可用于大论文凑工作量或毕设必备

YOLOv8/YOLOv11目标检测系统与多目标跟踪检测系统,目标检测、分割、姿势估计、obb(旋转框),用户端系统+后台管理系统开发实战,可用于大论文凑工作量或毕设必备,全网最详细教程,系统支持 目标检测、分割、姿势估计、obb(旋转框)等模型进来检测,是一个通用的目标跟踪与目标检测系统,适配多种场景如:鱼苗检测与跟踪、行人多目标跟踪、车辆多目标跟踪、牛只行为识别与跟踪、口罩佩戴检测、安全帽佩戴检测、火灾检测等。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1万+

Linux内核驱动的的platform机制

<br />Linux内核驱动的的platform机制 上 (2009-10-14 16:14)<br />正在学习如何将Android移植到PXA270平台,其中在DM9000网卡驱动处遇到了问题,怎么也无法让网卡驱动中的probe函数工作起来,于是找到了这篇文章:<br /> <br />Linux内核驱动的的platform机制<br />从Linux 2.6起引入了一套新的驱动管理和注册机制:platform_device和platform_driver。Linux中大部分的设备驱动,都可以使用这套

kerson的专栏 1077

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Linux学习——platform机制实现驱动层分离

1.输入子系统涉及到的分层概念 如上图所示,分层就是将一个复杂的工作分成了4层, 分而做之,降低难度,每一层专注于自己的事情, 系统只将其中的核心层和事件处理层写好了,所以我们只需要来写驱动层即可,接下来我们来分析platform机制以及分离概念 2.分离概念 1.bus结构体:即platform总线 是个全局变量,为platform_bus_type,属于虚拟设备总线,通过这个总线将...

Unlimited_Bit的博客 486

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

linux内核中的platform机制,Linux内核驱动的platform机制是怎样的

描述从Linux 2.6起引入了一套新的驱动管理和注册机制:platform_device和platform_driver。Linux中大部分的设备驱动,都可以使用这套机制,设备用platform_device表示,驱动用platform_driver进行注册。Linux platform driver机制和传统的device driver 机制(通过driver_register函数进行注册)相...

weixin_40005887的博客 288

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

上一篇: 深度:一文看懂Linux内核!Linux内核架构和工作原理详解
下一篇: 调用 device_add():将设备添加到内核的设备层次结构中。 与总线关联,触发设备与驱动的匹配流程。
BlueBirdssh
博客等级 码龄21年 231粉丝 198原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值