platform_driver_register( )過程追蹤

以下代碼源於linux3.1.9。

platform_driver_register( ) 是內核中非常著名的函數 。platform_driver_register( )負責註冊平臺驅動程序,如果在內核中找到了使用驅動程序的設備,調用probe( )。刨去參數檢查、錯誤處理,platform_driver_register的主要過程如下:

。。。 

    。。。 
    return platform_driver_register(&bcm2708_i2c_driver);

    。。。 
}   

int platform_driver_register(struct platform_driver *drv) 

    。。。 
    return driver_register(&drv->driver); 
}


int driver_register(struct device_driver *drv) 

    。。。 
    ret = bus_add_driver(drv);                    //platform是一個虛擬總線 
    。。。 
}


int bus_add_driver(struct device_driver *drv) 

    。。。 

    if (drv->bus->p->drivers_autoprobe) { 
        error = driver_attach(drv);                                           
        if (error) 
            goto out_unregister; 
    } 
    。。。 
    kobject_uevent(&priv->kobj, KOBJ_ADD);                   //發送uevent消息 
    return 0; 
    。。。 
}

int driver_attach(struct device_driver *drv) 

    return bus_for_each_dev(drv->bus, NULL, drv, __driver_attach);  //監測到bus設備,調用__driver_attach( )
}

static int __driver_attach(struct device *dev, void *data)                    //dev 爲使用驅動程式的設備結構體 

    。。。 
    if (!dev->driver) 
        driver_probe_device(drv, dev); 
    。。。 
    return 0; 
}

int driver_probe_device(struct device_driver *drv, struct device *dev) 

    。。。 
    ret = really_probe(dev, drv); 
    。。。 
}


static int really_probe(struct device *dev, struct device_driver *drv) 

    。。。 
    dev->driver = drv; 
    if (driver_sysfs_add(dev)) {           //在sysfs中添加設備的Kobject目錄和熟悉文件 
         。。。 
    } 
    if (dev->bus->probe) { 
       。。。

    } else if (drv->probe) { 
        ret = drv->probe(dev);               //調用driver的probe( ),dev爲設備結構體 
        。。。

    } 
     。。。 
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章