platform总线的probe函数调用

我们知道,platform总线提供了设备和驱动的mach函数,当设备和驱动匹配完成后,就会执行驱动的probe函数,但是这个probe函数是如何被调用的呢。

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

1:从注册函数platform_driver_register()函数开始

int platform_driver_register(struct platform_driver *drv)
{
    drv->driver.bus = &platform_bus_type;
    if (drv->probe)
        drv->driver.probe = platform_drv_probe;
    if (drv->remove)
        drv->driver.remove = platform_drv_remove;
    if (drv->shutdown)
        drv->driver.shutdown = platform_drv_shutdown;

    return driver_register(&drv->driver);
}

这个函数首先是对驱动进行填充,然后调用driver_register()函数,这个函数是向内核注册驱动的函数,不同的总线最终都是调用这个函数向内核进行驱动的注册。

driver_register(&drv->driver);

bus_add_driver(drv);

driver_attach(drv);

bus_for_each_dev(drv->bus, NULL, drv, __driver_attach);

__driver_attach

__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 (!driver_match_device(drv, dev))
        return 0;

    if (dev->parent)    /* Needed for USB */
        device_lock(dev->parent);
    device_lock(dev);
    if (!dev->driver)
        driver_probe_device(drv, dev);
    device_unlock(dev);
    if (dev->parent)
        device_unlock(dev->parent);

    return 0;
}

分析可知,首先是调用driver_mach_device函数进行设备和驱动的匹配(这里应该根据具体的总线来调用相应的mach函数),如果匹配失败则直接return 0,如果匹配成功,则进行下一步,probe函数的调用,probe函数的调用通过driver_probe_device()函数来引出。调用层次如下

driver_probe_device(drv, dev);

really_probe(dev, drv);

really_probe()函数的部分代码如下

if (dev->bus->probe) {
        ret = dev->bus->probe(dev);
        if (ret)
            goto probe_failed;
    } else if (drv->probe) {
        ret = drv->probe(dev);
        if (ret)
            goto probe_failed;
    }

分析可知,在驱动和设备匹配成功后,首先会判断总线的的probe指针是否为空,如果不为空,则执行总线的prboe函数,如果总线的prboe函数为空,则进一步判断驱动的probe函数是否为空,如果不为空,则执行驱动的probe函数

时间: 2024-10-13 20:20:26

platform总线的probe函数调用的相关文章

linux驱动之platform总线

第一部分:设备驱动模型1.总线:bus_type结构体,关键函数是match函数和uevent函数:总线将设备和驱动绑定,在系统每注册一个设备的时候,会寻找与之匹配的驱动,相反,在系统每注册一个驱动的时候,会寻找与之匹配的设备,而匹配由总线完成. 2.设备:struct device结构体,硬件设备在内核驱动框架中的抽象: (1)device_register用于向内核驱动框架注册一个设备 (2)通常device不会单独使用,而是被包含在一个具体设备结构体中,如struct usb_device

fl2440 platform总线led字符设备驱动

首先需要知道的是,设备跟驱动是分开的.设备通过struct device来定义,也可以自己将结构体封装到自己定义的device结构体中: 例如:struct platform_device: 1 在include/linux/platform_device.h文件中: //这个位置还是个盲点,我一直没找到这个位置在哪里 2 struct platform_device { 3 const char * name 4 u32 id 5 struct device dev 6 u32 num_res

linux2.6.30.4 s3c2440 platform总线 led驱动

1  basic 在设备驱动程序中经常会见到和platform相关的字段,分布在驱动程序的多个角落,这也是2.6内核中比较重要的一种机制,把它的原理弄懂了,对以后分析驱动程序很有帮助,下面简单介绍一下:    在linux2.6设备模型中,关心总线,设备,驱动这三个实体,总线将设备和驱动绑定,在系统每注册一个设备的时候,会寻找与之匹配的驱动.相反,在系统每注册一个驱动的时候,寻找与之匹配的设备,匹配是由总线来完成的. 一个现实的Linux 设备和驱动通常都需要挂接在一种总线上,对于本身依附于PC

platform总线驱动代码分析

/************************************************************************/ Linux内核版本:2.6.35.7 运行平台:三星s5pv210 /************************************************************************/ 1.本例中通过使用Linux驱动模型中的platform总线和led驱动框架编写出来的led驱动代码来分析platform总线的工作

内核中的 platform总线

一个现实的Linux 设备和驱动通常都需要挂接在一种总线上,对于本身依附于PCI.USB.I2C.SPI 等的设备而言,这自然不是问题,但是在嵌入式系统里面,SoC 系统中集成的独立的外设控制器.挂接在SoC 内存空间的外设等确不依附于此类总线.基于这一背景,Linux 发明了一种虚拟的总线,称为platform 总线    SOC系统中集成的独立外设单元(I2C,LCD,SPI,RTC等)都被当作平台设备来处理,而它们本身是字符型设备.    从Linux2.6内核起,引入一套新的驱动管理和注

platform 总线input子系统上的按键中断

什么时候唤醒? 报告事件input_event(dev,x)  input_event(dev,y) input_event(dev,SYN) -------------------- Linux内核中的总线设备驱动 总线   include/device.h Struct bus_type { Name; Match;//(匹配规则,匹配设备和设备驱动) }: 注册:bus_register(....) 注销:bus_unregister(...): 设备 Struct device{ Str

linux设备驱动归纳总结(九):1.platform总线的设备和驱动【转】

本文转载自:http://blog.chinaunix.net/uid-25014876-id-111745.html linux设备驱动归纳总结(九):1.platform总线的设备和驱动 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 这一节可以理解是第八章的延伸,从这节开始介绍platform设备驱动. xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Linux驱动下的platform总线架构(转)

从 Linux 2.6 内核起,引入一套新的驱动管理和注册机制:platform_device 和 platform_driver .    Linux 中大部分的设备驱动,都可以使用这套机制,设备用 platform_device 表示:驱动用 platform_driver 进行注册.        Linux platform driver 机制和传统的 device driver 机制(即:通过 driver_register 函数进行注册)相比,一个十分明显的优势在于 platform

3.0.35 platform 总线、设备与驱动

在该内核的设备驱动模型中,关心总线.设备和驱动这三个实体. 在系统每注册一个设备的时候,由总线寻找与之匹配的驱动:在系统每注册一个驱动的时候,会由总线寻找与之匹配的设备. 一个现实的linux设备和驱动通常都需要挂载在一种总线上,对于本身依附于PCI,USB,I2C,SPI等的设备而言,这不是问题 但在嵌入式系统中,SoC系统中集成了独立的外设控制器,集成于SoC中的外设却不依赖于这类总线.基于这一背景,linux 发明了一种虚拟总线,称为platform总线,platform 所描述的资源有一