您的位置:首页 > 其它

字符设备驱动程序之自动创建设备节点

2015-11-06 15:20 309 查看
#include <linux/fs.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/types.h>
#include <linux/device.h>
static struct class *led_class;

int led_open(struct inode *inode, struct file *file)
{
    printk("led_open\n");
    return 0;
}
ssize_t led_write(struct file *file, const char __user *user, size_t size, loff_t *off)
{
    printk("led_write\n");
    return 0;
}

static struct file_operations led_operation = {
    .owner=THIS_MODULE,
    .open=led_open,
    .write=led_write,   
};
int major;
int led_init(void)
{
    major=register_chrdev(0,"led",&led_operation);

    led_class = class_create(THIS_MODULE, "led_class");

    device_create(led_class, NULL, MKDEV(major, 0), NULL,"led_device");
    return 0;
}

void led_exit(void)
{
    unregister_chrdev(major,"led");
    device_destroy(led_class,MKDEV(major, 0));
    class_destroy(led_class);
    
}

module_init(led_init);
module_exit(led_exit);
MODULE_LICENSE("GPL");

主要思路:先创建一个类,在类下创建设备!这样我们就不需要在开发板上查看主设备号,然后手动创建设备节点了!在开发板上:ls /sys/class/会看到我们创建的类,ls /sys/class/led_class/会看到我们在类下创建的设备!不过真正的设备节点在/dev目录下面,通过命令:ls /dev/led_device可以查看到!
需要注意的是,我们在编写应用程序的时候,open函数里面的设备名字要跟驱动里面device_create指定的设备名字相一致!

但是,系统做了什么呢?在开发板的/etc/init.d/rcS文件里面有如下的信息:

echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
这两行信息就是说,一旦发生了热插拔事件(比如创建了类,在类下创建了设备),就会调用/sbin/mdev命令,mdev命令会通过环境变量中的 ACTION 和 DEVPATH来判断此次热插拔事件影响了/sys目录下的那个文件,一旦发现了这个文件,就会进入这个文件里面去查找dev的属性文件,并根据属性创建设备节点!比如我们加载驱动的的时候,会在 /sys/class/目录下创建类,在 /sys/class/led_class目录下创建设备,在
/sys/class/led_class目录下有个dev文件,dev文件里面就有设备的主次设备号,mdev就会根据主次设备号在/dev/目录下创建设备节点!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: