[media] em28xx: shed some light on video input formats
authorFrank Schaefer <fschaefer.oss@googlemail.com>
Sat, 15 Apr 2017 10:05:03 +0000 (07:05 -0300)
committerMauro Carvalho Chehab <mchehab@s-opensource.com>
Mon, 17 Apr 2017 20:32:44 +0000 (17:32 -0300)
CbYCrY has been identified by looking into the tvp5150 driver and the
saa7115 datasheet.
YUV formats have been verified with em2765 + ov2640 (VAD Laplace webcam).
RGB8 formats have been verified with em2710/em2820 + mt9v011 (Silvercrest
webcam 1.3mpix).
I also did some cross-checking with these two camera devices and 0x08-0x0b
are at least 16 bits per pixel formats on em2710/em2820, too, and
0x0c-0x0f are at least 8 bits per pixel formats on em2765, too.

Signed-off-by: Frank Schäfer <fschaefer.oss@googlemail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
drivers/media/usb/em28xx/em28xx-camera.c
drivers/media/usb/em28xx/em28xx-reg.h
drivers/media/usb/em28xx/em28xx-video.c

index ee0fe1f..ae87dd3 100644 (file)
@@ -344,8 +344,7 @@ int em28xx_init_camera(struct em28xx *dev)
                    v4l2_i2c_new_subdev_board(&v4l2->v4l2_dev, adap,
                                              &mt9v011_info, NULL))
                        return -ENODEV;
-               /* probably means GRGB 16 bit bayer */
-               v4l2->vinmode = 0x0d;
+               v4l2->vinmode = EM28XX_VINMODE_RGB8_GRBG;
                v4l2->vinctl = 0x00;
 
                break;
@@ -356,8 +355,7 @@ int em28xx_init_camera(struct em28xx *dev)
 
                em28xx_initialize_mt9m001(dev);
 
-               /* probably means BGGR 16 bit bayer */
-               v4l2->vinmode = 0x0c;
+               v4l2->vinmode = EM28XX_VINMODE_RGB8_BGGR;
                v4l2->vinctl = 0x00;
 
                break;
@@ -369,7 +367,7 @@ int em28xx_init_camera(struct em28xx *dev)
                em28xx_write_reg(dev, EM28XX_R0F_XCLK, dev->board.xclk);
                em28xx_initialize_mt9m111(dev);
 
-               v4l2->vinmode = 0x0a;
+               v4l2->vinmode = EM28XX_VINMODE_YUV422_UYVY;
                v4l2->vinctl = 0x00;
 
                break;
@@ -410,7 +408,7 @@ int em28xx_init_camera(struct em28xx *dev)
                /* NOTE: for UXGA=1600x1200 switch to 12MHz */
                dev->board.xclk = EM28XX_XCLK_FREQUENCY_24MHZ;
                em28xx_write_reg(dev, EM28XX_R0F_XCLK, dev->board.xclk);
-               v4l2->vinmode = 0x08;
+               v4l2->vinmode = EM28XX_VINMODE_YUV422_YUYV;
                v4l2->vinctl = 0x00;
 
                break;
index afe7a66..747525c 100644 (file)
 #define EM28XX_XCLK_FREQUENCY_24MHZ    0x0b
 
 #define EM28XX_R10_VINMODE     0x10
+         /* used by all non-camera devices: */
+#define   EM28XX_VINMODE_YUV422_CbYCrY  0x10
+         /* used by camera devices: */
+#define   EM28XX_VINMODE_YUV422_YUYV    0x08
+#define   EM28XX_VINMODE_YUV422_YVYU    0x09
+#define   EM28XX_VINMODE_YUV422_UYVY    0x0a
+#define   EM28XX_VINMODE_YUV422_VYUY    0x0b
+#define   EM28XX_VINMODE_RGB8_BGGR      0x0c
+#define   EM28XX_VINMODE_RGB8_GRBG      0x0d
+#define   EM28XX_VINMODE_RGB8_GBRG      0x0e
+#define   EM28XX_VINMODE_RGB8_RGGB      0x0f
+         /*
+          * apparently:
+          *   bit 0: swap component 1+2 with 3+4
+          *                 => e.g.: YUYV => YVYU, BGGR => GRBG
+          *   bit 1: swap component 1 with 2 and 3 with 4
+          *                 => e.g.: YUYV => UYVY, BGGR => GBRG
+          */
 
 #define EM28XX_R11_VINCTRL     0x11
 
index 3cbc3d4..aaa83f9 100644 (file)
@@ -2459,7 +2459,7 @@ static int em28xx_v4l2_init(struct em28xx *dev)
        /*
         * Default format, used for tvp5150 or saa711x output formats
         */
-       v4l2->vinmode = 0x10;
+       v4l2->vinmode = EM28XX_VINMODE_YUV422_CbYCrY;
        v4l2->vinctl  = EM28XX_VINCTRL_INTERLACED |
                        EM28XX_VINCTRL_CCIR656_ENABLE;