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

注册总线。

来自: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给踢掉了!
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值