linux 驱动入门6

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

一个双向闭环链表。一样,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;spa

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

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;
}get

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

#if defined(CONFIG_BLOCK)
/* let the block class directory show up in the root of sysfs */
if (!sysfs_deprecated || cls != &block_class)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;
}object

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