您的位置:首页 > 运维架构 > Linux

linux内核学习(22)设备模型之第二层bus_register

2011-02-24 22:27 489 查看
注册总线。

来自:dirvers/base/bus.c:

int bus_register(struct bus_type *bus)

{

int retval;

struct bus_type_private *priv;

priv = kzalloc(sizeof(struct bus_type_private), GFP_KERNEL);

if (!priv)

return -ENOMEM;

priv->bus = bus; //bus_type的私有成员

bus->p = priv;

BLOCKING_INIT_NOTIFIER_HEAD(&priv->bus_notifier);

retval = kobject_set_name(&priv->subsys.kobj, "%s", bus->name); //设置总线子系统kobject的名称

if (retval)

goto out;

priv->subsys.kobj.kset = bus_kset; //设置总线子系统kobject的所属集合,其实对应sys/bus/ 目录

priv->subsys.kobj.ktype = &bus_ktype; //kobj_type类型变量,和sysfs有关

priv->drivers_autoprobe = 1; //这个变量如果置位,则会执行一个函数,在驱动注册会看到它的运用

retval = kset_register(&priv->subsys); //注册总线子系统,会在sys/bus/ 目录下产生一个新的总线目录

if (retval)

goto out;

retval = bus_create_file(bus, &bus_attr_uevent);

if (retval)

goto bus_uevent_fail;

priv->devices_kset = kset_create_and_add("devices", NULL,

&priv->subsys.kobj); //为该总线创建并添加设备集合

if (!priv->devices_kset) {

retval = -ENOMEM;

goto bus_devices_fail;

}

priv->drivers_kset = kset_create_and_add("drivers", NULL,

&priv->subsys.kobj); //为该总线创建并添加驱动集合

if (!priv->drivers_kset) {

retval = -ENOMEM;

goto bus_drivers_fail;

}

klist_init(&priv->klist_devices, klist_devices_get, klist_devices_put); //初始化总线设备链表

klist_init(&priv->klist_drivers, NULL, NULL); //初始化总线驱动链表

retval = add_probe_files(bus);

if (retval)

goto bus_probe_files_fail;

retval = bus_add_attrs(bus);

if (retval)

goto bus_attrs_fail;

pr_debug("bus: '%s': registered/n", bus->name);

return 0;

bus_attrs_fail:

remove_probe_files(bus);

bus_probe_files_fail:

kset_unregister(bus->p->drivers_kset);

bus_drivers_fail:

kset_unregister(bus->p->devices_kset);

bus_devices_fail:

bus_remove_file(bus, &bus_attr_uevent);

bus_uevent_fail:

kset_unregister(&bus->p->subsys);

out:

kfree(bus->p);

bus->p = NULL;

return retval;

}

感觉怎么样,简单吧,理解起来那是相当的清楚,我认为这就是当初我选择简化分析的结果,到这里,我们可以相当的明白,如果你有一条总线要注册,那么注册后,会在sys/bus/目录下产生你的总线目录名,并且会在你的总线目录下在产生两个关于设备和驱动的目录,显然,它们记录了这条总线上所有的设备和驱动。

这里提一下,可能你会问,这里也涉及了到sysfs的内容啊,不是产生了目录吗,呵呵,这些都是在第一层搞定的,我们不去理会的,我们只是把第二层的sysfs给踢掉了!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: