1*fd9871f7SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-or-later 26a7eba24SJean-Francois Moine /* 36a7eba24SJean-Francois Moine * Connexant Cx11646 library 46a7eba24SJean-Francois Moine * Copyright (C) 2004 Michel Xhaard mxhaard@magic.fr 56a7eba24SJean-Francois Moine * 66a7eba24SJean-Francois Moine * V4L2 by Jean-Francois Moine <http://moinejf.free.fr> 76a7eba24SJean-Francois Moine */ 86a7eba24SJean-Francois Moine 9133a9fe9SJoe Perches #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 10133a9fe9SJoe Perches 116a7eba24SJean-Francois Moine #define MODULE_NAME "conex" 126a7eba24SJean-Francois Moine 136a7eba24SJean-Francois Moine #include "gspca.h" 146a7eba24SJean-Francois Moine #define CONEX_CAM 1 /* special JPEG header */ 156a7eba24SJean-Francois Moine #include "jpeg.h" 166a7eba24SJean-Francois Moine 176a7eba24SJean-Francois Moine MODULE_AUTHOR("Michel Xhaard <mxhaard@users.sourceforge.net>"); 186a7eba24SJean-Francois Moine MODULE_DESCRIPTION("GSPCA USB Conexant Camera Driver"); 196a7eba24SJean-Francois Moine MODULE_LICENSE("GPL"); 206a7eba24SJean-Francois Moine 21b56ab4caSHans de Goede #define QUALITY 50 2271cb2764SJean-Francois Moine 23cbc1c94cSHans Verkuil /* specific webcam descriptor */ 24cbc1c94cSHans Verkuil struct sd { 25cbc1c94cSHans Verkuil struct gspca_dev gspca_dev; /* !! must be the first item */ 26cbc1c94cSHans Verkuil struct v4l2_ctrl *brightness; 27cbc1c94cSHans Verkuil struct v4l2_ctrl *contrast; 28cbc1c94cSHans Verkuil struct v4l2_ctrl *sat; 29cbc1c94cSHans Verkuil 309a731a32SJean-François Moine u8 jpeg_hdr[JPEG_HDR_SZ]; 316a7eba24SJean-Francois Moine }; 326a7eba24SJean-Francois Moine 33cc611b8aSJean-Francois Moine static const struct v4l2_pix_format vga_mode[] = { 34c2446b3eSJean-Francois Moine {176, 144, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE, 35c2446b3eSJean-Francois Moine .bytesperline = 176, 36c2446b3eSJean-Francois Moine .sizeimage = 176 * 144 * 3 / 8 + 590, 37c2446b3eSJean-Francois Moine .colorspace = V4L2_COLORSPACE_JPEG, 38c2446b3eSJean-Francois Moine .priv = 3}, 39c2446b3eSJean-Francois Moine {320, 240, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE, 40c2446b3eSJean-Francois Moine .bytesperline = 320, 41c2446b3eSJean-Francois Moine .sizeimage = 320 * 240 * 3 / 8 + 590, 42c2446b3eSJean-Francois Moine .colorspace = V4L2_COLORSPACE_JPEG, 43c2446b3eSJean-Francois Moine .priv = 2}, 44c2446b3eSJean-Francois Moine {352, 288, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE, 45c2446b3eSJean-Francois Moine .bytesperline = 352, 46c2446b3eSJean-Francois Moine .sizeimage = 352 * 288 * 3 / 8 + 590, 47c2446b3eSJean-Francois Moine .colorspace = V4L2_COLORSPACE_JPEG, 48c2446b3eSJean-Francois Moine .priv = 1}, 49c2446b3eSJean-Francois Moine {640, 480, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE, 50c2446b3eSJean-Francois Moine .bytesperline = 640, 51c2446b3eSJean-Francois Moine .sizeimage = 640 * 480 * 3 / 8 + 590, 52c2446b3eSJean-Francois Moine .colorspace = V4L2_COLORSPACE_JPEG, 53c2446b3eSJean-Francois Moine .priv = 0}, 546a7eba24SJean-Francois Moine }; 556a7eba24SJean-Francois Moine 56739570bbSJean-Francois Moine /* the read bytes are found in gspca_dev->usb_buf */ 57739570bbSJean-Francois Moine static void reg_r(struct gspca_dev *gspca_dev, 586a7eba24SJean-Francois Moine __u16 index, 59739570bbSJean-Francois Moine __u16 len) 606a7eba24SJean-Francois Moine { 61739570bbSJean-Francois Moine struct usb_device *dev = gspca_dev->dev; 62739570bbSJean-Francois Moine 638295d99eSJean-Francois Moine if (len > USB_BUF_SZ) { 6452173c5fSJoe Perches gspca_err(gspca_dev, "reg_r: buffer overflow\n"); 65739570bbSJean-Francois Moine return; 66739570bbSJean-Francois Moine } 67c93396e1STheodore Kilgore 686a7eba24SJean-Francois Moine usb_control_msg(dev, 696a7eba24SJean-Francois Moine usb_rcvctrlpipe(dev, 0), 706a7eba24SJean-Francois Moine 0, 716a7eba24SJean-Francois Moine USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, 726a7eba24SJean-Francois Moine 0, 73739570bbSJean-Francois Moine index, gspca_dev->usb_buf, len, 746a7eba24SJean-Francois Moine 500); 7537d5efb0SJoe Perches gspca_dbg(gspca_dev, D_USBI, "reg read [%02x] -> %02x ..\n", 76739570bbSJean-Francois Moine index, gspca_dev->usb_buf[0]); 776a7eba24SJean-Francois Moine } 786a7eba24SJean-Francois Moine 79739570bbSJean-Francois Moine /* the bytes to write are in gspca_dev->usb_buf */ 80739570bbSJean-Francois Moine static void reg_w_val(struct gspca_dev *gspca_dev, 816a7eba24SJean-Francois Moine __u16 index, 82739570bbSJean-Francois Moine __u8 val) 836a7eba24SJean-Francois Moine { 84739570bbSJean-Francois Moine struct usb_device *dev = gspca_dev->dev; 85bf7f0b98SJean-Francois Moine 86739570bbSJean-Francois Moine gspca_dev->usb_buf[0] = val; 876a7eba24SJean-Francois Moine usb_control_msg(dev, 886a7eba24SJean-Francois Moine usb_sndctrlpipe(dev, 0), 896a7eba24SJean-Francois Moine 0, 906a7eba24SJean-Francois Moine USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, 916a7eba24SJean-Francois Moine 0, 92739570bbSJean-Francois Moine index, gspca_dev->usb_buf, 1, 500); 93739570bbSJean-Francois Moine } 94739570bbSJean-Francois Moine 95739570bbSJean-Francois Moine static void reg_w(struct gspca_dev *gspca_dev, 96739570bbSJean-Francois Moine __u16 index, 97739570bbSJean-Francois Moine const __u8 *buffer, 98739570bbSJean-Francois Moine __u16 len) 99739570bbSJean-Francois Moine { 100739570bbSJean-Francois Moine struct usb_device *dev = gspca_dev->dev; 101739570bbSJean-Francois Moine 1028295d99eSJean-Francois Moine if (len > USB_BUF_SZ) { 10352173c5fSJoe Perches gspca_err(gspca_dev, "reg_w: buffer overflow\n"); 104739570bbSJean-Francois Moine return; 105739570bbSJean-Francois Moine } 10637d5efb0SJoe Perches gspca_dbg(gspca_dev, D_USBO, "reg write [%02x] = %02x..\n", 10737d5efb0SJoe Perches index, *buffer); 108c93396e1STheodore Kilgore 109739570bbSJean-Francois Moine memcpy(gspca_dev->usb_buf, buffer, len); 110739570bbSJean-Francois Moine usb_control_msg(dev, 111739570bbSJean-Francois Moine usb_sndctrlpipe(dev, 0), 112739570bbSJean-Francois Moine 0, 113739570bbSJean-Francois Moine USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, 114739570bbSJean-Francois Moine 0, 115739570bbSJean-Francois Moine index, gspca_dev->usb_buf, len, 500); 1166a7eba24SJean-Francois Moine } 1176a7eba24SJean-Francois Moine 1186a7eba24SJean-Francois Moine static const __u8 cx_sensor_init[][4] = { 1196a7eba24SJean-Francois Moine {0x88, 0x11, 0x01, 0x01}, 1206a7eba24SJean-Francois Moine {0x88, 0x12, 0x70, 0x01}, 1216a7eba24SJean-Francois Moine {0x88, 0x0f, 0x00, 0x01}, 1226a7eba24SJean-Francois Moine {0x88, 0x05, 0x01, 0x01}, 1236a7eba24SJean-Francois Moine {} 1246a7eba24SJean-Francois Moine }; 1256a7eba24SJean-Francois Moine 1266a7eba24SJean-Francois Moine static const __u8 cx11646_fw1[][3] = { 1276a7eba24SJean-Francois Moine {0x00, 0x02, 0x00}, 1286a7eba24SJean-Francois Moine {0x01, 0x43, 0x00}, 1296a7eba24SJean-Francois Moine {0x02, 0xA7, 0x00}, 1306a7eba24SJean-Francois Moine {0x03, 0x8B, 0x01}, 1316a7eba24SJean-Francois Moine {0x04, 0xE9, 0x02}, 1326a7eba24SJean-Francois Moine {0x05, 0x08, 0x04}, 1336a7eba24SJean-Francois Moine {0x06, 0x08, 0x05}, 1346a7eba24SJean-Francois Moine {0x07, 0x07, 0x06}, 1356a7eba24SJean-Francois Moine {0x08, 0xE7, 0x06}, 1366a7eba24SJean-Francois Moine {0x09, 0xC6, 0x07}, 1376a7eba24SJean-Francois Moine {0x0A, 0x86, 0x08}, 1386a7eba24SJean-Francois Moine {0x0B, 0x46, 0x09}, 1396a7eba24SJean-Francois Moine {0x0C, 0x05, 0x0A}, 1406a7eba24SJean-Francois Moine {0x0D, 0xA5, 0x0A}, 1416a7eba24SJean-Francois Moine {0x0E, 0x45, 0x0B}, 1426a7eba24SJean-Francois Moine {0x0F, 0xE5, 0x0B}, 1436a7eba24SJean-Francois Moine {0x10, 0x85, 0x0C}, 1446a7eba24SJean-Francois Moine {0x11, 0x25, 0x0D}, 1456a7eba24SJean-Francois Moine {0x12, 0xC4, 0x0D}, 1466a7eba24SJean-Francois Moine {0x13, 0x45, 0x0E}, 1476a7eba24SJean-Francois Moine {0x14, 0xE4, 0x0E}, 1486a7eba24SJean-Francois Moine {0x15, 0x64, 0x0F}, 1496a7eba24SJean-Francois Moine {0x16, 0xE4, 0x0F}, 1506a7eba24SJean-Francois Moine {0x17, 0x64, 0x10}, 1516a7eba24SJean-Francois Moine {0x18, 0xE4, 0x10}, 1526a7eba24SJean-Francois Moine {0x19, 0x64, 0x11}, 1536a7eba24SJean-Francois Moine {0x1A, 0xE4, 0x11}, 1546a7eba24SJean-Francois Moine {0x1B, 0x64, 0x12}, 1556a7eba24SJean-Francois Moine {0x1C, 0xE3, 0x12}, 1566a7eba24SJean-Francois Moine {0x1D, 0x44, 0x13}, 1576a7eba24SJean-Francois Moine {0x1E, 0xC3, 0x13}, 1586a7eba24SJean-Francois Moine {0x1F, 0x24, 0x14}, 1596a7eba24SJean-Francois Moine {0x20, 0xA3, 0x14}, 1606a7eba24SJean-Francois Moine {0x21, 0x04, 0x15}, 1616a7eba24SJean-Francois Moine {0x22, 0x83, 0x15}, 1626a7eba24SJean-Francois Moine {0x23, 0xE3, 0x15}, 1636a7eba24SJean-Francois Moine {0x24, 0x43, 0x16}, 1646a7eba24SJean-Francois Moine {0x25, 0xA4, 0x16}, 1656a7eba24SJean-Francois Moine {0x26, 0x23, 0x17}, 1666a7eba24SJean-Francois Moine {0x27, 0x83, 0x17}, 1676a7eba24SJean-Francois Moine {0x28, 0xE3, 0x17}, 1686a7eba24SJean-Francois Moine {0x29, 0x43, 0x18}, 1696a7eba24SJean-Francois Moine {0x2A, 0xA3, 0x18}, 1706a7eba24SJean-Francois Moine {0x2B, 0x03, 0x19}, 1716a7eba24SJean-Francois Moine {0x2C, 0x63, 0x19}, 1726a7eba24SJean-Francois Moine {0x2D, 0xC3, 0x19}, 1736a7eba24SJean-Francois Moine {0x2E, 0x22, 0x1A}, 1746a7eba24SJean-Francois Moine {0x2F, 0x63, 0x1A}, 1756a7eba24SJean-Francois Moine {0x30, 0xC3, 0x1A}, 1766a7eba24SJean-Francois Moine {0x31, 0x23, 0x1B}, 1776a7eba24SJean-Francois Moine {0x32, 0x83, 0x1B}, 1786a7eba24SJean-Francois Moine {0x33, 0xE2, 0x1B}, 1796a7eba24SJean-Francois Moine {0x34, 0x23, 0x1C}, 1806a7eba24SJean-Francois Moine {0x35, 0x83, 0x1C}, 1816a7eba24SJean-Francois Moine {0x36, 0xE2, 0x1C}, 1826a7eba24SJean-Francois Moine {0x37, 0x23, 0x1D}, 1836a7eba24SJean-Francois Moine {0x38, 0x83, 0x1D}, 1846a7eba24SJean-Francois Moine {0x39, 0xE2, 0x1D}, 1856a7eba24SJean-Francois Moine {0x3A, 0x23, 0x1E}, 1866a7eba24SJean-Francois Moine {0x3B, 0x82, 0x1E}, 1876a7eba24SJean-Francois Moine {0x3C, 0xC3, 0x1E}, 1886a7eba24SJean-Francois Moine {0x3D, 0x22, 0x1F}, 1896a7eba24SJean-Francois Moine {0x3E, 0x63, 0x1F}, 1906a7eba24SJean-Francois Moine {0x3F, 0xC1, 0x1F}, 1916a7eba24SJean-Francois Moine {} 1926a7eba24SJean-Francois Moine }; 1936a7eba24SJean-Francois Moine static void cx11646_fw(struct gspca_dev*gspca_dev) 1946a7eba24SJean-Francois Moine { 1956a7eba24SJean-Francois Moine int i = 0; 1966a7eba24SJean-Francois Moine 197739570bbSJean-Francois Moine reg_w_val(gspca_dev, 0x006a, 0x02); 1986a7eba24SJean-Francois Moine while (cx11646_fw1[i][1]) { 199739570bbSJean-Francois Moine reg_w(gspca_dev, 0x006b, cx11646_fw1[i], 3); 2006a7eba24SJean-Francois Moine i++; 2016a7eba24SJean-Francois Moine } 202739570bbSJean-Francois Moine reg_w_val(gspca_dev, 0x006a, 0x00); 2036a7eba24SJean-Francois Moine } 2046a7eba24SJean-Francois Moine 205a5ae2062SJean-Francois Moine static const __u8 cxsensor[] = { 2066a7eba24SJean-Francois Moine 0x88, 0x12, 0x70, 0x01, 2076a7eba24SJean-Francois Moine 0x88, 0x0d, 0x02, 0x01, 2086a7eba24SJean-Francois Moine 0x88, 0x0f, 0x00, 0x01, 2096a7eba24SJean-Francois Moine 0x88, 0x03, 0x71, 0x01, 0x88, 0x04, 0x00, 0x01, /* 3 */ 2106a7eba24SJean-Francois Moine 0x88, 0x02, 0x10, 0x01, 2116a7eba24SJean-Francois Moine 0x88, 0x00, 0xD4, 0x01, 0x88, 0x01, 0x01, 0x01, /* 5 */ 2126a7eba24SJean-Francois Moine 0x88, 0x0B, 0x00, 0x01, 2136a7eba24SJean-Francois Moine 0x88, 0x0A, 0x0A, 0x01, 2146a7eba24SJean-Francois Moine 0x88, 0x00, 0x08, 0x01, 0x88, 0x01, 0x00, 0x01, /* 8 */ 2156a7eba24SJean-Francois Moine 0x88, 0x05, 0x01, 0x01, 2166a7eba24SJean-Francois Moine 0xA1, 0x18, 0x00, 0x01, 2176a7eba24SJean-Francois Moine 0x00 2186a7eba24SJean-Francois Moine }; 2196a7eba24SJean-Francois Moine 220a5ae2062SJean-Francois Moine static const __u8 reg20[] = { 0x10, 0x42, 0x81, 0x19, 0xd3, 0xff, 0xa7, 0xff }; 221a5ae2062SJean-Francois Moine static const __u8 reg28[] = { 0x87, 0x00, 0x87, 0x00, 0x8f, 0xff, 0xea, 0xff }; 222a5ae2062SJean-Francois Moine static const __u8 reg10[] = { 0xb1, 0xb1 }; 223a5ae2062SJean-Francois Moine static const __u8 reg71a[] = { 0x08, 0x18, 0x0a, 0x1e }; /* 640 */ 224a5ae2062SJean-Francois Moine static const __u8 reg71b[] = { 0x04, 0x0c, 0x05, 0x0f }; 2256a7eba24SJean-Francois Moine /* 352{0x04,0x0a,0x06,0x12}; //352{0x05,0x0e,0x06,0x11}; //352 */ 226a5ae2062SJean-Francois Moine static const __u8 reg71c[] = { 0x02, 0x07, 0x03, 0x09 }; 2276a7eba24SJean-Francois Moine /* 320{0x04,0x0c,0x05,0x0f}; //320 */ 228a5ae2062SJean-Francois Moine static const __u8 reg71d[] = { 0x02, 0x07, 0x03, 0x09 }; /* 176 */ 229a5ae2062SJean-Francois Moine static const __u8 reg7b[] = { 0x00, 0xff, 0x00, 0xff, 0x00, 0xff }; 2306a7eba24SJean-Francois Moine 2316a7eba24SJean-Francois Moine static void cx_sensor(struct gspca_dev*gspca_dev) 2326a7eba24SJean-Francois Moine { 2336a7eba24SJean-Francois Moine int i = 0; 234a5ae2062SJean-Francois Moine int length; 235a5ae2062SJean-Francois Moine const __u8 *ptsensor = cxsensor; 2366a7eba24SJean-Francois Moine 237739570bbSJean-Francois Moine reg_w(gspca_dev, 0x0020, reg20, 8); 238739570bbSJean-Francois Moine reg_w(gspca_dev, 0x0028, reg28, 8); 239b1890008SDan Carpenter reg_w(gspca_dev, 0x0010, reg10, 2); 240739570bbSJean-Francois Moine reg_w_val(gspca_dev, 0x0092, 0x03); 2416a7eba24SJean-Francois Moine 242c2446b3eSJean-Francois Moine switch (gspca_dev->cam.cam_mode[(int) gspca_dev->curr_mode].priv) { 2436a7eba24SJean-Francois Moine case 0: 244739570bbSJean-Francois Moine reg_w(gspca_dev, 0x0071, reg71a, 4); 2456a7eba24SJean-Francois Moine break; 2466a7eba24SJean-Francois Moine case 1: 247739570bbSJean-Francois Moine reg_w(gspca_dev, 0x0071, reg71b, 4); 2486a7eba24SJean-Francois Moine break; 2496a7eba24SJean-Francois Moine default: 2506a7eba24SJean-Francois Moine /* case 2: */ 251739570bbSJean-Francois Moine reg_w(gspca_dev, 0x0071, reg71c, 4); 2526a7eba24SJean-Francois Moine break; 2536a7eba24SJean-Francois Moine case 3: 254739570bbSJean-Francois Moine reg_w(gspca_dev, 0x0071, reg71d, 4); 2556a7eba24SJean-Francois Moine break; 2566a7eba24SJean-Francois Moine } 257739570bbSJean-Francois Moine reg_w(gspca_dev, 0x007b, reg7b, 6); 258739570bbSJean-Francois Moine reg_w_val(gspca_dev, 0x00f8, 0x00); 259b1890008SDan Carpenter reg_w(gspca_dev, 0x0010, reg10, 2); 260739570bbSJean-Francois Moine reg_w_val(gspca_dev, 0x0098, 0x41); 2616a7eba24SJean-Francois Moine for (i = 0; i < 11; i++) { 2626a7eba24SJean-Francois Moine if (i == 3 || i == 5 || i == 8) 2636a7eba24SJean-Francois Moine length = 8; 2646a7eba24SJean-Francois Moine else 2656a7eba24SJean-Francois Moine length = 4; 266739570bbSJean-Francois Moine reg_w(gspca_dev, 0x00e5, ptsensor, length); 2676a7eba24SJean-Francois Moine if (length == 4) 268739570bbSJean-Francois Moine reg_r(gspca_dev, 0x00e8, 1); 2696a7eba24SJean-Francois Moine else 270739570bbSJean-Francois Moine reg_r(gspca_dev, 0x00e8, length); 2716a7eba24SJean-Francois Moine ptsensor += length; 2726a7eba24SJean-Francois Moine } 273739570bbSJean-Francois Moine reg_r(gspca_dev, 0x00e7, 8); 2746a7eba24SJean-Francois Moine } 2756a7eba24SJean-Francois Moine 276a5ae2062SJean-Francois Moine static const __u8 cx_inits_176[] = { 2776a7eba24SJean-Francois Moine 0x33, 0x81, 0xB0, 0x00, 0x90, 0x00, 0x0A, 0x03, /* 176x144 */ 2786a7eba24SJean-Francois Moine 0x00, 0x03, 0x03, 0x03, 0x1B, 0x05, 0x30, 0x03, 2796a7eba24SJean-Francois Moine 0x65, 0x15, 0x18, 0x25, 0x03, 0x25, 0x08, 0x30, 2806a7eba24SJean-Francois Moine 0x3B, 0x25, 0x10, 0x00, 0x04, 0x00, 0x00, 0x00, 2816a7eba24SJean-Francois Moine 0xDC, 0xFF, 0xEE, 0xFF, 0xC5, 0xFF, 0xBF, 0xFF, 2826a7eba24SJean-Francois Moine 0xF7, 0xFF, 0x88, 0xFF, 0x66, 0x02, 0x28, 0x02, 2836a7eba24SJean-Francois Moine 0x1E, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 2846a7eba24SJean-Francois Moine }; 285a5ae2062SJean-Francois Moine static const __u8 cx_inits_320[] = { 2866a7eba24SJean-Francois Moine 0x7f, 0x7f, 0x40, 0x01, 0xf0, 0x00, 0x02, 0x01, 2876a7eba24SJean-Francois Moine 0x00, 0x01, 0x01, 0x01, 0x10, 0x00, 0x02, 0x01, 2886a7eba24SJean-Francois Moine 0x65, 0x45, 0xfa, 0x4c, 0x2c, 0xdf, 0xb9, 0x81, 2896a7eba24SJean-Francois Moine 0x30, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 2906a7eba24SJean-Francois Moine 0xe2, 0xff, 0xf1, 0xff, 0xc2, 0xff, 0xbc, 0xff, 2916a7eba24SJean-Francois Moine 0xf5, 0xff, 0x6d, 0xff, 0xf6, 0x01, 0x43, 0x02, 2926a7eba24SJean-Francois Moine 0xd3, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 2936a7eba24SJean-Francois Moine }; 294a5ae2062SJean-Francois Moine static const __u8 cx_inits_352[] = { 2956a7eba24SJean-Francois Moine 0x2e, 0x7c, 0x60, 0x01, 0x20, 0x01, 0x05, 0x03, 2966a7eba24SJean-Francois Moine 0x00, 0x06, 0x03, 0x06, 0x1b, 0x10, 0x05, 0x3b, 2976a7eba24SJean-Francois Moine 0x30, 0x25, 0x18, 0x25, 0x08, 0x30, 0x03, 0x25, 2986a7eba24SJean-Francois Moine 0x3b, 0x30, 0x25, 0x1b, 0x10, 0x05, 0x00, 0x00, 2996a7eba24SJean-Francois Moine 0xe3, 0xff, 0xf1, 0xff, 0xc2, 0xff, 0xbc, 0xff, 3006a7eba24SJean-Francois Moine 0xf5, 0xff, 0x6b, 0xff, 0xee, 0x01, 0x43, 0x02, 3016a7eba24SJean-Francois Moine 0xe4, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 3026a7eba24SJean-Francois Moine }; 303a5ae2062SJean-Francois Moine static const __u8 cx_inits_640[] = { 3046a7eba24SJean-Francois Moine 0x7e, 0x7e, 0x80, 0x02, 0xe0, 0x01, 0x01, 0x01, 3056a7eba24SJean-Francois Moine 0x00, 0x02, 0x01, 0x02, 0x10, 0x30, 0x01, 0x01, 3066a7eba24SJean-Francois Moine 0x65, 0x45, 0xf7, 0x52, 0x2c, 0xdf, 0xb9, 0x81, 3076a7eba24SJean-Francois Moine 0x30, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 3086a7eba24SJean-Francois Moine 0xe2, 0xff, 0xf1, 0xff, 0xc2, 0xff, 0xbc, 0xff, 3096a7eba24SJean-Francois Moine 0xf6, 0xff, 0x7b, 0xff, 0x01, 0x02, 0x43, 0x02, 3106a7eba24SJean-Francois Moine 0x77, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 3116a7eba24SJean-Francois Moine }; 3126a7eba24SJean-Francois Moine 313739570bbSJean-Francois Moine static void cx11646_initsize(struct gspca_dev *gspca_dev) 3146a7eba24SJean-Francois Moine { 315a5ae2062SJean-Francois Moine const __u8 *cxinit; 3166a7eba24SJean-Francois Moine static const __u8 reg12[] = { 0x08, 0x05, 0x07, 0x04, 0x24 }; 3176a7eba24SJean-Francois Moine static const __u8 reg17[] = 3186a7eba24SJean-Francois Moine { 0x0a, 0x00, 0xf2, 0x01, 0x0f, 0x00, 0x97, 0x02 }; 3196a7eba24SJean-Francois Moine 320c2446b3eSJean-Francois Moine switch (gspca_dev->cam.cam_mode[(int) gspca_dev->curr_mode].priv) { 3216a7eba24SJean-Francois Moine case 0: 3226a7eba24SJean-Francois Moine cxinit = cx_inits_640; 3236a7eba24SJean-Francois Moine break; 3246a7eba24SJean-Francois Moine case 1: 3256a7eba24SJean-Francois Moine cxinit = cx_inits_352; 3266a7eba24SJean-Francois Moine break; 3276a7eba24SJean-Francois Moine default: 3286a7eba24SJean-Francois Moine /* case 2: */ 3296a7eba24SJean-Francois Moine cxinit = cx_inits_320; 3306a7eba24SJean-Francois Moine break; 3316a7eba24SJean-Francois Moine case 3: 3326a7eba24SJean-Francois Moine cxinit = cx_inits_176; 3336a7eba24SJean-Francois Moine break; 3346a7eba24SJean-Francois Moine } 335739570bbSJean-Francois Moine reg_w_val(gspca_dev, 0x009a, 0x01); 336739570bbSJean-Francois Moine reg_w_val(gspca_dev, 0x0010, 0x10); 337739570bbSJean-Francois Moine reg_w(gspca_dev, 0x0012, reg12, 5); 338739570bbSJean-Francois Moine reg_w(gspca_dev, 0x0017, reg17, 8); 339739570bbSJean-Francois Moine reg_w_val(gspca_dev, 0x00c0, 0x00); 340739570bbSJean-Francois Moine reg_w_val(gspca_dev, 0x00c1, 0x04); 341739570bbSJean-Francois Moine reg_w_val(gspca_dev, 0x00c2, 0x04); 3426a7eba24SJean-Francois Moine 343739570bbSJean-Francois Moine reg_w(gspca_dev, 0x0061, cxinit, 8); 3446a7eba24SJean-Francois Moine cxinit += 8; 345739570bbSJean-Francois Moine reg_w(gspca_dev, 0x00ca, cxinit, 8); 3466a7eba24SJean-Francois Moine cxinit += 8; 347739570bbSJean-Francois Moine reg_w(gspca_dev, 0x00d2, cxinit, 8); 3486a7eba24SJean-Francois Moine cxinit += 8; 349739570bbSJean-Francois Moine reg_w(gspca_dev, 0x00da, cxinit, 6); 3506a7eba24SJean-Francois Moine cxinit += 8; 351739570bbSJean-Francois Moine reg_w(gspca_dev, 0x0041, cxinit, 8); 3526a7eba24SJean-Francois Moine cxinit += 8; 353739570bbSJean-Francois Moine reg_w(gspca_dev, 0x0049, cxinit, 8); 3546a7eba24SJean-Francois Moine cxinit += 8; 355739570bbSJean-Francois Moine reg_w(gspca_dev, 0x0051, cxinit, 2); 3566a7eba24SJean-Francois Moine 357739570bbSJean-Francois Moine reg_r(gspca_dev, 0x0010, 1); 3586a7eba24SJean-Francois Moine } 3596a7eba24SJean-Francois Moine 360a5ae2062SJean-Francois Moine static const __u8 cx_jpeg_init[][8] = { 3616a7eba24SJean-Francois Moine {0xff, 0xd8, 0xff, 0xdb, 0x00, 0x84, 0x00, 0x15}, /* 1 */ 3626a7eba24SJean-Francois Moine {0x0f, 0x10, 0x12, 0x10, 0x0d, 0x15, 0x12, 0x11}, 3636a7eba24SJean-Francois Moine {0x12, 0x18, 0x16, 0x15, 0x19, 0x20, 0x35, 0x22}, 3646a7eba24SJean-Francois Moine {0x20, 0x1d, 0x1d, 0x20, 0x41, 0x2e, 0x31, 0x26}, 3656a7eba24SJean-Francois Moine {0x35, 0x4d, 0x43, 0x51, 0x4f, 0x4b, 0x43, 0x4a}, 3666a7eba24SJean-Francois Moine {0x49, 0x55, 0x5F, 0x79, 0x67, 0x55, 0x5A, 0x73}, 3676a7eba24SJean-Francois Moine {0x5B, 0x49, 0x4A, 0x6A, 0x90, 0x6B, 0x73, 0x7D}, 3686a7eba24SJean-Francois Moine {0x81, 0x88, 0x89, 0x88, 0x52, 0x66, 0x95, 0xA0}, 3696a7eba24SJean-Francois Moine {0x94, 0x84, 0x9E, 0x79, 0x85, 0x88, 0x83, 0x01}, 3706a7eba24SJean-Francois Moine {0x15, 0x0F, 0x10, 0x12, 0x10, 0x0D, 0x15, 0x12}, 3716a7eba24SJean-Francois Moine {0x11, 0x12, 0x18, 0x16, 0x15, 0x19, 0x20, 0x35}, 3726a7eba24SJean-Francois Moine {0x22, 0x20, 0x1D, 0x1D, 0x20, 0x41, 0x2E, 0x31}, 3736a7eba24SJean-Francois Moine {0x26, 0x35, 0x4D, 0x43, 0x51, 0x4F, 0x4B, 0x43}, 3746a7eba24SJean-Francois Moine {0x4A, 0x49, 0x55, 0x5F, 0x79, 0x67, 0x55, 0x5A}, 3756a7eba24SJean-Francois Moine {0x73, 0x5B, 0x49, 0x4A, 0x6A, 0x90, 0x6B, 0x73}, 3766a7eba24SJean-Francois Moine {0x7D, 0x81, 0x88, 0x89, 0x88, 0x52, 0x66, 0x95}, 3776a7eba24SJean-Francois Moine {0xA0, 0x94, 0x84, 0x9E, 0x79, 0x85, 0x88, 0x83}, 3786a7eba24SJean-Francois Moine {0xFF, 0xC4, 0x01, 0xA2, 0x00, 0x00, 0x01, 0x05}, 3796a7eba24SJean-Francois Moine {0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00}, 3806a7eba24SJean-Francois Moine {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02}, 3816a7eba24SJean-Francois Moine {0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A}, 3826a7eba24SJean-Francois Moine {0x0B, 0x01, 0x00, 0x03, 0x01, 0x01, 0x01, 0x01}, 3836a7eba24SJean-Francois Moine {0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00}, 3846a7eba24SJean-Francois Moine {0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05}, 3856a7eba24SJean-Francois Moine {0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x10, 0x00}, 3866a7eba24SJean-Francois Moine {0x02, 0x01, 0x03, 0x03, 0x02, 0x04, 0x03, 0x05}, 3876a7eba24SJean-Francois Moine {0x05, 0x04, 0x04, 0x00, 0x00, 0x01, 0x7D, 0x01}, 3886a7eba24SJean-Francois Moine {0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12, 0x21}, 3896a7eba24SJean-Francois Moine {0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07, 0x22}, 3906a7eba24SJean-Francois Moine {0x71, 0x14, 0x32, 0x81, 0x91, 0xA1, 0x08, 0x23}, 3916a7eba24SJean-Francois Moine {0x42, 0xB1, 0xC1, 0x15, 0x52, 0xD1, 0xF0, 0x24}, 3926a7eba24SJean-Francois Moine {0x33, 0x62, 0x72, 0x82, 0x09, 0x0A, 0x16, 0x17}, 3936a7eba24SJean-Francois Moine {0x18, 0x19, 0x1A, 0x25, 0x26, 0x27, 0x28, 0x29}, 3946a7eba24SJean-Francois Moine {0x2A, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A}, 3956a7eba24SJean-Francois Moine {0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A}, 3966a7eba24SJean-Francois Moine {0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A}, 3976a7eba24SJean-Francois Moine {0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A}, 3986a7eba24SJean-Francois Moine {0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A}, 3996a7eba24SJean-Francois Moine {0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A}, 4006a7eba24SJean-Francois Moine {0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99}, 4016a7eba24SJean-Francois Moine {0x9A, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8}, 4026a7eba24SJean-Francois Moine {0xA9, 0xAA, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7}, 4036a7eba24SJean-Francois Moine {0xB8, 0xB9, 0xBA, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6}, 4046a7eba24SJean-Francois Moine {0xC7, 0xC8, 0xC9, 0xCA, 0xD2, 0xD3, 0xD4, 0xD5}, 4056a7eba24SJean-Francois Moine {0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xE1, 0xE2, 0xE3}, 4066a7eba24SJean-Francois Moine {0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xF1}, 4076a7eba24SJean-Francois Moine {0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9}, 4086a7eba24SJean-Francois Moine {0xFA, 0x11, 0x00, 0x02, 0x01, 0x02, 0x04, 0x04}, 4096a7eba24SJean-Francois Moine {0x03, 0x04, 0x07, 0x05, 0x04, 0x04, 0x00, 0x01}, 4106a7eba24SJean-Francois Moine {0x02, 0x77, 0x00, 0x01, 0x02, 0x03, 0x11, 0x04}, 4116a7eba24SJean-Francois Moine {0x05, 0x21, 0x31, 0x06, 0x12, 0x41, 0x51, 0x07}, 4126a7eba24SJean-Francois Moine {0x61, 0x71, 0x13, 0x22, 0x32, 0x81, 0x08, 0x14}, 4136a7eba24SJean-Francois Moine {0x42, 0x91, 0xA1, 0xB1, 0xC1, 0x09, 0x23, 0x33}, 4146a7eba24SJean-Francois Moine {0x52, 0xF0, 0x15, 0x62, 0x72, 0xD1, 0x0A, 0x16}, 4156a7eba24SJean-Francois Moine {0x24, 0x34, 0xE1, 0x25, 0xF1, 0x17, 0x18, 0x19}, 4166a7eba24SJean-Francois Moine {0x1A, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x35, 0x36}, 4176a7eba24SJean-Francois Moine {0x37, 0x38, 0x39, 0x3A, 0x43, 0x44, 0x45, 0x46}, 4186a7eba24SJean-Francois Moine {0x47, 0x48, 0x49, 0x4A, 0x53, 0x54, 0x55, 0x56}, 4196a7eba24SJean-Francois Moine {0x57, 0x58, 0x59, 0x5A, 0x63, 0x64, 0x65, 0x66}, 4206a7eba24SJean-Francois Moine {0x67, 0x68, 0x69, 0x6A, 0x73, 0x74, 0x75, 0x76}, 4216a7eba24SJean-Francois Moine {0x77, 0x78, 0x79, 0x7A, 0x82, 0x83, 0x84, 0x85}, 4226a7eba24SJean-Francois Moine {0x86, 0x87, 0x88, 0x89, 0x8A, 0x92, 0x93, 0x94}, 4236a7eba24SJean-Francois Moine {0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0xA2, 0xA3}, 4246a7eba24SJean-Francois Moine {0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xB2}, 4256a7eba24SJean-Francois Moine {0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA}, 4266a7eba24SJean-Francois Moine {0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9}, 4276a7eba24SJean-Francois Moine {0xCA, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8}, 4286a7eba24SJean-Francois Moine {0xD9, 0xDA, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7}, 4296a7eba24SJean-Francois Moine {0xE8, 0xE9, 0xEA, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6}, 4306a7eba24SJean-Francois Moine {0xF7, 0xF8, 0xF9, 0xFA, 0xFF, 0x20, 0x00, 0x1F}, 4316a7eba24SJean-Francois Moine {0x02, 0x0C, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00}, 4326a7eba24SJean-Francois Moine {0x00, 0x00, 0x11, 0x00, 0x11, 0x22, 0x00, 0x22}, 4336a7eba24SJean-Francois Moine {0x22, 0x11, 0x22, 0x22, 0x11, 0x33, 0x33, 0x11}, 4346a7eba24SJean-Francois Moine {0x44, 0x66, 0x22, 0x55, 0x66, 0xFF, 0xDD, 0x00}, 4356a7eba24SJean-Francois Moine {0x04, 0x00, 0x14, 0xFF, 0xC0, 0x00, 0x11, 0x08}, 4366a7eba24SJean-Francois Moine {0x00, 0xF0, 0x01, 0x40, 0x03, 0x00, 0x21, 0x00}, 4376a7eba24SJean-Francois Moine {0x01, 0x11, 0x01, 0x02, 0x11, 0x01, 0xFF, 0xDA}, 4386a7eba24SJean-Francois Moine {0x00, 0x0C, 0x03, 0x00, 0x00, 0x01, 0x11, 0x02}, 4396a7eba24SJean-Francois Moine {0x11, 0x00, 0x3F, 0x00, 0xFF, 0xD9, 0x00, 0x00} /* 79 */ 4406a7eba24SJean-Francois Moine }; 4416a7eba24SJean-Francois Moine 4426a7eba24SJean-Francois Moine 443a5ae2062SJean-Francois Moine static const __u8 cxjpeg_640[][8] = { 4446a7eba24SJean-Francois Moine {0xff, 0xd8, 0xff, 0xdb, 0x00, 0x84, 0x00, 0x10}, /* 1 */ 4456a7eba24SJean-Francois Moine {0x0b, 0x0c, 0x0e, 0x0c, 0x0a, 0x10, 0x0e, 0x0d}, 4466a7eba24SJean-Francois Moine {0x0e, 0x12, 0x11, 0x10, 0x13, 0x18, 0x28, 0x1a}, 4476a7eba24SJean-Francois Moine {0x18, 0x16, 0x16, 0x18, 0x31, 0x23, 0x25, 0x1d}, 4486a7eba24SJean-Francois Moine {0x28, 0x3a, 0x33, 0x3D, 0x3C, 0x39, 0x33, 0x38}, 4496a7eba24SJean-Francois Moine {0x37, 0x40, 0x48, 0x5C, 0x4E, 0x40, 0x44, 0x57}, 4506a7eba24SJean-Francois Moine {0x45, 0x37, 0x38, 0x50, 0x6D, 0x51, 0x57, 0x5F}, 4516a7eba24SJean-Francois Moine {0x62, 0x67, 0x68, 0x67, 0x3E, 0x4D, 0x71, 0x79}, 4526a7eba24SJean-Francois Moine {0x70, 0x64, 0x78, 0x5C, 0x65, 0x67, 0x63, 0x01}, 4536a7eba24SJean-Francois Moine {0x10, 0x0B, 0x0C, 0x0E, 0x0C, 0x0A, 0x10, 0x0E}, 4546a7eba24SJean-Francois Moine {0x0D, 0x0E, 0x12, 0x11, 0x10, 0x13, 0x18, 0x28}, 4556a7eba24SJean-Francois Moine {0x1A, 0x18, 0x16, 0x16, 0x18, 0x31, 0x23, 0x25}, 4566a7eba24SJean-Francois Moine {0x1D, 0x28, 0x3A, 0x33, 0x3D, 0x3C, 0x39, 0x33}, 4576a7eba24SJean-Francois Moine {0x38, 0x37, 0x40, 0x48, 0x5C, 0x4E, 0x40, 0x44}, 4586a7eba24SJean-Francois Moine {0x57, 0x45, 0x37, 0x38, 0x50, 0x6D, 0x51, 0x57}, 4596a7eba24SJean-Francois Moine {0x5F, 0x62, 0x67, 0x68, 0x67, 0x3E, 0x4D, 0x71}, 4606a7eba24SJean-Francois Moine {0x79, 0x70, 0x64, 0x78, 0x5C, 0x65, 0x67, 0x63}, 4616a7eba24SJean-Francois Moine {0xFF, 0x20, 0x00, 0x1F, 0x00, 0x83, 0x00, 0x00}, 4626a7eba24SJean-Francois Moine {0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00}, 4636a7eba24SJean-Francois Moine {0x11, 0x22, 0x00, 0x22, 0x22, 0x11, 0x22, 0x22}, 4646a7eba24SJean-Francois Moine {0x11, 0x33, 0x33, 0x11, 0x44, 0x66, 0x22, 0x55}, 4656a7eba24SJean-Francois Moine {0x66, 0xFF, 0xDD, 0x00, 0x04, 0x00, 0x28, 0xFF}, 4666a7eba24SJean-Francois Moine {0xC0, 0x00, 0x11, 0x08, 0x01, 0xE0, 0x02, 0x80}, 4676a7eba24SJean-Francois Moine {0x03, 0x00, 0x21, 0x00, 0x01, 0x11, 0x01, 0x02}, 4686a7eba24SJean-Francois Moine {0x11, 0x01, 0xFF, 0xDA, 0x00, 0x0C, 0x03, 0x00}, 4696a7eba24SJean-Francois Moine {0x00, 0x01, 0x11, 0x02, 0x11, 0x00, 0x3F, 0x00}, 4706a7eba24SJean-Francois Moine {0xFF, 0xD9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} /* 27 */ 4716a7eba24SJean-Francois Moine }; 472a5ae2062SJean-Francois Moine static const __u8 cxjpeg_352[][8] = { 4736a7eba24SJean-Francois Moine {0xff, 0xd8, 0xff, 0xdb, 0x00, 0x84, 0x00, 0x0d}, 4746a7eba24SJean-Francois Moine {0x09, 0x09, 0x0b, 0x09, 0x08, 0x0D, 0x0b, 0x0a}, 4756a7eba24SJean-Francois Moine {0x0b, 0x0e, 0x0d, 0x0d, 0x0f, 0x13, 0x1f, 0x14}, 4766a7eba24SJean-Francois Moine {0x13, 0x11, 0x11, 0x13, 0x26, 0x1b, 0x1d, 0x17}, 4776a7eba24SJean-Francois Moine {0x1F, 0x2D, 0x28, 0x30, 0x2F, 0x2D, 0x28, 0x2C}, 4786a7eba24SJean-Francois Moine {0x2B, 0x32, 0x38, 0x48, 0x3D, 0x32, 0x35, 0x44}, 4796a7eba24SJean-Francois Moine {0x36, 0x2B, 0x2C, 0x3F, 0x55, 0x3F, 0x44, 0x4A}, 4806a7eba24SJean-Francois Moine {0x4D, 0x50, 0x51, 0x50, 0x30, 0x3C, 0x58, 0x5F}, 4816a7eba24SJean-Francois Moine {0x58, 0x4E, 0x5E, 0x48, 0x4F, 0x50, 0x4D, 0x01}, 4826a7eba24SJean-Francois Moine {0x0D, 0x09, 0x09, 0x0B, 0x09, 0x08, 0x0D, 0x0B}, 4836a7eba24SJean-Francois Moine {0x0A, 0x0B, 0x0E, 0x0D, 0x0D, 0x0F, 0x13, 0x1F}, 4846a7eba24SJean-Francois Moine {0x14, 0x13, 0x11, 0x11, 0x13, 0x26, 0x1B, 0x1D}, 4856a7eba24SJean-Francois Moine {0x17, 0x1F, 0x2D, 0x28, 0x30, 0x2F, 0x2D, 0x28}, 4866a7eba24SJean-Francois Moine {0x2C, 0x2B, 0x32, 0x38, 0x48, 0x3D, 0x32, 0x35}, 4876a7eba24SJean-Francois Moine {0x44, 0x36, 0x2B, 0x2C, 0x3F, 0x55, 0x3F, 0x44}, 4886a7eba24SJean-Francois Moine {0x4A, 0x4D, 0x50, 0x51, 0x50, 0x30, 0x3C, 0x58}, 4896a7eba24SJean-Francois Moine {0x5F, 0x58, 0x4E, 0x5E, 0x48, 0x4F, 0x50, 0x4D}, 4906a7eba24SJean-Francois Moine {0xFF, 0x20, 0x00, 0x1F, 0x01, 0x83, 0x00, 0x00}, 4916a7eba24SJean-Francois Moine {0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00}, 4926a7eba24SJean-Francois Moine {0x11, 0x22, 0x00, 0x22, 0x22, 0x11, 0x22, 0x22}, 4936a7eba24SJean-Francois Moine {0x11, 0x33, 0x33, 0x11, 0x44, 0x66, 0x22, 0x55}, 4946a7eba24SJean-Francois Moine {0x66, 0xFF, 0xDD, 0x00, 0x04, 0x00, 0x16, 0xFF}, 4956a7eba24SJean-Francois Moine {0xC0, 0x00, 0x11, 0x08, 0x01, 0x20, 0x01, 0x60}, 4966a7eba24SJean-Francois Moine {0x03, 0x00, 0x21, 0x00, 0x01, 0x11, 0x01, 0x02}, 4976a7eba24SJean-Francois Moine {0x11, 0x01, 0xFF, 0xDA, 0x00, 0x0C, 0x03, 0x00}, 4986a7eba24SJean-Francois Moine {0x00, 0x01, 0x11, 0x02, 0x11, 0x00, 0x3F, 0x00}, 4996a7eba24SJean-Francois Moine {0xFF, 0xD9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} 5006a7eba24SJean-Francois Moine }; 501a5ae2062SJean-Francois Moine static const __u8 cxjpeg_320[][8] = { 5026a7eba24SJean-Francois Moine {0xff, 0xd8, 0xff, 0xdb, 0x00, 0x84, 0x00, 0x05}, 5036a7eba24SJean-Francois Moine {0x03, 0x04, 0x04, 0x04, 0x03, 0x05, 0x04, 0x04}, 5046a7eba24SJean-Francois Moine {0x04, 0x05, 0x05, 0x05, 0x06, 0x07, 0x0c, 0x08}, 5056a7eba24SJean-Francois Moine {0x07, 0x07, 0x07, 0x07, 0x0f, 0x0b, 0x0b, 0x09}, 5066a7eba24SJean-Francois Moine {0x0C, 0x11, 0x0F, 0x12, 0x12, 0x11, 0x0f, 0x11}, 5076a7eba24SJean-Francois Moine {0x11, 0x13, 0x16, 0x1C, 0x17, 0x13, 0x14, 0x1A}, 5086a7eba24SJean-Francois Moine {0x15, 0x11, 0x11, 0x18, 0x21, 0x18, 0x1A, 0x1D}, 5096a7eba24SJean-Francois Moine {0x1D, 0x1F, 0x1F, 0x1F, 0x13, 0x17, 0x22, 0x24}, 5106a7eba24SJean-Francois Moine {0x22, 0x1E, 0x24, 0x1C, 0x1E, 0x1F, 0x1E, 0x01}, 5116a7eba24SJean-Francois Moine {0x05, 0x03, 0x04, 0x04, 0x04, 0x03, 0x05, 0x04}, 5126a7eba24SJean-Francois Moine {0x04, 0x04, 0x05, 0x05, 0x05, 0x06, 0x07, 0x0C}, 5136a7eba24SJean-Francois Moine {0x08, 0x07, 0x07, 0x07, 0x07, 0x0F, 0x0B, 0x0B}, 5146a7eba24SJean-Francois Moine {0x09, 0x0C, 0x11, 0x0F, 0x12, 0x12, 0x11, 0x0F}, 5156a7eba24SJean-Francois Moine {0x11, 0x11, 0x13, 0x16, 0x1C, 0x17, 0x13, 0x14}, 5166a7eba24SJean-Francois Moine {0x1A, 0x15, 0x11, 0x11, 0x18, 0x21, 0x18, 0x1A}, 5176a7eba24SJean-Francois Moine {0x1D, 0x1D, 0x1F, 0x1F, 0x1F, 0x13, 0x17, 0x22}, 5186a7eba24SJean-Francois Moine {0x24, 0x22, 0x1E, 0x24, 0x1C, 0x1E, 0x1F, 0x1E}, 5196a7eba24SJean-Francois Moine {0xFF, 0x20, 0x00, 0x1F, 0x02, 0x0C, 0x00, 0x00}, 5206a7eba24SJean-Francois Moine {0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00}, 5216a7eba24SJean-Francois Moine {0x11, 0x22, 0x00, 0x22, 0x22, 0x11, 0x22, 0x22}, 5226a7eba24SJean-Francois Moine {0x11, 0x33, 0x33, 0x11, 0x44, 0x66, 0x22, 0x55}, 5236a7eba24SJean-Francois Moine {0x66, 0xFF, 0xDD, 0x00, 0x04, 0x00, 0x14, 0xFF}, 5246a7eba24SJean-Francois Moine {0xC0, 0x00, 0x11, 0x08, 0x00, 0xF0, 0x01, 0x40}, 5256a7eba24SJean-Francois Moine {0x03, 0x00, 0x21, 0x00, 0x01, 0x11, 0x01, 0x02}, 5266a7eba24SJean-Francois Moine {0x11, 0x01, 0xFF, 0xDA, 0x00, 0x0C, 0x03, 0x00}, 5276a7eba24SJean-Francois Moine {0x00, 0x01, 0x11, 0x02, 0x11, 0x00, 0x3F, 0x00}, 5286a7eba24SJean-Francois Moine {0xFF, 0xD9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} /* 27 */ 5296a7eba24SJean-Francois Moine }; 530a5ae2062SJean-Francois Moine static const __u8 cxjpeg_176[][8] = { 5316a7eba24SJean-Francois Moine {0xff, 0xd8, 0xff, 0xdb, 0x00, 0x84, 0x00, 0x0d}, 5326a7eba24SJean-Francois Moine {0x09, 0x09, 0x0B, 0x09, 0x08, 0x0D, 0x0B, 0x0A}, 5336a7eba24SJean-Francois Moine {0x0B, 0x0E, 0x0D, 0x0D, 0x0F, 0x13, 0x1F, 0x14}, 5346a7eba24SJean-Francois Moine {0x13, 0x11, 0x11, 0x13, 0x26, 0x1B, 0x1D, 0x17}, 5356a7eba24SJean-Francois Moine {0x1F, 0x2D, 0x28, 0x30, 0x2F, 0x2D, 0x28, 0x2C}, 5366a7eba24SJean-Francois Moine {0x2B, 0x32, 0x38, 0x48, 0x3D, 0x32, 0x35, 0x44}, 5376a7eba24SJean-Francois Moine {0x36, 0x2B, 0x2C, 0x3F, 0x55, 0x3F, 0x44, 0x4A}, 5386a7eba24SJean-Francois Moine {0x4D, 0x50, 0x51, 0x50, 0x30, 0x3C, 0x58, 0x5F}, 5396a7eba24SJean-Francois Moine {0x58, 0x4E, 0x5E, 0x48, 0x4F, 0x50, 0x4D, 0x01}, 5406a7eba24SJean-Francois Moine {0x0D, 0x09, 0x09, 0x0B, 0x09, 0x08, 0x0D, 0x0B}, 5416a7eba24SJean-Francois Moine {0x0A, 0x0B, 0x0E, 0x0D, 0x0D, 0x0F, 0x13, 0x1F}, 5426a7eba24SJean-Francois Moine {0x14, 0x13, 0x11, 0x11, 0x13, 0x26, 0x1B, 0x1D}, 5436a7eba24SJean-Francois Moine {0x17, 0x1F, 0x2D, 0x28, 0x30, 0x2F, 0x2D, 0x28}, 5446a7eba24SJean-Francois Moine {0x2C, 0x2B, 0x32, 0x38, 0x48, 0x3D, 0x32, 0x35}, 5456a7eba24SJean-Francois Moine {0x44, 0x36, 0x2B, 0x2C, 0x3F, 0x55, 0x3F, 0x44}, 5466a7eba24SJean-Francois Moine {0x4A, 0x4D, 0x50, 0x51, 0x50, 0x30, 0x3C, 0x58}, 5476a7eba24SJean-Francois Moine {0x5F, 0x58, 0x4E, 0x5E, 0x48, 0x4F, 0x50, 0x4D}, 5486a7eba24SJean-Francois Moine {0xFF, 0x20, 0x00, 0x1F, 0x03, 0xA1, 0x00, 0x00}, 5496a7eba24SJean-Francois Moine {0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00}, 5506a7eba24SJean-Francois Moine {0x11, 0x22, 0x00, 0x22, 0x22, 0x11, 0x22, 0x22}, 5516a7eba24SJean-Francois Moine {0x11, 0x33, 0x33, 0x11, 0x44, 0x66, 0x22, 0x55}, 5526a7eba24SJean-Francois Moine {0x66, 0xFF, 0xDD, 0x00, 0x04, 0x00, 0x0B, 0xFF}, 5536a7eba24SJean-Francois Moine {0xC0, 0x00, 0x11, 0x08, 0x00, 0x90, 0x00, 0xB0}, 5546a7eba24SJean-Francois Moine {0x03, 0x00, 0x21, 0x00, 0x01, 0x11, 0x01, 0x02}, 5556a7eba24SJean-Francois Moine {0x11, 0x01, 0xFF, 0xDA, 0x00, 0x0C, 0x03, 0x00}, 5566a7eba24SJean-Francois Moine {0x00, 0x01, 0x11, 0x02, 0x11, 0x00, 0x3F, 0x00}, 5576a7eba24SJean-Francois Moine {0xFF, 0xD9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} 5586a7eba24SJean-Francois Moine }; 559a5ae2062SJean-Francois Moine /* 640 take with the zcx30x part */ 560a5ae2062SJean-Francois Moine static const __u8 cxjpeg_qtable[][8] = { 5616a7eba24SJean-Francois Moine {0xff, 0xd8, 0xff, 0xdb, 0x00, 0x84, 0x00, 0x08}, 5626a7eba24SJean-Francois Moine {0x06, 0x06, 0x07, 0x06, 0x05, 0x08, 0x07, 0x07}, 5636a7eba24SJean-Francois Moine {0x07, 0x09, 0x09, 0x08, 0x0a, 0x0c, 0x14, 0x0a}, 5646a7eba24SJean-Francois Moine {0x0c, 0x0b, 0x0b, 0x0c, 0x19, 0x12, 0x13, 0x0f}, 5656a7eba24SJean-Francois Moine {0x14, 0x1d, 0x1a, 0x1f, 0x1e, 0x1d, 0x1a, 0x1c}, 5666a7eba24SJean-Francois Moine {0x1c, 0x20, 0x24, 0x2e, 0x27, 0x20, 0x22, 0x2c}, 5676a7eba24SJean-Francois Moine {0x23, 0x1c, 0x1c, 0x28, 0x37, 0x29, 0x2c, 0x30}, 5686a7eba24SJean-Francois Moine {0x31, 0x34, 0x34, 0x34, 0x1f, 0x27, 0x39, 0x3d}, 5696a7eba24SJean-Francois Moine {0x38, 0x32, 0x3c, 0x2e, 0x33, 0x34, 0x32, 0x01}, 5706a7eba24SJean-Francois Moine {0x09, 0x09, 0x09, 0x0c, 0x0b, 0x0c, 0x18, 0x0a}, 5716a7eba24SJean-Francois Moine {0x0a, 0x18, 0x32, 0x21, 0x1c, 0x21, 0x32, 0x32}, 5726a7eba24SJean-Francois Moine {0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32}, 5736a7eba24SJean-Francois Moine {0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32}, 5746a7eba24SJean-Francois Moine {0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32}, 5756a7eba24SJean-Francois Moine {0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32}, 5766a7eba24SJean-Francois Moine {0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32}, 5776a7eba24SJean-Francois Moine {0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32}, 5786a7eba24SJean-Francois Moine {0xFF, 0xD9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} /* 18 */ 5796a7eba24SJean-Francois Moine }; 5806a7eba24SJean-Francois Moine 5816a7eba24SJean-Francois Moine 5826a7eba24SJean-Francois Moine static void cx11646_jpegInit(struct gspca_dev*gspca_dev) 5836a7eba24SJean-Francois Moine { 5846a7eba24SJean-Francois Moine int i; 5856a7eba24SJean-Francois Moine int length; 5866a7eba24SJean-Francois Moine 587739570bbSJean-Francois Moine reg_w_val(gspca_dev, 0x00c0, 0x01); 588739570bbSJean-Francois Moine reg_w_val(gspca_dev, 0x00c3, 0x00); 589739570bbSJean-Francois Moine reg_w_val(gspca_dev, 0x00c0, 0x00); 590739570bbSJean-Francois Moine reg_r(gspca_dev, 0x0001, 1); 5916a7eba24SJean-Francois Moine length = 8; 5926a7eba24SJean-Francois Moine for (i = 0; i < 79; i++) { 5936a7eba24SJean-Francois Moine if (i == 78) 5946a7eba24SJean-Francois Moine length = 6; 595739570bbSJean-Francois Moine reg_w(gspca_dev, 0x0008, cx_jpeg_init[i], length); 5966a7eba24SJean-Francois Moine } 597739570bbSJean-Francois Moine reg_r(gspca_dev, 0x0002, 1); 598739570bbSJean-Francois Moine reg_w_val(gspca_dev, 0x0055, 0x14); 5996a7eba24SJean-Francois Moine } 6006a7eba24SJean-Francois Moine 601a5ae2062SJean-Francois Moine static const __u8 reg12[] = { 0x0a, 0x05, 0x07, 0x04, 0x19 }; 602a5ae2062SJean-Francois Moine static const __u8 regE5_8[] = 603a5ae2062SJean-Francois Moine { 0x88, 0x00, 0xd4, 0x01, 0x88, 0x01, 0x01, 0x01 }; 604a5ae2062SJean-Francois Moine static const __u8 regE5a[] = { 0x88, 0x0a, 0x0c, 0x01 }; 605a5ae2062SJean-Francois Moine static const __u8 regE5b[] = { 0x88, 0x0b, 0x12, 0x01 }; 606a5ae2062SJean-Francois Moine static const __u8 regE5c[] = { 0x88, 0x05, 0x01, 0x01 }; 607a5ae2062SJean-Francois Moine static const __u8 reg51[] = { 0x77, 0x03 }; 608739570bbSJean-Francois Moine #define reg70 0x03 6096a7eba24SJean-Francois Moine 6106a7eba24SJean-Francois Moine static void cx11646_jpeg(struct gspca_dev*gspca_dev) 6116a7eba24SJean-Francois Moine { 6126a7eba24SJean-Francois Moine int i; 613a5ae2062SJean-Francois Moine int length; 614a5ae2062SJean-Francois Moine __u8 Reg55; 615a5ae2062SJean-Francois Moine int retry; 6166a7eba24SJean-Francois Moine 617739570bbSJean-Francois Moine reg_w_val(gspca_dev, 0x00c0, 0x01); 618739570bbSJean-Francois Moine reg_w_val(gspca_dev, 0x00c3, 0x00); 619739570bbSJean-Francois Moine reg_w_val(gspca_dev, 0x00c0, 0x00); 620739570bbSJean-Francois Moine reg_r(gspca_dev, 0x0001, 1); 621a5ae2062SJean-Francois Moine length = 8; 622780e3121SJean-François Moine switch (gspca_dev->cam.cam_mode[gspca_dev->curr_mode].priv) { 6236a7eba24SJean-Francois Moine case 0: 6246a7eba24SJean-Francois Moine for (i = 0; i < 27; i++) { 6256a7eba24SJean-Francois Moine if (i == 26) 6266a7eba24SJean-Francois Moine length = 2; 627739570bbSJean-Francois Moine reg_w(gspca_dev, 0x0008, cxjpeg_640[i], length); 6286a7eba24SJean-Francois Moine } 6296a7eba24SJean-Francois Moine Reg55 = 0x28; 6306a7eba24SJean-Francois Moine break; 6316a7eba24SJean-Francois Moine case 1: 6326a7eba24SJean-Francois Moine for (i = 0; i < 27; i++) { 6336a7eba24SJean-Francois Moine if (i == 26) 6346a7eba24SJean-Francois Moine length = 2; 635739570bbSJean-Francois Moine reg_w(gspca_dev, 0x0008, cxjpeg_352[i], length); 6366a7eba24SJean-Francois Moine } 6376a7eba24SJean-Francois Moine Reg55 = 0x16; 6386a7eba24SJean-Francois Moine break; 6396a7eba24SJean-Francois Moine default: 6406a7eba24SJean-Francois Moine /* case 2: */ 6416a7eba24SJean-Francois Moine for (i = 0; i < 27; i++) { 6426a7eba24SJean-Francois Moine if (i == 26) 6436a7eba24SJean-Francois Moine length = 2; 644739570bbSJean-Francois Moine reg_w(gspca_dev, 0x0008, cxjpeg_320[i], length); 6456a7eba24SJean-Francois Moine } 6466a7eba24SJean-Francois Moine Reg55 = 0x14; 6476a7eba24SJean-Francois Moine break; 6486a7eba24SJean-Francois Moine case 3: 6496a7eba24SJean-Francois Moine for (i = 0; i < 27; i++) { 6506a7eba24SJean-Francois Moine if (i == 26) 6516a7eba24SJean-Francois Moine length = 2; 652739570bbSJean-Francois Moine reg_w(gspca_dev, 0x0008, cxjpeg_176[i], length); 6536a7eba24SJean-Francois Moine } 6546a7eba24SJean-Francois Moine Reg55 = 0x0B; 6556a7eba24SJean-Francois Moine break; 6566a7eba24SJean-Francois Moine } 6576a7eba24SJean-Francois Moine 658739570bbSJean-Francois Moine reg_r(gspca_dev, 0x0002, 1); 659739570bbSJean-Francois Moine reg_w_val(gspca_dev, 0x0055, Reg55); 660739570bbSJean-Francois Moine reg_r(gspca_dev, 0x0002, 1); 661739570bbSJean-Francois Moine reg_w(gspca_dev, 0x0010, reg10, 2); 662739570bbSJean-Francois Moine reg_w_val(gspca_dev, 0x0054, 0x02); 663739570bbSJean-Francois Moine reg_w_val(gspca_dev, 0x0054, 0x01); 664739570bbSJean-Francois Moine reg_w_val(gspca_dev, 0x0000, 0x94); 665739570bbSJean-Francois Moine reg_w_val(gspca_dev, 0x0053, 0xc0); 666739570bbSJean-Francois Moine reg_w_val(gspca_dev, 0x00fc, 0xe1); 667739570bbSJean-Francois Moine reg_w_val(gspca_dev, 0x0000, 0x00); 6686a7eba24SJean-Francois Moine /* wait for completion */ 669a5ae2062SJean-Francois Moine retry = 50; 6708561098fSLi Zefan do { 671739570bbSJean-Francois Moine reg_r(gspca_dev, 0x0002, 1); 6726a7eba24SJean-Francois Moine /* 0x07 until 0x00 */ 673739570bbSJean-Francois Moine if (gspca_dev->usb_buf[0] == 0x00) 6746a7eba24SJean-Francois Moine break; 675739570bbSJean-Francois Moine reg_w_val(gspca_dev, 0x0053, 0x00); 6768561098fSLi Zefan } while (--retry); 6776a7eba24SJean-Francois Moine if (retry == 0) 67852173c5fSJoe Perches gspca_err(gspca_dev, "Damned Errors sending jpeg Table\n"); 6796a7eba24SJean-Francois Moine /* send the qtable now */ 680739570bbSJean-Francois Moine reg_r(gspca_dev, 0x0001, 1); /* -> 0x18 */ 6816a7eba24SJean-Francois Moine length = 8; 6826a7eba24SJean-Francois Moine for (i = 0; i < 18; i++) { 6836a7eba24SJean-Francois Moine if (i == 17) 6846a7eba24SJean-Francois Moine length = 2; 685739570bbSJean-Francois Moine reg_w(gspca_dev, 0x0008, cxjpeg_qtable[i], length); 6866a7eba24SJean-Francois Moine 6876a7eba24SJean-Francois Moine } 688739570bbSJean-Francois Moine reg_r(gspca_dev, 0x0002, 1); /* 0x00 */ 689739570bbSJean-Francois Moine reg_r(gspca_dev, 0x0053, 1); /* 0x00 */ 690739570bbSJean-Francois Moine reg_w_val(gspca_dev, 0x0054, 0x02); 691739570bbSJean-Francois Moine reg_w_val(gspca_dev, 0x0054, 0x01); 692739570bbSJean-Francois Moine reg_w_val(gspca_dev, 0x0000, 0x94); 693739570bbSJean-Francois Moine reg_w_val(gspca_dev, 0x0053, 0xc0); 6946a7eba24SJean-Francois Moine 695739570bbSJean-Francois Moine reg_r(gspca_dev, 0x0038, 1); /* 0x40 */ 696739570bbSJean-Francois Moine reg_r(gspca_dev, 0x0038, 1); /* 0x40 */ 697739570bbSJean-Francois Moine reg_r(gspca_dev, 0x001f, 1); /* 0x38 */ 698739570bbSJean-Francois Moine reg_w(gspca_dev, 0x0012, reg12, 5); 699739570bbSJean-Francois Moine reg_w(gspca_dev, 0x00e5, regE5_8, 8); 700739570bbSJean-Francois Moine reg_r(gspca_dev, 0x00e8, 8); 701739570bbSJean-Francois Moine reg_w(gspca_dev, 0x00e5, regE5a, 4); 702739570bbSJean-Francois Moine reg_r(gspca_dev, 0x00e8, 1); /* 0x00 */ 703739570bbSJean-Francois Moine reg_w_val(gspca_dev, 0x009a, 0x01); 704739570bbSJean-Francois Moine reg_w(gspca_dev, 0x00e5, regE5b, 4); 705739570bbSJean-Francois Moine reg_r(gspca_dev, 0x00e8, 1); /* 0x00 */ 706739570bbSJean-Francois Moine reg_w(gspca_dev, 0x00e5, regE5c, 4); 707739570bbSJean-Francois Moine reg_r(gspca_dev, 0x00e8, 1); /* 0x00 */ 7086a7eba24SJean-Francois Moine 709739570bbSJean-Francois Moine reg_w(gspca_dev, 0x0051, reg51, 2); 710739570bbSJean-Francois Moine reg_w(gspca_dev, 0x0010, reg10, 2); 711739570bbSJean-Francois Moine reg_w_val(gspca_dev, 0x0070, reg70); 7126a7eba24SJean-Francois Moine } 7136a7eba24SJean-Francois Moine 7146a7eba24SJean-Francois Moine static void cx11646_init1(struct gspca_dev *gspca_dev) 7156a7eba24SJean-Francois Moine { 7166a7eba24SJean-Francois Moine int i = 0; 7176a7eba24SJean-Francois Moine 718739570bbSJean-Francois Moine reg_w_val(gspca_dev, 0x0010, 0x00); 719739570bbSJean-Francois Moine reg_w_val(gspca_dev, 0x0053, 0x00); 720739570bbSJean-Francois Moine reg_w_val(gspca_dev, 0x0052, 0x00); 721739570bbSJean-Francois Moine reg_w_val(gspca_dev, 0x009b, 0x2f); 722739570bbSJean-Francois Moine reg_w_val(gspca_dev, 0x009c, 0x10); 723739570bbSJean-Francois Moine reg_r(gspca_dev, 0x0098, 1); 724739570bbSJean-Francois Moine reg_w_val(gspca_dev, 0x0098, 0x40); 725739570bbSJean-Francois Moine reg_r(gspca_dev, 0x0099, 1); 726739570bbSJean-Francois Moine reg_w_val(gspca_dev, 0x0099, 0x07); 727739570bbSJean-Francois Moine reg_w_val(gspca_dev, 0x0039, 0x40); 728739570bbSJean-Francois Moine reg_w_val(gspca_dev, 0x003c, 0xff); 729739570bbSJean-Francois Moine reg_w_val(gspca_dev, 0x003f, 0x1f); 730739570bbSJean-Francois Moine reg_w_val(gspca_dev, 0x003d, 0x40); 731739570bbSJean-Francois Moine /* reg_w_val(gspca_dev, 0x003d, 0x60); */ 732739570bbSJean-Francois Moine reg_r(gspca_dev, 0x0099, 1); /* ->0x07 */ 7336a7eba24SJean-Francois Moine 7346a7eba24SJean-Francois Moine while (cx_sensor_init[i][0]) { 735739570bbSJean-Francois Moine reg_w_val(gspca_dev, 0x00e5, cx_sensor_init[i][0]); 736739570bbSJean-Francois Moine reg_r(gspca_dev, 0x00e8, 1); /* -> 0x00 */ 7376a7eba24SJean-Francois Moine if (i == 1) { 738739570bbSJean-Francois Moine reg_w_val(gspca_dev, 0x00ed, 0x01); 739739570bbSJean-Francois Moine reg_r(gspca_dev, 0x00ed, 1); /* -> 0x01 */ 7406a7eba24SJean-Francois Moine } 7416a7eba24SJean-Francois Moine i++; 7426a7eba24SJean-Francois Moine } 743739570bbSJean-Francois Moine reg_w_val(gspca_dev, 0x00c3, 0x00); 7446a7eba24SJean-Francois Moine } 7456a7eba24SJean-Francois Moine 7466a7eba24SJean-Francois Moine /* this function is called at probe time */ 7476a7eba24SJean-Francois Moine static int sd_config(struct gspca_dev *gspca_dev, 7486a7eba24SJean-Francois Moine const struct usb_device_id *id) 7496a7eba24SJean-Francois Moine { 7506a7eba24SJean-Francois Moine struct cam *cam; 7516a7eba24SJean-Francois Moine 7526a7eba24SJean-Francois Moine cam = &gspca_dev->cam; 7536a7eba24SJean-Francois Moine cam->cam_mode = vga_mode; 754d6f76b97SMauro Carvalho Chehab cam->nmodes = ARRAY_SIZE(vga_mode); 7556a7eba24SJean-Francois Moine return 0; 7566a7eba24SJean-Francois Moine } 7576a7eba24SJean-Francois Moine 758012d6b02SJean-Francois Moine /* this function is called at probe and resume time */ 759012d6b02SJean-Francois Moine static int sd_init(struct gspca_dev *gspca_dev) 7606a7eba24SJean-Francois Moine { 7616a7eba24SJean-Francois Moine cx11646_init1(gspca_dev); 7626a7eba24SJean-Francois Moine cx11646_initsize(gspca_dev); 7636a7eba24SJean-Francois Moine cx11646_fw(gspca_dev); 7646a7eba24SJean-Francois Moine cx_sensor(gspca_dev); 7656a7eba24SJean-Francois Moine cx11646_jpegInit(gspca_dev); 7666a7eba24SJean-Francois Moine return 0; 7676a7eba24SJean-Francois Moine } 7686a7eba24SJean-Francois Moine 76972ab97ceSJean-Francois Moine static int sd_start(struct gspca_dev *gspca_dev) 7706a7eba24SJean-Francois Moine { 77171cb2764SJean-Francois Moine struct sd *sd = (struct sd *) gspca_dev; 77271cb2764SJean-Francois Moine 77371cb2764SJean-Francois Moine /* create the JPEG header */ 7741966bc2aSOndrej Zary jpeg_define(sd->jpeg_hdr, gspca_dev->pixfmt.height, 7751966bc2aSOndrej Zary gspca_dev->pixfmt.width, 77671cb2764SJean-Francois Moine 0x22); /* JPEG 411 */ 777b56ab4caSHans de Goede jpeg_set_qual(sd->jpeg_hdr, QUALITY); 77871cb2764SJean-Francois Moine 7796a7eba24SJean-Francois Moine cx11646_initsize(gspca_dev); 7806a7eba24SJean-Francois Moine cx11646_fw(gspca_dev); 7816a7eba24SJean-Francois Moine cx_sensor(gspca_dev); 7826a7eba24SJean-Francois Moine cx11646_jpeg(gspca_dev); 78372ab97ceSJean-Francois Moine return 0; 7846a7eba24SJean-Francois Moine } 7856a7eba24SJean-Francois Moine 78698522a7bSJean-Francois Moine /* called on streamoff with alt 0 and on disconnect */ 7876a7eba24SJean-Francois Moine static void sd_stop0(struct gspca_dev *gspca_dev) 7886a7eba24SJean-Francois Moine { 7896a7eba24SJean-Francois Moine int retry = 50; 7906a7eba24SJean-Francois Moine 79198522a7bSJean-Francois Moine if (!gspca_dev->present) 79298522a7bSJean-Francois Moine return; 793739570bbSJean-Francois Moine reg_w_val(gspca_dev, 0x0000, 0x00); 794739570bbSJean-Francois Moine reg_r(gspca_dev, 0x0002, 1); 795739570bbSJean-Francois Moine reg_w_val(gspca_dev, 0x0053, 0x00); 7966a7eba24SJean-Francois Moine 7976a7eba24SJean-Francois Moine while (retry--) { 798739570bbSJean-Francois Moine /* reg_r(gspca_dev, 0x0002, 1);*/ 799739570bbSJean-Francois Moine reg_r(gspca_dev, 0x0053, 1); 800739570bbSJean-Francois Moine if (gspca_dev->usb_buf[0] == 0) 8016a7eba24SJean-Francois Moine break; 8026a7eba24SJean-Francois Moine } 803739570bbSJean-Francois Moine reg_w_val(gspca_dev, 0x0000, 0x00); 804739570bbSJean-Francois Moine reg_r(gspca_dev, 0x0002, 1); 8056a7eba24SJean-Francois Moine 806739570bbSJean-Francois Moine reg_w_val(gspca_dev, 0x0010, 0x00); 807739570bbSJean-Francois Moine reg_r(gspca_dev, 0x0033, 1); 808739570bbSJean-Francois Moine reg_w_val(gspca_dev, 0x00fc, 0xe0); 8096a7eba24SJean-Francois Moine } 8106a7eba24SJean-Francois Moine 8116a7eba24SJean-Francois Moine static void sd_pkt_scan(struct gspca_dev *gspca_dev, 81276dd272bSJean-Francois Moine u8 *data, /* isoc packet */ 8136a7eba24SJean-Francois Moine int len) /* iso packet length */ 8146a7eba24SJean-Francois Moine { 81571cb2764SJean-Francois Moine struct sd *sd = (struct sd *) gspca_dev; 81671cb2764SJean-Francois Moine 8176a7eba24SJean-Francois Moine if (data[0] == 0xff && data[1] == 0xd8) { 8186a7eba24SJean-Francois Moine 8196a7eba24SJean-Francois Moine /* start of frame */ 82076dd272bSJean-Francois Moine gspca_frame_add(gspca_dev, LAST_PACKET, NULL, 0); 8216a7eba24SJean-Francois Moine 8226a7eba24SJean-Francois Moine /* put the JPEG header in the new frame */ 82376dd272bSJean-Francois Moine gspca_frame_add(gspca_dev, FIRST_PACKET, 82471cb2764SJean-Francois Moine sd->jpeg_hdr, JPEG_HDR_SZ); 8256a7eba24SJean-Francois Moine data += 2; 8266a7eba24SJean-Francois Moine len -= 2; 8276a7eba24SJean-Francois Moine } 82876dd272bSJean-Francois Moine gspca_frame_add(gspca_dev, INTER_PACKET, data, len); 8296a7eba24SJean-Francois Moine } 8306a7eba24SJean-Francois Moine 831cbc1c94cSHans Verkuil static void setbrightness(struct gspca_dev *gspca_dev, s32 val, s32 sat) 8326a7eba24SJean-Francois Moine { 8336a7eba24SJean-Francois Moine __u8 regE5cbx[] = { 0x88, 0x00, 0xd4, 0x01, 0x88, 0x01, 0x01, 0x01 }; 834a5ae2062SJean-Francois Moine __u8 reg51c[2]; 8356a7eba24SJean-Francois Moine 836cbc1c94cSHans Verkuil regE5cbx[2] = val; 837739570bbSJean-Francois Moine reg_w(gspca_dev, 0x00e5, regE5cbx, 8); 838739570bbSJean-Francois Moine reg_r(gspca_dev, 0x00e8, 8); 839739570bbSJean-Francois Moine reg_w(gspca_dev, 0x00e5, regE5c, 4); 840739570bbSJean-Francois Moine reg_r(gspca_dev, 0x00e8, 1); /* 0x00 */ 8416a7eba24SJean-Francois Moine 842a5ae2062SJean-Francois Moine reg51c[0] = 0x77; 843cbc1c94cSHans Verkuil reg51c[1] = sat; 844739570bbSJean-Francois Moine reg_w(gspca_dev, 0x0051, reg51c, 2); 845739570bbSJean-Francois Moine reg_w(gspca_dev, 0x0010, reg10, 2); 846739570bbSJean-Francois Moine reg_w_val(gspca_dev, 0x0070, reg70); 8476a7eba24SJean-Francois Moine } 8486a7eba24SJean-Francois Moine 849cbc1c94cSHans Verkuil static void setcontrast(struct gspca_dev *gspca_dev, s32 val, s32 sat) 8506a7eba24SJean-Francois Moine { 8516a7eba24SJean-Francois Moine __u8 regE5acx[] = { 0x88, 0x0a, 0x0c, 0x01 }; /* seem MSB */ 852a5ae2062SJean-Francois Moine /* __u8 regE5bcx[] = { 0x88, 0x0b, 0x12, 0x01}; * LSB */ 853a5ae2062SJean-Francois Moine __u8 reg51c[2]; 8546a7eba24SJean-Francois Moine 855cbc1c94cSHans Verkuil regE5acx[2] = val; 856739570bbSJean-Francois Moine reg_w(gspca_dev, 0x00e5, regE5acx, 4); 857739570bbSJean-Francois Moine reg_r(gspca_dev, 0x00e8, 1); /* 0x00 */ 858a5ae2062SJean-Francois Moine reg51c[0] = 0x77; 859cbc1c94cSHans Verkuil reg51c[1] = sat; 860739570bbSJean-Francois Moine reg_w(gspca_dev, 0x0051, reg51c, 2); 861739570bbSJean-Francois Moine reg_w(gspca_dev, 0x0010, reg10, 2); 862739570bbSJean-Francois Moine reg_w_val(gspca_dev, 0x0070, reg70); 8636a7eba24SJean-Francois Moine } 8646a7eba24SJean-Francois Moine 865cbc1c94cSHans Verkuil static int sd_s_ctrl(struct v4l2_ctrl *ctrl) 8666a7eba24SJean-Francois Moine { 867cbc1c94cSHans Verkuil struct gspca_dev *gspca_dev = 868cbc1c94cSHans Verkuil container_of(ctrl->handler, struct gspca_dev, ctrl_handler); 8696a7eba24SJean-Francois Moine struct sd *sd = (struct sd *)gspca_dev; 8706a7eba24SJean-Francois Moine 871cbc1c94cSHans Verkuil gspca_dev->usb_err = 0; 872cbc1c94cSHans Verkuil 873cbc1c94cSHans Verkuil if (!gspca_dev->streaming) 8746a7eba24SJean-Francois Moine return 0; 875cbc1c94cSHans Verkuil 876cbc1c94cSHans Verkuil switch (ctrl->id) { 877cbc1c94cSHans Verkuil case V4L2_CID_BRIGHTNESS: 878cbc1c94cSHans Verkuil setbrightness(gspca_dev, ctrl->val, sd->sat->cur.val); 879cbc1c94cSHans Verkuil break; 880cbc1c94cSHans Verkuil case V4L2_CID_CONTRAST: 881cbc1c94cSHans Verkuil setcontrast(gspca_dev, ctrl->val, sd->sat->cur.val); 882cbc1c94cSHans Verkuil break; 883cbc1c94cSHans Verkuil case V4L2_CID_SATURATION: 884cbc1c94cSHans Verkuil setbrightness(gspca_dev, sd->brightness->cur.val, ctrl->val); 885cbc1c94cSHans Verkuil setcontrast(gspca_dev, sd->contrast->cur.val, ctrl->val); 886cbc1c94cSHans Verkuil break; 887cbc1c94cSHans Verkuil } 888cbc1c94cSHans Verkuil return gspca_dev->usb_err; 8896a7eba24SJean-Francois Moine } 8906a7eba24SJean-Francois Moine 891cbc1c94cSHans Verkuil static const struct v4l2_ctrl_ops sd_ctrl_ops = { 892cbc1c94cSHans Verkuil .s_ctrl = sd_s_ctrl, 893cbc1c94cSHans Verkuil }; 894cbc1c94cSHans Verkuil 895cbc1c94cSHans Verkuil static int sd_init_controls(struct gspca_dev *gspca_dev) 8966a7eba24SJean-Francois Moine { 8976a7eba24SJean-Francois Moine struct sd *sd = (struct sd *)gspca_dev; 898cbc1c94cSHans Verkuil struct v4l2_ctrl_handler *hdl = &gspca_dev->ctrl_handler; 8996a7eba24SJean-Francois Moine 900cbc1c94cSHans Verkuil gspca_dev->vdev.ctrl_handler = hdl; 901b56ab4caSHans de Goede v4l2_ctrl_handler_init(hdl, 3); 902cbc1c94cSHans Verkuil sd->brightness = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops, 903cbc1c94cSHans Verkuil V4L2_CID_BRIGHTNESS, 0, 255, 1, 0xd4); 904cbc1c94cSHans Verkuil sd->contrast = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops, 905cbc1c94cSHans Verkuil V4L2_CID_CONTRAST, 0x0a, 0x1f, 1, 0x0c); 906cbc1c94cSHans Verkuil sd->sat = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops, 907cbc1c94cSHans Verkuil V4L2_CID_SATURATION, 0, 7, 1, 3); 908cbc1c94cSHans Verkuil if (hdl->error) { 909cbc1c94cSHans Verkuil pr_err("Could not initialize controls\n"); 910cbc1c94cSHans Verkuil return hdl->error; 9116a7eba24SJean-Francois Moine } 9126a7eba24SJean-Francois Moine return 0; 9136a7eba24SJean-Francois Moine } 9146a7eba24SJean-Francois Moine 9156a7eba24SJean-Francois Moine /* sub-driver description */ 916aabcdfb6SMárton Németh static const struct sd_desc sd_desc = { 9176a7eba24SJean-Francois Moine .name = MODULE_NAME, 9186a7eba24SJean-Francois Moine .config = sd_config, 919012d6b02SJean-Francois Moine .init = sd_init, 920cbc1c94cSHans Verkuil .init_controls = sd_init_controls, 9216a7eba24SJean-Francois Moine .start = sd_start, 9226a7eba24SJean-Francois Moine .stop0 = sd_stop0, 9236a7eba24SJean-Francois Moine .pkt_scan = sd_pkt_scan, 9246a7eba24SJean-Francois Moine }; 9256a7eba24SJean-Francois Moine 9266a7eba24SJean-Francois Moine /* -- module initialisation -- */ 92795c967c1SJean-François Moine static const struct usb_device_id device_table[] = { 9289d64fdb1SJean-Francois Moine {USB_DEVICE(0x0572, 0x0041)}, 9296a7eba24SJean-Francois Moine {} 9306a7eba24SJean-Francois Moine }; 9316a7eba24SJean-Francois Moine MODULE_DEVICE_TABLE(usb, device_table); 9326a7eba24SJean-Francois Moine 9336a7eba24SJean-Francois Moine /* -- device connect -- */ 93495c967c1SJean-François Moine static int sd_probe(struct usb_interface *intf, 9356a7eba24SJean-Francois Moine const struct usb_device_id *id) 9366a7eba24SJean-Francois Moine { 9376a7eba24SJean-Francois Moine return gspca_dev_probe(intf, id, &sd_desc, sizeof(struct sd), 9386a7eba24SJean-Francois Moine THIS_MODULE); 9396a7eba24SJean-Francois Moine } 9406a7eba24SJean-Francois Moine 9416a7eba24SJean-Francois Moine static struct usb_driver sd_driver = { 9426a7eba24SJean-Francois Moine .name = MODULE_NAME, 9436a7eba24SJean-Francois Moine .id_table = device_table, 9446a7eba24SJean-Francois Moine .probe = sd_probe, 9456a7eba24SJean-Francois Moine .disconnect = gspca_disconnect, 9466a709749SJean-Francois Moine #ifdef CONFIG_PM 9476a709749SJean-Francois Moine .suspend = gspca_suspend, 9486a709749SJean-Francois Moine .resume = gspca_resume, 9498bb58964SHans de Goede .reset_resume = gspca_resume, 9506a709749SJean-Francois Moine #endif 9516a7eba24SJean-Francois Moine }; 9526a7eba24SJean-Francois Moine 953ecb3b2b3SGreg Kroah-Hartman module_usb_driver(sd_driver); 954