zoukankan      html  css  js  c++  java
  • 字符设备模板3:misc_register

    内核代码

    #include <linux/kernel.h>
    #include <linux/init.h>
    #include <linux/types.h>
    #include <linux/spinlock.h>
    #include <linux/blkdev.h>
    #include <linux/module.h>  
    #include <linux/fs.h>  
    #include <linux/errno.h>  
    #include <linux/mm.h>  
    #include <linux/cdev.h>  
    #include <linux/miscdevice.h>
    
    #define MISC_NAME   "miscdriver"
    
    static int misc_open(struct inode *inode, struct file *file)
    {
        printk("misc_open
    ");
        return 0;
    }
    
    int temp_data = 0;
    
    static int misc_ioctl( struct file *file, unsigned int cmd, unsigned long arg)
    {    
        switch(cmd)
        {
            case 0x100:
                if(copy_from_user(&temp_data,  (int *)arg, sizeof(int))) 
                    return -EFAULT;
                break;
            
            case 0x101:
                if(copy_to_user( (int *)arg, &temp_data, sizeof(int))) 
                    return -EFAULT;
                break;
        }
        
        //printk(KERN_NOTICE"ioctl CMD%d done!
    ",temp);    
        return 0;
    }
    
    
    static const struct file_operations misc_fops =
    {
        .owner   =   THIS_MODULE,
        .open    =   misc_open,
        .unlocked_ioctl = misc_ioctl,
    };
    
    static struct miscdevice misc_dev =
    {
        .minor = MISC_DYNAMIC_MINOR,
        .name = MISC_NAME,
        .fops = &misc_fops,
    };
    
    
    static int __init misc_init(void)
    {
        int ret;
        
        ret = misc_register(&misc_dev);
        if (ret)
        {
            printk("misc_register error
    ");
            return ret;
        }
    
        return 0;
    }
    
    static void __exit misc_exit(void)
    {
        misc_deregister(&misc_dev);
    }
    
    module_init(misc_init);
    module_exit(misc_exit);
    MODULE_LICENSE("GPL");
    MODULE_AUTHOR("Decly");
    

      

     测试代码

    #if 1
    
    #include <stdio.h>  
    #include <fcntl.h>  
    #include <stdlib.h>  
    #include <string.h>  
    #include <sys/types.h>  
    #include <sys/stat.h>
    #include <unistd.h>
    #include <sys/ioctl.h>
    
    int main()
    {
        int fd;
        int ret;
        int wdata, rdata;
    
        fd = open("/dev/miscdriver", O_RDWR);
        if( fd < 0 ) {
            printf("open miscdriver WRONG!
    ");
            return 0;
        }
    
        ret = ioctl(fd, 0x101, &rdata);
        printf("ioctl: ret=%d rdata=%d
    ", ret, rdata);
    
        wdata = 42;
        ret = ioctl(fd, 0x100, &wdata);
    
        ret = ioctl(fd, 0x101, &rdata);
        printf("ioctl: ret=%d rdata=%d
    ", ret, rdata);
        
        close(fd);
        return 0;
    }
    
    #endif
    

      

  • 相关阅读:
    win10下VMware15运行ubuntu18.04无法和主机之间复制粘贴问题
    Redis的五种数据类型
    celery的入门使用
    Django/Flask的一些实现方法
    Python3实现简单的钉钉机器人调用
    装饰者模式
    pyhdfs安装
    使用setup.py安装python包和卸载python包的方法
    zookeeper搭建
    S3C6410裸奔之旅——RVDS2.2编译、仿真、调试过程 LED流水灯---转的
  • 原文地址:https://www.cnblogs.com/soul-stone/p/7423920.html
Copyright © 2011-2022 走看看