[PATCH v3] [media] usbtv: Add driver for Fushicai USBTV007 video frame grabber

2013-06-17 Thread Lubomir Rintel
Reverse-engineered driver for cheapo video digitizer, made from observations of
Windows XP driver. The protocol is not yet completely understood, so far we
don't provide any controls, only support a single format out of three and don't
support the audio device.

Signed-off-by: Lubomir Rintel lkund...@v3.sk
Cc: Mauro Carvalho Chehab mche...@redhat.com
Cc: linux-ker...@vger.kernel.org
Cc: linux-media@vger.kernel.org

---
Changes for v2:
- Fix a typo in comment
- Make prototype register settings static const
- Solve parity calculation weirdness
- Attempt to fix interlacing
- Add timestamp to frames
- [v4l2-compliance] Set pix format priv to 0
- Drop usbtv_*_fmt_vid_cap code duplication
- [v4l2-compliance] Add vidioc_create_bufs
- [v4l2-compliance] Use file handle priorities
- Drop Driver from initial dev_info
Changes for v3:
- Utilize ARRAY_SIZE
- Drop queryctrl ioctl
- Reduce default number of buffers to two
- Remove unnecessary locking
- video_set_drvdata() before video_register_device()

diff --git a/drivers/media/usb/Kconfig b/drivers/media/usb/Kconfig
index 0a7d520..8e10267 100644
--- a/drivers/media/usb/Kconfig
+++ b/drivers/media/usb/Kconfig
@@ -17,6 +17,7 @@ source drivers/media/usb/zr364xx/Kconfig
 source drivers/media/usb/stkwebcam/Kconfig
 source drivers/media/usb/s2255/Kconfig
 source drivers/media/usb/sn9c102/Kconfig
+source drivers/media/usb/usbtv/Kconfig
 endif
 
 if MEDIA_ANALOG_TV_SUPPORT
diff --git a/drivers/media/usb/Makefile b/drivers/media/usb/Makefile
index 7f51d7e..0935f47 100644
--- a/drivers/media/usb/Makefile
+++ b/drivers/media/usb/Makefile
@@ -20,3 +20,4 @@ obj-$(CONFIG_VIDEO_STK1160) += stk1160/
 obj-$(CONFIG_VIDEO_CX231XX) += cx231xx/
 obj-$(CONFIG_VIDEO_TM6000) += tm6000/
 obj-$(CONFIG_VIDEO_EM28XX) += em28xx/
+obj-$(CONFIG_VIDEO_USBTV) += usbtv/
diff --git a/drivers/media/usb/usbtv/Kconfig b/drivers/media/usb/usbtv/Kconfig
new file mode 100644
index 000..8864436
--- /dev/null
+++ b/drivers/media/usb/usbtv/Kconfig
@@ -0,0 +1,10 @@
+config VIDEO_USBTV
+tristate USBTV007 video capture support
+depends on VIDEO_DEV
+select VIDEOBUF2_VMALLOC
+
+---help---
+  This is a video4linux2 driver for USBTV007 based video capture 
devices.
+
+  To compile this driver as a module, choose M here: the
+  module will be called usbtv
diff --git a/drivers/media/usb/usbtv/Makefile b/drivers/media/usb/usbtv/Makefile
new file mode 100644
index 000..28b872f
--- /dev/null
+++ b/drivers/media/usb/usbtv/Makefile
@@ -0,0 +1 @@
+obj-$(CONFIG_VIDEO_USBTV) += usbtv.o
diff --git a/drivers/media/usb/usbtv/usbtv.c b/drivers/media/usb/usbtv/usbtv.c
new file mode 100644
index 000..d44fa63
--- /dev/null
+++ b/drivers/media/usb/usbtv/usbtv.c
@@ -0,0 +1,696 @@
+/*
+ * Fushicai USBTV007 Video Grabber Driver
+ *
+ * Product web site:
+ * 
http://www.fushicai.com/products_detail/productId=d05449ee-b690-42f9-a661-aa7353894bed.html
+ *
+ * Following LWN articles were very useful in construction of this driver:
+ * Video4Linux2 API series: http://lwn.net/Articles/203924/
+ * videobuf2 API explanation: http://lwn.net/Articles/447435/
+ * Thanks go to Jonathan Corbet for providing this quality documentation.
+ * He is awesome.
+ *
+ * Copyright (c) 2013 Lubomir Rintel
+ * All rights reserved.
+ * No physical hardware was harmed running Windows during the
+ * reverse-engineering activity
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *notice, this list of conditions, and the following disclaimer,
+ *without modification.
+ * 2. The name of the author may not be used to endorse or promote products
+ *derived from this software without specific prior written permission.
+ *
+ * Alternatively, this software may be distributed under the terms of the
+ * GNU General Public License (GPL).
+ */
+
+#include linux/init.h
+#include linux/list.h
+#include linux/module.h
+#include linux/slab.h
+#include linux/usb.h
+#include linux/version.h
+#include linux/videodev2.h
+
+#include media/v4l2-device.h
+#include media/v4l2-ioctl.h
+#include media/videobuf2-core.h
+#include media/videobuf2-vmalloc.h
+
+/* Hardware. */
+#define USBTV_VIDEO_ENDP   0x81
+#define USBTV_BASE 0xc000
+#define USBTV_REQUEST_REG  12
+
+/* Number of concurrent isochronous urbs submitted.
+ * Higher numbers was seen to overly saturate the USB bus. */
+#define USBTV_ISOC_TRANSFERS   16
+#define USBTV_ISOC_PACKETS 8
+
+#define USBTV_WIDTH720
+#define USBTV_HEIGHT   480
+
+#define USBTV_CHUNK_SIZE   256
+#define USBTV_CHUNK240
+#define USBTV_CHUNKS   (USBTV_WIDTH * USBTV_HEIGHT \
+   / 2 / USBTV_CHUNK)
+
+/* Chunk header. */
+#define 

Re: [PATCH v3] [media] usbtv: Add driver for Fushicai USBTV007 video frame grabber

2013-06-17 Thread Hans Verkuil
On Mon 17 June 2013 11:43:13 Lubomir Rintel wrote:
 Reverse-engineered driver for cheapo video digitizer, made from observations 
 of
 Windows XP driver. The protocol is not yet completely understood, so far we
 don't provide any controls, only support a single format out of three and 
 don't
 support the audio device.

Looks great. I've got two remaining issues: replace strncpy with the safer 
strlcpy
and a small problem in usbtv_queue_setup.

After fixing that you can add my

Acked-by: Hans Verkuil hans.verk...@cisco.com

to the patch.

Regards,

Hans

 
 Signed-off-by: Lubomir Rintel lkund...@v3.sk
 Cc: Mauro Carvalho Chehab mche...@redhat.com
 Cc: linux-ker...@vger.kernel.org
 Cc: linux-media@vger.kernel.org
 
 ---
 Changes for v2:
 - Fix a typo in comment
 - Make prototype register settings static const
 - Solve parity calculation weirdness
 - Attempt to fix interlacing
 - Add timestamp to frames
 - [v4l2-compliance] Set pix format priv to 0
 - Drop usbtv_*_fmt_vid_cap code duplication
 - [v4l2-compliance] Add vidioc_create_bufs
 - [v4l2-compliance] Use file handle priorities
 - Drop Driver from initial dev_info
 Changes for v3:
 - Utilize ARRAY_SIZE
 - Drop queryctrl ioctl
 - Reduce default number of buffers to two
 - Remove unnecessary locking
 - video_set_drvdata() before video_register_device()
 
 diff --git a/drivers/media/usb/Kconfig b/drivers/media/usb/Kconfig
 index 0a7d520..8e10267 100644
 --- a/drivers/media/usb/Kconfig
 +++ b/drivers/media/usb/Kconfig
 @@ -17,6 +17,7 @@ source drivers/media/usb/zr364xx/Kconfig
  source drivers/media/usb/stkwebcam/Kconfig
  source drivers/media/usb/s2255/Kconfig
  source drivers/media/usb/sn9c102/Kconfig
 +source drivers/media/usb/usbtv/Kconfig
  endif
  
  if MEDIA_ANALOG_TV_SUPPORT
 diff --git a/drivers/media/usb/Makefile b/drivers/media/usb/Makefile
 index 7f51d7e..0935f47 100644
 --- a/drivers/media/usb/Makefile
 +++ b/drivers/media/usb/Makefile
 @@ -20,3 +20,4 @@ obj-$(CONFIG_VIDEO_STK1160) += stk1160/
  obj-$(CONFIG_VIDEO_CX231XX) += cx231xx/
  obj-$(CONFIG_VIDEO_TM6000) += tm6000/
  obj-$(CONFIG_VIDEO_EM28XX) += em28xx/
 +obj-$(CONFIG_VIDEO_USBTV) += usbtv/
 diff --git a/drivers/media/usb/usbtv/Kconfig b/drivers/media/usb/usbtv/Kconfig
 new file mode 100644
 index 000..8864436
 --- /dev/null
 +++ b/drivers/media/usb/usbtv/Kconfig
 @@ -0,0 +1,10 @@
 +config VIDEO_USBTV
 +tristate USBTV007 video capture support
 +depends on VIDEO_DEV
 +select VIDEOBUF2_VMALLOC
 +
 +---help---
 +  This is a video4linux2 driver for USBTV007 based video capture 
 devices.
 +
 +  To compile this driver as a module, choose M here: the
 +  module will be called usbtv
 diff --git a/drivers/media/usb/usbtv/Makefile 
 b/drivers/media/usb/usbtv/Makefile
 new file mode 100644
 index 000..28b872f
 --- /dev/null
 +++ b/drivers/media/usb/usbtv/Makefile
 @@ -0,0 +1 @@
 +obj-$(CONFIG_VIDEO_USBTV) += usbtv.o
 diff --git a/drivers/media/usb/usbtv/usbtv.c b/drivers/media/usb/usbtv/usbtv.c
 new file mode 100644
 index 000..d44fa63
 --- /dev/null
 +++ b/drivers/media/usb/usbtv/usbtv.c
 @@ -0,0 +1,696 @@
 +/*
 + * Fushicai USBTV007 Video Grabber Driver
 + *
 + * Product web site:
 + * 
 http://www.fushicai.com/products_detail/productId=d05449ee-b690-42f9-a661-aa7353894bed.html
 + *
 + * Following LWN articles were very useful in construction of this driver:
 + * Video4Linux2 API series: http://lwn.net/Articles/203924/
 + * videobuf2 API explanation: http://lwn.net/Articles/447435/
 + * Thanks go to Jonathan Corbet for providing this quality documentation.
 + * He is awesome.
 + *
 + * Copyright (c) 2013 Lubomir Rintel
 + * All rights reserved.
 + * No physical hardware was harmed running Windows during the
 + * reverse-engineering activity
 + *
 + * Redistribution and use in source and binary forms, with or without
 + * modification, are permitted provided that the following conditions
 + * are met:
 + * 1. Redistributions of source code must retain the above copyright
 + *notice, this list of conditions, and the following disclaimer,
 + *without modification.
 + * 2. The name of the author may not be used to endorse or promote products
 + *derived from this software without specific prior written permission.
 + *
 + * Alternatively, this software may be distributed under the terms of the
 + * GNU General Public License (GPL).
 + */
 +
 +#include linux/init.h
 +#include linux/list.h
 +#include linux/module.h
 +#include linux/slab.h
 +#include linux/usb.h
 +#include linux/version.h
 +#include linux/videodev2.h
 +
 +#include media/v4l2-device.h
 +#include media/v4l2-ioctl.h
 +#include media/videobuf2-core.h
 +#include media/videobuf2-vmalloc.h
 +
 +/* Hardware. */
 +#define USBTV_VIDEO_ENDP 0x81
 +#define USBTV_BASE   0xc000
 +#define USBTV_REQUEST_REG12
 +
 +/* Number of concurrent isochronous urbs submitted.
 + * Higher numbers