要使用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_file
struct 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
自动创建设备文件并使用内核提供的寄存器读写接口例程
