19 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
46 .sizeimage = 640 * 480,
53 static const struct ctrl mt9m111_ctrls[] = {
59 .name =
"vertical flip",
65 .set = mt9m111_set_vflip,
66 .get = mt9m111_get_vflip
73 .name =
"horizontal flip",
79 .set = mt9m111_set_hflip,
80 .get = mt9m111_get_hflip
94 .
set = mt9m111_set_gain,
95 .
get = mt9m111_get_gain
97 #define AUTO_WHITE_BALANCE_IDX 3
102 .name =
"auto white balance",
108 .set = mt9m111_set_auto_white_balance,
109 .get = mt9m111_get_auto_white_balance
111 #define GREEN_BALANCE_IDX 4
116 .name =
"green balance",
123 .set = mt9m111_set_green_balance,
124 .get = mt9m111_get_green_balance
126 #define BLUE_BALANCE_IDX 5
131 .name =
"blue balance",
138 .set = mt9m111_set_blue_balance,
139 .get = mt9m111_get_blue_balance
141 #define RED_BALANCE_IDX 5
146 .name =
"red balance",
153 .set = mt9m111_set_red_balance,
154 .get = mt9m111_get_red_balance
158 static void mt9m111_dump_registers(
struct sd *
sd);
162 u8 data[2] = {0x00, 0x00};
164 s32 *sensor_settings;
176 PDEBUG(D_PROBE,
"Probing for a mt9m111 sensor");
179 for (i = 0; i <
ARRAY_SIZE(preinit_mt9m111); i++) {
180 if (preinit_mt9m111[i][0] ==
BRIDGE) {
182 preinit_mt9m111[i][1],
183 preinit_mt9m111[i][2]);
185 data[0] = preinit_mt9m111[
i][2];
186 data[1] = preinit_mt9m111[
i][3];
188 preinit_mt9m111[i][1], data, 2);
195 if ((data[0] == 0x14) && (data[1] == 0x3a)) {
196 pr_info(
"Detected a mt9m111 sensor\n");
205 if (!sensor_settings)
208 sd->
gspca_dev.cam.cam_mode = mt9m111_modes;
210 sd->
desc->ctrls = mt9m111_ctrls;
213 for (i = 0; i <
ARRAY_SIZE(mt9m111_ctrls); i++)
214 sensor_settings[i] = mt9m111_ctrls[i].
qctrl.default_value;
229 if (init_mt9m111[i][0] ==
BRIDGE) {
234 data[0] = init_mt9m111[
i][2];
235 data[1] = init_mt9m111[
i][3];
237 init_mt9m111[i][1], data, 2);
242 mt9m111_dump_registers(sd);
252 err = mt9m111_set_green_balance(&sd->
gspca_dev,
257 err = mt9m111_set_blue_balance(&sd->
gspca_dev,
262 err = mt9m111_set_red_balance(&sd->
gspca_dev,
281 if (start_mt9m111[i][0] ==
BRIDGE) {
284 start_mt9m111[i][2]);
286 data[0] = start_mt9m111[
i][2];
287 data[1] = start_mt9m111[
i][3];
289 start_mt9m111[i][1], data, 2);
303 for (i = 0; i < 2 && !
err; i++)
316 for (i = 0; i < 2 && !
err; i++)
322 (width >> 8) & 0xff);
336 PDEBUG(D_V4L2,
"Configuring camera for VGA mode");
348 PDEBUG(D_V4L2,
"Configuring camera for QVGA mode");
369 struct sd *
sd = (
struct sd *) gspca_dev;
373 PDEBUG(D_V4L2,
"Read vertical flip %d", *val);
381 u8 data[2] = {0x00, 0x00};
382 struct sd *
sd = (
struct sd *) gspca_dev;
385 PDEBUG(D_V4L2,
"Set vertical flip to %d", val);
401 data[1] = (data[1] & 0xfe) | val;
407 static int mt9m111_get_hflip(
struct gspca_dev *gspca_dev,
__s32 *val)
409 struct sd *sd = (
struct sd *) gspca_dev;
413 PDEBUG(D_V4L2,
"Read horizontal flip %d", *val);
418 static int mt9m111_set_hflip(
struct gspca_dev *gspca_dev,
__s32 val)
421 u8 data[2] = {0x00, 0x00};
422 struct sd *sd = (
struct sd *) gspca_dev;
425 PDEBUG(D_V4L2,
"Set horizontal flip to %d", val);
441 data[1] = (data[1] & 0xfd) | ((val << 1) & 0x02);
447 static int mt9m111_get_gain(
struct gspca_dev *gspca_dev,
__s32 *val)
449 struct sd *sd = (
struct sd *) gspca_dev;
453 PDEBUG(D_V4L2,
"Read gain %d", *val);
458 static int mt9m111_set_auto_white_balance(
struct gspca_dev *gspca_dev,
461 struct sd *sd = (
struct sd *) gspca_dev;
471 data[1] = ((data[1] & 0xfd) | ((val & 0x01) << 1));
475 PDEBUG(D_V4L2,
"Set auto white balance %d", val);
479 static int mt9m111_get_auto_white_balance(
struct gspca_dev *gspca_dev,
481 struct sd *sd = (
struct sd *) gspca_dev;
485 PDEBUG(D_V4L2,
"Read auto white balance %d", *val);
489 static int mt9m111_set_gain(
struct gspca_dev *gspca_dev,
__s32 val)
492 u8 data[2] = {0x00, 0x00};
493 struct sd *sd = (
struct sd *) gspca_dev;
508 tmp = (1 << 10) | (val << 9) |
509 (val << 8) | (val / 8);
512 tmp = (1 << 9) | (1 << 8) | (val / 4);
515 tmp = (1 << 8) | (val / 2);
519 data[1] = (tmp & 0xff);
520 data[0] = (tmp & 0xff00) >> 8;
521 PDEBUG(D_V4L2,
"tmp=%d, data[1]=%d, data[0]=%d", tmp,
530 static int mt9m111_set_green_balance(
struct gspca_dev *gspca_dev,
__s32 val)
534 struct sd *sd = (
struct sd *) gspca_dev;
538 data[1] = (val & 0xff);
539 data[0] = (val & 0xff00) >> 8;
541 PDEBUG(D_V4L2,
"Set green balance %d", val);
551 static int mt9m111_get_green_balance(
struct gspca_dev *gspca_dev,
__s32 *val)
553 struct sd *sd = (
struct sd *) gspca_dev;
557 PDEBUG(D_V4L2,
"Read green balance %d", *val);
561 static int mt9m111_set_blue_balance(
struct gspca_dev *gspca_dev,
__s32 val)
564 struct sd *sd = (
struct sd *) gspca_dev;
568 data[1] = (val & 0xff);
569 data[0] = (val & 0xff00) >> 8;
571 PDEBUG(D_V4L2,
"Set blue balance %d", val);
577 static int mt9m111_get_blue_balance(
struct gspca_dev *gspca_dev,
__s32 *val)
579 struct sd *sd = (
struct sd *) gspca_dev;
583 PDEBUG(D_V4L2,
"Read blue balance %d", *val);
587 static int mt9m111_set_red_balance(
struct gspca_dev *gspca_dev,
__s32 val)
590 struct sd *sd = (
struct sd *) gspca_dev;
594 data[1] = (val & 0xff);
595 data[0] = (val & 0xff00) >> 8;
597 PDEBUG(D_V4L2,
"Set red balance %d", val);
603 static int mt9m111_get_red_balance(
struct gspca_dev *gspca_dev,
__s32 *val)
605 struct sd *sd = (
struct sd *) gspca_dev;
609 PDEBUG(D_V4L2,
"Read red balance %d", *val);
613 static void mt9m111_dump_registers(
struct sd *sd)
617 pr_info(
"Dumping the mt9m111 register state\n");
619 pr_info(
"Dumping the mt9m111 sensor core registers\n");
622 for (address = 0; address < 0xff; address++) {
624 pr_info(
"register 0x%x contains 0x%x%x\n",
625 address, value[0], value[1]);
628 pr_info(
"Dumping the mt9m111 color pipeline registers\n");
631 for (address = 0; address < 0xff; address++) {
633 pr_info(
"register 0x%x contains 0x%x%x\n",
634 address, value[0], value[1]);
637 pr_info(
"Dumping the mt9m111 camera control registers\n");
640 for (address = 0; address < 0xff; address++) {
642 pr_info(
"register 0x%x contains 0x%x%x\n",
643 address, value[0], value[1]);
646 pr_info(
"mt9m111 register state dump complete\n");