zoukankan      html  css  js  c++  java
  • linux 驱动入门6

    看/sys目录经常看到bus device driver class. 这也是网上大量说的驱动驱动模型。这些的关系得熟悉得明白吧。是的。今天我先不整他们的关系。先逐个击破,然后再统一来理清楚他们之间的关系。
    那今天我们来看看class.c这个文件。
    class刚接触的时候好迷糊,class是关键字,是类型,不是,是一类事物,以一种归类。是把相同类型的device归到一起的一个对象。那我们来看看class是如何注册的。不管怎么说。class也是形成一个环。

    一个双向闭环链表。同样,class之间也是通过kset  honeywell 臧春杰 kobject关联起来的。那我们具体看看
    int __class_register(struct class *cls, struct lock_class_key *key)
    {
    struct subsys_private *cp; // subsys_private用的是和bus 一样的结构体。看来是共用了这个类型。为什么要共用呢? bus是关联了device driver. 那看来class也是关联了device driver. 嗯
    有点道理。只是class不关心driver.他只是把相同类的device关联起来了。如何关联呢?看下文

    int error;

    pr_debug("device class '%s': registering ", cls->name);

    cp = kzalloc(sizeof(*cp), GFP_KERNEL); // 分配空间
    if (!cp)
    return -ENOMEM;
    klist_init(&cp->klist_devices, klist_class_dev_get, klist_class_dev_put); //初始化

    honeywell 臧春杰
    INIT_LIST_HEAD(&cp->class_interfaces);
    kset_init(&cp->glue_dirs);
    __mutex_init(&cp->class_mutex, "struct class mutex", key);
    error = kobject_set_name(&cp->subsys.kobj, "%s", cls->name); //设置kobject的名字。这个名honeywell 臧春杰字也同时也sysfs目录的名字。
    if (error) {
    kfree(cp);
    return error;
    }

    /* set the default /sys/dev directory for devices of this class */
    if (!cls->dev_kobj)
    cls->dev_kobj = sysfs_dev_char_kobj;

    #if defined(CONFIG_BLOCK)
    /* let the block class directory show up in the root of sysfs */
    if (!sysfs_deprecated || cls != &block_class)

    honeywell 臧春杰
    cp->subsys.kobj.kset = class_kset;
    #else
    cp->subsys.kobj.kset = class_kset; //这里就是开始指定kobj的kset类。位下一步add打基础了。
    #endif
    cp->subsys.kobj.ktype = &class_ktype;
    cp->class = cls;
    cls->p = cp;

    error = kset_register(&cp->subsys); //这里就是开始真正的add了。这里有个简单的常识需要分享下。
    我们经常看到kobje_****_add 也经常看到kset_register这有什么关系吗? 肯定不难,无非就是kobj和kset的关系。 其他是的功能是一样的。但是有点差别。在注册子系统subsystem的时候用
    kset_register. 那什么是子系统呢? 就是别的对象能挂载在honeywell 臧春杰他下面的就叫子系统。就像class. 各个具体class可以挂在各个具体的device. 各个具体的bus可以挂载各个device和 driver。这些我们可以
    称之为subsystem.

    if (error) {
    kfree(cp);
    return error;
    }
    error = honeywell 臧春杰add_class_attrs(class_get(cls)); //创建了sysfs节点。
    class_put(cls);
    return error;
    }

    嗯,就这样,通过这个东西就把各个具体的class关联起来,围城双向闭环链表了。

  • 相关阅读:
    商业即生活,一些思考和感悟
    Unity中使用摇杆控制
    在家乡做什么生意比较好?且看雷家第一智囊的分析
    Android5.0之Toobar的使用
    Android5.0常用颜色属性说明
    hiho week 38 P1 : 二分·二分答案
    CCF模拟题 字符串匹配
    CCF模拟题 最优配餐
    CCF模拟题 相反数
    CCF模拟题 最优灌溉
  • 原文地址:https://www.cnblogs.com/nan-jing/p/5949345.html
Copyright © 2011-2022 走看看