内核代码
#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\n");
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!\n",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\n");
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!\n");
return 0;
}
ret = ioctl(fd, 0x101, &rdata);
printf("ioctl: ret=%d rdata=%d\n", ret, rdata);
wdata = 42;
ret = ioctl(fd, 0x100, &wdata);
ret = ioctl(fd, 0x101, &rdata);
printf("ioctl: ret=%d rdata=%d\n", ret, rdata);
close(fd);
return 0;
}
#endif