天天看点

linux驱动:自动创建设备节点

在加载驱动模块后,就要自己使用mknod创建设备节点,这样虽然是可行的,但是比较麻烦。我们可以在__init()函数里面添加一些函数,自动创建设备节点。创建设备节点使用了两个函数 class_create()和device_create(),当然在__exit()函数里,要使用class_destory()和device_desotry()注销创建的设备节点。

1. 函数说明

struct device *device_create(struct class *class, struct device *parent,
dev_t devt, const char *fmt, ...)

struct device *device_create(struct class *class, struct device *parent,
dev_t devt, void *drvdata, const char *fmt, ...)
           

在驱动用加入对udev的支持主要做的就是:在驱动初始化的代码里调用class_create(...)为该设备创建一个class,再为每个设备调用device_create(...)( 在2.6较早的内核中用class_device_create)创建对应的设备。

内核中定义的struct class结构体,顾名思义,一个struct class结构体类型变量对应一个类,内核同时提供了class_create(…)函数,可以用它来创建一个类,这个类存放于sysfs下面,一旦创建好了这个类,再调用 device_create(…)函数来在/dev目录下创建相应的设备节点。这样,加载模块的时候,用户空间中的udev会自动响应 device_create(…)函数,去/sysfs下寻找对应的类从而创建设备节点。

2. 具体用法

需要包含头文件 #include <linux/device.h>    

static int led_init()
{

    major = register_chrdev(0, "led_drv", &led_fops);
    led_drv_class = class_create("THIS_MODULE", "led_drv");
    device_create(led_drv_class, NULL, MKDEV(major, 0), NULL, "myled");

    return 0;

}



static void led_exit()
{

    unregister_chrdev(major, "led_drv");
    device_destroy(led_drv_class, MKDEV(major, 0));
    class_destroy(led_drv_class);

}
           

在驱动初始化的代码里调用class_create为该设备创建一个class,再为每个设备调用 device_create创建对应的设备。

加载模块后,会自动在/dev/下创建myled设备文件。

继续阅读