在上一篇文章中分析了,i2c设备和i2c驱动的向总线注册过程。在总线-设备-驱动这种模型中,无论是先进行driver_register还是后进行device_register,总线驱动都会对进行匹配,只有匹配工程后,才会执行驱动的probe函数;
首先分析driver_register函数,先看此函数源码(driver/base/driver.c):
int driver_register(struct device_driver *drv)
{
int ret;
struct device_driver *other;
BUG_ON(!drv->bus->p);
/*检查总线上注册的函数和driver注册的函数是否一样*/
if ((drv->bus->probe && drv->probe) ||
(drv->bus->remove && drv->remove) ||
(drv->bus->shutdown && drv->shutdown))
printk(KERN_WARNING "Driver '%s' needs updating - please use "
"bus_type methods\n", drv->name);
/*查找总线上是否注册了这个设备驱动,此函数见分析1*/
other = driver_find(drv->name, drv->bus);
if (other) {
printk(KERN_ERR "Error: Driver '%s' is already registered, "
"aborting...\n", drv->name);
return -EBUSY;
}
ret = bus_add_driver(drv);//向bus中添加此设备驱动程序,下面详细分析此函数,见2
if (ret)
return ret;
ret = driver_add_groups(drv, drv->groups);
if (ret)
bus_remove_driver(drv);
return ret;
}
**1.**driver_find源码如下:
struct device_driver *driver_find(const char *name, struct bus_type *bus)
{
/*这里涉及到kobj和kset的概念,将bus的kset传入函数kset_find_obj,kset是一个结构体,结构体里有链表这一成员,链表里面记录着这类kobjet,通过比较object的成员变量name和传进来的name是否相等,来判断是否注册过此类设备。kset_find_obj函数就不向下跟了,有兴趣可参考https://blog.csdn.net/tmkeepgood/article/details/8767408*/
struct kobject *k = kset_find_obj(bus->p->drivers_kset, name);
struct driver_private *priv;
if (k) {
/* Drop reference added by kset_find_obj() */
kobject_put(k);
priv = to_driver(k);
return priv->driver;
}
return NULL;
}
**2.**bus_add_driver源码如下:
int bus_add_driver(struct device_driver *drv)
{
struct bus_type *bus;
struct driver_private *priv;
int error = 0;
bus = bus_get(drv->bus);
if (!bus)
return