mr97310a.c 29.9 KB
Newer Older
1 2 3
/*
 * Mars MR97310A library
 *
4
 * The original mr97310a driver, which supported the Aiptek Pencam VGA+, is
5 6
 * Copyright (C) 2009 Kyle Guinn <elyk03@gmail.com>
 *
7 8
 * Support for the MR97310A cameras in addition to the Aiptek Pencam VGA+
 * and for the routines for detecting and classifying these various cameras,
9
 * is Copyright (C) 2009 Theodore Kilgore <kilgota@auburn.edu>
10
 *
11
 * Support for the control settings for the CIF cameras is
12
 * Copyright (C) 2009 Hans de Goede <hdegoede@redhat.com> and
13 14 15
 * Thomas Kaiser <thomas@kaiser-linux.li>
 *
 * Support for the control settings for the VGA cameras is
16 17
 * Copyright (C) 2009 Theodore Kilgore <kilgota@auburn.edu>
 *
18
 * Several previously unsupported cameras are owned and have been tested by
19
 * Hans de Goede <hdegoede@redhat.com> and
20
 * Thomas Kaiser <thomas@kaiser-linux.li> and
21 22 23
 * Theodore Kilgore <kilgota@auburn.edu> and
 * Edmond Rodriguez <erodrig_97@yahoo.com> and
 * Aurelien Jacobs <aurel@gnuage.org>
24 25 26 27
 *
 * The MR97311A support in gspca/mars.c has been helpful in understanding some
 * of the registers in these cameras.
 *
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 */

43 44
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt

45 46 47 48
#define MODULE_NAME "mr97310a"

#include "gspca.h"

49 50 51 52 53
#define CAM_TYPE_CIF			0
#define CAM_TYPE_VGA			1

#define MR97310A_BRIGHTNESS_DEFAULT	0

54
#define MR97310A_EXPOSURE_MIN		0
55 56 57 58 59 60 61
#define MR97310A_EXPOSURE_MAX		4095
#define MR97310A_EXPOSURE_DEFAULT	1000

#define MR97310A_GAIN_MIN		0
#define MR97310A_GAIN_MAX		31
#define MR97310A_GAIN_DEFAULT		25

62 63 64 65 66 67 68 69
#define MR97310A_CONTRAST_MIN		0
#define MR97310A_CONTRAST_MAX		31
#define MR97310A_CONTRAST_DEFAULT	23

#define MR97310A_CS_GAIN_MIN		0
#define MR97310A_CS_GAIN_MAX		0x7ff
#define MR97310A_CS_GAIN_DEFAULT	0x110

70
#define MR97310A_CID_CLOCKDIV (V4L2_CTRL_CLASS_USER + 0x1000)
71 72 73 74
#define MR97310A_MIN_CLOCKDIV_MIN	3
#define MR97310A_MIN_CLOCKDIV_MAX	8
#define MR97310A_MIN_CLOCKDIV_DEFAULT	3

75 76
MODULE_AUTHOR("Kyle Guinn <elyk03@gmail.com>,"
	      "Theodore Kilgore <kilgota@auburn.edu>");
77 78 79
MODULE_DESCRIPTION("GSPCA/Mars-Semi MR97310A USB Camera Driver");
MODULE_LICENSE("GPL");

80
/* global parameters */
81
static int force_sensor_type = -1;
82 83 84
module_param(force_sensor_type, int, 0644);
MODULE_PARM_DESC(force_sensor_type, "Force sensor type (-1 (auto), 0 or 1)");

85 86 87
/* specific webcam descriptor */
struct sd {
	struct gspca_dev gspca_dev;  /* !! must be the first item */
88 89 90 91
	struct { /* exposure/min_clockdiv control cluster */
		struct v4l2_ctrl *exposure;
		struct v4l2_ctrl *min_clockdiv;
	};
92
	u8 sof_read;
93 94 95
	u8 cam_type;	/* 0 is CIF and 1 is VGA */
	u8 sensor_type;	/* We use 0 and 1 here, too. */
	u8 do_lcd_stop;
96
	u8 adj_colors;
97 98
};

99 100 101 102 103 104 105
struct sensor_w_data {
	u8 reg;
	u8 flags;
	u8 data[16];
	int len;
};

106
static void sd_stopN(struct gspca_dev *gspca_dev);
107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136

static const struct v4l2_pix_format vga_mode[] = {
	{160, 120, V4L2_PIX_FMT_MR97310A, V4L2_FIELD_NONE,
		.bytesperline = 160,
		.sizeimage = 160 * 120,
		.colorspace = V4L2_COLORSPACE_SRGB,
		.priv = 4},
	{176, 144, V4L2_PIX_FMT_MR97310A, V4L2_FIELD_NONE,
		.bytesperline = 176,
		.sizeimage = 176 * 144,
		.colorspace = V4L2_COLORSPACE_SRGB,
		.priv = 3},
	{320, 240, V4L2_PIX_FMT_MR97310A, V4L2_FIELD_NONE,
		.bytesperline = 320,
		.sizeimage = 320 * 240,
		.colorspace = V4L2_COLORSPACE_SRGB,
		.priv = 2},
	{352, 288, V4L2_PIX_FMT_MR97310A, V4L2_FIELD_NONE,
		.bytesperline = 352,
		.sizeimage = 352 * 288,
		.colorspace = V4L2_COLORSPACE_SRGB,
		.priv = 1},
	{640, 480, V4L2_PIX_FMT_MR97310A, V4L2_FIELD_NONE,
		.bytesperline = 640,
		.sizeimage = 640 * 480,
		.colorspace = V4L2_COLORSPACE_SRGB,
		.priv = 0},
};

/* the bytes to write are in gspca_dev->usb_buf */
137
static int mr_write(struct gspca_dev *gspca_dev, int len)
138 139 140 141 142
{
	int rc;

	rc = usb_bulk_msg(gspca_dev->dev,
			  usb_sndbulkpipe(gspca_dev->dev, 4),
143
			  gspca_dev->usb_buf, len, NULL, 500);
144
	if (rc < 0)
145
		pr_err("reg write [%02x] error %d\n",
146 147 148 149
		       gspca_dev->usb_buf[0], rc);
	return rc;
}

150 151 152 153 154 155 156 157 158
/* the bytes are read into gspca_dev->usb_buf */
static int mr_read(struct gspca_dev *gspca_dev, int len)
{
	int rc;

	rc = usb_bulk_msg(gspca_dev->dev,
			  usb_rcvbulkpipe(gspca_dev->dev, 3),
			  gspca_dev->usb_buf, len, NULL, 500);
	if (rc < 0)
159
		pr_err("reg read [%02x] error %d\n",
160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191
		       gspca_dev->usb_buf[0], rc);
	return rc;
}

static int sensor_write_reg(struct gspca_dev *gspca_dev, u8 reg, u8 flags,
	const u8 *data, int len)
{
	gspca_dev->usb_buf[0] = 0x1f;
	gspca_dev->usb_buf[1] = flags;
	gspca_dev->usb_buf[2] = reg;
	memcpy(gspca_dev->usb_buf + 3, data, len);

	return mr_write(gspca_dev, len + 3);
}

static int sensor_write_regs(struct gspca_dev *gspca_dev,
	const struct sensor_w_data *data, int len)
{
	int i, rc;

	for (i = 0; i < len; i++) {
		rc = sensor_write_reg(gspca_dev, data[i].reg, data[i].flags,
					  data[i].data, data[i].len);
		if (rc < 0)
			return rc;
	}

	return 0;
}

static int sensor_write1(struct gspca_dev *gspca_dev, u8 reg, u8 data)
{
192 193
	struct sd *sd = (struct sd *) gspca_dev;
	u8 buf, confirm_reg;
194 195 196
	int rc;

	buf = data;
197 198 199 200 201 202 203
	if (sd->cam_type == CAM_TYPE_CIF) {
		rc = sensor_write_reg(gspca_dev, reg, 0x01, &buf, 1);
		confirm_reg = sd->sensor_type ? 0x13 : 0x11;
	} else {
		rc = sensor_write_reg(gspca_dev, reg, 0x00, &buf, 1);
		confirm_reg = 0x11;
	}
204 205 206 207
	if (rc < 0)
		return rc;

	buf = 0x01;
208
	rc = sensor_write_reg(gspca_dev, confirm_reg, 0x00, &buf, 1);
209 210 211 212 213 214
	if (rc < 0)
		return rc;

	return 0;
}

215
static int cam_get_response16(struct gspca_dev *gspca_dev, u8 reg, int verbose)
216 217 218
{
	int err_code;

219
	gspca_dev->usb_buf[0] = reg;
220 221 222 223 224
	err_code = mr_write(gspca_dev, 1);
	if (err_code < 0)
		return err_code;

	err_code = mr_read(gspca_dev, 16);
225 226 227 228 229 230 231 232 233 234
	if (err_code < 0)
		return err_code;

	if (verbose)
		PDEBUG(D_PROBE, "Register: %02x reads %02x%02x%02x", reg,
		       gspca_dev->usb_buf[0],
		       gspca_dev->usb_buf[1],
		       gspca_dev->usb_buf[2]);

	return 0;
235 236 237 238 239 240 241 242 243
}

static int zero_the_pointer(struct gspca_dev *gspca_dev)
{
	__u8 *data = gspca_dev->usb_buf;
	int err_code;
	u8 status = 0;
	int tries = 0;

244
	err_code = cam_get_response16(gspca_dev, 0x21, 0);
245 246 247 248 249 250 251 252 253
	if (err_code < 0)
		return err_code;

	data[0] = 0x19;
	data[1] = 0x51;
	err_code = mr_write(gspca_dev, 2);
	if (err_code < 0)
		return err_code;

254
	err_code = cam_get_response16(gspca_dev, 0x21, 0);
255 256 257 258 259 260 261 262 263
	if (err_code < 0)
		return err_code;

	data[0] = 0x19;
	data[1] = 0xba;
	err_code = mr_write(gspca_dev, 2);
	if (err_code < 0)
		return err_code;

264
	err_code = cam_get_response16(gspca_dev, 0x21, 0);
265 266 267 268 269 270 271 272 273
	if (err_code < 0)
		return err_code;

	data[0] = 0x19;
	data[1] = 0x00;
	err_code = mr_write(gspca_dev, 2);
	if (err_code < 0)
		return err_code;

274
	err_code = cam_get_response16(gspca_dev, 0x21, 0);
275 276 277 278 279 280 281 282 283 284
	if (err_code < 0)
		return err_code;

	data[0] = 0x19;
	data[1] = 0x00;
	err_code = mr_write(gspca_dev, 2);
	if (err_code < 0)
		return err_code;

	while (status != 0x0a && tries < 256) {
285
		err_code = cam_get_response16(gspca_dev, 0x21, 0);
286 287 288 289 290
		status = data[0];
		tries++;
		if (err_code < 0)
			return err_code;
	}
291 292
	if (status != 0x0a)
		PDEBUG(D_ERR, "status is %02x", status);
293 294 295 296 297 298 299 300 301

	tries = 0;
	while (tries < 4) {
		data[0] = 0x19;
		data[1] = 0x00;
		err_code = mr_write(gspca_dev, 2);
		if (err_code < 0)
			return err_code;

302
		err_code = cam_get_response16(gspca_dev, 0x21, 0);
303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320
		status = data[0];
		tries++;
		if (err_code < 0)
			return err_code;
	}

	data[0] = 0x19;
	err_code = mr_write(gspca_dev, 1);
	if (err_code < 0)
		return err_code;

	err_code = mr_read(gspca_dev, 16);
	if (err_code < 0)
		return err_code;

	return 0;
}

321
static int stream_start(struct gspca_dev *gspca_dev)
322
{
323 324 325 326
	gspca_dev->usb_buf[0] = 0x01;
	gspca_dev->usb_buf[1] = 0x01;
	return mr_write(gspca_dev, 2);
}
327

328 329 330 331 332 333 334
static void stream_stop(struct gspca_dev *gspca_dev)
{
	gspca_dev->usb_buf[0] = 0x01;
	gspca_dev->usb_buf[1] = 0x00;
	if (mr_write(gspca_dev, 2) < 0)
		PDEBUG(D_ERR, "Stream Stop failed");
}
335

336 337 338 339 340 341 342
static void lcd_stop(struct gspca_dev *gspca_dev)
{
	gspca_dev->usb_buf[0] = 0x19;
	gspca_dev->usb_buf[1] = 0x54;
	if (mr_write(gspca_dev, 2) < 0)
		PDEBUG(D_ERR, "LCD Stop failed");
}
343

344 345 346
static int isoc_enable(struct gspca_dev *gspca_dev)
{
	gspca_dev->usb_buf[0] = 0x00;
L
Lucas De Marchi 已提交
347
	gspca_dev->usb_buf[1] = 0x4d;  /* ISOC transferring enable... */
348
	return mr_write(gspca_dev, 2);
349 350
}

351
/* This function is called at probe time */
352 353 354
static int sd_config(struct gspca_dev *gspca_dev,
		     const struct usb_device_id *id)
{
355
	struct sd *sd = (struct sd *) gspca_dev;
356
	struct cam *cam;
357
	int err_code;
358 359 360 361

	cam = &gspca_dev->cam;
	cam->cam_mode = vga_mode;
	cam->nmodes = ARRAY_SIZE(vga_mode);
362 363
	sd->do_lcd_stop = 0;

364 365 366 367 368
	/* Several of the supported CIF cameras share the same USB ID but
	 * require different initializations and different control settings.
	 * The same is true of the VGA cameras. Therefore, we are forced
	 * to start the initialization process in order to determine which
	 * camera is present. Some of the supported cameras require the
369 370 371 372 373 374
	 * memory pointer to be set to 0 as the very first item of business
	 * or else they will not stream. So we do that immediately.
	 */
	err_code = zero_the_pointer(gspca_dev);
	if (err_code < 0)
		return err_code;
375

376 377 378 379
	err_code = stream_start(gspca_dev);
	if (err_code < 0)
		return err_code;

380 381 382 383 384
	/* Now, the query for sensor type. */
	err_code = cam_get_response16(gspca_dev, 0x07, 1);
	if (err_code < 0)
		return err_code;

385
	if (id->idProduct == 0x0110 || id->idProduct == 0x010e) {
386
		sd->cam_type = CAM_TYPE_CIF;
387
		cam->nmodes--;
388
		/*
389 390 391 392
		 * All but one of the known CIF cameras share the same USB ID,
		 * but two different init routines are in use, and the control
		 * settings are different, too. We need to detect which camera
		 * of the two known varieties is connected!
393
		 *
394
		 * A list of known CIF cameras follows. They all report either
395
		 * 0200 for type 0 or 0300 for type 1.
396 397 398 399
		 * If you have another to report, please do
		 *
		 * Name		sd->sensor_type		reported by
		 *
400
		 * Sakar 56379 Spy-shot	0		T. Kilgore
401 402 403 404 405 406
		 * Innovage		0		T. Kilgore
		 * Vivitar Mini		0		H. De Goede
		 * Vivitar Mini		0		E. Rodriguez
		 * Vivitar Mini		1		T. Kilgore
		 * Elta-Media 8212dc	1		T. Kaiser
		 * Philips dig. keych.	1		T. Kilgore
407
		 * Trust Spyc@m 100	1		A. Jacobs
408
		 */
409
		switch (gspca_dev->usb_buf[0]) {
410
		case 2:
411
			sd->sensor_type = 0;
412 413 414 415 416
			break;
		case 3:
			sd->sensor_type = 1;
			break;
		default:
417
			pr_err("Unknown CIF Sensor id : %02x\n",
418 419 420
			       gspca_dev->usb_buf[1]);
			return -ENODEV;
		}
421 422
		PDEBUG(D_PROBE, "MR97310A CIF camera detected, sensor: %d",
		       sd->sensor_type);
423 424
	} else {
		sd->cam_type = CAM_TYPE_VGA;
425

426
		/*
427
		 * Here is a table of the responses to the query for sensor
428 429
		 * type, from the known MR97310A VGA cameras. Six different
		 * cameras of which five share the same USB ID.
430 431
		 *
		 * Name			gspca_dev->usb_buf[]	sd->sensor_type
432 433
		 *				sd->do_lcd_stop
		 * Aiptek Pencam VGA+	0300		0		1
434
		 * ION digital		0300		0		1
435 436
		 * Argus DC-1620	0450		1		0
		 * Argus QuickClix	0420		1		1
437 438
		 * Sakar 77379 Digital	0350		0		1
		 * Sakar 1638x CyberPix	0120		0		2
439
		 *
440 441
		 * Based upon these results, we assume default settings
		 * and then correct as necessary, as follows.
442 443 444
		 *
		 */

445 446
		sd->sensor_type = 1;
		sd->do_lcd_stop = 0;
447
		sd->adj_colors = 0;
448 449 450
		if (gspca_dev->usb_buf[0] == 0x01) {
			sd->sensor_type = 2;
		} else if ((gspca_dev->usb_buf[0] != 0x03) &&
451
					(gspca_dev->usb_buf[0] != 0x04)) {
452 453 454 455
			pr_err("Unknown VGA Sensor id Byte 0: %02x\n",
			       gspca_dev->usb_buf[0]);
			pr_err("Defaults assumed, may not work\n");
			pr_err("Please report this\n");
456
		}
457 458 459 460
		/* Sakar Digital color needs to be adjusted. */
		if ((gspca_dev->usb_buf[0] == 0x03) &&
					(gspca_dev->usb_buf[1] == 0x50))
			sd->adj_colors = 1;
461 462
		if (gspca_dev->usb_buf[0] == 0x04) {
			sd->do_lcd_stop = 1;
463 464
			switch (gspca_dev->usb_buf[1]) {
			case 0x50:
465 466
				sd->sensor_type = 0;
				PDEBUG(D_PROBE, "sensor_type corrected to 0");
467 468
				break;
			case 0x20:
469
				/* Nothing to do here. */
470 471
				break;
			default:
472 473 474 475
				pr_err("Unknown VGA Sensor id Byte 1: %02x\n",
				       gspca_dev->usb_buf[1]);
				pr_err("Defaults assumed, may not work\n");
				pr_err("Please report this\n");
476
			}
477
		}
478 479 480
		PDEBUG(D_PROBE, "MR97310A VGA camera detected, sensor: %d",
		       sd->sensor_type);
	}
481
	/* Stop streaming as we've started it only to probe the sensor type. */
482
	sd_stopN(gspca_dev);
483

484 485 486 487 488 489
	if (force_sensor_type != -1) {
		sd->sensor_type = !!force_sensor_type;
		PDEBUG(D_PROBE, "Forcing sensor type to: %d",
		       sd->sensor_type);
	}

490 491 492 493 494 495 496 497 498
	return 0;
}

/* this function is called at probe and resume time */
static int sd_init(struct gspca_dev *gspca_dev)
{
	return 0;
}

499
static int start_cif_cam(struct gspca_dev *gspca_dev)
500 501 502 503
{
	struct sd *sd = (struct sd *) gspca_dev;
	__u8 *data = gspca_dev->usb_buf;
	int err_code;
504
	static const __u8 startup_string[] = {
505 506 507 508 509 510 511 512 513 514 515 516 517 518
		0x00,
		0x0d,
		0x01,
		0x00, /* Hsize/8 for 352 or 320 */
		0x00, /* Vsize/4 for 288 or 240 */
		0x13, /* or 0xbb, depends on sensor */
		0x00, /* Hstart, depends on res. */
		0x00, /* reserved ? */
		0x00, /* Vstart, depends on res. and sensor */
		0x50, /* 0x54 to get 176 or 160 */
		0xc0
	};

	/* Note: Some of the above descriptions guessed from MR97113A driver */
519

520 521 522
	memcpy(data, startup_string, 11);
	if (sd->sensor_type)
		data[5] = 0xbb;
523 524 525

	switch (gspca_dev->width) {
	case 160:
526
		data[9] |= 0x04;  /* reg 8, 2:1 scale down from 320 */
527 528 529
		/* fall thru */
	case 320:
	default:
530 531 532 533
		data[3] = 0x28;			   /* reg 2, H size/8 */
		data[4] = 0x3c;			   /* reg 3, V size/4 */
		data[6] = 0x14;			   /* reg 5, H start  */
		data[8] = 0x1a + sd->sensor_type;  /* reg 7, V start  */
534 535
		break;
	case 176:
536
		data[9] |= 0x04;  /* reg 8, 2:1 scale down from 352 */
537 538
		/* fall thru */
	case 352:
539 540 541
		data[3] = 0x2c;			   /* reg 2, H size/8 */
		data[4] = 0x48;			   /* reg 3, V size/4 */
		data[6] = 0x06;			   /* reg 5, H start  */
542
		data[8] = 0x06 - sd->sensor_type;  /* reg 7, V start  */
543 544
		break;
	}
545
	err_code = mr_write(gspca_dev, 11);
546 547 548
	if (err_code < 0)
		return err_code;

549
	if (!sd->sensor_type) {
550
		static const struct sensor_w_data cif_sensor0_init_data[] = {
551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570
			{0x02, 0x00, {0x03, 0x5a, 0xb5, 0x01,
				      0x0f, 0x14, 0x0f, 0x10}, 8},
			{0x0c, 0x00, {0x04, 0x01, 0x01, 0x00, 0x1f}, 5},
			{0x12, 0x00, {0x07}, 1},
			{0x1f, 0x00, {0x06}, 1},
			{0x27, 0x00, {0x04}, 1},
			{0x29, 0x00, {0x0c}, 1},
			{0x40, 0x00, {0x40, 0x00, 0x04}, 3},
			{0x50, 0x00, {0x60}, 1},
			{0x60, 0x00, {0x06}, 1},
			{0x6b, 0x00, {0x85, 0x85, 0xc8, 0xc8, 0xc8, 0xc8}, 6},
			{0x72, 0x00, {0x1e, 0x56}, 2},
			{0x75, 0x00, {0x58, 0x40, 0xa2, 0x02, 0x31, 0x02,
				      0x31, 0x80, 0x00}, 9},
			{0x11, 0x00, {0x01}, 1},
			{0, 0, {0}, 0}
		};
		err_code = sensor_write_regs(gspca_dev, cif_sensor0_init_data,
					 ARRAY_SIZE(cif_sensor0_init_data));
	} else {	/* sd->sensor_type = 1 */
571
		static const struct sensor_w_data cif_sensor1_init_data[] = {
572
			/* Reg 3,4, 7,8 get set by the controls */
573
			{0x02, 0x00, {0x10}, 1},
574 575
			{0x05, 0x01, {0x22}, 1}, /* 5/6 also seen as 65h/32h */
			{0x06, 0x01, {0x00}, 1},
576 577 578 579
			{0x09, 0x02, {0x0e}, 1},
			{0x0a, 0x02, {0x05}, 1},
			{0x0b, 0x02, {0x05}, 1},
			{0x0c, 0x02, {0x0f}, 1},
580
			{0x0d, 0x02, {0x07}, 1},
581 582 583 584 585 586 587 588
			{0x0e, 0x02, {0x0c}, 1},
			{0x0f, 0x00, {0x00}, 1},
			{0x10, 0x00, {0x06}, 1},
			{0x11, 0x00, {0x07}, 1},
			{0x12, 0x00, {0x00}, 1},
			{0x13, 0x00, {0x01}, 1},
			{0, 0, {0}, 0}
		};
589 590 591 592 593 594
		/* Without this command the cam won't work with USB-UHCI */
		gspca_dev->usb_buf[0] = 0x0a;
		gspca_dev->usb_buf[1] = 0x00;
		err_code = mr_write(gspca_dev, 2);
		if (err_code < 0)
			return err_code;
595 596 597
		err_code = sensor_write_regs(gspca_dev, cif_sensor1_init_data,
					 ARRAY_SIZE(cif_sensor1_init_data));
	}
598
	return err_code;
599
}
600

601 602 603 604 605
static int start_vga_cam(struct gspca_dev *gspca_dev)
{
	struct sd *sd = (struct sd *) gspca_dev;
	__u8 *data = gspca_dev->usb_buf;
	int err_code;
606 607 608
	static const __u8 startup_string[] =
		{0x00, 0x0d, 0x01, 0x00, 0x00, 0x2b, 0x00, 0x00,
		 0x00, 0x50, 0xc0};
609
	/* What some of these mean is explained in start_cif_cam(), above */
610

611 612 613 614 615
	memcpy(data, startup_string, 11);
	if (!sd->sensor_type) {
		data[5]  = 0x00;
		data[10] = 0x91;
	}
616 617 618 619
	if (sd->sensor_type == 2) {
		data[5]  = 0x00;
		data[10] = 0x18;
	}
620 621 622 623 624 625 626 627 628 629 630 631 632 633

	switch (gspca_dev->width) {
	case 160:
		data[9] |= 0x0c;  /* reg 8, 4:1 scale down */
		/* fall thru */
	case 320:
		data[9] |= 0x04;  /* reg 8, 2:1 scale down */
		/* fall thru */
	case 640:
	default:
		data[3] = 0x50;  /* reg 2, H size/8 */
		data[4] = 0x78;  /* reg 3, V size/4 */
		data[6] = 0x04;  /* reg 5, H start */
		data[8] = 0x03;  /* reg 7, V start */
634 635 636 637
		if (sd->sensor_type == 2) {
			data[6] = 2;
			data[8] = 1;
		}
638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655
		if (sd->do_lcd_stop)
			data[8] = 0x04;  /* Bayer tile shifted */
		break;

	case 176:
		data[9] |= 0x04;  /* reg 8, 2:1 scale down */
		/* fall thru */
	case 352:
		data[3] = 0x2c;  /* reg 2, H size */
		data[4] = 0x48;  /* reg 3, V size */
		data[6] = 0x94;  /* reg 5, H start */
		data[8] = 0x63;  /* reg 7, V start */
		if (sd->do_lcd_stop)
			data[8] = 0x64;  /* Bayer tile shifted */
		break;
	}

	err_code = mr_write(gspca_dev, 11);
656 657 658
	if (err_code < 0)
		return err_code;

659
	if (!sd->sensor_type) {
660
		static const struct sensor_w_data vga_sensor0_init_data[] = {
661 662 663 664 665 666 667 668 669
			{0x01, 0x00, {0x0c, 0x00, 0x04}, 3},
			{0x14, 0x00, {0x01, 0xe4, 0x02, 0x84}, 4},
			{0x20, 0x00, {0x00, 0x80, 0x00, 0x08}, 4},
			{0x25, 0x00, {0x03, 0xa9, 0x80}, 3},
			{0x30, 0x00, {0x30, 0x18, 0x10, 0x18}, 4},
			{0, 0, {0}, 0}
		};
		err_code = sensor_write_regs(gspca_dev, vga_sensor0_init_data,
					 ARRAY_SIZE(vga_sensor0_init_data));
670
	} else if (sd->sensor_type == 1) {
671
		static const struct sensor_w_data color_adj[] = {
672 673 674
			{0x02, 0x00, {0x06, 0x59, 0x0c, 0x16, 0x00,
				/* adjusted blue, green, red gain correct
				   too much blue from the Sakar Digital */
675
				0x05, 0x01, 0x04}, 8}
676 677
		};

678
		static const struct sensor_w_data color_no_adj[] = {
679
			{0x02, 0x00, {0x06, 0x59, 0x0c, 0x16, 0x00,
680 681 682 683
				/* default blue, green, red gain settings */
				0x07, 0x00, 0x01}, 8}
		};

684
		static const struct sensor_w_data vga_sensor1_init_data[] = {
685
			{0x11, 0x04, {0x01}, 1},
686 687 688
			{0x0a, 0x00, {0x00, 0x01, 0x00, 0x00, 0x01,
			/* These settings may be better for some cameras */
			/* {0x0a, 0x00, {0x01, 0x06, 0x00, 0x00, 0x01, */
689 690 691 692 693 694
				0x00, 0x0a}, 7},
			{0x11, 0x04, {0x01}, 1},
			{0x12, 0x00, {0x00, 0x63, 0x00, 0x70, 0x00, 0x00}, 6},
			{0x11, 0x04, {0x01}, 1},
			{0, 0, {0}, 0}
		};
695 696 697 698 699 700 701 702 703 704 705

		if (sd->adj_colors)
			err_code = sensor_write_regs(gspca_dev, color_adj,
					 ARRAY_SIZE(color_adj));
		else
			err_code = sensor_write_regs(gspca_dev, color_no_adj,
					 ARRAY_SIZE(color_no_adj));

		if (err_code < 0)
			return err_code;

706 707
		err_code = sensor_write_regs(gspca_dev, vga_sensor1_init_data,
					 ARRAY_SIZE(vga_sensor1_init_data));
708
	} else {	/* sensor type == 2 */
709
		static const struct sensor_w_data vga_sensor2_init_data[] = {
710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749

			{0x01, 0x00, {0x48}, 1},
			{0x02, 0x00, {0x22}, 1},
			/* Reg 3 msb and 4 is lsb of the exposure setting*/
			{0x05, 0x00, {0x10}, 1},
			{0x06, 0x00, {0x00}, 1},
			{0x07, 0x00, {0x00}, 1},
			{0x08, 0x00, {0x00}, 1},
			{0x09, 0x00, {0x00}, 1},
			/* The following are used in the gain control
			 * which is BTW completely borked in the OEM driver
			 * The values for each color go from 0 to 0x7ff
			 *{0x0a, 0x00, {0x01}, 1},  green1 gain msb
			 *{0x0b, 0x00, {0x10}, 1},  green1 gain lsb
			 *{0x0c, 0x00, {0x01}, 1},  red gain msb
			 *{0x0d, 0x00, {0x10}, 1},  red gain lsb
			 *{0x0e, 0x00, {0x01}, 1},  blue gain msb
			 *{0x0f, 0x00, {0x10}, 1},  blue gain lsb
			 *{0x10, 0x00, {0x01}, 1}, green2 gain msb
			 *{0x11, 0x00, {0x10}, 1}, green2 gain lsb
			 */
			{0x12, 0x00, {0x00}, 1},
			{0x13, 0x00, {0x04}, 1}, /* weird effect on colors */
			{0x14, 0x00, {0x00}, 1},
			{0x15, 0x00, {0x06}, 1},
			{0x16, 0x00, {0x01}, 1},
			{0x17, 0x00, {0xe2}, 1}, /* vertical alignment */
			{0x18, 0x00, {0x02}, 1},
			{0x19, 0x00, {0x82}, 1}, /* don't mess with */
			{0x1a, 0x00, {0x00}, 1},
			{0x1b, 0x00, {0x20}, 1},
			/* {0x1c, 0x00, {0x17}, 1}, contrast control */
			{0x1d, 0x00, {0x80}, 1}, /* moving causes a mess */
			{0x1e, 0x00, {0x08}, 1}, /* moving jams the camera */
			{0x1f, 0x00, {0x0c}, 1},
			{0x20, 0x00, {0x00}, 1},
			{0, 0, {0}, 0}
		};
		err_code = sensor_write_regs(gspca_dev, vga_sensor2_init_data,
					 ARRAY_SIZE(vga_sensor2_init_data));
750 751 752 753 754 755 756 757 758 759
	}
	return err_code;
}

static int sd_start(struct gspca_dev *gspca_dev)
{
	struct sd *sd = (struct sd *) gspca_dev;
	int err_code;

	sd->sof_read = 0;
760 761 762

	/* Some of the VGA cameras require the memory pointer
	 * to be set to 0 again. We have been forced to start the
763 764
	 * stream in sd_config() to detect the hardware, and closed it.
	 * Thus, we need here to do a completely fresh and clean start. */
765 766 767 768 769 770 771 772
	err_code = zero_the_pointer(gspca_dev);
	if (err_code < 0)
		return err_code;

	err_code = stream_start(gspca_dev);
	if (err_code < 0)
		return err_code;

773 774 775 776 777
	if (sd->cam_type == CAM_TYPE_CIF) {
		err_code = start_cif_cam(gspca_dev);
	} else {
		err_code = start_vga_cam(gspca_dev);
	}
778 779 780 781
	if (err_code < 0)
		return err_code;

	return isoc_enable(gspca_dev);
782 783 784 785
}

static void sd_stopN(struct gspca_dev *gspca_dev)
{
786 787
	struct sd *sd = (struct sd *) gspca_dev;

788
	stream_stop(gspca_dev);
789 790
	/* Not all the cams need this, but even if not, probably a good idea */
	zero_the_pointer(gspca_dev);
791 792
	if (sd->do_lcd_stop)
		lcd_stop(gspca_dev);
793 794
}

795
static void setbrightness(struct gspca_dev *gspca_dev, s32 val)
796 797
{
	struct sd *sd = (struct sd *) gspca_dev;
798 799
	u8 sign_reg = 7;  /* This reg and the next one used on CIF cams. */
	u8 value_reg = 8; /* VGA cams seem to use regs 0x0b and 0x0c */
800
	static const u8 quick_clix_table[] =
801 802 803 804 805 806 807
	/*	  0  1  2   3  4  5  6  7  8  9  10  11  12  13  14  15 */
		{ 0, 4, 8, 12, 1, 2, 3, 5, 6, 9,  7, 10, 13, 11, 14, 15};
	if (sd->cam_type == CAM_TYPE_VGA) {
		sign_reg += 4;
		value_reg += 4;
	}

808
	/* Note register 7 is also seen as 0x8x or 0xCx in some dumps */
809
	if (val > 0) {
810
		sensor_write1(gspca_dev, sign_reg, 0x00);
811
	} else {
812
		sensor_write1(gspca_dev, sign_reg, 0x01);
813
		val = 257 - val;
814
	}
815 816 817 818 819
	/* Use lookup table for funky Argus QuickClix brightness */
	if (sd->do_lcd_stop)
		val = quick_clix_table[val];

	sensor_write1(gspca_dev, value_reg, val);
820 821
}

822
static void setexposure(struct gspca_dev *gspca_dev, s32 expo, s32 min_clockdiv)
823 824
{
	struct sd *sd = (struct sd *) gspca_dev;
825
	int exposure = MR97310A_EXPOSURE_DEFAULT;
826
	u8 buf[2];
827

828
	if (sd->cam_type == CAM_TYPE_CIF && sd->sensor_type == 1) {
829
		/* This cam does not like exposure settings < 300,
830
		   so scale 0 - 4095 to 300 - 4095 */
831
		exposure = (expo * 9267) / 10000 + 300;
832 833
		sensor_write1(gspca_dev, 3, exposure >> 4);
		sensor_write1(gspca_dev, 4, exposure & 0x0f);
834
	} else if (sd->sensor_type == 2) {
835
		exposure = expo;
836 837 838
		exposure >>= 3;
		sensor_write1(gspca_dev, 3, exposure >> 8);
		sensor_write1(gspca_dev, 4, exposure & 0xff);
839 840 841
	} else {
		/* We have both a clock divider and an exposure register.
		   We first calculate the clock divider, as that determines
842
		   the maximum exposure and then we calculate the exposure
843 844 845 846
		   register setting (which goes from 0 - 511).

		   Note our 0 - 4095 exposure is mapped to 0 - 511
		   milliseconds exposure time */
847
		u8 clockdiv = (60 * expo + 7999) / 8000;
848 849

		/* Limit framerate to not exceed usb bandwidth */
850 851
		if (clockdiv < min_clockdiv && gspca_dev->width >= 320)
			clockdiv = min_clockdiv;
852 853 854
		else if (clockdiv < 2)
			clockdiv = 2;

855 856 857
		if (sd->cam_type == CAM_TYPE_VGA && clockdiv < 4)
			clockdiv = 4;

858 859
		/* Frame exposure time in ms = 1000 * clockdiv / 60 ->
		exposure = (sd->exposure / 8) * 511 / (1000 * clockdiv / 60) */
860
		exposure = (60 * 511 * expo) / (8000 * clockdiv);
861 862 863 864 865 866
		if (exposure > 511)
			exposure = 511;

		/* exposure register value is reversed! */
		exposure = 511 - exposure;

867 868 869
		buf[0] = exposure & 0xff;
		buf[1] = exposure >> 8;
		sensor_write_reg(gspca_dev, 0x0e, 0, buf, 2);
870 871
		sensor_write1(gspca_dev, 0x02, clockdiv);
	}
872 873
}

874
static void setgain(struct gspca_dev *gspca_dev, s32 val)
875 876
{
	struct sd *sd = (struct sd *) gspca_dev;
877
	u8 gainreg;
878

879
	if (sd->cam_type == CAM_TYPE_CIF && sd->sensor_type == 1)
880
		sensor_write1(gspca_dev, 0x0e, val);
881 882
	else if (sd->cam_type == CAM_TYPE_VGA && sd->sensor_type == 2)
		for (gainreg = 0x0a; gainreg < 0x11; gainreg += 2) {
883 884
			sensor_write1(gspca_dev, gainreg, val >> 8);
			sensor_write1(gspca_dev, gainreg + 1, val & 0xff);
885 886
		}
	else
887
		sensor_write1(gspca_dev, 0x10, val);
888 889
}

890
static void setcontrast(struct gspca_dev *gspca_dev, s32 val)
891
{
892
	sensor_write1(gspca_dev, 0x1c, val);
893 894
}

895
static int sd_s_ctrl(struct v4l2_ctrl *ctrl)
896
{
897 898 899
	struct gspca_dev *gspca_dev =
		container_of(ctrl->handler, struct gspca_dev, ctrl_handler);
	struct sd *sd = (struct sd *)gspca_dev;
900

901
	gspca_dev->usb_err = 0;
902

903 904
	if (!gspca_dev->streaming)
		return 0;
905

906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921
	switch (ctrl->id) {
	case V4L2_CID_BRIGHTNESS:
		setbrightness(gspca_dev, ctrl->val);
		break;
	case V4L2_CID_CONTRAST:
		setcontrast(gspca_dev, ctrl->val);
		break;
	case V4L2_CID_EXPOSURE:
		setexposure(gspca_dev, sd->exposure->val,
			    sd->min_clockdiv ? sd->min_clockdiv->val : 0);
		break;
	case V4L2_CID_GAIN:
		setgain(gspca_dev, ctrl->val);
		break;
	}
	return gspca_dev->usb_err;
922 923
}

924 925 926
static const struct v4l2_ctrl_ops sd_ctrl_ops = {
	.s_ctrl = sd_s_ctrl,
};
927

928
static int sd_init_controls(struct gspca_dev *gspca_dev)
929
{
930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948
	struct sd *sd = (struct sd *)gspca_dev;
	struct v4l2_ctrl_handler *hdl = &gspca_dev->ctrl_handler;
	static const struct v4l2_ctrl_config clockdiv = {
		.ops = &sd_ctrl_ops,
		.id = MR97310A_CID_CLOCKDIV,
		.type = V4L2_CTRL_TYPE_INTEGER,
		.name = "Minimum Clock Divider",
		.min = MR97310A_MIN_CLOCKDIV_MIN,
		.max = MR97310A_MIN_CLOCKDIV_MAX,
		.step = 1,
		.def = MR97310A_MIN_CLOCKDIV_DEFAULT,
	};
	bool has_brightness = false;
	bool has_argus_brightness = false;
	bool has_contrast = false;
	bool has_gain = false;
	bool has_cs_gain = false;
	bool has_exposure = false;
	bool has_clockdiv = false;
949

950 951
	gspca_dev->vdev.ctrl_handler = hdl;
	v4l2_ctrl_handler_init(hdl, 4);
952

953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972
	/* Setup controls depending on camera type */
	if (sd->cam_type == CAM_TYPE_CIF) {
		/* No brightness for sensor_type 0 */
		if (sd->sensor_type == 0)
			has_exposure = has_gain = has_clockdiv = true;
		else
			has_exposure = has_gain = has_brightness = true;
	} else {
		/* All controls need to be disabled if VGA sensor_type is 0 */
		if (sd->sensor_type == 0)
			; /* no controls! */
		else if (sd->sensor_type == 2)
			has_exposure = has_cs_gain = has_contrast = true;
		else if (sd->do_lcd_stop)
			has_exposure = has_gain = has_argus_brightness =
				has_clockdiv = true;
		else
			has_exposure = has_gain = has_brightness =
				has_clockdiv = true;
	}
973

974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015
	/* Separate brightness control description for Argus QuickClix as it has
	 * different limits from the other mr97310a cameras, and separate gain
	 * control for Sakar CyberPix camera. */
	/*
	 * This control is disabled for CIF type 1 and VGA type 0 cameras.
	 * It does not quite act linearly for the Argus QuickClix camera,
	 * but it does control brightness. The values are 0 - 15 only, and
	 * the table above makes them act consecutively.
	 */
	if (has_brightness)
		v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
			V4L2_CID_BRIGHTNESS, -254, 255, 1,
			MR97310A_BRIGHTNESS_DEFAULT);
	else if (has_argus_brightness)
		v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
			V4L2_CID_BRIGHTNESS, 0, 15, 1,
			MR97310A_BRIGHTNESS_DEFAULT);
	if (has_contrast)
		v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
			V4L2_CID_CONTRAST, MR97310A_CONTRAST_MIN,
			MR97310A_CONTRAST_MAX, 1, MR97310A_CONTRAST_DEFAULT);
	if (has_gain)
		v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
			V4L2_CID_GAIN, MR97310A_GAIN_MIN, MR97310A_GAIN_MAX,
			1, MR97310A_GAIN_DEFAULT);
	else if (has_cs_gain)
		v4l2_ctrl_new_std(hdl, &sd_ctrl_ops, V4L2_CID_GAIN,
			MR97310A_CS_GAIN_MIN, MR97310A_CS_GAIN_MAX,
			1, MR97310A_CS_GAIN_DEFAULT);
	if (has_exposure)
		sd->exposure = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
			V4L2_CID_EXPOSURE, MR97310A_EXPOSURE_MIN,
			MR97310A_EXPOSURE_MAX, 1, MR97310A_EXPOSURE_DEFAULT);
	if (has_clockdiv)
		sd->min_clockdiv = v4l2_ctrl_new_custom(hdl, &clockdiv, NULL);

	if (hdl->error) {
		pr_err("Could not initialize controls\n");
		return hdl->error;
	}
	if (has_exposure && has_clockdiv)
		v4l2_ctrl_cluster(2, &sd->exposure);
1016 1017 1018
	return 0;
}

1019 1020 1021 1022
/* Include pac common sof detection functions */
#include "pac_common.h"

static void sd_pkt_scan(struct gspca_dev *gspca_dev,
1023 1024
			u8 *data,		/* isoc packet */
			int len)		/* iso packet length */
1025
{
1026
	struct sd *sd = (struct sd *) gspca_dev;
1027 1028
	unsigned char *sof;

1029
	sof = pac_find_sof(&sd->sof_read, data, len);
1030 1031 1032 1033 1034 1035 1036 1037 1038
	if (sof) {
		int n;

		/* finish decoding current frame */
		n = sof - data;
		if (n > sizeof pac_sof_marker)
			n -= sizeof pac_sof_marker;
		else
			n = 0;
1039
		gspca_frame_add(gspca_dev, LAST_PACKET,
1040
					data, n);
1041
		/* Start next frame. */
1042
		gspca_frame_add(gspca_dev, FIRST_PACKET,
1043
			pac_sof_marker, sizeof pac_sof_marker);
1044 1045 1046
		len -= sof - data;
		data = sof;
	}
1047
	gspca_frame_add(gspca_dev, INTER_PACKET, data, len);
1048 1049 1050 1051 1052 1053 1054
}

/* sub-driver description */
static const struct sd_desc sd_desc = {
	.name = MODULE_NAME,
	.config = sd_config,
	.init = sd_init,
1055
	.init_controls = sd_init_controls,
1056 1057 1058 1059 1060 1061
	.start = sd_start,
	.stopN = sd_stopN,
	.pkt_scan = sd_pkt_scan,
};

/* -- module initialisation -- */
1062
static const struct usb_device_id device_table[] = {
1063
	{USB_DEVICE(0x08ca, 0x0110)},	/* Trust Spyc@m 100 */
1064 1065 1066
	{USB_DEVICE(0x08ca, 0x0111)},	/* Aiptek Pencam VGA+ */
	{USB_DEVICE(0x093a, 0x010f)},	/* All other known MR97310A VGA cams */
	{USB_DEVICE(0x093a, 0x010e)},	/* All known MR97310A CIF cams */
1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086
	{}
};
MODULE_DEVICE_TABLE(usb, device_table);

/* -- device connect -- */
static int sd_probe(struct usb_interface *intf,
		    const struct usb_device_id *id)
{
	return gspca_dev_probe(intf, id, &sd_desc, sizeof(struct sd),
			       THIS_MODULE);
}

static struct usb_driver sd_driver = {
	.name = MODULE_NAME,
	.id_table = device_table,
	.probe = sd_probe,
	.disconnect = gspca_disconnect,
#ifdef CONFIG_PM
	.suspend = gspca_suspend,
	.resume = gspca_resume,
1087
	.reset_resume = gspca_resume,
1088 1089 1090
#endif
};

1091
module_usb_driver(sd_driver);