要使用struct class、class_create(…) 以及device_create(…)需要包含/include/linux/device.h头文件。
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_file
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,第五个参数是设备名称。
(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
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; };一个struct class结构体类型变量对应一个类。
自动创建设备文件并使用内核提供的寄存器读写接口例程