static void mi2020_post_unset_alt(struct gspca_dev *gspca_dev) { ctrl_out(gspca_dev, 0x40, 5, 0x0000, 0x0000, 0, NULL); msleep(20); if (_MI2020c_ || _MI2020_) ctrl_out(gspca_dev, 0x40, 1, 0x0001, 0x0000, 0, NULL); else ctrl_out(gspca_dev, 0x40, 1, 0x0041, 0x0000, 0, NULL); }
static void mi1320_post_unset_alt(struct gspca_dev *gspca_dev) { ctrl_out(gspca_dev, 0x40, 5, 0x0000, 0x0000, 0, NULL); fetch_validx(gspca_dev, tbl_post_unset_alt, ARRAY_SIZE(tbl_post_unset_alt)); }
static int ov9655_camera_settings(struct gspca_dev *gspca_dev) { struct sd *sd = (struct sd *) gspca_dev; u8 dat_bright[] = "\x04\x00\x10\x7c\xa1\x00\x00\x70"; s32 bright = sd->vcur.brightness; s32 hue = sd->vcur.hue; if (bright != sd->vold.brightness) { sd->vold.brightness = bright; if (bright < 0 || bright > sd->vmax.brightness) bright = 0; dat_bright[3] = bright; ctrl_out(gspca_dev, 0x40, 3, 0x6000, 0x0200, 8, dat_bright); } if (hue != sd->vold.hue) { sd->vold.hue = hue; sd->swapRB = (hue != 0); } return 0; }
static int ov2640_init_at_startup(struct gspca_dev *gspca_dev) { fetch_validx(gspca_dev, tbl_init_at_startup, ARRAY_SIZE(tbl_init_at_startup)); ctrl_out(gspca_dev, 0x40, 3, 0x0000, 0x0200, 12, dat_init1); common(gspca_dev); ctrl_in(gspca_dev, 0xc0, 2, 0x0000, 0x0006, 1, c61); ctrl_out(gspca_dev, 0x40, 1, 0x00ef, 0x0006, 0, NULL); ctrl_in(gspca_dev, 0xc0, 2, 0x0000, 0x0000, 1, c51); ctrl_out(gspca_dev, 0x40, 1, 0x0051, 0x0000, 0, NULL); /* ctrl_out(gspca_dev, 0x40, 11, 0x0000, 0x0000, 0, NULL); */ return 0; }
void fetch_idxdata(struct gspca_dev *gspca_dev, struct idxdata *tbl, int len) { int n; for (n = 0; n < len; n++) { if (memcmp(tbl[n].data, "\xff\xff\xff", 3) != 0) ctrl_out(gspca_dev, 0x40, 3, 0x7a00, tbl[n].idx, 3, tbl[n].data); else msleep(tbl[n].idx); } }
int keep_on_fetching_validx(struct gspca_dev *gspca_dev, struct validx *tbl, int len, int n) { while (++n < len) { if (tbl[n].idx != 0xffff) ctrl_out(gspca_dev, 0x40, 1, tbl[n].val, tbl[n].idx, 0, NULL); else if (tbl[n].val == 0xffff) break; else msleep(tbl[n].val); } return n; }
int fetch_validx(struct gspca_dev *gspca_dev, struct validx *tbl, int len) { int n; for (n = 0; n < len; n++) { if (tbl[n].idx != 0xffff) ctrl_out(gspca_dev, 0x40, 1, tbl[n].val, tbl[n].idx, 0, NULL); else if (tbl[n].val == 0xffff) break; else msleep(tbl[n].val); } return n; }
static int mi1320_sensor_settings(struct gspca_dev *gspca_dev) { s32 reso = gspca_dev->cam.cam_mode[(s32) gspca_dev->curr_mode].priv; ctrl_out(gspca_dev, 0x40, 5, 0x0001, 0x0000, 0, NULL); fetch_validx(gspca_dev, tbl_sensor_settings_common, ARRAY_SIZE(tbl_sensor_settings_common)); switch (reso) { case IMAGE_1280: fetch_validx(gspca_dev, tbl_sensor_settings_1280, ARRAY_SIZE(tbl_sensor_settings_1280)); ctrl_out(gspca_dev, 0x40, 3, 0xba00, 0x0200, 64, tbl_1280[0]); ctrl_out(gspca_dev, 0x40, 3, 0xba00, 0x0200, 40, tbl_1280[1]); ctrl_out(gspca_dev, 0x40, 3, 0x0000, 0x0200, 12, tbl_1280[2]); break; case IMAGE_800: fetch_validx(gspca_dev, tbl_sensor_settings_800, ARRAY_SIZE(tbl_sensor_settings_800)); ctrl_out(gspca_dev, 0x40, 3, 0xba00, 0x0200, 64, tbl_800[0]); ctrl_out(gspca_dev, 0x40, 3, 0xba00, 0x0200, 40, tbl_800[1]); ctrl_out(gspca_dev, 0x40, 3, 0x0000, 0x0200, 12, tbl_800[2]); break; default: fetch_validx(gspca_dev, tbl_sensor_settings_640, ARRAY_SIZE(tbl_sensor_settings_640)); ctrl_out(gspca_dev, 0x40, 3, 0xba00, 0x0200, 60, tbl_640[0]); ctrl_out(gspca_dev, 0x40, 3, 0xba00, 0x0200, 40, tbl_640[1]); ctrl_out(gspca_dev, 0x40, 3, 0x0000, 0x0200, 12, tbl_640[2]); break; } return 0; }
int mi1320_camera_settings(struct gspca_dev *gspca_dev) { struct sd *sd = (struct sd *) gspca_dev; s32 backlight = sd->vcur.backlight; s32 bright = sd->vcur.brightness; s32 sharp = sd->vcur.sharpness; s32 cntr = sd->vcur.contrast; s32 gam = sd->vcur.gamma; s32 hue = sd->vcur.hue; s32 sat = sd->vcur.saturation; s32 wbal = sd->vcur.whitebal; s32 mirror = (((sd->vcur.mirror > 0) ^ sd->mirrorMask) > 0); s32 flip = (((sd->vcur.flip > 0) ^ sd->mirrorMask) > 0); s32 freq = (sd->vcur.AC50Hz > 0); s32 i; if (freq != sd->vold.AC50Hz) { sd->vold.AC50Hz = freq; freq = 2 * (freq == 0); ctrl_out(gspca_dev, 0x40, 1, 0xba00, 0x00f0, 0, NULL); ctrl_out(gspca_dev, 0x40, 1, 0xba02, 0x00f1, 0, NULL); ctrl_out(gspca_dev, 0x40, 1, 0xba00 , 0x005b, 0, NULL); ctrl_out(gspca_dev, 0x40, 1, 0xba01 + freq, 0x00f1, 0, NULL); } if (wbal != sd->vold.whitebal) { sd->vold.whitebal = wbal; if (wbal < 0 || wbal > sd->vmax.whitebal) wbal = 0; for (i = 0; i < 2; i++) { if (wbal == 0) { /* Normal light */ ctrl_out(gspca_dev, 0x40, 1, 0x0010, 0x0010, 0, NULL); ctrl_out(gspca_dev, 0x40, 1, 0x0003, 0x00c1, 0, NULL); ctrl_out(gspca_dev, 0x40, 1, 0x0042, 0x00c2, 0, NULL); ctrl_out(gspca_dev, 0x40, 3, 0xba00, 0x0200, 48, dat_wbalNL); } if (wbal == 1) { /* Low light */ ctrl_out(gspca_dev, 0x40, 1, 0x0010, 0x0010, 0, NULL); ctrl_out(gspca_dev, 0x40, 1, 0x0004, 0x00c1, 0, NULL); ctrl_out(gspca_dev, 0x40, 1, 0x0043, 0x00c2, 0, NULL); ctrl_out(gspca_dev, 0x40, 3, 0xba00, 0x0200, 48, dat_wbalLL); } if (wbal == 2) { /* Back light */ ctrl_out(gspca_dev, 0x40, 1, 0x0010, 0x0010, 0, NULL); ctrl_out(gspca_dev, 0x40, 1, 0x0003, 0x00c1, 0, NULL); ctrl_out(gspca_dev, 0x40, 1, 0x0042, 0x00c2, 0, NULL); ctrl_out(gspca_dev, 0x40, 3, 0xba00, 0x0200, 44, dat_wbalBL); } } } if (bright != sd->vold.brightness) { sd->vold.brightness = bright; if (bright < 0 || bright > sd->vmax.brightness) bright = 0; bright = tbl_bright[bright]; ctrl_out(gspca_dev, 0x40, 1, 0xba00, 0x00f0, 0, NULL); ctrl_out(gspca_dev, 0x40, 1, 0xba01, 0x00f1, 0, NULL); ctrl_out(gspca_dev, 0x40, 1, 0xba00 + bright, 0x0034, 0, NULL); ctrl_out(gspca_dev, 0x40, 1, 0xba00 + bright, 0x00f1, 0, NULL); } if (sat != sd->vold.saturation) { sd->vold.saturation = sat; if (sat < 0 || sat > sd->vmax.saturation) sat = 0; sat = tbl_sat[sat]; ctrl_out(gspca_dev, 0x40, 1, 0xba00, 0x00f0, 0, NULL); ctrl_out(gspca_dev, 0x40, 1, 0xba01, 0x00f1, 0, NULL); ctrl_out(gspca_dev, 0x40, 1, 0xba00 , 0x0025, 0, NULL); ctrl_out(gspca_dev, 0x40, 1, 0xba00 + sat, 0x00f1, 0, NULL); } if (sharp != sd->vold.sharpness) { sd->vold.sharpness = sharp; if (sharp < 0 || sharp > sd->vmax.sharpness) sharp = 0; ctrl_out(gspca_dev, 0x40, 1, 0xba00, 0x00f0, 0, NULL); ctrl_out(gspca_dev, 0x40, 1, 0xba01, 0x00f1, 0, NULL); ctrl_out(gspca_dev, 0x40, 1, 0xba00 , 0x0005, 0, NULL); ctrl_out(gspca_dev, 0x40, 1, 0xba00 + sharp, 0x00f1, 0, NULL); } if (hue != sd->vold.hue) { /* 0=normal 1=NB 2="sepia" 3=negative 4=other 5=other2 */ if (hue < 0 || hue > sd->vmax.hue) hue = 0; if (hue == sd->vmax.hue) sd->swapRB = 1; else sd->swapRB = 0; ctrl_out(gspca_dev, 0x40, 1, 0xba00, 0x00f0, 0, NULL); ctrl_out(gspca_dev, 0x40, 1, 0xba01, 0x00f1, 0, NULL); ctrl_out(gspca_dev, 0x40, 1, 0xba70, 0x00e2, 0, NULL); ctrl_out(gspca_dev, 0x40, 1, 0xba00 + hue * (hue < 6), 0x00f1, 0, NULL); } if (backlight != sd->vold.backlight) { sd->vold.backlight = backlight; if (backlight < 0 || backlight > sd->vmax.backlight) backlight = 0; backlight = tbl_backlight[backlight]; for (i = 0; i < 2; i++) { ctrl_out(gspca_dev, 0x40, 1, 0xba00, 0x00f0, 0, NULL); ctrl_out(gspca_dev, 0x40, 1, 0xba01, 0x00f1, 0, NULL); ctrl_out(gspca_dev, 0x40, 1, 0xba74, 0x0006, 0, NULL); ctrl_out(gspca_dev, 0x40, 1, 0xba80 + backlight, 0x00f1, 0, NULL); } } if (hue != sd->vold.hue) { sd->vold.hue = hue; ctrl_out(gspca_dev, 0x40, 1, 0xba00, 0x00f0, 0, NULL); ctrl_out(gspca_dev, 0x40, 1, 0xba01, 0x00f1, 0, NULL); ctrl_out(gspca_dev, 0x40, 1, 0xba70, 0x00e2, 0, NULL); ctrl_out(gspca_dev, 0x40, 1, 0xba00 + hue * (hue < 6), 0x00f1, 0, NULL); } if (mirror != sd->vold.mirror || flip != sd->vold.flip) { u8 dat_hvflip2[4] = {0x20, 0x01, 0xf1, 0x00}; sd->vold.mirror = mirror; sd->vold.flip = flip; dat_hvflip2[3] = flip + 2 * mirror; ctrl_out(gspca_dev, 0x40, 3, 0xba00, 0x0200, 4, dat_hvflip1); ctrl_out(gspca_dev, 0x40, 3, 0xba00, 0x0200, 4, dat_hvflip2); } if (gam != sd->vold.gamma) { sd->vold.gamma = gam; if (gam < 0 || gam > sd->vmax.gamma) gam = 0; gam = 2 * gam; ctrl_out(gspca_dev, 0x40, 1, 0xba00, 0x00f0, 0, NULL); ctrl_out(gspca_dev, 0x40, 1, 0xba01, 0x00f1, 0, NULL); ctrl_out(gspca_dev, 0x40, 1, 0xba04 , 0x003b, 0, NULL); ctrl_out(gspca_dev, 0x40, 1, 0xba02 + gam, 0x00f1, 0, NULL); } if (cntr != sd->vold.contrast) { sd->vold.contrast = cntr; if (cntr < 0 || cntr > sd->vmax.contrast) cntr = 0; ctrl_out(gspca_dev, 0x40, 1, 0xba00, 0x00f0, 0, NULL); ctrl_out(gspca_dev, 0x40, 1, 0xba01, 0x00f1, 0, NULL); ctrl_out(gspca_dev, 0x40, 1, 0xba00 + tbl_cntr1[cntr], 0x0035, 0, NULL); ctrl_out(gspca_dev, 0x40, 1, 0xba00 + tbl_cntr2[cntr], 0x00f1, 0, NULL); } return 0; }
static void common(struct gspca_dev *gspca_dev) { s32 reso = gspca_dev->cam.cam_mode[(s32) gspca_dev->curr_mode].priv; if (_MI2020b_) { fetch_validx(gspca_dev, tbl_common_a, ARRAY_SIZE(tbl_common_a)); } else { if (_MI2020_) ctrl_out(gspca_dev, 0x40, 1, 0x0008, 0x0004, 0, NULL); else ctrl_out(gspca_dev, 0x40, 1, 0x0002, 0x0004, 0, NULL); msleep(35); fetch_validx(gspca_dev, tbl_common_b, ARRAY_SIZE(tbl_common_b)); } ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, "\x86\x25\x01"); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, "\x86\x25\x00"); msleep(2); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0030, 3, "\x1a\x0a\xcc"); if (reso == IMAGE_1600) msleep(2); fetch_idxdata(gspca_dev, tbl_common_c, ARRAY_SIZE(tbl_common_c)); if (_MI2020b_ || _MI2020_) fetch_idxdata(gspca_dev, tbl_common_d, ARRAY_SIZE(tbl_common_d)); fetch_idxdata(gspca_dev, tbl_common_e, ARRAY_SIZE(tbl_common_e)); if (_MI2020b_ || _MI2020_) { ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, "\x90\x00\x78"); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, "\x8c\x24\x17"); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, "\x90\x00\x90"); } else { ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, "\x90\x00\x6a"); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, "\x8c\x24\x17"); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, "\x90\x00\x80"); } ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, "\x8c\xa1\x03"); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, "\x90\x00\x05"); msleep(2); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, "\x8c\xa1\x03"); if (reso == IMAGE_1600) msleep(14); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, "\x90\x00\x06"); msleep(2); }
static int gl860_guess_sensor(struct gspca_dev *gspca_dev, s32 vendor_id, s32 product_id) { struct sd *sd = (struct sd *) gspca_dev; u8 probe, nb26, nb96, nOV, ntry; if (product_id == 0xf191) sd->sensor = ID_MI1320; if (sd->sensor == 0xff) { ctrl_in(gspca_dev, 0xc0, 2, 0x0000, 0x0004, 1, &probe); ctrl_in(gspca_dev, 0xc0, 2, 0x0000, 0x0004, 1, &probe); ctrl_out(gspca_dev, 0x40, 1, 0x0000, 0x0000, 0, NULL); msleep(3); ctrl_out(gspca_dev, 0x40, 1, 0x0010, 0x0010, 0, NULL); msleep(3); ctrl_out(gspca_dev, 0x40, 1, 0x0008, 0x00c0, 0, NULL); msleep(3); ctrl_out(gspca_dev, 0x40, 1, 0x0001, 0x00c1, 0, NULL); msleep(3); ctrl_out(gspca_dev, 0x40, 1, 0x0001, 0x00c2, 0, NULL); msleep(3); ctrl_out(gspca_dev, 0x40, 1, 0x0020, 0x0006, 0, NULL); msleep(3); ctrl_out(gspca_dev, 0x40, 1, 0x006a, 0x000d, 0, NULL); msleep(56); nOV = 0; for (ntry = 0; ntry < 4; ntry++) { ctrl_out(gspca_dev, 0x40, 1, 0x0040, 0x0000, 0, NULL); msleep(3); ctrl_out(gspca_dev, 0x40, 1, 0x0063, 0x0006, 0, NULL); msleep(3); ctrl_out(gspca_dev, 0x40, 1, 0x7a00, 0x8030, 0, NULL); msleep(10); ctrl_in(gspca_dev, 0xc0, 2, 0x7a00, 0x8030, 1, &probe); PDEBUG(D_PROBE, "1st probe=%02x", probe); if (probe == 0xff) nOV++; } if (nOV) { PDEBUG(D_PROBE, "0xff -> sensor OVXXXX"); PDEBUG(D_PROBE, "Probing for sensor OV2640 or OV9655"); nb26 = nb96 = 0; for (ntry = 0; ntry < 4; ntry++) { ctrl_out(gspca_dev, 0x40, 1, 0x0040, 0x0000, 0, NULL); msleep(3); ctrl_out(gspca_dev, 0x40, 1, 0x6000, 0x800a, 0, NULL); msleep(10); ctrl_in(gspca_dev, 0xc0, 2, 0x6000, 0x800a, 1, &probe); PDEBUG(D_PROBE, "2nd probe=%02x", probe); if (probe == 0x00) nb26++; if (probe == 0x26 || probe == 0x40) { sd->sensor = ID_OV2640; nb26 += 4; break; } if (probe == 0x96 || probe == 0x55) { sd->sensor = ID_OV9655; nb96 += 4; break; } if (probe == 0xff) nb96++; msleep(3); } if (nb26 < 4 && nb96 < 4) { PDEBUG(D_PROBE, "No relevant answer "); PDEBUG(D_PROBE, "* 1.3Mpixels -> use OV9655"); PDEBUG(D_PROBE, "* 2.0Mpixels -> use OV2640"); PDEBUG(D_PROBE, "To force a sensor, add that line to " "/etc/modprobe.d/options.conf:"); PDEBUG(D_PROBE, "options gspca_gl860 " "sensor=\"OV2640\" or \"OV9655\""); return -1; } } else { PDEBUG(D_PROBE, "No 0xff -> sensor MI2020"); sd->sensor = ID_MI2020; } } if (_MI1320_) { PDEBUG(D_PROBE, "05e3:f191 sensor MI1320 (1.3M)"); } else if (_MI2020_) { PDEBUG(D_PROBE, "05e3:0503 sensor MI2020 (2.0M)"); } else if (_MI2020b_) { PDEBUG(D_PROBE, "05e3:0503 sensor MI2020 alt. driver (2.0M)"); } else if (_OV9655_) { PDEBUG(D_PROBE, "05e3:0503 sensor OV9655 (1.3M)"); } else if (_OV2640_) { PDEBUG(D_PROBE, "05e3:0503 sensor OV2640 (2.0M)"); } else { PDEBUG(D_PROBE, "***** Unknown sensor *****"); return -1; } return 0; }
static int ov2640_camera_settings(struct gspca_dev *gspca_dev) { struct sd *sd = (struct sd *) gspca_dev; s32 backlight = sd->vcur.backlight; s32 bright = sd->vcur.brightness; s32 sharp = sd->vcur.sharpness; s32 gam = sd->vcur.gamma; s32 cntr = sd->vcur.contrast; s32 sat = sd->vcur.saturation; s32 hue = sd->vcur.hue; s32 wbal = sd->vcur.whitebal; s32 mirror = (((sd->vcur.mirror > 0) ^ sd->mirrorMask) == 0); s32 flip = (((sd->vcur.flip > 0) ^ sd->mirrorMask) == 0); if (backlight != sd->vold.backlight) { /* No sd->vold.backlight=backlight; (to be done again later) */ if (backlight < 0 || backlight > sd->vmax.backlight) backlight = 0; ctrl_out(gspca_dev, 0x40, 1, 0x6001 , 0x00ff, 0, NULL); ctrl_out(gspca_dev, 0x40, 1, 0x601e + backlight , 0x0024, 0, NULL); ctrl_out(gspca_dev, 0x40, 1, 0x601e + backlight - 10, 0x0025, 0, NULL); } if (bright != sd->vold.brightness) { sd->vold.brightness = bright; if (bright < 0 || bright > sd->vmax.brightness) bright = 0; ctrl_out(gspca_dev, 0x40, 1, 0x6000 , 0x00ff, 0, NULL); ctrl_out(gspca_dev, 0x40, 1, 0x6009 , 0x007c, 0, NULL); ctrl_out(gspca_dev, 0x40, 1, 0x6000 + bright, 0x007d, 0, NULL); } if (wbal != sd->vold.whitebal) { sd->vold.whitebal = wbal; if (wbal < 0 || wbal > sd->vmax.whitebal) wbal = 0; ctrl_out(gspca_dev, 0x40, 1, 0x6000 , 0x00ff, 0, NULL); ctrl_out(gspca_dev, 0x40, 1, 0x6003 , 0x007c, 0, NULL); ctrl_out(gspca_dev, 0x40, 1, 0x6000 + wbal, 0x007d, 0, NULL); } if (cntr != sd->vold.contrast) { sd->vold.contrast = cntr; if (cntr < 0 || cntr > sd->vmax.contrast) cntr = 0; ctrl_out(gspca_dev, 0x40, 1, 0x6000 , 0x00ff, 0, NULL); ctrl_out(gspca_dev, 0x40, 1, 0x6007 , 0x007c, 0, NULL); ctrl_out(gspca_dev, 0x40, 1, 0x6000 + cntr, 0x007d, 0, NULL); } if (sat != sd->vold.saturation) { sd->vold.saturation = sat; if (sat < 0 || sat > sd->vmax.saturation) sat = 0; ctrl_out(gspca_dev, 0x40, 1, 0x6000 , 0x00ff, 0, NULL); ctrl_out(gspca_dev, 0x40, 1, 0x6001 , 0x007c, 0, NULL); ctrl_out(gspca_dev, 0x40, 1, 0x6000 + sat, 0x007d, 0, NULL); } if (sharp != sd->vold.sharpness) { sd->vold.sharpness = sharp; if (sharp < 0 || sharp > sd->vmax.sharpness) sharp = 0; ctrl_out(gspca_dev, 0x40, 1, 0x6000 , 0x00ff, 0, NULL); ctrl_out(gspca_dev, 0x40, 1, 0x6001 , 0x0092, 0, NULL); ctrl_out(gspca_dev, 0x40, 1, 0x60c0 + sharp, 0x0093, 0, NULL); } if (hue != sd->vold.hue) { sd->vold.hue = hue; if (hue < 0 || hue > sd->vmax.hue) hue = 0; ctrl_out(gspca_dev, 0x40, 1, 0x6000 , 0x00ff, 0, NULL); ctrl_out(gspca_dev, 0x40, 1, 0x6002 , 0x007c, 0, NULL); ctrl_out(gspca_dev, 0x40, 1, 0x6000 + hue * (hue < 255), 0x007d, 0, NULL); if (hue >= 255) sd->swapRB = 1; else sd->swapRB = 0; } if (gam != sd->vold.gamma) { sd->vold.gamma = gam; if (gam < 0 || gam > sd->vmax.gamma) gam = 0; ctrl_out(gspca_dev, 0x40, 1, 0x6000 , 0x00ff, 0, NULL); ctrl_out(gspca_dev, 0x40, 1, 0x6008 , 0x007c, 0, NULL); ctrl_out(gspca_dev, 0x40, 1, 0x6000 + gam, 0x007d, 0, NULL); } if (mirror != sd->vold.mirror || flip != sd->vold.flip) { sd->vold.mirror = mirror; sd->vold.flip = flip; mirror = 0x80 * mirror; ctrl_out(gspca_dev, 0x40, 1, 0x6001, 0x00ff, 0, NULL); ctrl_out(gspca_dev, 0x40, 1, 0x6000, 0x8004, 0, NULL); ctrl_in(gspca_dev, 0xc0, 2, 0x6000, 0x8004, 1, c28); ctrl_out(gspca_dev, 0x40, 1, 0x6028 + mirror, 0x0004, 0, NULL); flip = 0x50 * flip + mirror; ctrl_out(gspca_dev, 0x40, 1, 0x6001, 0x00ff, 0, NULL); ctrl_out(gspca_dev, 0x40, 1, 0x6000, 0x8004, 0, NULL); ctrl_in(gspca_dev, 0xc0, 2, 0x6000, 0x8004, 1, ca8); ctrl_out(gspca_dev, 0x40, 1, 0x6028 + flip, 0x0004, 0, NULL); ctrl_in(gspca_dev, 0xc0, 2, 0x0000, 0x0000, 1, c50); } if (backlight != sd->vold.backlight) { sd->vold.backlight = backlight; ctrl_out(gspca_dev, 0x40, 1, 0x6001 , 0x00ff, 0, NULL); ctrl_out(gspca_dev, 0x40, 1, 0x601e + backlight , 0x0024, 0, NULL); ctrl_out(gspca_dev, 0x40, 1, 0x601e + backlight - 10, 0x0025, 0, NULL); } return 0; }
static int ov2640_init_post_alt(struct gspca_dev *gspca_dev) { s32 reso = gspca_dev->cam.cam_mode[(s32) gspca_dev->curr_mode].priv; s32 n; /* reserved for FETCH functions */ ctrl_out(gspca_dev, 0x40, 5, 0x0001, 0x0000, 0, NULL); n = fetch_validx(gspca_dev, tbl_sensor_settings_common1, ARRAY_SIZE(tbl_sensor_settings_common1)); ctrl_out(gspca_dev, 0x40, 3, 0x0000, 0x0200, 12, dat_post); common(gspca_dev); keep_on_fetching_validx(gspca_dev, tbl_sensor_settings_common1, ARRAY_SIZE(tbl_sensor_settings_common1), n); switch (reso) { case IMAGE_640: n = fetch_validx(gspca_dev, tbl_640, ARRAY_SIZE(tbl_640)); ctrl_out(gspca_dev, 0x40, 3, 0x0000, 0x0200, 12, dat_640); break; case IMAGE_800: n = fetch_validx(gspca_dev, tbl_800, ARRAY_SIZE(tbl_800)); ctrl_out(gspca_dev, 0x40, 3, 0x0000, 0x0200, 12, dat_800); break; case IMAGE_1600: case IMAGE_1280: n = fetch_validx(gspca_dev, tbl_big1, ARRAY_SIZE(tbl_big1)); if (reso == IMAGE_1280) { n = fetch_validx(gspca_dev, tbl_big2, ARRAY_SIZE(tbl_big2)); } else { ctrl_out(gspca_dev, 0x40, 1, 0x601d, 0x0086, 0, NULL); ctrl_out(gspca_dev, 0x40, 1, 0x6001, 0x00d7, 0, NULL); ctrl_out(gspca_dev, 0x40, 1, 0x6082, 0x00d3, 0, NULL); } n = fetch_validx(gspca_dev, tbl_big3, ARRAY_SIZE(tbl_big3)); if (reso == IMAGE_1280) { ctrl_out(gspca_dev, 0x40, 1, 0x6001, 0x00ff, 0, NULL); ctrl_out(gspca_dev, 0x40, 3, 0x0000, 0x0200, 12, dat_1280); } else { ctrl_out(gspca_dev, 0x40, 1, 0x6020, 0x008c, 0, NULL); ctrl_out(gspca_dev, 0x40, 1, 0x6001, 0x00ff, 0, NULL); ctrl_out(gspca_dev, 0x40, 1, 0x6076, 0x0018, 0, NULL); ctrl_out(gspca_dev, 0x40, 3, 0x0000, 0x0200, 12, dat_1600); } break; } n = fetch_validx(gspca_dev, tbl_sensor_settings_common2, ARRAY_SIZE(tbl_sensor_settings_common2)); ov2640_camera_settings(gspca_dev); return 0; }
int mi2020_camera_settings(struct gspca_dev *gspca_dev) { struct sd *sd = (struct sd *) gspca_dev; s32 backlight = sd->vcur.backlight; s32 bright = sd->vcur.brightness; s32 sharp = sd->vcur.sharpness; s32 cntr = sd->vcur.contrast; s32 gam = sd->vcur.gamma; s32 hue = (sd->vcur.hue > 0); s32 mirror = (((sd->vcur.mirror > 0) ^ sd->mirrorMask) > 0); s32 flip = (((sd->vcur.flip > 0) ^ sd->mirrorMask) > 0); s32 freq = (sd->vcur.AC50Hz > 0); u8 dat_sharp[] = {0x6c, 0x00, 0x08}; u8 dat_bright2[] = {0x90, 0x00, 0x00}; u8 dat_freq2[] = {0x90, 0x00, 0x80}; u8 dat_multi1[] = {0x8c, 0xa7, 0x00}; u8 dat_multi2[] = {0x90, 0x00, 0x00}; u8 dat_multi3[] = {0x8c, 0xa7, 0x00}; u8 dat_multi4[] = {0x90, 0x00, 0x00}; u8 dat_hvflip2[] = {0x90, 0x04, 0x6c}; u8 dat_hvflip4[] = {0x90, 0x00, 0x24}; if (sd->nbIm < 4) { sd->waitSet = 1; return 0; } sd->waitSet = 0; if (freq != sd->vold.AC50Hz) { sd->vold.AC50Hz = freq; dat_freq2[2] = freq ? 0xc0 : 0x80; ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_freq1); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_freq2); msleep(20); } if (mirror != sd->vold.mirror || flip != sd->vold.flip) { sd->vold.mirror = mirror; sd->vold.flip = flip; dat_hvflip2[2] = 0x6c + 2 * (1 - flip) + (1 - mirror); dat_hvflip4[2] = 0x24 + 2 * (1 - flip) + (1 - mirror); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_hvflip1); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_hvflip2); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_hvflip3); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_hvflip4); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_hvflip5); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_hvflip6); msleep(130); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_dummy1); msleep(6); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_dummy1); msleep(6); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_dummy1); msleep(6); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_dummy1); msleep(6); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_dummy1); msleep(6); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_dummy1); msleep(6); } if (backlight != sd->vold.backlight) { sd->vold.backlight = backlight; if (backlight < 0 || backlight > sd->vmax.backlight) backlight = 0; dat_multi1[2] = 0x9d; dat_multi3[2] = dat_multi1[2] + 1; dat_multi4[2] = dat_multi2[2] = backlight; ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_multi1); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_multi2); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_multi3); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_multi4); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_multi5); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_multi6); } if (gam != sd->vold.gamma) { sd->vold.gamma = gam; if (gam < 0 || gam > sd->vmax.gamma) gam = 0; dat_multi1[2] = 0x6d; dat_multi3[2] = dat_multi1[2] + 1; dat_multi4[2] = dat_multi2[2] = 0x40 + gam; ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_multi1); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_multi2); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_multi3); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_multi4); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_multi5); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_multi6); } if (cntr != sd->vold.contrast) { sd->vold.contrast = cntr; if (cntr < 0 || cntr > sd->vmax.contrast) cntr = 0; dat_multi1[2] = 0x6d; dat_multi3[2] = dat_multi1[2] + 1; dat_multi4[2] = dat_multi2[2] = 0x12 + 16 * cntr; ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_multi1); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_multi2); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_multi3); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_multi4); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_multi5); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_multi6); } if (bright != sd->vold.brightness) { sd->vold.brightness = bright; if (bright < 0 || bright > sd->vmax.brightness) bright = 0; dat_bright2[2] = bright; ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_bright1); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_bright2); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_bright3); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_bright4); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_bright5); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_bright6); } if (sharp != sd->vold.sharpness) { sd->vold.sharpness = sharp; if (sharp < 0 || sharp > sd->vmax.sharpness) sharp = 0; dat_sharp[1] = sharp; ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0032, 3, dat_sharp); } if (hue != sd->vold.hue) { sd->swapRB = hue; sd->vold.hue = hue; } return 0; }
static int mi2020_init_post_alt(struct gspca_dev *gspca_dev) { struct sd *sd = (struct sd *) gspca_dev; s32 reso = gspca_dev->cam.cam_mode[(s32) gspca_dev->curr_mode].priv; s32 backlight = sd->vcur.backlight; s32 mirror = (((sd->vcur.mirror > 0) ^ sd->mirrorMask) > 0); s32 flip = (((sd->vcur.flip > 0) ^ sd->mirrorMask) > 0); s32 freq = (sd->vcur.AC50Hz > 0); u8 dat_freq2[] = {0x90, 0x00, 0x80}; u8 dat_multi1[] = {0x8c, 0xa7, 0x00}; u8 dat_multi2[] = {0x90, 0x00, 0x00}; u8 dat_multi3[] = {0x8c, 0xa7, 0x00}; u8 dat_multi4[] = {0x90, 0x00, 0x00}; u8 dat_hvflip2[] = {0x90, 0x04, 0x6c}; u8 dat_hvflip4[] = {0x90, 0x00, 0x24}; u8 c; sd->nbIm = -1; dat_freq2[2] = freq ? 0xc0 : 0x80; dat_multi1[2] = 0x9d; dat_multi3[2] = dat_multi1[2] + 1; dat_multi4[2] = dat_multi2[2] = backlight; dat_hvflip2[2] = 0x6c + 2 * (1 - flip) + (1 - mirror); dat_hvflip4[2] = 0x24 + 2 * (1 - flip) + (1 - mirror); msleep(200); ctrl_out(gspca_dev, 0x40, 5, 0x0001, 0x0000, 0, NULL); msleep(3); common(gspca_dev); ctrl_out(gspca_dev, 0x40, 1, 0x0041, 0x0000, 0, NULL); msleep(70); if (_MI2020b_) ctrl_out(gspca_dev, 0x40, 1, 0x0040, 0x0000, 0, NULL); ctrl_out(gspca_dev, 0x40, 1, 0x0010, 0x0010, 0, NULL); ctrl_out(gspca_dev, 0x40, 1, 0x0003, 0x00c1, 0, NULL); ctrl_out(gspca_dev, 0x40, 1, 0x0042, 0x00c2, 0, NULL); ctrl_out(gspca_dev, 0x40, 1, 0x006a, 0x000d, 0, NULL); switch (reso) { case IMAGE_640: case IMAGE_800: if (reso != IMAGE_800) ctrl_out(gspca_dev, 0x40, 3, 0x0000, 0x0200, 12, dat_640); else ctrl_out(gspca_dev, 0x40, 3, 0x0000, 0x0200, 12, dat_800); if (_MI2020c_) fetch_idxdata(gspca_dev, tbl_init_post_alt_low_a, ARRAY_SIZE(tbl_init_post_alt_low_a)); if (reso == IMAGE_800) fetch_idxdata(gspca_dev, tbl_init_post_alt_low_b, ARRAY_SIZE(tbl_init_post_alt_low_b)); fetch_idxdata(gspca_dev, tbl_init_post_alt_low_c, ARRAY_SIZE(tbl_init_post_alt_low_c)); if (_MI2020b_) { ctrl_out(gspca_dev, 0x40, 1, 0x0001, 0x0010, 0, NULL); ctrl_out(gspca_dev, 0x40, 1, 0x0000, 0x00c1, 0, NULL); ctrl_out(gspca_dev, 0x40, 1, 0x0041, 0x00c2, 0, NULL); msleep(150); } else if (_MI2020c_) { ctrl_out(gspca_dev, 0x40, 1, 0x0010, 0x0010, 0, NULL); ctrl_out(gspca_dev, 0x40, 1, 0x0000, 0x00c1, 0, NULL); ctrl_out(gspca_dev, 0x40, 1, 0x0041, 0x00c2, 0, NULL); msleep(120); ctrl_out(gspca_dev, 0x40, 1, 0x0040, 0x0000, 0, NULL); msleep(30); } else if (_MI2020_) { ctrl_out(gspca_dev, 0x40, 1, 0x0001, 0x0010, 0, NULL); ctrl_out(gspca_dev, 0x40, 1, 0x0000, 0x00c1, 0, NULL); ctrl_out(gspca_dev, 0x40, 1, 0x0041, 0x00c2, 0, NULL); msleep(120); ctrl_out(gspca_dev, 0x40, 1, 0x0040, 0x0000, 0, NULL); msleep(30); } ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_freq1); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_freq2); msleep(20); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_multi1); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_multi2); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_multi3); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_multi4); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, "\x8c\xa2\x0c"); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, "\x90\x00\x17"); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_multi5); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_multi6); msleep(5); if (_MI2020c_) { fetch_idxdata(gspca_dev, tbl_init_post_alt_low_d, ARRAY_SIZE(tbl_init_post_alt_low_d)); } else { ctrl_in(gspca_dev, 0xc0, 2, 0x0000, 0x0000, 1, &c); msleep(14); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_hvflip1); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_hvflip2); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_hvflip3); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_hvflip4); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_hvflip5); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_hvflip6); msleep(21); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_dummy1); msleep(5); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_dummy1); msleep(5); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_dummy1); msleep(5); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_dummy1); msleep(5); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_dummy1); msleep(5); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_dummy1); msleep(246); sd->nbIm = 0; } break; case IMAGE_1280: case IMAGE_1600: if (reso == IMAGE_1280) { ctrl_out(gspca_dev, 0x40, 3, 0x0000, 0x0200, 12, dat_1280); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, "\x8c\x27\x07"); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, "\x90\x05\x04"); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, "\x8c\x27\x09"); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, "\x90\x04\x02"); } else { ctrl_out(gspca_dev, 0x40, 3, 0x0000, 0x0200, 12, dat_1600); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, "\x8c\x27\x07"); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, "\x90\x06\x40"); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, "\x8c\x27\x09"); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, "\x90\x04\xb0"); } fetch_idxdata(gspca_dev, tbl_init_post_alt_big_a, ARRAY_SIZE(tbl_init_post_alt_big_a)); if (reso == IMAGE_1600) msleep(13); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, "\x8c\x27\x97"); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, "\x90\x01\x00"); msleep(53); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, "\x8c\xa1\x20"); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, "\x90\x00\x00"); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, "\x8c\xa1\x03"); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, "\x90\x00\x01"); if (reso == IMAGE_1600) msleep(13); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, "\x8c\xa7\x02"); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, "\x90\x00\x00"); msleep(53); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, "\x8c\xa1\x20"); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, "\x90\x00\x72"); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, "\x8c\xa1\x03"); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, "\x90\x00\x02"); if (reso == IMAGE_1600) msleep(13); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, "\x8c\xa7\x02"); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, "\x90\x00\x01"); msleep(53); if (_MI2020b_) { ctrl_out(gspca_dev, 0x40, 1, 0x0001, 0x0010, 0, NULL); if (reso == IMAGE_1600) msleep(500); ctrl_out(gspca_dev, 0x40, 1, 0x0000, 0x00c1, 0, NULL); ctrl_out(gspca_dev, 0x40, 1, 0x0041, 0x00c2, 0, NULL); msleep(1850); } else if (_MI2020c_ || _MI2020_) { ctrl_out(gspca_dev, 0x40, 1, 0x0001, 0x0010, 0, NULL); ctrl_out(gspca_dev, 0x40, 1, 0x0000, 0x00c1, 0, NULL); ctrl_out(gspca_dev, 0x40, 1, 0x0041, 0x00c2, 0, NULL); msleep(1850); ctrl_out(gspca_dev, 0x40, 1, 0x0040, 0x0000, 0, NULL); msleep(30); } ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_freq1); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_freq2); msleep(20); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_multi1); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_multi2); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_multi3); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_multi4); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, "\x8c\xa2\x0c"); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, "\x90\x00\x17"); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_multi5); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_multi6); msleep(6); ctrl_in(gspca_dev, 0xc0, 2, 0x0000, 0x0000, 1, &c); msleep(14); if (_MI2020c_) fetch_idxdata(gspca_dev, tbl_init_post_alt_big_b, ARRAY_SIZE(tbl_init_post_alt_big_b)); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_hvflip1); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_hvflip2); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_hvflip3); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_hvflip4); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_hvflip5); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, dat_hvflip6); msleep(16); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, "\x8c\xa1\x03"); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, "\x90\x00\x01"); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, "\x8c\xa1\x20"); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, "\x90\x00\x00"); if (reso == IMAGE_1600) msleep(25); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, "\x8c\xa7\x02"); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, "\x90\x00\x00"); msleep(103); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, "\x8c\xa1\x03"); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, "\x90\x00\x02"); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, "\x8c\xa1\x20"); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, "\x90\x00\x72"); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, "\x8c\xa7\x02"); ctrl_out(gspca_dev, 0x40, 3, 0x7a00, 0x0033, 3, "\x90\x00\x01"); sd->nbIm = 0; if (_MI2020c_) fetch_idxdata(gspca_dev, tbl_init_post_alt_big_c, ARRAY_SIZE(tbl_init_post_alt_big_c)); } sd->vold.mirror = mirror; sd->vold.flip = flip; sd->vold.AC50Hz = freq; sd->vold.backlight = backlight; mi2020_camera_settings(gspca_dev); return 0; }
static int gl860_guess_sensor(struct gspca_dev *gspca_dev, u16 vendor_id, u16 product_id) { struct sd *sd = (struct sd *) gspca_dev; u8 probe, nb26, nb96, nOV, ntry; if (product_id == 0xf191) sd->sensor = ID_MI1320; if (sd->sensor == 0xff) { ctrl_in(gspca_dev, 0xc0, 2, 0x0000, 0x0004, 1, &probe); ctrl_in(gspca_dev, 0xc0, 2, 0x0000, 0x0004, 1, &probe); ctrl_out(gspca_dev, 0x40, 1, 0x0000, 0x0000, 0, NULL); msleep(3); ctrl_out(gspca_dev, 0x40, 1, 0x0010, 0x0010, 0, NULL); msleep(3); ctrl_out(gspca_dev, 0x40, 1, 0x0008, 0x00c0, 0, NULL); msleep(3); ctrl_out(gspca_dev, 0x40, 1, 0x0001, 0x00c1, 0, NULL); msleep(3); ctrl_out(gspca_dev, 0x40, 1, 0x0001, 0x00c2, 0, NULL); msleep(3); ctrl_out(gspca_dev, 0x40, 1, 0x0020, 0x0006, 0, NULL); msleep(3); ctrl_out(gspca_dev, 0x40, 1, 0x006a, 0x000d, 0, NULL); msleep(56); PDEBUG(D_PROBE, "probing for sensor MI2020 or OVXXXX"); nOV = 0; for (ntry = 0; ntry < 4; ntry++) { ctrl_out(gspca_dev, 0x40, 1, 0x0040, 0x0000, 0, NULL); msleep(3); ctrl_out(gspca_dev, 0x40, 1, 0x0063, 0x0006, 0, NULL); msleep(3); ctrl_out(gspca_dev, 0x40, 1, 0x7a00, 0x8030, 0, NULL); msleep(10); ctrl_in(gspca_dev, 0xc0, 2, 0x7a00, 0x8030, 1, &probe); PDEBUG(D_PROBE, "probe=0x%02x", probe); if (probe == 0xff) nOV++; } if (nOV) { PDEBUG(D_PROBE, "0xff -> OVXXXX"); PDEBUG(D_PROBE, "probing for sensor OV2640 or OV9655"); nb26 = nb96 = 0; for (ntry = 0; ntry < 4; ntry++) { ctrl_out(gspca_dev, 0x40, 1, 0x0040, 0x0000, 0, NULL); msleep(3); ctrl_out(gspca_dev, 0x40, 1, 0x6000, 0x800a, 0, NULL); msleep(10); /* Wait for 26(OV2640) or 96(OV9655) */ ctrl_in(gspca_dev, 0xc0, 2, 0x6000, 0x800a, 1, &probe); if (probe == 0x26 || probe == 0x40) { PDEBUG(D_PROBE, "probe=0x%02x -> OV2640", probe); sd->sensor = ID_OV2640; nb26 += 4; break; } if (probe == 0x96 || probe == 0x55) { PDEBUG(D_PROBE, "probe=0x%02x -> OV9655", probe); sd->sensor = ID_OV9655; nb96 += 4; break; } PDEBUG(D_PROBE, "probe=0x%02x", probe); if (probe == 0x00) nb26++; if (probe == 0xff) nb96++; msleep(3); } if (nb26 < 4 && nb96 < 4) return -1; } else { PDEBUG(D_PROBE, "Not any 0xff -> MI2020"); sd->sensor = ID_MI2020; } } if (_MI1320_) { PDEBUG(D_PROBE, "05e3:f191 sensor MI1320 (1.3M)"); } else if (_MI2020_) { PDEBUG(D_PROBE, "05e3:0503 sensor MI2020 (2.0M)"); } else if (_MI2020b_) { PDEBUG(D_PROBE, "05e3:0503 sensor MI2020 alt. driver (2.0M)"); } else if (_OV9655_) { PDEBUG(D_PROBE, "05e3:0503 sensor OV9655 (1.3M)"); } else if (_OV2640_) { PDEBUG(D_PROBE, "05e3:0503 sensor OV2640 (2.0M)"); } else { PDEBUG(D_PROBE, "***** Unknown sensor *****"); return -1; } return 0; }
static int ov9655_init_post_alt(struct gspca_dev *gspca_dev) { s32 reso = gspca_dev->cam.cam_mode[(s32) gspca_dev->curr_mode].priv; s32 n; s32 i; u8 **tbl; ctrl_out(gspca_dev, 0x40, 5, 0x0001, 0x0000, 0, NULL); tbl = (reso == IMAGE_640) ? tbl_640 : tbl_800; ctrl_out(gspca_dev, 0x40, 3, 0x0000, 0x0200, tbl_length[0], tbl[0]); for (i = 1; i < 7; i++) ctrl_out(gspca_dev, 0x40, 3, 0x6000, 0x0200, tbl_length[i], tbl[i]); ctrl_out(gspca_dev, 0x40, 3, 0x0000, 0x0200, tbl_length[7], tbl[7]); n = fetch_validx(gspca_dev, tbl_init_post_alt, ARRAY_SIZE(tbl_init_post_alt)); ctrl_in(gspca_dev, 0xc0, 2, 0x6000, 0x801e, 1, c04); keep_on_fetching_validx(gspca_dev, tbl_init_post_alt, ARRAY_SIZE(tbl_init_post_alt), n); ctrl_in(gspca_dev, 0xc0, 2, 0x6000, 0x801e, 1, c04); keep_on_fetching_validx(gspca_dev, tbl_init_post_alt, ARRAY_SIZE(tbl_init_post_alt), n); ctrl_in(gspca_dev, 0xc0, 2, 0x6000, 0x801e, 1, c04); keep_on_fetching_validx(gspca_dev, tbl_init_post_alt, ARRAY_SIZE(tbl_init_post_alt), n); ctrl_in(gspca_dev, 0xc0, 2, 0x6000, 0x801e, 1, c04); keep_on_fetching_validx(gspca_dev, tbl_init_post_alt, ARRAY_SIZE(tbl_init_post_alt), n); ctrl_out(gspca_dev, 0x40, 3, 0x6000, 0x0200, 8, dat_post_1); keep_on_fetching_validx(gspca_dev, tbl_init_post_alt, ARRAY_SIZE(tbl_init_post_alt), n); ctrl_in(gspca_dev, 0xc0, 2, 0x6000, 0x801e, 1, c04); keep_on_fetching_validx(gspca_dev, tbl_init_post_alt, ARRAY_SIZE(tbl_init_post_alt), n); ctrl_in(gspca_dev, 0xc0, 2, 0x6000, 0x801e, 1, c04); keep_on_fetching_validx(gspca_dev, tbl_init_post_alt, ARRAY_SIZE(tbl_init_post_alt), n); ctrl_in(gspca_dev, 0xc0, 2, 0x6000, 0x801e, 1, c04); keep_on_fetching_validx(gspca_dev, tbl_init_post_alt, ARRAY_SIZE(tbl_init_post_alt), n); ctrl_in(gspca_dev, 0xc0, 2, 0x6000, 0x801e, 1, c04); keep_on_fetching_validx(gspca_dev, tbl_init_post_alt, ARRAY_SIZE(tbl_init_post_alt), n); ctrl_out(gspca_dev, 0x40, 3, 0x6000, 0x0200, 8, dat_post_1); keep_on_fetching_validx(gspca_dev, tbl_init_post_alt, ARRAY_SIZE(tbl_init_post_alt), n); ctrl_in(gspca_dev, 0xc0, 2, 0x6000, 0x801e, 1, c04); keep_on_fetching_validx(gspca_dev, tbl_init_post_alt, ARRAY_SIZE(tbl_init_post_alt), n); ctrl_in(gspca_dev, 0xc0, 2, 0x6000, 0x801e, 1, c04); keep_on_fetching_validx(gspca_dev, tbl_init_post_alt, ARRAY_SIZE(tbl_init_post_alt), n); ctrl_out(gspca_dev, 0x40, 3, 0x6000, 0x0200, 8, dat_post_1); ctrl_out(gspca_dev, 0x40, 3, 0x0000, 0x0200, 4, dat_post_2); ctrl_out(gspca_dev, 0x40, 3, 0x6000, 0x0200, 8, dat_post_3); ctrl_out(gspca_dev, 0x40, 3, 0x0000, 0x0200, 4, dat_post_4); ctrl_out(gspca_dev, 0x40, 3, 0x6000, 0x0200, 8, dat_post_5); ctrl_out(gspca_dev, 0x40, 3, 0x0000, 0x0200, 4, dat_post_6); ctrl_out(gspca_dev, 0x40, 3, 0x6000, 0x0200, 8, dat_post_7); ctrl_out(gspca_dev, 0x40, 3, 0x6000, 0x0200, 8, dat_post_8); ov9655_camera_settings(gspca_dev); return 0; }
static void common(struct gspca_dev *gspca_dev) { s32 n; /* reserved for FETCH macros */ ctrl_out(gspca_dev, 0x40, 3, 0x0000, 0x0200, 22, s000); ctrl_out(gspca_dev, 0x40, 1, 0x0041, 0x0000, 0, NULL); ctrl_out(gspca_dev, 0x40, 3, 0xba00, 0x0200, 32, s001); n = fetch_validx(gspca_dev, tbl_common, ARRAY_SIZE(tbl_common)); ctrl_out(gspca_dev, 0x40, 3, 0xba00, 0x0200, 48, s002); ctrl_out(gspca_dev, 0x40, 3, 0xba00, 0x0200, 48, s003); ctrl_out(gspca_dev, 0x40, 3, 0xba00, 0x0200, 16, s004); ctrl_out(gspca_dev, 0x40, 3, 0xba00, 0x0200, 48, s005); ctrl_out(gspca_dev, 0x40, 3, 0xba00, 0x0200, 44, s006); keep_on_fetching_validx(gspca_dev, tbl_common, ARRAY_SIZE(tbl_common), n); ctrl_out(gspca_dev, 0x40, 3, 0xba00, 0x0200, 52, s007); ctrl_out(gspca_dev, 0x40, 3, 0xba00, 0x0200, 48, s008); ctrl_out(gspca_dev, 0x40, 3, 0xba00, 0x0200, 48, s009); ctrl_out(gspca_dev, 0x40, 3, 0xba00, 0x0200, 56, s010); keep_on_fetching_validx(gspca_dev, tbl_common, ARRAY_SIZE(tbl_common), n); ctrl_out(gspca_dev, 0x40, 3, 0xba00, 0x0200, 40, s011); keep_on_fetching_validx(gspca_dev, tbl_common, ARRAY_SIZE(tbl_common), n); }
static void ov9655_post_unset_alt(struct gspca_dev *gspca_dev) { ctrl_out(gspca_dev, 0x40, 5, 0x0000, 0x0000, 0, NULL); ctrl_out(gspca_dev, 0x40, 1, 0x0061, 0x0000, 0, NULL); }
static void common(struct gspca_dev *gspca_dev) { s32 n; /* reserved for FETCH functions */ ctrl_out(gspca_dev, 0x40, 3, 0x0000, 0x0200, 22, dat_common00); ctrl_out(gspca_dev, 0x40, 1, 0x0041, 0x0000, 0, NULL); ctrl_out(gspca_dev, 0x40, 3, 0xba00, 0x0200, 32, dat_common01); n = fetch_validx(gspca_dev, tbl_common, ARRAY_SIZE(tbl_common)); ctrl_out(gspca_dev, 0x40, 3, 0xba00, 0x0200, 48, dat_common02); ctrl_out(gspca_dev, 0x40, 3, 0xba00, 0x0200, 48, dat_common03); ctrl_out(gspca_dev, 0x40, 3, 0xba00, 0x0200, 16, dat_common04); ctrl_out(gspca_dev, 0x40, 3, 0xba00, 0x0200, 48, dat_common05); ctrl_out(gspca_dev, 0x40, 3, 0xba00, 0x0200, 44, dat_common06); keep_on_fetching_validx(gspca_dev, tbl_common, ARRAY_SIZE(tbl_common), n); ctrl_out(gspca_dev, 0x40, 3, 0xba00, 0x0200, 52, dat_common07); ctrl_out(gspca_dev, 0x40, 3, 0xba00, 0x0200, 48, dat_common08); ctrl_out(gspca_dev, 0x40, 3, 0xba00, 0x0200, 48, dat_common09); ctrl_out(gspca_dev, 0x40, 3, 0xba00, 0x0200, 56, dat_common10); keep_on_fetching_validx(gspca_dev, tbl_common, ARRAY_SIZE(tbl_common), n); ctrl_out(gspca_dev, 0x40, 3, 0xba00, 0x0200, 40, dat_common11); keep_on_fetching_validx(gspca_dev, tbl_common, ARRAY_SIZE(tbl_common), n); }