Lines Matching +full:colour +full:- +full:sensor
1 // SPDX-License-Identifier: GPL-2.0-or-later
5 * Copyright (C) 2012 Jean-Francois Moine <http://moinejf.free.fr>
6 * Copyright (C) 2008-2009 microdia project <[email protected]>
99 u8 sensor; member
122 .ident = "MSI MS-1034",
124 DMI_MATCH(DMI_SYS_VENDOR, "MICRO-STAR INT'L CO.,LTD."),
125 DMI_MATCH(DMI_PRODUCT_NAME, "MS-1034"),
130 .ident = "MSI MS-1039",
132 DMI_MATCH(DMI_SYS_VENDOR, "MICRO-STAR INT'L CO.,LTD."),
133 DMI_MATCH(DMI_PRODUCT_NAME, "MS-1039"),
137 .ident = "MSI MS-1632",
140 DMI_MATCH(DMI_BOARD_NAME, "MS-1632")
144 .ident = "MSI MS-1633X",
147 DMI_MATCH(DMI_BOARD_NAME, "MS-1633X")
151 .ident = "MSI MS-1635X",
154 DMI_MATCH(DMI_BOARD_NAME, "MS-1635X")
312 3, 0, -1, -3, -6, -8, -10, -12,
313 -15, -17, -19, -22, -24, -26, -28, -30,
314 -33, -35, -37, -39, -41, -44, -46, -48,
315 -50, -52, -54, -56, -58, -60, -62, -64,
316 -66, -68, -70, -72, -74, -76, -78, -80,
317 -81, -83, -85, -87, -88, -90, -92, -93,
318 -95, -97, -98, -100, -101, -102, -104, -105,
319 -107, -108, -109, -110, -112, -113, -114, -115,
320 -116, -117, -118, -119, -120, -121, -122, -123,
321 -123, -124, -125, -125, -126, -127, -127, -128,
322 -128, -128, -128, -128, -128, -128, -128, -128,
323 -128, -128, -128, -128, -128, -128, -128, -128,
324 -128, -128, -128, -128, -128, -128, -128, -128,
325 -128, -127, -127, -126, -125, -125, -124, -123,
326 -122, -122, -121, -120, -119, -118, -117, -116,
327 -115, -114, -112, -111, -110, -109, -107, -106,
328 -105, -103, -102, -101, -99, -98, -96, -94,
329 -93, -91, -90, -88, -86, -84, -83, -81,
330 -79, -77, -75, -74, -72, -70, -68, -66,
331 -64, -62, -60, -58, -56, -54, -52, -49,
332 -47, -45, -43, -41, -39, -36, -34, -32,
333 -30, -28, -25, -23, -21, -19, -16, -14,
334 -12, -9, -7, -5, -3, 0, 1, 3,
344 14, 12, 10, 7, 5, 3, 0, -1,
345 -3, -6, -8, -10, -13, -15, -17, -19,
346 -22, -24, -26, -29, -31, -33, -35, -38,
347 -40, -42, -44, -46, -48, -51, -53, -55,
348 -57, -59, -61, -63, -65, -67, -69, -71,
349 -73, -75, -77, -79, -81, -82, -84, -86,
350 -88, -89, -91, -93, -94, -96, -98, -99,
351 -101, -102, -104, -105, -106, -108, -109, -110,
352 -112, -113, -114, -115, -116, -117, -119, -120,
353 -120, -121, -122, -123, -124, -125, -126, -126,
354 -127, -128, -128, -128, -128, -128, -128, -128,
355 -128, -128, -128, -128, -128, -128, -128, -128,
356 -128, -128, -128, -128, -128, -128, -128, -128,
357 -128, -128, -128, -128, -128, -128, -128, -128,
358 -127, -127, -126, -125, -125, -124, -123, -122,
359 -121, -120, -119, -118, -117, -116, -115, -114,
360 -113, -111, -110, -109, -107, -106, -105, -103,
361 -102, -100, -99, -97, -96, -94, -92, -91,
362 -89, -87, -85, -84, -82, -80, -78, -76,
363 -74, -73, -71, -69, -67, -65, -63, -61,
364 -58, -56, -54, -52, -50, -48, -46, -44,
365 -41, -39, -37, -35, -32, -30, -28, -26,
366 -23, -21, -19, -16, -14, -12, -10, -7,
367 -5, -3, 0, 1, 3, 6, 8, 10,
388 -124, -124, -125, -125, -125, -125, -125, -125,
389 -125, -126, -126, -125, -125, -125, -125, -125,
390 -125, -124, -124, -124, -123, -123, -122, -122,
391 -121, -121, -120, -120, -119, -118, -117, -117,
392 -116, -115, -114, -113, -112, -111, -110, -109,
393 -108, -107, -105, -104, -103, -102, -100, -99,
394 -98, -96, -95, -93, -92, -91, -89, -87,
395 -86, -84, -83, -81, -79, -77, -76, -74,
396 -72, -70, -69, -67, -65, -63, -61, -59,
397 -57, -55, -53, -51, -49, -47, -45, -43,
398 -41, -39, -37, -35, -33, -30, -28, -26,
399 -24, -22, -20, -18, -15, -13, -11, -9,
400 -7, -4, -2, 0, 1, 3, 6, 8,
423 -1, -3, -6, -8, -10, -12, -14, -17,
424 -19, -21, -23, -25, -27, -29, -32, -34,
425 -36, -38, -40, -42, -44, -46, -48, -50,
426 -52, -54, -56, -58, -60, -62, -64, -66,
427 -68, -70, -71, -73, -75, -77, -78, -80,
428 -82, -83, -85, -87, -88, -90, -91, -93,
429 -94, -96, -97, -98, -100, -101, -102, -104,
430 -105, -106, -107, -108, -109, -111, -112, -113,
431 -113, -114, -115, -116, -117, -118, -118, -119,
432 -120, -120, -121, -122, -122, -123, -123, -124, -124
436 -100, -99, -98, -97, -95, -94, -93, -91,
437 -90, -89, -87, -86, -84, -83, -81, -80,
438 -78, -76, -75, -73, -71, -70, -68, -66,
439 -64, -63, -61, -59, -57, -55, -53, -51,
440 -49, -48, -46, -44, -42, -40, -38, -36,
441 -34, -32, -30, -27, -25, -23, -21, -19,
442 -17, -15, -13, -11, -9, -7, -4, -2,
465 9, 7, 4, 2, 0, -1, -3, -5,
466 -7, -9, -11, -14, -16, -18, -20, -22,
467 -24, -26, -28, -30, -32, -34, -36, -38,
468 -40, -42, -44, -46, -48, -50, -52, -54,
469 -56, -58, -59, -61, -63, -65, -67, -68,
470 -70, -72, -74, -75, -77, -78, -80, -82,
471 -83, -85, -86, -88, -89, -90, -92, -93,
472 -95, -96, -97, -98, -100, -101, -102, -103,
473 -104, -105, -106, -107, -108, -109, -110, -111,
474 -112, -112, -113, -114, -115, -115, -116, -116,
475 -117, -117, -118, -118, -119, -119, -119, -120,
476 -120, -120, -120, -120, -121, -121, -121, -121,
477 -121, -121, -120, -120, -120, -120, -120, -119,
478 -119, -119, -118, -118, -117, -117, -116, -116,
479 -115, -114, -114, -113, -112, -111, -111, -110,
480 -109, -108, -107, -106, -105, -104, -103, -102, -100
498 2, 0, -1, -3, -5, -7, -9, -12,
499 -14, -16, -18, -20, -22, -24, -26, -28,
500 -31, -33, -35, -37, -39, -41, -43, -45,
501 -47, -49, -51, -53, -54, -56, -58, -60,
502 -62, -64, -66, -67, -69, -71, -73, -74,
503 -76, -78, -79, -81, -83, -84, -86, -87,
504 -89, -90, -92, -93, -94, -96, -97, -98,
505 -99, -101, -102, -103, -104, -105, -106, -107,
506 -108, -109, -110, -111, -112, -113, -114, -114,
507 -115, -116, -117, -117, -118, -118, -119, -119,
508 -120, -120, -120, -121, -121, -121, -122, -122,
509 -122, -122, -122, -122, -122, -122, -122, -122,
510 -122, -122, -121, -121, -121, -120, -120, -120,
511 -119, -119, -118, -118, -117, -116, -116, -115,
512 -114, -113, -113, -112, -111, -110, -109, -108,
513 -107, -106, -105, -104, -103, -102, -100, -99,
514 -98, -97, -95, -94, -93, -91, -90, -88,
515 -87, -85, -84, -82, -80, -79, -77, -76,
516 -74, -72, -70, -69, -67, -65, -63, -61,
517 -60, -58, -56, -54, -52, -50, -48, -46,
518 -44, -42, -40, -38, -36, -34, -32, -30,
519 -28, -26, -24, -22, -19, -17, -15, -13,
520 -11, -9, -7, -5, -2, 0, 1, 3,
532 -11, -13, -15, -17, -19, -21, -23, -25,
533 -27, -29, -31, -33, -35, -37, -39, -41,
534 -43, -45, -46, -48, -50, -52, -54, -55,
535 -57, -59, -61, -62, -64, -66, -67, -69,
536 -71, -72, -74, -75, -77, -78, -80, -81,
537 -83, -84, -86, -87, -88, -90, -91, -92,
538 -93, -95, -96, -97, -98, -99, -100, -101,
539 -102, -103, -104, -105, -106, -106, -107, -108,
540 -109, -109, -110, -111, -111, -112, -112, -113,
541 -113, -114, -114, -114, -115, -115, -115, -115,
542 -116, -116, -116, -116, -116, -116, -116, -116,
543 -116, -115, -115, -115, -115, -114, -114, -114,
544 -113, -113, -112, -112, -111, -111, -110, -110,
545 -109, -108, -108, -107, -106, -105, -104, -103,
546 -102, -101, -100, -99, -98, -97, -96, -95,
547 -94, -93, -91, -90, -89, -88, -86, -85,
548 -84, -82, -81, -79, -78, -76, -75, -73,
549 -71, -70, -68, -67, -65, -63, -62, -60,
550 -58, -56, -55, -53, -51, -49, -47, -45,
551 -44, -42, -40, -38, -36, -34, -32, -30,
552 -28, -26, -24, -22, -20, -18, -16, -14,
553 -12, -10, -8, -6, -4, -2, 0, 1,
576 4, 2, 0, -1, -3, -5, -7, -9, -11
634 /* mt9m001 sensor uses a different gain formula then other micron sensors */
635 /* Gain = (bit[6] + 1) * (bit[5-0] * 0.125) */
686 0x10, 0x61 and sd->hstart, vstart = 3, fixes ugly colored borders */
906 struct usb_device *dev = gspca_dev->dev; in reg_r()
909 if (gspca_dev->usb_err < 0) in reg_r()
916 gspca_dev->usb_buf, in reg_r()
921 gspca_dev->usb_err = result; in reg_r()
926 memset(gspca_dev->usb_buf, 0, USB_BUF_SZ); in reg_r()
933 struct usb_device *dev = gspca_dev->dev; in reg_w()
936 if (gspca_dev->usb_err < 0) in reg_w()
938 memcpy(gspca_dev->usb_buf, buffer, length); in reg_w()
944 gspca_dev->usb_buf, in reg_w()
949 gspca_dev->usb_err = result; in reg_w()
965 if (gspca_dev->usb_err < 0) in i2c_w()
967 if (gspca_dev->usb_buf[0] & 0x04) { in i2c_w()
968 if (gspca_dev->usb_buf[0] & 0x08) { in i2c_w()
970 gspca_dev->usb_err = -EIO; in i2c_w()
977 /* gspca_dev->usb_err = -EIO; fixme: may occur */ in i2c_w()
989 row[0] = sd->i2c_intf | (2 << 4); in i2c_w1()
990 row[1] = sd->i2c_addr; in i2c_w1()
1004 while (--sz >= 0) { in i2c_w1_buf()
1005 i2c_w1(gspca_dev, buf->reg, buf->val); in i2c_w1_buf()
1019 row[0] = sd->i2c_intf | (3 << 4); in i2c_w2()
1020 row[1] = sd->i2c_addr; in i2c_w2()
1034 while (--sz >= 0) { in i2c_w2_buf()
1035 i2c_w2(gspca_dev, buf->reg, buf->val); in i2c_w2_buf()
1045 row[0] = sd->i2c_intf | (1 << 4); in i2c_r1()
1046 row[1] = sd->i2c_addr; in i2c_r1()
1054 row[0] = sd->i2c_intf | (1 << 4) | 0x02; in i2c_r1()
1058 *val = gspca_dev->usb_buf[4]; in i2c_r1()
1066 row[0] = sd->i2c_intf | (1 << 4); in i2c_r2()
1067 row[1] = sd->i2c_addr; in i2c_r2()
1075 row[0] = sd->i2c_intf | (2 << 4) | 0x02; in i2c_r2()
1079 *val = (gspca_dev->usb_buf[3] << 8) | gspca_dev->usb_buf[4]; in i2c_r2()
1088 if (gspca_dev->usb_err < 0) in ov9650_init_sensor()
1092 pr_err("sensor id for ov9650 doesn't match (0x%04x)\n", id); in ov9650_init_sensor()
1093 gspca_dev->usb_err = -ENODEV; in ov9650_init_sensor()
1097 i2c_w1(gspca_dev, 0x12, 0x80); /* sensor reset */ in ov9650_init_sensor()
1100 if (gspca_dev->usb_err < 0) in ov9650_init_sensor()
1101 pr_err("OV9650 sensor initialization failed\n"); in ov9650_init_sensor()
1102 sd->hstart = 1; in ov9650_init_sensor()
1103 sd->vstart = 7; in ov9650_init_sensor()
1110 i2c_w1(gspca_dev, 0x12, 0x80); /* sensor reset */ in ov9655_init_sensor()
1113 if (gspca_dev->usb_err < 0) in ov9655_init_sensor()
1114 pr_err("OV9655 sensor initialization failed\n"); in ov9655_init_sensor()
1116 sd->hstart = 1; in ov9655_init_sensor()
1117 sd->vstart = 2; in ov9655_init_sensor()
1124 i2c_w1(gspca_dev, 0x12, 0x80); /* sensor reset */ in soi968_init_sensor()
1127 if (gspca_dev->usb_err < 0) in soi968_init_sensor()
1128 pr_err("SOI968 sensor initialization failed\n"); in soi968_init_sensor()
1130 sd->hstart = 60; in soi968_init_sensor()
1131 sd->vstart = 11; in soi968_init_sensor()
1138 i2c_w1(gspca_dev, 0x12, 0x80); /* sensor reset */ in ov7660_init_sensor()
1141 if (gspca_dev->usb_err < 0) in ov7660_init_sensor()
1142 pr_err("OV7660 sensor initialization failed\n"); in ov7660_init_sensor()
1143 sd->hstart = 3; in ov7660_init_sensor()
1144 sd->vstart = 3; in ov7660_init_sensor()
1151 i2c_w1(gspca_dev, 0x12, 0x80); /* sensor reset */ in ov7670_init_sensor()
1154 if (gspca_dev->usb_err < 0) in ov7670_init_sensor()
1155 pr_err("OV7670 sensor initialization failed\n"); in ov7670_init_sensor()
1157 sd->hstart = 0; in ov7670_init_sensor()
1158 sd->vstart = 1; in ov7670_init_sensor()
1166 sd->i2c_addr = 0x5d; in mt9v_init_sensor()
1168 if (gspca_dev->usb_err >= 0 in mt9v_init_sensor()
1171 if (gspca_dev->usb_err < 0) { in mt9v_init_sensor()
1172 pr_err("MT9V011 sensor initialization failed\n"); in mt9v_init_sensor()
1175 sd->hstart = 2; in mt9v_init_sensor()
1176 sd->vstart = 2; in mt9v_init_sensor()
1177 sd->sensor = SENSOR_MT9V011; in mt9v_init_sensor()
1178 pr_info("MT9V011 sensor detected\n"); in mt9v_init_sensor()
1182 gspca_dev->usb_err = 0; in mt9v_init_sensor()
1183 sd->i2c_addr = 0x5c; in mt9v_init_sensor()
1186 if (gspca_dev->usb_err >= 0 in mt9v_init_sensor()
1189 if (gspca_dev->usb_err < 0) { in mt9v_init_sensor()
1190 pr_err("MT9V111 sensor initialization failed\n"); in mt9v_init_sensor()
1193 sd->hstart = 2; in mt9v_init_sensor()
1194 sd->vstart = 2; in mt9v_init_sensor()
1195 sd->sensor = SENSOR_MT9V111; in mt9v_init_sensor()
1196 pr_info("MT9V111 sensor detected\n"); in mt9v_init_sensor()
1200 gspca_dev->usb_err = 0; in mt9v_init_sensor()
1201 sd->i2c_addr = 0x5d; in mt9v_init_sensor()
1203 if (gspca_dev->usb_err < 0) { in mt9v_init_sensor()
1204 gspca_dev->usb_err = 0; in mt9v_init_sensor()
1205 sd->i2c_addr = 0x48; in mt9v_init_sensor()
1209 if (gspca_dev->usb_err >= 0 in mt9v_init_sensor()
1212 if (gspca_dev->usb_err < 0) { in mt9v_init_sensor()
1213 pr_err("MT9V112 sensor initialization failed\n"); in mt9v_init_sensor()
1216 sd->hstart = 6; in mt9v_init_sensor()
1217 sd->vstart = 2; in mt9v_init_sensor()
1218 sd->sensor = SENSOR_MT9V112; in mt9v_init_sensor()
1219 pr_info("MT9V112 sensor detected\n"); in mt9v_init_sensor()
1223 gspca_dev->usb_err = -ENODEV; in mt9v_init_sensor()
1231 if (gspca_dev->usb_err < 0) in mt9m112_init_sensor()
1232 pr_err("MT9M112 sensor initialization failed\n"); in mt9m112_init_sensor()
1234 sd->hstart = 0; in mt9m112_init_sensor()
1235 sd->vstart = 2; in mt9m112_init_sensor()
1243 if (gspca_dev->usb_err < 0) in mt9m111_init_sensor()
1244 pr_err("MT9M111 sensor initialization failed\n"); in mt9m111_init_sensor()
1246 sd->hstart = 0; in mt9m111_init_sensor()
1247 sd->vstart = 2; in mt9m111_init_sensor()
1256 if (gspca_dev->usb_err < 0) in mt9m001_init_sensor()
1259 /* must be 0x8411 or 0x8421 for colour sensor and 8431 for bw */ in mt9m001_init_sensor()
1263 pr_info("MT9M001 color sensor detected\n"); in mt9m001_init_sensor()
1266 pr_info("MT9M001 mono sensor detected\n"); in mt9m001_init_sensor()
1270 gspca_dev->usb_err = -ENODEV; in mt9m001_init_sensor()
1275 if (gspca_dev->usb_err < 0) in mt9m001_init_sensor()
1276 pr_err("MT9M001 sensor initialization failed\n"); in mt9m001_init_sensor()
1278 sd->hstart = 1; in mt9m001_init_sensor()
1279 sd->vstart = 1; in mt9m001_init_sensor()
1287 if (gspca_dev->usb_err < 0) in hv7131r_init_sensor()
1288 pr_err("HV7131R Sensor initialization failed\n"); in hv7131r_init_sensor()
1290 sd->hstart = 0; in hv7131r_init_sensor()
1291 sd->vstart = 1; in hv7131r_init_sensor()
1302 cmatrix[0] = 0x13 + (cmatrix[2] - 0x26) * 0x13 / 0x25; in set_cmatrix()
1303 cmatrix[4] = 0x07 + (cmatrix[2] - 0x26) * 0x07 / 0x25; in set_cmatrix()
1304 cmatrix[18] = brightness - 0x80; in set_cmatrix()
1339 gamma[1] = 0x13 + (gval * (0xcb - 0x13) / 0xb8); in set_gamma()
1340 gamma[2] = 0x25 + (gval * (0xee - 0x25) / 0xb8); in set_gamma()
1341 gamma[3] = 0x37 + (gval * (0xfa - 0x37) / 0xb8); in set_gamma()
1342 gamma[4] = 0x45 + (gval * (0xfc - 0x45) / 0xb8); in set_gamma()
1343 gamma[5] = 0x55 + (gval * (0xfb - 0x55) / 0xb8); in set_gamma()
1344 gamma[6] = 0x65 + (gval * (0xfc - 0x65) / 0xb8); in set_gamma()
1345 gamma[7] = 0x74 + (gval * (0xfd - 0x74) / 0xb8); in set_gamma()
1346 gamma[8] = 0x83 + (gval * (0xfe - 0x83) / 0xb8); in set_gamma()
1347 gamma[9] = 0x92 + (gval * (0xfc - 0x92) / 0xb8); in set_gamma()
1348 gamma[10] = 0xa1 + (gval * (0xfc - 0xa1) / 0xb8); in set_gamma()
1349 gamma[11] = 0xb0 + (gval * (0xfc - 0xb0) / 0xb8); in set_gamma()
1350 gamma[12] = 0xbf + (gval * (0xfb - 0xbf) / 0xb8); in set_gamma()
1351 gamma[13] = 0xce + (gval * (0xfb - 0xce) / 0xb8); in set_gamma()
1352 gamma[14] = 0xdf + (gval * (0xfd - 0xdf) / 0xb8); in set_gamma()
1353 gamma[15] = 0xea + (gval * (0xf9 - 0xea) / 0xb8); in set_gamma()
1371 if ((sd->flags & FLIP_DETECT) && dmi_check_system(flip_dmi_table)) { in set_hvflip()
1376 switch (sd->sensor) { in set_hvflip()
1383 sd->vstart = 2; in set_hvflip()
1385 sd->vstart = 3; in set_hvflip()
1387 reg_w1(gspca_dev, 0x1182, sd->vstart); in set_hvflip()
1439 u8 exp[8] = {sd->i2c_intf, sd->i2c_addr, in set_exposure()
1443 if (gspca_dev->streaming) in set_exposure()
1446 switch (sd->sensor) { in set_exposure()
1464 expo -= expo2; in set_exposure()
1495 u8 gain[8] = {sd->i2c_intf, sd->i2c_addr, in set_gain()
1498 if (gspca_dev->streaming) in set_gain()
1501 switch (sd->sensor) { in set_gain()
1549 jpeg_set_qual(sd->jpeg_hdr, val); in set_quality()
1551 reg_w1(gspca_dev, 0x10e0, sd->fmt | 0x20); /* write QTAB */ in set_quality()
1552 reg_w(gspca_dev, 0x1100, &sd->jpeg_hdr[JPEG_QT0_OFFSET], 64); in set_quality()
1553 reg_w(gspca_dev, 0x1140, &sd->jpeg_hdr[JPEG_QT1_OFFSET], 64); in set_quality()
1555 reg_w1(gspca_dev, 0x10e0, sd->fmt); in set_quality()
1556 sd->fmt ^= 0x0c; /* invert QTAB use + write */ in set_quality()
1557 reg_w1(gspca_dev, 0x10e0, sd->fmt); in set_quality()
1566 reg->size = 1; in sd_dbg_g_register()
1567 switch (reg->match.addr) { in sd_dbg_g_register()
1569 if (reg->reg < 0x1000 || reg->reg > 0x11ff) in sd_dbg_g_register()
1570 return -EINVAL; in sd_dbg_g_register()
1571 reg_r(gspca_dev, reg->reg, 1); in sd_dbg_g_register()
1572 reg->val = gspca_dev->usb_buf[0]; in sd_dbg_g_register()
1573 return gspca_dev->usb_err; in sd_dbg_g_register()
1575 if (sd->sensor >= SENSOR_MT9V011 && in sd_dbg_g_register()
1576 sd->sensor <= SENSOR_MT9M112) { in sd_dbg_g_register()
1577 i2c_r2(gspca_dev, reg->reg, (u16 *) ®->val); in sd_dbg_g_register()
1578 reg->size = 2; in sd_dbg_g_register()
1580 i2c_r1(gspca_dev, reg->reg, (u8 *) ®->val); in sd_dbg_g_register()
1582 return gspca_dev->usb_err; in sd_dbg_g_register()
1584 return -EINVAL; in sd_dbg_g_register()
1592 switch (reg->match.addr) { in sd_dbg_s_register()
1594 if (reg->reg < 0x1000 || reg->reg > 0x11ff) in sd_dbg_s_register()
1595 return -EINVAL; in sd_dbg_s_register()
1596 reg_w1(gspca_dev, reg->reg, reg->val); in sd_dbg_s_register()
1597 return gspca_dev->usb_err; in sd_dbg_s_register()
1599 if (sd->sensor >= SENSOR_MT9V011 && in sd_dbg_s_register()
1600 sd->sensor <= SENSOR_MT9M112) { in sd_dbg_s_register()
1601 i2c_w2(gspca_dev, reg->reg, reg->val); in sd_dbg_s_register()
1603 i2c_w1(gspca_dev, reg->reg, reg->val); in sd_dbg_s_register()
1605 return gspca_dev->usb_err; in sd_dbg_s_register()
1607 return -EINVAL; in sd_dbg_s_register()
1613 if (chip->match.addr > 1) in sd_chip_info()
1614 return -EINVAL; in sd_chip_info()
1615 if (chip->match.addr == 1) in sd_chip_info()
1616 strscpy(chip->name, "sensor", sizeof(chip->name)); in sd_chip_info()
1627 cam = &gspca_dev->cam; in sd_config()
1628 cam->needs_full_bandwidth = 1; in sd_config()
1630 sd->sensor = id->driver_info >> 8; in sd_config()
1631 sd->i2c_addr = id->driver_info; in sd_config()
1632 sd->flags = id->driver_info >> 16; in sd_config()
1633 sd->i2c_intf = 0x80; /* i2c 100 Kb/s */ in sd_config()
1635 switch (sd->sensor) { in sd_config()
1640 cam->cam_mode = sxga_mode; in sd_config()
1641 cam->nmodes = ARRAY_SIZE(sxga_mode); in sd_config()
1644 cam->cam_mode = mono_mode; in sd_config()
1645 cam->nmodes = ARRAY_SIZE(mono_mode); in sd_config()
1648 sd->i2c_intf = 0x81; /* i2c 400 Kb/s */ in sd_config()
1651 cam->cam_mode = vga_mode; in sd_config()
1652 cam->nmodes = ARRAY_SIZE(vga_mode); in sd_config()
1656 sd->old_step = 0; in sd_config()
1657 sd->older_step = 0; in sd_config()
1658 sd->exposure_step = 16; in sd_config()
1660 INIT_WORK(&sd->work, qual_upd); in sd_config()
1668 container_of(ctrl->handler, struct gspca_dev, ctrl_handler); in sd_s_ctrl()
1671 gspca_dev->usb_err = 0; in sd_s_ctrl()
1673 if (!gspca_dev->streaming) in sd_s_ctrl()
1676 switch (ctrl->id) { in sd_s_ctrl()
1679 set_cmatrix(gspca_dev, sd->brightness->val, in sd_s_ctrl()
1680 sd->contrast->val, sd->saturation->val, sd->hue->val); in sd_s_ctrl()
1683 set_gamma(gspca_dev, ctrl->val); in sd_s_ctrl()
1687 set_redblue(gspca_dev, sd->blue->val, sd->red->val); in sd_s_ctrl()
1691 set_hvflip(gspca_dev, sd->hflip->val, sd->vflip->val); in sd_s_ctrl()
1695 set_exposure(gspca_dev, ctrl->val); in sd_s_ctrl()
1699 set_gain(gspca_dev, ctrl->val); in sd_s_ctrl()
1703 if (sd->sensor == SENSOR_SOI968) in sd_s_ctrl()
1704 set_gain(gspca_dev, sd->gain->val); in sd_s_ctrl()
1706 set_exposure(gspca_dev, sd->exposure->val); in sd_s_ctrl()
1709 set_quality(gspca_dev, ctrl->val); in sd_s_ctrl()
1712 set_led_mode(gspca_dev, ctrl->val); in sd_s_ctrl()
1715 return gspca_dev->usb_err; in sd_s_ctrl()
1725 struct v4l2_ctrl_handler *hdl = &gspca_dev->ctrl_handler; in sd_init_controls()
1727 gspca_dev->vdev.ctrl_handler = hdl; in sd_init_controls()
1730 sd->brightness = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops, in sd_init_controls()
1732 sd->contrast = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops, in sd_init_controls()
1734 sd->saturation = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops, in sd_init_controls()
1736 sd->hue = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops, in sd_init_controls()
1737 V4L2_CID_HUE, -180, 180, 1, 0); in sd_init_controls()
1739 sd->gamma = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops, in sd_init_controls()
1742 sd->blue = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops, in sd_init_controls()
1744 sd->red = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops, in sd_init_controls()
1747 if (sd->sensor != SENSOR_OV9655 && sd->sensor != SENSOR_SOI968 && in sd_init_controls()
1748 sd->sensor != SENSOR_OV7670 && sd->sensor != SENSOR_MT9M001 && in sd_init_controls()
1749 sd->sensor != SENSOR_MT9VPRB) { in sd_init_controls()
1750 sd->hflip = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops, in sd_init_controls()
1752 sd->vflip = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops, in sd_init_controls()
1756 if (sd->sensor != SENSOR_SOI968 && sd->sensor != SENSOR_MT9VPRB && in sd_init_controls()
1757 sd->sensor != SENSOR_MT9M112 && sd->sensor != SENSOR_MT9M111 && in sd_init_controls()
1758 sd->sensor != SENSOR_MT9V111) in sd_init_controls()
1759 sd->exposure = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops, in sd_init_controls()
1762 if (sd->sensor != SENSOR_MT9VPRB && sd->sensor != SENSOR_MT9M112 && in sd_init_controls()
1763 sd->sensor != SENSOR_MT9M111 && sd->sensor != SENSOR_MT9V111) { in sd_init_controls()
1764 sd->gain = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops, in sd_init_controls()
1766 sd->autogain = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops, in sd_init_controls()
1770 sd->jpegqual = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops, in sd_init_controls()
1773 if (sd->flags & HAS_LED_TORCH) in sd_init_controls()
1774 sd->led_mode = v4l2_ctrl_new_std_menu(hdl, &sd_ctrl_ops, in sd_init_controls()
1778 if (hdl->error) { in sd_init_controls()
1780 return hdl->error; in sd_init_controls()
1783 v4l2_ctrl_cluster(4, &sd->brightness); in sd_init_controls()
1784 v4l2_ctrl_cluster(2, &sd->blue); in sd_init_controls()
1785 if (sd->hflip) in sd_init_controls()
1786 v4l2_ctrl_cluster(2, &sd->hflip); in sd_init_controls()
1787 if (sd->autogain) { in sd_init_controls()
1788 if (sd->sensor == SENSOR_SOI968) in sd_init_controls()
1789 /* this sensor doesn't have the exposure control and in sd_init_controls()
1791 because sd->exposure == NULL. */ in sd_init_controls()
1792 v4l2_ctrl_auto_cluster(3, &sd->autogain, 0, false); in sd_init_controls()
1795 v4l2_ctrl_auto_cluster(2, &sd->autogain, 0, false); in sd_init_controls()
1806 0x80, sd->i2c_addr, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03 in sd_init()
1812 if (gspca_dev->usb_err < 0) { in sd_init()
1814 return gspca_dev->usb_err; in sd_init()
1818 if (sd->flags & LED_REVERSE) in sd_init()
1824 if (gspca_dev->usb_err < 0) { in sd_init()
1826 return gspca_dev->usb_err; in sd_init()
1829 switch (sd->sensor) { in sd_init()
1832 if (gspca_dev->usb_err < 0) in sd_init()
1834 pr_info("OV9650 sensor detected\n"); in sd_init()
1838 if (gspca_dev->usb_err < 0) in sd_init()
1840 pr_info("OV9655 sensor detected\n"); in sd_init()
1844 if (gspca_dev->usb_err < 0) in sd_init()
1846 pr_info("SOI968 sensor detected\n"); in sd_init()
1850 if (gspca_dev->usb_err < 0) in sd_init()
1852 pr_info("OV7660 sensor detected\n"); in sd_init()
1856 if (gspca_dev->usb_err < 0) in sd_init()
1858 pr_info("OV7670 sensor detected\n"); in sd_init()
1862 if (gspca_dev->usb_err < 0) in sd_init()
1864 pr_info("MT9VPRB sensor detected\n"); in sd_init()
1868 if (gspca_dev->usb_err < 0) in sd_init()
1870 pr_info("MT9M111 sensor detected\n"); in sd_init()
1874 if (gspca_dev->usb_err < 0) in sd_init()
1876 pr_info("MT9M112 sensor detected\n"); in sd_init()
1880 if (gspca_dev->usb_err < 0) in sd_init()
1885 if (gspca_dev->usb_err < 0) in sd_init()
1887 pr_info("HV7131R sensor detected\n"); in sd_init()
1890 pr_err("Unsupported sensor\n"); in sd_init()
1891 gspca_dev->usb_err = -ENODEV; in sd_init()
1893 return gspca_dev->usb_err; in sd_init()
1901 switch (sd->sensor) { in configure_sensor_output()
1909 sd->hstart = 140; in configure_sensor_output()
1910 sd->vstart = 19; in configure_sensor_output()
1917 sd->hstart = 60; in configure_sensor_output()
1918 sd->vstart = 11; in configure_sensor_output()
1956 u32 flags = gspca_dev->cam.cam_mode[(int)gspca_dev->curr_mode].priv; in sd_isoc_init()
1964 intf = usb_ifnum_to_if(gspca_dev->dev, gspca_dev->iface); in sd_isoc_init()
1966 if (intf->num_altsetting != 9) { in sd_isoc_init()
1968 intf->num_altsetting); in sd_isoc_init()
1969 gspca_dev->alt = intf->num_altsetting; in sd_isoc_init()
1973 switch (gspca_dev->pixfmt.width) { in sd_isoc_init()
1975 gspca_dev->alt = 2; in sd_isoc_init()
1978 gspca_dev->alt = 6; in sd_isoc_init()
1981 gspca_dev->alt = 9; in sd_isoc_init()
2002 int mode = gspca_dev->cam.cam_mode[(int) gspca_dev->curr_mode].priv; in sd_start()
2003 int width = gspca_dev->pixfmt.width; in sd_start()
2004 int height = gspca_dev->pixfmt.height; in sd_start()
2007 jpeg_define(sd->jpeg_hdr, height, width, in sd_start()
2009 jpeg_set_qual(sd->jpeg_hdr, v4l2_ctrl_g_ctrl(sd->jpegqual)); in sd_start()
2017 sd->fmt = fmt; in sd_start()
2039 reg_w(gspca_dev, 0x1100, &sd->jpeg_hdr[JPEG_QT0_OFFSET], 64); in sd_start()
2040 reg_w(gspca_dev, 0x1140, &sd->jpeg_hdr[JPEG_QT1_OFFSET], 64); in sd_start()
2042 reg_w(gspca_dev, 0x1180, HW_WIN(mode, sd->hstart, sd->vstart), 6); in sd_start()
2046 set_cmatrix(gspca_dev, v4l2_ctrl_g_ctrl(sd->brightness), in sd_start()
2047 v4l2_ctrl_g_ctrl(sd->contrast), in sd_start()
2048 v4l2_ctrl_g_ctrl(sd->saturation), in sd_start()
2049 v4l2_ctrl_g_ctrl(sd->hue)); in sd_start()
2050 set_gamma(gspca_dev, v4l2_ctrl_g_ctrl(sd->gamma)); in sd_start()
2051 set_redblue(gspca_dev, v4l2_ctrl_g_ctrl(sd->blue), in sd_start()
2052 v4l2_ctrl_g_ctrl(sd->red)); in sd_start()
2053 if (sd->gain) in sd_start()
2054 set_gain(gspca_dev, v4l2_ctrl_g_ctrl(sd->gain)); in sd_start()
2055 if (sd->exposure) in sd_start()
2056 set_exposure(gspca_dev, v4l2_ctrl_g_ctrl(sd->exposure)); in sd_start()
2057 if (sd->hflip) in sd_start()
2058 set_hvflip(gspca_dev, v4l2_ctrl_g_ctrl(sd->hflip), in sd_start()
2059 v4l2_ctrl_g_ctrl(sd->vflip)); in sd_start()
2066 sd->pktsz = sd->npkt = 0; in sd_start()
2067 sd->nchg = 0; in sd_start()
2069 if (sd->led_mode) in sd_start()
2070 v4l2_ctrl_s_ctrl(sd->led_mode, 0); in sd_start()
2072 return gspca_dev->usb_err; in sd_start()
2082 /* the usb_lock is held at entry - restore on exit */
2087 mutex_unlock(&gspca_dev->usb_lock); in sd_stop0()
2088 flush_work(&sd->work); in sd_stop0()
2089 mutex_lock(&gspca_dev->usb_lock); in sd_stop0()
2095 s32 cur_exp = v4l2_ctrl_g_ctrl(sd->exposure); in do_autoexposure()
2096 s32 max = sd->exposure->maximum - sd->exposure_step; in do_autoexposure()
2097 s32 min = sd->exposure->minimum + sd->exposure_step; in do_autoexposure()
2109 new_exp = cur_exp + sd->exposure_step; in do_autoexposure()
2114 v4l2_ctrl_s_ctrl(sd->exposure, new_exp); in do_autoexposure()
2116 sd->older_step = sd->old_step; in do_autoexposure()
2117 sd->old_step = 1; in do_autoexposure()
2119 if (sd->old_step ^ sd->older_step) in do_autoexposure()
2120 sd->exposure_step /= 2; in do_autoexposure()
2122 sd->exposure_step += 2; in do_autoexposure()
2127 new_exp = cur_exp - sd->exposure_step; in do_autoexposure()
2132 v4l2_ctrl_s_ctrl(sd->exposure, new_exp); in do_autoexposure()
2133 sd->older_step = sd->old_step; in do_autoexposure()
2134 sd->old_step = 0; in do_autoexposure()
2136 if (sd->old_step ^ sd->older_step) in do_autoexposure()
2137 sd->exposure_step /= 2; in do_autoexposure()
2139 sd->exposure_step += 2; in do_autoexposure()
2146 s32 cur_gain = v4l2_ctrl_g_ctrl(sd->gain); in do_autogain()
2148 if (avg_lum < MIN_AVG_LUM && cur_gain < sd->gain->maximum) in do_autogain()
2149 v4l2_ctrl_s_ctrl(sd->gain, cur_gain + 1); in do_autogain()
2150 if (avg_lum > MAX_AVG_LUM && cur_gain > sd->gain->minimum) in do_autogain()
2151 v4l2_ctrl_s_ctrl(sd->gain, cur_gain - 1); in do_autogain()
2159 if (sd->autogain == NULL || !v4l2_ctrl_g_ctrl(sd->autogain)) in sd_dqcallback()
2162 avg_lum = atomic_read(&sd->avg_lum); in sd_dqcallback()
2163 if (sd->sensor == SENSOR_SOI968) in sd_dqcallback()
2174 struct gspca_dev *gspca_dev = &sd->gspca_dev; in qual_upd()
2175 s32 qual = v4l2_ctrl_g_ctrl(sd->jpegqual); in qual_upd()
2177 /* To protect gspca_dev->usb_buf and gspca_dev->usb_err */ in qual_upd()
2178 mutex_lock(&gspca_dev->usb_lock); in qual_upd()
2180 gspca_dev->usb_err = 0; in qual_upd()
2182 mutex_unlock(&gspca_dev->usb_lock); in qual_upd()
2192 if (!(sd->flags & HAS_NO_BUTTON) && len == 1) { in sd_int_pkt_scan()
2193 input_report_key(gspca_dev->input_dev, KEY_CAMERA, 1); in sd_int_pkt_scan()
2194 input_sync(gspca_dev->input_dev); in sd_int_pkt_scan()
2195 input_report_key(gspca_dev->input_dev, KEY_CAMERA, 0); in sd_int_pkt_scan()
2196 input_sync(gspca_dev->input_dev); in sd_int_pkt_scan()
2199 return -EINVAL; in sd_int_pkt_scan()
2214 gspca_dev->last_packet_type = DISCARD_PACKET; in transfer_check()
2215 new_qual = -5; in transfer_check()
2219 r = (sd->pktsz * 100) / in transfer_check()
2220 (sd->npkt * in transfer_check()
2221 gspca_dev->urb[0]->iso_frame_desc[0].length); in transfer_check()
2223 new_qual = -3; in transfer_check()
2228 sd->nchg += new_qual; in transfer_check()
2229 if (sd->nchg < -6 || sd->nchg >= 12) { in transfer_check()
2233 s32 curqual = sd->jpegqual->cur.val; in transfer_check()
2234 sd->nchg = 0; in transfer_check()
2236 if (new_qual < sd->jpegqual->minimum) in transfer_check()
2237 new_qual = sd->jpegqual->minimum; in transfer_check()
2238 else if (new_qual > sd->jpegqual->maximum) in transfer_check()
2239 new_qual = sd->jpegqual->maximum; in transfer_check()
2241 sd->jpegqual->cur.val = new_qual; in transfer_check()
2242 schedule_work(&sd->work); in transfer_check()
2246 sd->nchg = 0; in transfer_check()
2248 sd->pktsz = sd->npkt = 0; in transfer_check()
2261 is_jpeg = (sd->fmt & 0x03) == 0; in sd_pkt_scan()
2288 atomic_set(&sd->avg_lum, avg_lum); in sd_pkt_scan()
2294 len -= 64; in sd_pkt_scan()
2299 if (gspca_dev->last_packet_type == LAST_PACKET) { in sd_pkt_scan()
2302 sd->jpeg_hdr, JPEG_HDR_SZ); in sd_pkt_scan()
2312 sd->npkt++; in sd_pkt_scan()
2313 sd->pktsz += len; in sd_pkt_scan()
2319 /* sub-driver description */
2341 #define SN9C20X(sensor, i2c_addr, flags) \ argument
2343 | (SENSOR_ ## sensor << 8) \
2389 /* -- device connect -- */