linux驱动开发扩展--自动创建设备文件

本文详细介绍了Linux内核中的structclass结构体,它是用来创建类的模板,用于组织设备。class_create函数用于在/sys/class下创建类的目录,device_create函数则用于在/sysfs下创建设备节点,并在/dev目录下生成设备文件。文章通过源码分析了这两个函数的工作流程,并解释了它们在设备驱动开发中的作用。
摘要由CSDN通过智能技术生成

要使用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

自动创建设备文件并使用内核提供的寄存器读写接口例程 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值