【Linux设备驱动】使用class_create()和device_create()自动创建设备节点

之前【Linux设备驱动】最简单的 字符设备驱动编写一文已经对最简单的字符设备驱动编写做了一个简答的叙述,但手动创建设备节点,还是差那么点意思.

Linux内核为我们提供了一组函数,可以用来在模块加载的时候自动在/dev目录下创建相应设备节点,并在卸载模块时删除该节点,当然前提条件是用户空间移植了udev

疑问:什么是udev?

创建或删除类

class_create()和class_destroy()

1.class_create 是类创建函数,它本身是一个宏,一共有两个参数:

  • 参数owner 一般为THIS_MODULE
  • 参数name 是类名字

返回值:指向结构体class 的指针,也就是创建的类。

/* This is a #define to keep the compiler from merging different
 * instances of the __key variable */
#define class_create(owner, name)       \
({                      \
    static struct lock_class_key __key; \
    __class_create(owner, name, &__key);    \
})

//__class_create函数原型是
/**
 * class_create - create a struct class structure
 * @owner: pointer to the module that is to "own" this struct class
 * @name: pointer to a string for the name of this class.
 * @key: the lock_class_key for this class; used by mutex lock debugging
 *
 * This is used to create a struct class pointer that can then be used
 * in calls to device_create().
 *
 * Returns &struct class pointer on success, or ERR_PTR() on error.
 *
 * Note, the pointer created here is to be destroyed when finished by
 * making a call to class_destroy().
 */
struct class *__class_create(struct module *owner, const char *name,struct lock_class_key *key);

2.class_destroy()是卸载驱动程序的时候要删除类

void class_destroy(struct class *class);

创建删除设备

device_create()和device_destroy()

在创建好类之后还不能实现自动创建设备节点,还需要在类下创建设备

struct device *device_create(struct class *class, struct device *parent, dev_t devt, void *drvdata, const char *fmt, ...);
//class:给哪个类创建设备
//parent:父设备,一般为NULL
//devt:设备号
//drvdata:设备可能会使用到的数据
//fmt:设备名字

同样的,卸载驱动的时候需要删除掉创建的设备,设备删除函数为device_destroy,函数原型如下:

void device_destroy(struct class *class, dev_t devt)

参照【Linux设备驱动】最简单的 字符设备驱动编写代码,优化结果如下:

/*以上代码略*/
/*******************************************/

struct class *char_class;
struct device *char_device;

static __init int char_init(void)
{
    int ret = 0;

    ret = alloc_chrdev_region(&ndev, 0, 1, "chr_dev");//动态分配设备号
    if(ret < 0){
        printk("alloc_chrdev_region failed!\n");
        return ret;
    }

    printk("init():major = %d, minor = %d\n", MAJOR(ndev), MINOR(ndev));//打印主设备号和次设备号

    chr_dev = kzalloc(sizeof(struct cdev), GFP_KERNEL);
	if(NULL == chr_dev){
		printk("kzalloc cdev failed!\n");
		goto err_alloc_cdev;
	}

    cdev_init(chr_dev, &chr_ops);//初始化字符设备对象,[加入系统前必须初始化]
    
    ret = cdev_add(chr_dev, ndev, 1);//将字符设备对象插入chr_dev注册进系统
    if(ret < 0){
        printk("cdev_add error!\n");
        goto err_cdev_add;//注册失败记得要销毁刚才分配的设备号
    }
    
    char_class = class_create(THIS_MODULE,"chr_dev")//创建类
    if(NULL == char_class){
        printk("char class create failed!\n");
        goto err_class_create;
    }

    char_device = device_create(char_class, NULL, ndev, NULL, "chr_dev");
    if(NULL == char_device){
        printk("char device create failed!\n");
        goto err_device_create;
    }
    
    printk("create char driver success!\n");
    return 0;
    
err_device_create:    
    class_destroy(char_class);

err_class_create:
	cdev_del(chr_dev);
    
err_cdev_add:
	kfree(chr_dev);

err_alloc_cdev:
	unregister_chrdev_region(ndev, 1);
    
    printk("create char driver failed!\n");
	return -1;

}

static __exit void char_exit(void)
{
    device_destroy(char_class, ndev);//删除设备
    class_destroy(char_class);//删除类
    unregister_chrdev_region(ndev, 1);//释放分配的设备号
    cdev_del(chr_dev);//将字符设备对象chr_dev从系统中注销
    kfree(chr_dev);
	printk("exit char driver success!\n");
}


module_init(char_init);
module_exit(char_exit);

MODULE_AUTHOR("zywang");
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("char driver new demo");
### 回答1: class_create是一个函数,用于创建一个新的设备。它接受一个指向struct class结构体的指针作为参数,并返回一个指向新创建设备的指针。 device_create是一个函数,用于创建一个新的设备节点。它接受一个指向struct class结构体的指针、一个指向父设备的指针和一个设备号作为参数,并返回一个指向新创建设备节点的指针。 ### 回答2: 在Linux驱动程序开发中,class_createdevice_create是常用的函数,它们的作用是为Linux设备驱动程序提供一种无需手动注册设备节点的方式,从而简化了驱动程序的编写过程。 class_create函数可用于向系统注册一个新的设备别(class),同时自动创建一个sysfs设备目录,该目录下包含了该设备别的各种属性和状态信息。在该目录下创建设备文件会自动继承该设备别,从而归管理,便于后续的设备管理操作。另外,向系统注册一个设备别还可以允许用户空间的程序动态地发现和识别与其相关的设备device_create函数是在一个已经注册的设备别下(通过调用class_create函数实现)创建一个设备对象(即设备节点),并自动将其添加到sysfs文件系统中。设备节点包含了与设备相关的信息,如设备号、设备属性等等。通过该函数,用户空间程序只需知道设备别名称和设备名称,即可实现对设备自动发现和访问。同时,该函数还允许驱动程序在设备对象被创建之前执行一些相关的初始化配置操作,以确保设备使用时的正确性和稳定性。 总之,class_createdevice_createLinux设备驱动程序编写中非常基础和重要的函数,它们可以大大简化设备节点创建和管理工作,同时也为用户空间程序提供了一种方便的接口,有助于提升Linux设备驱动程序的可用性和易用性。 ### 回答3: class_createdevice_create都是Linux内核中的函数,用于驱动程序中的设备注册和创建class_create函数用于创建设备,它有以下几个参数: 1. owner:表示该的拥有者,通常为THIS_MODULE。 2. name:表示设备的名称,该名称在/sys/class目录下创建。 3. parent:表示设备的父指针,可以为NULL。 4. class_attr:表示指向设备的属性结构数组的指针,属性结构数组中存放着设备的各种属性信息,包括设备属性名、访问方式、读写接口等。 5. device_attr:表示指向设备的属性结构数组的指针,属性结构数组中存放着设备的各种属性信息,包括设备属性名、访问方式、读写接口等。 因此,在使用class_create函数时,需要先定义好设备设备的属性结构数组,并通过参数传递给该函数。 而device_create函数用于创建一个设备,并将其加入到设备中。它有以下几个参数: 1. class:表示指向设备的指针。 2. parent:表示指定设备的父设备,可以为NULL。 3. devt:表示设备设备号,在内核中唯一识别该设备。 4. name:表示设备的名称,该名称在/dev目录下创建。 5. fmt:表示设备名称的格式,常用的格式有“%s”,表示设备名称为字符串。 本函数的基本操作就是在设备创建一个新的设备。因此,在调用该函数之前,需要确定要创建哪个设备,以及要创建设备的名称和设备号。 总的来说,class_createdevice_create两个函数都是用于管理设备的函数,前者用于创建设备,后者用于创建设备。它们是Linux设备驱动程序中非常常用的两个函数,掌握它们对于开发Linux设备驱动程序非常重要。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Van.Ghylivan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值