basic misc driver

#include <linux/init.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/miscdevice.h>
/////////////////////////////////////////////////
MODULE_LICENSE("Dual BSD/GPL");
int open_state = 0;
/////////////////////////////////////////////////
int misc01_open(struct inode *inode, struct file *filp)
{
    if (open_state == 0)
    {
        open_state = 1;
        printk("misc01 open!\n");
        return 0;
    }
    printk("misc01 has been open!\n");
    return -1;
}

int misc01_release(struct inode *inode, struct file *filp)
{
    if (open_state == 1)
    {
        open_state = 0;
        printk("misc01 release!\n");
        return 0;
    }
    printk("misc01 has not been open yet!\n");
    return -1;
}

ssize_t misc01_read(struct file *filp, char *buf,
        size_t count, loff_t *fpos)
{
    printk("misc01 read!\n");
    return 0;
}

ssize_t misc01_write(struct file *filp, const char *buf,
        size_t count, loff_t *fpos)
{
    printk("misc01 write!\n");
    return 0;
}

long misc01_ioctl(struct file *filp,
        unsigned int cmd, unsigned long arg)
{
    printk("ioctl is called!\n");
    printk("cmd:%d arg:%ld\n", cmd, arg);
        switch(cmd)
        {
                case 0: break;
                case 1: break;
                case 2: break;
                default: break;
        }
    return 0;
}
/////////////////////////////////////////////////
struct file_operations fops = 
{
    .owner      =   THIS_MODULE,
    .write      =   misc01_write,
    .read       =   misc01_read,
    .unlocked_ioctl     =   misc01_ioctl,
    .open       =   misc01_open,
    .release    =   misc01_release,
};

struct miscdevice dev = 
{
    .minor  =   MISC_DYNAMIC_MINOR,
    .fops    =   &fops,
    .name   =   "misc01",
    .nodename = "misc01_node"
};

int setup_misc01(void)
{
    
    return misc_register(&dev);
}
/////////////////////////////////////////////////
static int __init misc01_init(void)
{
    printk("misc01 init!\n");
    return setup_misc01();
}

static void __exit misc01_exit(void)
{
    printk("misc01 exit!\n");
    misc_deregister(&dev);
}

/////////////////////////////////////////////////
module_init(misc01_init);
module_exit(misc01_exit);

 

posted @ 2015-05-26 12:02  Kozmers  阅读(175)  评论(0编辑  收藏  举报