Home | History | Annotate | Download | only in kernel_space
      1 
      2 #include <linux/module.h>
      3 #include <linux/version.h>
      4 #include <linux/fs.h>
      5 #include <linux/videodev2.h>
      6 #include <media/v4l2-ioctl.h>
      7 #include <media/v4l2-dev.h>
      8 
      9 struct dummy_dev {
     10 	struct video_device *vfd;
     11 };
     12 
     13 static int dummy_open(struct inode *inode, struct file *file)
     14 {
     15 	int minor = iminor(inode);
     16 
     17 	printk(KERN_DEBUG "video_dummy: open called (minor=%d)\n", minor);
     18 
     19 	return 0;
     20 }
     21 
     22 static int dummy_close(struct inode *inode, struct file *file)
     23 {
     24 	int minor = iminor(inode);
     25 
     26 	printk(KERN_DEBUG "video_dummy: close called (minor=%d)\n", minor);
     27 
     28 	return 0;
     29 }
     30 
     31 static int vidioc_querycap(struct file *file, void *priv,
     32 			   struct v4l2_capability *cap)
     33 {
     34 	strcpy(cap->driver, "dummy");
     35 	strcpy(cap->card, "dummy");
     36 	cap->version = KERNEL_VERSION(0, 0, 1);
     37 	cap->capabilities = 0;
     38 	return 0;
     39 }
     40 
     41 static struct file_operations dummy_fops = {
     42 	.owner = THIS_MODULE,
     43 	.open = dummy_open,
     44 	.release = dummy_close,
     45 	.ioctl = video_ioctl2,	/* V4L2 ioctl handler */
     46 
     47 #ifdef CONFIG_COMPAT
     48 /*
     49  * V4L/DVB (10139): v4l: rename v4l_compat_ioctl32 to v4l2_compat_ioctl32
     50  * http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=9bb7cde793f0637cfbdd21c04050ffcef33a5624
     51  */
     52 #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 19)
     53 	.compat_ioctl = v4l_compat_ioctl32,
     54 #else
     55 	.compat_ioctl = v4l2_compat_ioctl32,
     56 #endif
     57 #endif
     58 };
     59 
     60 static const struct v4l2_ioctl_ops dummy_ioctl_ops = {
     61 	.vidioc_querycap = vidioc_querycap,
     62 };
     63 
     64 static const struct video_device dummy_template = {
     65 	.name = "dummy",
     66 	.fops = &dummy_fops,
     67 	.ioctl_ops = &dummy_ioctl_ops,
     68 	.minor = -1,
     69 	.release = video_device_release,
     70 
     71 	.tvnorms = V4L2_STD_525_60,
     72 	.current_norm = V4L2_STD_NTSC_M,
     73 };
     74 
     75 static struct video_device *dummy_vfd = NULL;
     76 
     77 static int __init video_dummy_init(void)
     78 {
     79 	int ret;
     80 
     81 	dummy_vfd = video_device_alloc();
     82 	if (!dummy_vfd)
     83 		return -ENOMEM;
     84 
     85 	*dummy_vfd = dummy_template;
     86 
     87 	ret = video_register_device(dummy_vfd, VFL_TYPE_GRABBER, -1);
     88 	if (ret < 0) {
     89 		video_device_release(dummy_vfd);
     90 		dummy_vfd = NULL;
     91 		return ret;
     92 	}
     93 
     94 	printk(KERN_INFO
     95 	       "video_dummy: V4L2 device registered as /dev/video%d\n",
     96 	       dummy_vfd->num);
     97 
     98 	return 0;
     99 }
    100 
    101 static void __exit video_dummy_exit(void)
    102 {
    103 
    104 	printk(KERN_INFO "video_dummy: removing /dev/video%d\n",
    105 	       dummy_vfd->num);
    106 	video_unregister_device(dummy_vfd);
    107 	dummy_vfd = NULL;
    108 
    109 }
    110 
    111 module_init(video_dummy_init);
    112 module_exit(video_dummy_exit);
    113 
    114 MODULE_DESCRIPTION("Dummy video module");
    115 MODULE_AUTHOR("Mrton Nmeth <nm127 (at) freemail.hu>");
    116 MODULE_LICENSE("GPL");
    117