内核设备驱动API之__class_create
2018-03-20 21:14
344 查看
struct class *__class_create(struct module *owner, const char *name, struct lock_class_key *key) 用于动态创建设备的逻辑类,并完成字段的初始化,并在/sys/class 下新建一个目录。 其使用的例程如下: #define class_create(owner, name) \ ({ \ static struct lock_class_key __key; \ __class_create(owner, name, &__key); \ }) kernel中主要是通过class_create这个宏来调用__class_create 例如: cuse_class = class_create(THIS_MODULE, "cuse"); if (IS_ERR(cuse_class)) return PTR_ERR(cuse_class); 其源码分析如下: struct class *__class_create(struct module *owner, const char *name, struct lock_class_key *key) { struct class *cls; int retval; #申请一个class 结构体,如果申请失败则退出 cls = kzalloc(sizeof(*cls), GFP_KERNEL); if (!cls) { retval = -ENOMEM; goto error; } #针对class 结构体用形参来赋值 cls->name = name; cls->owner = owner; cls->class_release = class_create_release; #将这个class 添加到kernel中,并在/sys/class 中新建一个目录 retval = __class_register(cls, key); if (retval) goto error; return cls; error: kfree(cls); return ERR_PTR(retval); } __class_register 的实现如下: int __class_register(struct class *cls, struct lock_class_key *key) { struct subsys_private *cp; int error; pr_debug("device class '%s': registering\n", cls->name); #class 一般作为subsys 注册给kernel,这里申请subsys 结构体并赋值 cp = kzalloc(sizeof(*cp), GFP_KERNEL); if (!cp) return -ENOMEM; klist_init(&cp->klist_devices, klist_class_dev_get, klist_class_dev_put); INIT_LIST_HEAD(&cp->interfaces); kset_init(&cp->glue_dirs); __mutex_init(&cp->mutex, "subsys mutex", key); error = kobject_set_name(&cp->subsys.kobj, "%s", cls->name); 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; #一般我们都会定义这个config_block #if defined(CONFIG_BLOCK) /* let the block class directory show up in the root of sysfs */ if (!sysfs_deprecated || cls != &block_class) cp->subsys.kobj.kset = class_kset; #else cp->subsys.kobj.kset = class_kset; #endif cp->subsys.kobj.ktype = &class_ktype; cp->class = cls; cls->p = cp; #注册给kernel 这个subsys error = kset_register(&cp->subsys); if (error) { kfree(cp); return error; } #添加这个class 给kernel error = class_add_groups(class_get(cls), cls->class_groups); class_put(cls); return error; }
相关文章推荐
- 驱动中使用class_device_create()报错的原因,自动创建设备节点
- 内核设备驱动API之__register_chrdev_region
- (一)小记——驱动中使用class_device_create()报错的原因、自动创建设备节点
- linux内核部件分析之——设备驱动模型之class
- linux内核部件分析(十)——设备驱动模型之class
- 内核设备驱动API之get_device和put_device
- 内核设备驱动API之cdev_add
- linux内核部件分析之——设备驱动模型之class
- 内核设备驱动API之device_add
- 内核设备驱动API之register_chrdev
- Linux 内核设备驱动之GPIO驱动之GPIO API
- 内核设备驱动API之device_rename
- linux内核部件分析之——设备驱动模型之class
- linux内核部件分析之——设备驱动模型之class
- 浅谈 Linux 内核开发之网络设备驱动
- 过滤键盘驱动对象Kbdclass的所有设备对象
- Linux 设备驱动模型中的class(类)
- 设备驱动的艺术之旅 - 驱动和内核的关系
- Linux 设备驱动--- 内核等待队列 --- wait_queue_head --- wait_event_interruptible --- 按键驱动程序优化
- Linux设备驱动前的工作准备 ---- 内核的配置及Makefile编写