2 * Driver for the ov9650 sensor
4 * Copyright (C) 2008 Erik Andrén
5 * Copyright (C) 2007 Ilyes Gouta. Based on the m5603x Linux Driver Project.
6 * Copyright (C) 2005 m5603x Linux Driver Project <m5602@x3ng.com.br>
8 * Portions of code to USB interface and ALi driver software,
9 * Copyright (c) 2006 Willem Duinker
10 * v4l2 interface modeled after the V4L2 driver
11 * for SN9C10x PC Camera Controllers
13 * This program is free software; you can redistribute it and/or
14 * modify it under the terms of the GNU General Public License as
15 * published by the Free Software Foundation, version 2.
19 #include "m5602_ov9650.h"
21 /* Vertically and horizontally flips the image if matched, needed for machines
22 where the sensor is mounted upside down */
25 struct dmi_system_id ov9650_flip_dmi_table[] = {
29 DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK Computer Inc."),
30 DMI_MATCH(DMI_PRODUCT_NAME, "A6VC")
36 DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK Computer Inc."),
37 DMI_MATCH(DMI_PRODUCT_NAME, "A6VM")
43 DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK Computer Inc."),
44 DMI_MATCH(DMI_PRODUCT_NAME, "A6JC")
50 DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK Computer Inc."),
51 DMI_MATCH(DMI_PRODUCT_NAME, "A6J")
57 DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK Computer Inc."),
58 DMI_MATCH(DMI_PRODUCT_NAME, "A6Kt")
62 .ident = "Alienware Aurora m9700",
64 DMI_MATCH(DMI_SYS_VENDOR, "alienware"),
65 DMI_MATCH(DMI_PRODUCT_NAME, "Aurora m9700")
71 const static struct ctrl ov9650_ctrls[] = {
72 #define EXPOSURE_IDX 0
75 .id = V4L2_CID_EXPOSURE,
76 .type = V4L2_CTRL_TYPE_INTEGER,
81 .default_value = EXPOSURE_DEFAULT,
82 .flags = V4L2_CTRL_FLAG_SLIDER
84 .set = ov9650_set_exposure,
85 .get = ov9650_get_exposure
91 .type = V4L2_CTRL_TYPE_INTEGER,
96 .default_value = GAIN_DEFAULT,
97 .flags = V4L2_CTRL_FLAG_SLIDER
99 .set = ov9650_set_gain,
100 .get = ov9650_get_gain
102 #define RED_BALANCE_IDX 2
105 .type = V4L2_CTRL_TYPE_INTEGER,
106 .name = "red balance",
110 .default_value = RED_GAIN_DEFAULT,
111 .flags = V4L2_CTRL_FLAG_SLIDER
113 .set = ov9650_set_red_balance,
114 .get = ov9650_get_red_balance
116 #define BLUE_BALANCE_IDX 3
119 .type = V4L2_CTRL_TYPE_INTEGER,
120 .name = "blue balance",
124 .default_value = BLUE_GAIN_DEFAULT,
125 .flags = V4L2_CTRL_FLAG_SLIDER
127 .set = ov9650_set_blue_balance,
128 .get = ov9650_get_blue_balance
133 .id = V4L2_CID_HFLIP,
134 .type = V4L2_CTRL_TYPE_BOOLEAN,
135 .name = "horizontal flip",
141 .set = ov9650_set_hflip,
142 .get = ov9650_get_hflip
147 .id = V4L2_CID_VFLIP,
148 .type = V4L2_CTRL_TYPE_BOOLEAN,
149 .name = "vertical flip",
155 .set = ov9650_set_vflip,
156 .get = ov9650_get_vflip
158 #define AUTO_WHITE_BALANCE_IDX 6
161 .id = V4L2_CID_AUTO_WHITE_BALANCE,
162 .type = V4L2_CTRL_TYPE_BOOLEAN,
163 .name = "auto white balance",
169 .set = ov9650_set_auto_white_balance,
170 .get = ov9650_get_auto_white_balance
172 #define AUTO_GAIN_CTRL_IDX 7
175 .id = V4L2_CID_AUTOGAIN,
176 .type = V4L2_CTRL_TYPE_BOOLEAN,
177 .name = "auto gain control",
183 .set = ov9650_set_auto_gain,
184 .get = ov9650_get_auto_gain
188 static struct v4l2_pix_format ov9650_modes[] = {
197 .colorspace = V4L2_COLORSPACE_SRGB,
207 .colorspace = V4L2_COLORSPACE_SRGB,
217 .colorspace = V4L2_COLORSPACE_SRGB,
227 .colorspace = V4L2_COLORSPACE_SRGB,
232 static void ov9650_dump_registers(struct sd *sd);
234 int ov9650_probe(struct sd *sd)
237 u8 prod_id = 0, ver_id = 0, i;
238 s32 *sensor_settings;
241 if (force_sensor == OV9650_SENSOR) {
242 info("Forcing an %s sensor", ov9650.name);
245 /* If we want to force another sensor,
246 don't try to probe this one */
250 info("Probing for an ov9650 sensor");
252 /* Run the pre-init before probing the sensor */
253 for (i = 0; i < ARRAY_SIZE(preinit_ov9650) && !err; i++) {
254 u8 data = preinit_ov9650[i][2];
255 if (preinit_ov9650[i][0] == SENSOR)
256 err = m5602_write_sensor(sd,
257 preinit_ov9650[i][1], &data, 1);
259 err = m5602_write_bridge(sd,
260 preinit_ov9650[i][1], data);
266 if (m5602_read_sensor(sd, OV9650_PID, &prod_id, 1))
269 if (m5602_read_sensor(sd, OV9650_VER, &ver_id, 1))
272 if ((prod_id == 0x96) && (ver_id == 0x52)) {
273 info("Detected an ov9650 sensor");
279 sensor_settings = kmalloc(
280 ARRAY_SIZE(ov9650_ctrls) * sizeof(s32), GFP_KERNEL);
281 if (!sensor_settings)
284 sd->gspca_dev.cam.cam_mode = ov9650_modes;
285 sd->gspca_dev.cam.nmodes = ARRAY_SIZE(ov9650_modes);
286 sd->desc->ctrls = ov9650_ctrls;
287 sd->desc->nctrls = ARRAY_SIZE(ov9650_ctrls);
289 for (i = 0; i < ARRAY_SIZE(ov9650_ctrls); i++)
290 sensor_settings[i] = ov9650_ctrls[i].qctrl.default_value;
291 sd->sensor_priv = sensor_settings;
295 int ov9650_init(struct sd *sd)
299 s32 *sensor_settings = sd->sensor_priv;
302 ov9650_dump_registers(sd);
304 for (i = 0; i < ARRAY_SIZE(init_ov9650) && !err; i++) {
305 data = init_ov9650[i][2];
306 if (init_ov9650[i][0] == SENSOR)
307 err = m5602_write_sensor(sd, init_ov9650[i][1],
310 err = m5602_write_bridge(sd, init_ov9650[i][1], data);
313 err = ov9650_set_exposure(&sd->gspca_dev, sensor_settings[EXPOSURE_IDX]);
317 err = ov9650_set_gain(&sd->gspca_dev, sensor_settings[GAIN_IDX]);
321 err = ov9650_set_red_balance(&sd->gspca_dev, sensor_settings[RED_BALANCE_IDX]);
325 err = ov9650_set_blue_balance(&sd->gspca_dev, sensor_settings[BLUE_BALANCE_IDX]);
329 err = ov9650_set_hflip(&sd->gspca_dev, sensor_settings[HFLIP_IDX]);
333 err = ov9650_set_vflip(&sd->gspca_dev, sensor_settings[VFLIP_IDX]);
337 err = ov9650_set_auto_white_balance(&sd->gspca_dev, sensor_settings[AUTO_WHITE_BALANCE_IDX]);
341 err = ov9650_set_auto_gain(&sd->gspca_dev, sensor_settings[AUTO_GAIN_CTRL_IDX]);
345 int ov9650_start(struct sd *sd)
349 struct cam *cam = &sd->gspca_dev.cam;
350 s32 *sensor_settings = sd->sensor_priv;
352 int width = cam->cam_mode[sd->gspca_dev.curr_mode].width;
353 int height = cam->cam_mode[sd->gspca_dev.curr_mode].height;
354 int ver_offs = cam->cam_mode[sd->gspca_dev.curr_mode].priv;
355 int hor_offs = OV9650_LEFT_OFFSET;
357 if ((!dmi_check_system(ov9650_flip_dmi_table) &&
358 sensor_settings[VFLIP_IDX]) ||
359 (dmi_check_system(ov9650_flip_dmi_table) &&
360 !sensor_settings[VFLIP_IDX]))
366 /* Synthesize the vsync/hsync setup */
367 for (i = 0; i < ARRAY_SIZE(res_init_ov9650) && !err; i++) {
368 if (res_init_ov9650[i][0] == BRIDGE)
369 err = m5602_write_bridge(sd, res_init_ov9650[i][1],
370 res_init_ov9650[i][2]);
371 else if (res_init_ov9650[i][0] == SENSOR) {
372 u8 data = res_init_ov9650[i][2];
373 err = m5602_write_sensor(sd,
374 res_init_ov9650[i][1], &data, 1);
380 err = m5602_write_bridge(sd, M5602_XB_VSYNC_PARA,
381 ((ver_offs >> 8) & 0xff));
385 err = m5602_write_bridge(sd, M5602_XB_VSYNC_PARA, (ver_offs & 0xff));
389 err = m5602_write_bridge(sd, M5602_XB_VSYNC_PARA, 0);
393 err = m5602_write_bridge(sd, M5602_XB_VSYNC_PARA, (height >> 8) & 0xff);
397 err = m5602_write_bridge(sd, M5602_XB_VSYNC_PARA, (height & 0xff));
401 for (i = 0; i < 2 && !err; i++)
402 err = m5602_write_bridge(sd, M5602_XB_VSYNC_PARA, 0);
406 err = m5602_write_bridge(sd, M5602_XB_HSYNC_PARA,
407 (hor_offs >> 8) & 0xff);
411 err = m5602_write_bridge(sd, M5602_XB_HSYNC_PARA, hor_offs & 0xff);
415 err = m5602_write_bridge(sd, M5602_XB_HSYNC_PARA,
416 ((width + hor_offs) >> 8) & 0xff);
420 err = m5602_write_bridge(sd, M5602_XB_HSYNC_PARA,
421 ((width + hor_offs) & 0xff));
427 PDEBUG(D_V4L2, "Configuring camera for VGA mode");
429 data = OV9650_VGA_SELECT | OV9650_RGB_SELECT |
430 OV9650_RAW_RGB_SELECT;
431 err = m5602_write_sensor(sd, OV9650_COM7, &data, 1);
435 PDEBUG(D_V4L2, "Configuring camera for CIF mode");
437 data = OV9650_CIF_SELECT | OV9650_RGB_SELECT |
438 OV9650_RAW_RGB_SELECT;
439 err = m5602_write_sensor(sd, OV9650_COM7, &data, 1);
443 PDEBUG(D_V4L2, "Configuring camera for QVGA mode");
445 data = OV9650_QVGA_SELECT | OV9650_RGB_SELECT |
446 OV9650_RAW_RGB_SELECT;
447 err = m5602_write_sensor(sd, OV9650_COM7, &data, 1);
451 PDEBUG(D_V4L2, "Configuring camera for QCIF mode");
453 data = OV9650_QCIF_SELECT | OV9650_RGB_SELECT |
454 OV9650_RAW_RGB_SELECT;
455 err = m5602_write_sensor(sd, OV9650_COM7, &data, 1);
461 int ov9650_stop(struct sd *sd)
463 u8 data = OV9650_SOFT_SLEEP | OV9650_OUTPUT_DRIVE_2X;
464 return m5602_write_sensor(sd, OV9650_COM2, &data, 1);
467 void ov9650_disconnect(struct sd *sd)
472 kfree(sd->sensor_priv);
475 int ov9650_get_exposure(struct gspca_dev *gspca_dev, __s32 *val)
477 struct sd *sd = (struct sd *) gspca_dev;
478 s32 *sensor_settings = sd->sensor_priv;
480 *val = sensor_settings[EXPOSURE_IDX];
481 PDEBUG(D_V4L2, "Read exposure %d", *val);
485 int ov9650_set_exposure(struct gspca_dev *gspca_dev, __s32 val)
487 struct sd *sd = (struct sd *) gspca_dev;
488 s32 *sensor_settings = sd->sensor_priv;
492 PDEBUG(D_V4L2, "Set exposure to %d", val);
494 sensor_settings[EXPOSURE_IDX] = val;
496 i2c_data = (val >> 10) & 0x3f;
497 err = m5602_write_sensor(sd, OV9650_AECHM,
502 /* The 8 middle bits */
503 i2c_data = (val >> 2) & 0xff;
504 err = m5602_write_sensor(sd, OV9650_AECH,
510 i2c_data = val & 0x03;
511 err = m5602_write_sensor(sd, OV9650_COM1, &i2c_data, 1);
515 int ov9650_get_gain(struct gspca_dev *gspca_dev, __s32 *val)
517 struct sd *sd = (struct sd *) gspca_dev;
518 s32 *sensor_settings = sd->sensor_priv;
520 *val = sensor_settings[GAIN_IDX];
521 PDEBUG(D_V4L2, "Read gain %d", *val);
525 int ov9650_set_gain(struct gspca_dev *gspca_dev, __s32 val)
529 struct sd *sd = (struct sd *) gspca_dev;
530 s32 *sensor_settings = sd->sensor_priv;
532 PDEBUG(D_V4L2, "Setting gain to %d", val);
534 sensor_settings[GAIN_IDX] = val;
537 /* Read the OV9650_VREF register first to avoid
538 corrupting the VREF high and low bits */
539 err = m5602_read_sensor(sd, OV9650_VREF, &i2c_data, 1);
543 /* Mask away all uninteresting bits */
544 i2c_data = ((val & 0x0300) >> 2) |
546 err = m5602_write_sensor(sd, OV9650_VREF, &i2c_data, 1);
551 i2c_data = val & 0xff;
552 err = m5602_write_sensor(sd, OV9650_GAIN, &i2c_data, 1);
556 int ov9650_get_red_balance(struct gspca_dev *gspca_dev, __s32 *val)
558 struct sd *sd = (struct sd *) gspca_dev;
559 s32 *sensor_settings = sd->sensor_priv;
561 *val = sensor_settings[RED_BALANCE_IDX];
562 PDEBUG(D_V4L2, "Read red gain %d", *val);
566 int ov9650_set_red_balance(struct gspca_dev *gspca_dev, __s32 val)
570 struct sd *sd = (struct sd *) gspca_dev;
571 s32 *sensor_settings = sd->sensor_priv;
573 PDEBUG(D_V4L2, "Set red gain to %d", val);
575 sensor_settings[RED_BALANCE_IDX] = val;
577 i2c_data = val & 0xff;
578 err = m5602_write_sensor(sd, OV9650_RED, &i2c_data, 1);
582 int ov9650_get_blue_balance(struct gspca_dev *gspca_dev, __s32 *val)
584 struct sd *sd = (struct sd *) gspca_dev;
585 s32 *sensor_settings = sd->sensor_priv;
587 *val = sensor_settings[BLUE_BALANCE_IDX];
588 PDEBUG(D_V4L2, "Read blue gain %d", *val);
593 int ov9650_set_blue_balance(struct gspca_dev *gspca_dev, __s32 val)
597 struct sd *sd = (struct sd *) gspca_dev;
598 s32 *sensor_settings = sd->sensor_priv;
600 PDEBUG(D_V4L2, "Set blue gain to %d", val);
602 sensor_settings[BLUE_BALANCE_IDX] = val;
604 i2c_data = val & 0xff;
605 err = m5602_write_sensor(sd, OV9650_BLUE, &i2c_data, 1);
609 int ov9650_get_hflip(struct gspca_dev *gspca_dev, __s32 *val)
611 struct sd *sd = (struct sd *) gspca_dev;
612 s32 *sensor_settings = sd->sensor_priv;
614 *val = sensor_settings[HFLIP_IDX];
615 PDEBUG(D_V4L2, "Read horizontal flip %d", *val);
619 int ov9650_set_hflip(struct gspca_dev *gspca_dev, __s32 val)
623 struct sd *sd = (struct sd *) gspca_dev;
624 s32 *sensor_settings = sd->sensor_priv;
626 PDEBUG(D_V4L2, "Set horizontal flip to %d", val);
628 sensor_settings[HFLIP_IDX] = val;
630 if (!dmi_check_system(ov9650_flip_dmi_table))
631 i2c_data = ((val & 0x01) << 5) | (sensor_settings[VFLIP_IDX] << 4);
633 i2c_data = ((val & 0x01) << 5) | (!sensor_settings[VFLIP_IDX] << 4);
635 err = m5602_write_sensor(sd, OV9650_MVFP, &i2c_data, 1);
640 int ov9650_get_vflip(struct gspca_dev *gspca_dev, __s32 *val)
642 struct sd *sd = (struct sd *) gspca_dev;
643 s32 *sensor_settings = sd->sensor_priv;
645 *val = sensor_settings[VFLIP_IDX];
646 PDEBUG(D_V4L2, "Read vertical flip %d", *val);
651 int ov9650_set_vflip(struct gspca_dev *gspca_dev, __s32 val)
655 struct sd *sd = (struct sd *) gspca_dev;
656 s32 *sensor_settings = sd->sensor_priv;
658 PDEBUG(D_V4L2, "Set vertical flip to %d", val);
659 sensor_settings[VFLIP_IDX] = val;
661 if (dmi_check_system(ov9650_flip_dmi_table))
664 i2c_data = ((val & 0x01) << 4) | (sensor_settings[VFLIP_IDX] << 5);
665 err = m5602_write_sensor(sd, OV9650_MVFP, &i2c_data, 1);
669 /* When vflip is toggled we need to readjust the bridge hsync/vsync */
670 if (gspca_dev->streaming)
671 err = ov9650_start(sd);
676 int ov9650_get_brightness(struct gspca_dev *gspca_dev, __s32 *val)
678 struct sd *sd = (struct sd *) gspca_dev;
679 s32 *sensor_settings = sd->sensor_priv;
681 *val = sensor_settings[GAIN_IDX];
682 PDEBUG(D_V4L2, "Read gain %d", *val);
687 int ov9650_set_brightness(struct gspca_dev *gspca_dev, __s32 val)
691 struct sd *sd = (struct sd *) gspca_dev;
692 s32 *sensor_settings = sd->sensor_priv;
694 PDEBUG(D_V4L2, "Set gain to %d", val);
696 sensor_settings[GAIN_IDX] = val;
698 /* Read the OV9650_VREF register first to avoid
699 corrupting the VREF high and low bits */
700 err = m5602_read_sensor(sd, OV9650_VREF, &i2c_data, 1);
704 /* Mask away all uninteresting bits */
705 i2c_data = ((val & 0x0300) >> 2) | (i2c_data & 0x3F);
706 err = m5602_write_sensor(sd, OV9650_VREF, &i2c_data, 1);
711 i2c_data = val & 0xff;
712 err = m5602_write_sensor(sd, OV9650_GAIN, &i2c_data, 1);
717 int ov9650_get_auto_white_balance(struct gspca_dev *gspca_dev, __s32 *val)
719 struct sd *sd = (struct sd *) gspca_dev;
720 s32 *sensor_settings = sd->sensor_priv;
722 *val = sensor_settings[AUTO_WHITE_BALANCE_IDX];
726 int ov9650_set_auto_white_balance(struct gspca_dev *gspca_dev, __s32 val)
730 struct sd *sd = (struct sd *) gspca_dev;
731 s32 *sensor_settings = sd->sensor_priv;
733 PDEBUG(D_V4L2, "Set auto white balance to %d", val);
735 sensor_settings[AUTO_WHITE_BALANCE_IDX] = val;
736 err = m5602_read_sensor(sd, OV9650_COM8, &i2c_data, 1);
740 i2c_data = ((i2c_data & 0xfd) | ((val & 0x01) << 1));
741 err = m5602_write_sensor(sd, OV9650_COM8, &i2c_data, 1);
746 int ov9650_get_auto_gain(struct gspca_dev *gspca_dev, __s32 *val)
748 struct sd *sd = (struct sd *) gspca_dev;
749 s32 *sensor_settings = sd->sensor_priv;
751 *val = sensor_settings[AUTO_GAIN_CTRL_IDX];
752 PDEBUG(D_V4L2, "Read auto gain control %d", *val);
756 int ov9650_set_auto_gain(struct gspca_dev *gspca_dev, __s32 val)
760 struct sd *sd = (struct sd *) gspca_dev;
761 s32 *sensor_settings = sd->sensor_priv;
763 PDEBUG(D_V4L2, "Set auto gain control to %d", val);
765 sensor_settings[AUTO_GAIN_CTRL_IDX] = val;
766 err = m5602_read_sensor(sd, OV9650_COM8, &i2c_data, 1);
770 i2c_data = ((i2c_data & 0xfb) | ((val & 0x01) << 2));
771 err = m5602_write_sensor(sd, OV9650_COM8, &i2c_data, 1);
776 static void ov9650_dump_registers(struct sd *sd)
779 info("Dumping the ov9650 register state");
780 for (address = 0; address < 0xa9; address++) {
782 m5602_read_sensor(sd, address, &value, 1);
783 info("register 0x%x contains 0x%x",
787 info("ov9650 register state dump complete");
789 info("Probing for which registers that are read/write");
790 for (address = 0; address < 0xff; address++) {
791 u8 old_value, ctrl_value;
792 u8 test_value[2] = {0xff, 0xff};
794 m5602_read_sensor(sd, address, &old_value, 1);
795 m5602_write_sensor(sd, address, test_value, 1);
796 m5602_read_sensor(sd, address, &ctrl_value, 1);
798 if (ctrl_value == test_value[0])
799 info("register 0x%x is writeable", address);
801 info("register 0x%x is read only", address);
803 /* Restore original value */
804 m5602_write_sensor(sd, address, &old_value, 1);