linux内核学习(22)设备模型之第二层bus_register
2011-02-24 22:27
525 查看
注册总线。
来自: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给踢掉了!
来自: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给踢掉了!
相关文章推荐
- linux内核学习(22)设备模型之第二层bus_register
- linux内核学习设备模型之第二层bus_register
- linux内核学习 设备模型之第二层bus_register
- linux内核学习(21)设备模型之第二层device_register
- linux内核学习设备模型之第二层driver_register
- linux内核学习 设备模型之第二层device_register
- linux内核学习(23)设备模型之第二层driver_register
- linux内核学习(23)设备模型之第二层driver_register
- linux内核学习 设备模型之第二层driver_register
- linux内核学习(21)设备模型之第二层device_register
- linux内核学习(21)设备模型之第二层device_register
- linux内核学习(20)设备模型第二层之一
- linux内核学习(20)设备模型第二层之一
- linux内核学习 设备模型第二层之一
- linux内核学习(20)设备模型第二层之一
- linux内核学习设备模型第二层之一
- linux内核部件分析(八)——设备驱动模型之bus
- linux内核部件分析(八)——设备驱动模型之bus
- linux设备模型分析之bus_register()
- Linux内核部件分析<8> 设备驱动模型之bus