要使用struct class、class_create(…) 以及device_create(…)需要包含/include/linux/device.h头文件。
struct class
include/linux/device.h
struct class { const char *name; struct module *owner; struct class_attribute *class_attrs; struct device_attribute *dev_attrs; struct kobject *dev_kobj; int (*dev_uevent)(struct device *dev, struct kobj_uevent_env *env); char *(*devnode)(struct device *dev, mode_t *mode); void (*class_release)(struct class *class); void (*dev_release)(struct device *dev); int (*suspend)(struct device *dev, pm_message_t state); int (*resume)(struct device *dev); const struct kobj_ns_type_operations *ns_type; const void *(*namespace)(struct device *dev); const struct dev_pm_ops *pm; struct class_private *p; };
该结构体是用来生成类的模板,每一个用该结构体定义出的实例都表示一个类。
class_create
(1)创建一个类,会在/sys/class目录下生成相应的文件夹
(2)第一个参数指定类的所有者是哪个模块,第二个参数指定类名。
(3)class_destroy(…)函数,用于在模块卸载时删除类。
(4)函数分析
class_create
__class_create
__class_register
kset_register
kobject_uevent
add_class_attrs
class_create_file
sysfs_create_filestruct class *__class_create(struct module *owner, const char *name, struct lock_class_key *key) { struct class *cls; int retval; cls = kzalloc(sizeof(*cls), GFP_KERNEL); if (!cls) { retval = -ENOMEM; goto error; } cls->name = name; cls->owner = owner; cls->class_release = class_create_release; retval = __class_register(cls, key); if (retval) goto error; return cls; error: kfree(cls); return ERR_PTR(retval); }
分析__class_create函数可以发现其内部就是定义了一个struct class类型的变量,进行一些成员赋值后。。。
device_creat(struct class *class, struct device *parent,dev_t devt, void *drvdata, const char *fmt, ...)
(1)用户空间中的udev会自动响应device_create(…)函数,去/sysfs下寻找对应的类从而创建设备节点。 在/dev目录下创建相应的设备节点
(2)第一个参数指定所要创建的设备所从属的类,第二个参数是这个设备的父设备,如果没有就指定为NULL,第三个参数是设备号,第四个参数是为回调而添加到设备的数据,如果没有就指定为NULL,第五个参数是设备名称,后面的可变参数类似于printf的用法,主要是为了辅助设备名称的创建。
(4)device_destroy函数用于删除设备节点
(3)函数分析
device_create
device_create_vargs
kobject_set_name_vargs
device_register
device_add
kobject_add
device_create_file
device_create_sys_dev_entry
devtmpfs_create_node
device_add_class_symlinks
device_add_attrs
device_pm_add
kobject_uevent