platfrom的probe的详解

logisim笔记 面板 corcuit name电路名称 shared label共享标签 shared label facing共享标签朝向 shared label font共享标签字体 文本text text内容 font字体 horizontal alignment水平位置 vertical alignment垂直位置 pull behavior未定义处理 label标签 label location标签... 阅读详情
probe()函数是什么时候被调用,设备和驱动是怎么联系起来的

平台设备的注册

platform_add_devices(ldd6410_devices, ARRAY_SIZE(ldd6410_devices));  //这是bsp中添加所有的设备

--> 

platform_device_register(devs[i]);//注册平台设备

--->

platform_device_add(pdev);将平台设备加入到platform_bus中

--->

device_add(&pdev->dev);

 

平台驱动的注册

platform_driver_register(&gpio_led_driver)

---->

driver_register(&drv->driver);

---->

bus_add_driver(drv); //添加驱动到总线

--->

driver_attach(drv);//为驱动寻找相应的设备

---->

__driver_attach()

---->

driver_probe_device(drv, dev); 

--->

really_probe(dev, drv);

 

static int __init XXX_init(void)
{
 return platform_driver_register(&XXX_driver);   //注册平台驱动
}

int driver_attach(struct device_driver *drv)
{
 return bus_for_each_dev(drv->bus, NULL, drv, __driver_attach);   //遍历设备总线寻找驱动
}

static int __driver_attach(struct device *dev, void *data)
{
 struct device_driver *drv = data;

 /*
  * Lock device and try to bind to it. We drop the error
  * here and always return 0, because we need to keep trying
  * to bind to devices and some drivers will return an error
  * simply if it didn't support the device.
  *
  * driver_probe_device() will spit a warning if there 
  * is an error.
  */

 if (drv->bus->match && !drv->bus->match(dev, drv))   //通过match判断驱动和设备是否匹配,这里通过比较dev和drv中的设备名来判断,所以设备名需要唯一
  return 0;

 if (dev->parent) /* Needed for USB */
  down(&dev->parent->sem);
 down(&dev->sem);
 if (!dev->driver)
  driver_probe_device(drv, dev);  //   驱动和设备绑定
 up(&dev->sem);
 if (dev->parent)
  up(&dev->parent->sem);

 return 0;
}

 
static int really_probe(struct device *dev, struct device_driver *drv)
{
 int ret = 0;

 atomic_inc(&probe_count);
 pr_debug("bus: '%s': %s: probing driver %s with device %s\n",
   drv->bus->name, __func__, drv->name, dev->bus_id);
 WARN_ON(!list_empty(&dev->devres_head));

 dev->driver = drv;
 if (driver_sysfs_add(dev)) {
  printk(KERN_ERR "%s: driver_sysfs_add(%s) failed\n",
   __func__, dev->bus_id);
  goto probe_failed;
 }

 if (dev->bus->probe) {   
  ret = dev->bus->probe(dev);
  if (ret)
   goto probe_failed;
 } else if (drv->probe) {
  ret = drv->probe(dev);  //这里才真正调用了驱动的probe
  if (ret)
   goto probe_failed;
 }

 driver_bound(dev);
 ret = 1;
 pr_debug("bus: '%s': %s: bound device %s to driver %s\n",
   drv->bus->name, __func__, dev->bus_id, drv->name);
 goto done;

probe_failed:
 devres_release_all(dev);
 driver_sysfs_remove(dev);
 dev->driver = NULL;

 if (ret != -ENODEV && ret != -ENXIO) {
  /* driver matched but the probe failed */
  printk(KERN_WARNING
         "%s: probe of %s failed with error %d\n",
         drv->name, dev->bus_id, ret);
 }
 /*
  * Ignore errors returned by ->probe so that the next driver can try
  * its luck.
  */
 ret = 0;
done:
 atomic_dec(&probe_count);
 wake_up(&probe_waitqueue);
 return ret;
}

无设备树时,platfrom平台总线驱动框架 1. 逻辑简单:直接通过代码定义设备,无需学习设备树语法;无设备树的 Platform 驱动框架是理解 Linux “总线 - 设备 - 驱动” 模型的基础,其核心是通过**硬编码的`platform_device`描述硬件**,通过 **`platform_driver`实现驱动逻辑 **,再由 Platform 总线完成匹配。|设备定义方式|手动定义`platform_device`结构体|设备树中通过`compatible`属性描述设备,内核自动解析为`platform_device`| 阅读详情

相关推荐

RK3399平台开发系列讲解(内核入门篇)1.12、platfrom 设备与驱动注册

Platform 驱动注册

内核笔记 4197

really_probe()函数

static int really_probe(struct device *dev, struct device_driver *drv) { int ret = -EPROBE_DEFER; int local_trigger_count = atomic_read(&deferred_trigger_count); bool test_...

abcdefg的专栏 2384

Klipper-源码模块

Klippy上位机程序采用多线程架构,包含四个主要进程:主线程处理G代码命令、串口IO线程(C语言实现)、MCU响应处理线程(Python实现)和独立日志线程。代码结构分为三大模块:chelper(C语言辅助函数)、extras(扩展功能如温度控制)和kinematics(运动学模型实现)。核心功能模块包括串口通信(serialhdl.py)、步进电机控制(stepper.py)、运动学计算等,其中C语言实现的底层模块通过serialqueue.c处理高效IO。扩展模块支持热床、传感器等外设,运动学子模块提

weixin_44258581的博客 990

probe函数个人理解

主要是做一些初始化工作 1、首先这是从网上找到的相关对probe的描述 static int really_probe(struct device *dev, struct device_driver *drv) { ... //1.先是调用的驱动所属总线的probe函数: if (dev->bus->probe) { ret = dev->bus->probe

qianyong1990的专栏 7324

别再手动配电脑了!手把手教你用Windows Server 2022搭建企业AD域(附DNS配置避坑指南)

本文详细介绍了如何使用Windows Server 2022搭建企业AD域,提升20+终端的管理效率。通过实战案例和避坑指南,解析AD域的核心价值、部署步骤及DNS配置技巧,帮助企业实现集中权限管理、安全策略统一部署,显著降低IT运维成本。

weixin_30652897的博客 348

UFAST车道线检测 Ultra-Fast-Lane-Detection 从环境搭建到复现完成(一)

UFAST车道线检测 Ultra-Fast-Lane-Detection 从环境搭建到复现完成(一)

m0_46364958的博客 4345

2.onvif笔记 --实现Probe命令来进行设备发现(discover)

搭建ONVIF环境1.编译gSOAP ONVIF协议很复杂,我们需要借助工具来实现代码框架。这个工具叫做gSOAP。soap协议进行封装为c/c++代码,这样我们就不需要关心soap协议,只需要考虑逻辑层就可以了。接下来我们就开始搭建环境 1.编译gSOAP 要使用工具,我们就得线编译工具, 下载gSOAP2.8 上传到Linux,在linux上编译,我不管你怎么上传,哪怕用意念 解压 :unz...

xf1234的博客 4451

【局部规划模块轨迹优化算法】EM_planner最大期望滚动优化算法

认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长!本文先对EM_planner最大期望滚动优化算法做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章提示:以下是本篇文章正文内容。

qq_35635374的博客 759

Linux驱动中platfrom-driver/device注册及probe执行过程分析

1、platform系统 platfrom系统在linux内核中包含三个部分 ①platfrom-bus虚拟总线,是一个内核抽象出来的虚拟的总线,在linux内核中以链表的形式表示,platform-driver/device通过挂载在platform虚拟总线上,实现设备和驱动之间的匹配,在内核表现形式为一系列platform-driver/device结构体组成的链表形式; ②platform-driver模型,内核中抽象出来的driver模型,表现形式为platfrom-driver的结构体,它的

QQ135102692的博客 2485

使用 MATLAB/Simulink 构建一个基于FOC控制的PMSM矢量控制仿真模型

本教程详细介绍了基于MATLAB/Simulink的永磁同步电机(PMSM)磁场定向控制(FOC)系统建模与仿真方法。主要内容包括:PMSM电机模型参数设置、Clarke/Park变换模块设计、电流环PID控制器配置、SVPWM调制实现以及系统仿真参数优化。文章提供了模块化设计思路和具体参数设置示例,并给出了PID整定建议和进阶优化方向。通过该仿真模型,可深入理解PMSM矢量控制原理,掌握高性能电机控制系统的建模技巧,适用于伺服系统、电动汽车驱动等高端控制场景。教程还推荐了实时仿真和高级控制策略等扩展应用。

xiaoheshang_123的博客 528

Agent应用实践之三十六 - AgentScope高阶用法:AG-UI

AI 大模型飞速进化,不懂 AI、不会用 Agent 的程序员,正在慢慢被行业淘汰。现在 AI 新技术迭代快到离谱:RAG 还没学明白,MCP 接踵而来;工具刚上手,Skills、各类新 Agent 概念又轮番刷屏;Manus还没看懂,就出来OpenClaw,OpenClaw热度还没退,又出来Hermes。越追越乱、越学越焦虑,永远在被动跟风,陷入学不完、跟不上、用不上的内耗。其实焦虑的根本原因,不是新技术太多,而是不懂大模型 Agent 应用底层原理,只会零散跟风,没有通用方法论。为此我专门推出Agent

代码让AI扣 138

platfrom_driver和device_driver都有probe、remove函数,为什么一般都注册platform中的而不是driver中的?

应用场景专用于平台设备,而是更通用的驱动程序接口,适用于所有类型的设备。参数类型中的probe和remove函数接受类型的参数,而中的probe和remove函数接受类型的参数。通常情况下,如果你在开发平台设备驱动程序,会使用中的probe和remove函数。如果你在开发更通用的驱动程序,可能会使用中的probe和remove函数。那是否可以不注册struct platform_driver中的probe和remove,而直接注册drvier中的呢在开发平台设备驱动程序时,通常会使用中的probe和。

崖边垂钓者 897

Qt视频播放器项目(打开文件,视频的播放与停止,进度条与视频进度绑定,调整音量,设置按钮图标,将槽函数与按钮绑定等功能)完整代码地址在末尾

【代码】Qt视频播放器项目。

分享计算机视觉,C++,网络摄像头研发,音视频开发,嵌入式等知识。 754

platfrom总线(一)

如果不使用设备树定义那么用户需要对设备信息进行描述,并且加载设备} return 0;下图可以看出,当驱动,和设备都加载成功后会执行routine_probe(),当有一方卸载后会执行routine_remove()函数。当linux内核支持设备树时,就可以使用设备树来代替platform_device.c的工作,具体怎么代替的,设备树怎么工作的,先不要管,先会用再说。platform_device.c可以直接删除在设备树的根节点下添加。

m0_58056008的博客 297

BOSS直聘数据采集、解析处理、分析与可视化实战

招聘和求职是一对永恒的话题,不论什么时候都有招聘或者是求职的需求,找不找得到工作可能最主要的就是匹配度是否高,待遇福利是否诱人,如今互联网的快速发展,找工作的方式早已发生了翻天覆地的变化,从以往的面对面形式的招聘简历投递和面试方式,变成了电子简历网络直接投递、远程面试录用的形式,便捷性大大提升,需求的快速增长,促生了一批互联网招聘类的企业,诸如:51job、BOSS直聘、拉勾网等等,为了能...

Together_CZ的博客 9022

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Linux platfrom驱动框架

详细讲解Linux platform驱动框架

先写一个BUG吧 860

计算机控制技术及应用

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

platfrom

1、概述: 通常在Linux中,把SoC系统中集成的独立外设单元(如:I2C、IIS、RTC、看门狗等)都被当作平台设备来处理。 从Linux2.6起,引入了一套新的驱动管理和注册机制:Platform_device和Platform_driver,来管理相应设备。 Linux中大部分的设备驱动,都可以使用这套机制,设备用platform_device表示,驱动用platform

wulong117的专栏 1852

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

platform_device与platform_driver && i2c驱动是如何probe的 && spi驱动是如何probe的

做Linux方面也有三个多月了,对代码中的有些结构一直不是很明白,比如platform_device与platform_driver一直分不清关系。在网上搜了下,做个总结。两者的工作顺序是先定义platform_device -> 注册 platform_device->,再定义 platform_driver-> 注册 platform_driver。  (1)platform_device设

zhandoushi的专栏 5万+

03-03 platfrom

8.platform驱动分离gitee代码 代码结构 1. 总线设备驱动模型 这一部分的主要内容可参考上述博客 1.1 platform dev和drv 匹配机制 首先匹配device中的driver_override与drv中name是否匹配 第二匹配设备中device中从设备树中解析的properties(即compatible) type name。存放在device存放在devi...

二手水滴的博客 60

GPIO子系统

GPIO子系统主要的几个数据结构:对于一个GPIO Cnotroller ,都有相对应的一个 gpio_chip结构体,通过其内部的函数指针最终来操作硬件。struct gpio_chip定义如下 include\linux\gpio\driver.h在驱动里定义并初始化一个gpio_chip,使用 gpiochip_add_data()注册。其中比较关键的是​ /* 反向绑定 */实现了gpio_chip <-------> gpio_device 的双向绑定。

m0_67973341的博客 754

5.platfrom平台点亮led

Platform 是 Linux 为片上外设提供的一种标准驱动模型,其核心思想是将硬件描述与驱动逻辑分离。硬件信息由设备树描述,Linux 根据设备树创建 Platform Device;驱动程序实现 Platform Driver;Platform 总线负责两者的自动匹配,匹配成功后调用 probe() 完成设备初始化。

2301_76559904的博客 172

imx6ULL从应用程序到驱动程序

本文介绍了如何通过应用程序和驱动程序控制LED设备。应用程序通过open和write系统调用打开字符设备并改变LED状态。驱动程序部分,首先通过register_chrdev注册设备并绑定file_operations结构体,确保内核能够找到并调用相应的驱动函数。接着,通过platform_device描述硬件资源,并使用platform_device_register将其注册到内核。最后,通过platform_driver提供设备操作函数,并使用platform_driver_register注册驱动。整

2401_86112944的博客 1054

platform驱动之probe函数

驱动注册的probe函数 probe函数在设备驱动注册最后收尾工作,当设备的device 和其对应的driver 在总线上完成配对之后,系统就调用platform设备的probe函数完成驱动注册最后工作。资源、中断调用函数以及其他相关工作。下面是probe被调用的一些程序流程。 从driver_register看起: [cpp]view plain intdr...

weixin_30311605的博客 102

platfrom设备驱动框架

前面编写的设备驱动都非常的简单,都是对IO进行最简单的读写操作。像I2C、SPI、LCD 等这些复杂外设的驱动就不能这么去写了,Linux 系统要考虑到驱动的可重用性,因此提出了驱动的分离与分层这样的软件思路,在这个思路下诞生了我们将来最常打交道的platform 设备驱动,也叫做平台设备驱动。 1、Linux驱动的分离与分层 1.1 驱动的分隔与分离 对于 Linux 这样一个成熟、庞大、复杂...

weixin_44708624的博客 625
上一篇: 从可执行命令 确定 RPM软件包
下一篇: linux nand bbt 坏块管理部分
独角鲸
博客等级 码龄16年 24粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值