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

相關文章
相關標籤/搜索