?? ov511.c
字號:
static int ov51x_set_slave_ids(struct usb_ov511 *ov511, unsigned char write_id, unsigned char read_id){ struct usb_device *dev = ov511->dev; if (ov511_reg_write(dev, OV511_REG_I2C_SLAVE_ID_WRITE, write_id) < 0) return -EIO; if (ov511_reg_write(dev, OV511_REG_I2C_SLAVE_ID_READ, read_id) < 0) return -EIO; if (ov511_reset(ov511, OV511_RESET_NOREGS) < 0) return -EIO; return 0;}/* This does an initial reset of an OmniVision sensor and ensures that I2C * is synchronized. Returns <0 for failure. */static int ov51x_init_ov_sensor(struct usb_ov511 *ov511){ int i, success; /* Reset the sensor */ if (ov51x_i2c_write(ov511, 0x12, 0x80) < 0) return -EIO; /* Wait for it to initialize */ schedule_timeout (1 + 150 * HZ / 1000); for (i = 0, success = 0; i < i2c_detect_tries && !success; i++) { if ((ov51x_i2c_read(ov511, OV7610_REG_ID_HIGH) == 0x7F) && (ov51x_i2c_read(ov511, OV7610_REG_ID_LOW) == 0xA2)) { success = 1; continue; } /* Reset the sensor */ if (ov51x_i2c_write(ov511, 0x12, 0x80) < 0) return -EIO; /* Wait for it to initialize */ schedule_timeout(1 + 150 * HZ / 1000); /* Dummy read to sync I2C */ if (ov51x_i2c_read(ov511, 0x00) < 0) return -EIO; } if (!success) return -EIO; PDEBUG(1, "I2C synced in %d attempt(s)", i); return 0;}static int ov511_set_packet_size(struct usb_ov511 *ov511, int size){ int alt, mult; if (ov511_stop(ov511) < 0) return -EIO; mult = size >> 5; if (ov511->bridge == BRG_OV511) { if (size == 0) alt = OV511_ALT_SIZE_0; else if (size == 257) alt = OV511_ALT_SIZE_257; else if (size == 513) alt = OV511_ALT_SIZE_513; else if (size == 769) alt = OV511_ALT_SIZE_769; else if (size == 993) alt = OV511_ALT_SIZE_993; else { err("Set packet size: invalid size (%d)", size); return -EINVAL; } } else if (ov511->bridge == BRG_OV511PLUS) { if (size == 0) alt = OV511PLUS_ALT_SIZE_0; else if (size == 33) alt = OV511PLUS_ALT_SIZE_33; else if (size == 129) alt = OV511PLUS_ALT_SIZE_129; else if (size == 257) alt = OV511PLUS_ALT_SIZE_257; else if (size == 385) alt = OV511PLUS_ALT_SIZE_385; else if (size == 513) alt = OV511PLUS_ALT_SIZE_513; else if (size == 769) alt = OV511PLUS_ALT_SIZE_769; else if (size == 961) alt = OV511PLUS_ALT_SIZE_961; else { err("Set packet size: invalid size (%d)", size); return -EINVAL; } } else if (ov511->bridge == BRG_OV518 || ov511->bridge == BRG_OV518PLUS) { if (size == 0) alt = OV518_ALT_SIZE_0; else if (size == 128) alt = OV518_ALT_SIZE_128; else if (size == 256) alt = OV518_ALT_SIZE_256; else if (size == 384) alt = OV518_ALT_SIZE_384; else if (size == 512) alt = OV518_ALT_SIZE_512; else if (size == 640) alt = OV518_ALT_SIZE_640; else if (size == 768) alt = OV518_ALT_SIZE_768; else if (size == 896) alt = OV518_ALT_SIZE_896; else { err("Set packet size: invalid size (%d)", size); return -EINVAL; } } else { err("Set packet size: Invalid bridge type"); return -EINVAL; } PDEBUG(3, "set packet size: %d, mult=%d, alt=%d", size, mult, alt); // FIXME: Don't know how to do this on OV518 yet if (ov511->bridge != BRG_OV518 && ov511->bridge != BRG_OV518PLUS) { if (ov511_reg_write(ov511->dev, OV511_REG_FIFO_PACKET_SIZE, mult) < 0) { return -EIO; } } if (usb_set_interface(ov511->dev, ov511->iface, alt) < 0) { err("Set packet size: set interface error"); return -EBUSY; } /* Initialize the stream */ if (ov511->bridge == BRG_OV518 || ov511->bridge == BRG_OV518PLUS) if (ov511_reg_write(ov511->dev, 0x2f, 0x80) < 0) return -EIO; // FIXME - Should we only reset the FIFO? if (ov511_reset(ov511, OV511_RESET_NOREGS) < 0) return -EIO; ov511->packet_size = size; if (ov511_restart(ov511) < 0) return -EIO; return 0;}/* Upload compression params and quantization tables. Returns 0 for success. */static intov511_init_compression(struct usb_ov511 *ov511){ struct usb_device *dev = ov511->dev; int rc = 0; if (!ov511->compress_inited) { ov511_reg_write(dev, 0x70, phy); ov511_reg_write(dev, 0x71, phuv); ov511_reg_write(dev, 0x72, pvy); ov511_reg_write(dev, 0x73, pvuv); ov511_reg_write(dev, 0x74, qhy); ov511_reg_write(dev, 0x75, qhuv); ov511_reg_write(dev, 0x76, qvy); ov511_reg_write(dev, 0x77, qvuv); if (ov511_upload_quan_tables(dev) < 0) { err("Error uploading quantization tables"); rc = -EIO; goto out; } } ov511->compress_inited = 1;out: return rc;}/* Upload compression params and quantization tables. Returns 0 for success. */static intov518_init_compression(struct usb_ov511 *ov511){ struct usb_device *dev = ov511->dev; int rc = 0; if (!ov511->compress_inited) { if (ov518_upload_quan_tables(dev) < 0) { err("Error uploading quantization tables"); rc = -EIO; goto out; } } ov511->compress_inited = 1;out: return rc;}/* -------------------------------------------------------------------------- *//* Sets sensor's contrast setting to "val" */static intsensor_set_contrast(struct usb_ov511 *ov511, unsigned short val){ int rc; PDEBUG(3, "%d", val); if (ov511->stop_during_set) if (ov511_stop(ov511) < 0) return -EIO; switch (ov511->sensor) { case SEN_OV7610: case SEN_OV6620: case SEN_OV6630: { rc = ov51x_i2c_write(ov511, OV7610_REG_CNT, val >> 8); if (rc < 0) goto out; break; } case SEN_OV7620: { unsigned char ctab[] = { 0x01, 0x05, 0x09, 0x11, 0x15, 0x35, 0x37, 0x57, 0x5b, 0xa5, 0xa7, 0xc7, 0xc9, 0xcf, 0xef, 0xff }; /* Use Y gamma control instead. Bit 0 enables it. */ rc = ov51x_i2c_write(ov511, 0x64, ctab[val>>12]); if (rc < 0) goto out; break; } case SEN_SAA7111A: { rc = ov51x_i2c_write(ov511, 0x0b, val >> 9); if (rc < 0) goto out; break; } default: { PDEBUG(3, "Unsupported with this sensor"); rc = -EPERM; goto out; } } rc = 0; /* Success */ ov511->contrast = val;out: if (ov511_restart(ov511) < 0) return -EIO; return rc;}/* Gets sensor's contrast setting */static intsensor_get_contrast(struct usb_ov511 *ov511, unsigned short *val){ int rc; switch (ov511->sensor) { case SEN_OV7610: case SEN_OV6620: case SEN_OV6630: rc = ov51x_i2c_read(ov511, OV7610_REG_CNT); if (rc < 0) return rc; else *val = rc << 8; break; case SEN_OV7620: /* Use Y gamma reg instead. Bit 0 is the enable bit. */ rc = ov51x_i2c_read(ov511, 0x64); if (rc < 0) return rc; else *val = (rc & 0xfe) << 8; break; case SEN_SAA7111A: *val = ov511->contrast; break; default: PDEBUG(3, "Unsupported with this sensor"); return -EPERM; } PDEBUG(3, "%d", *val); ov511->contrast = *val; return 0;}/* -------------------------------------------------------------------------- *//* Sets sensor's brightness setting to "val" */static intsensor_set_brightness(struct usb_ov511 *ov511, unsigned short val){ int rc; PDEBUG(4, "%d", val); if (ov511->stop_during_set) if (ov511_stop(ov511) < 0) return -EIO; switch (ov511->sensor) { case SEN_OV7610: case SEN_OV7620AE: case SEN_OV6620: case SEN_OV6630: rc = ov51x_i2c_write(ov511, OV7610_REG_BRT, val >> 8); if (rc < 0) goto out; break; case SEN_OV7620: /* 7620 doesn't like manual changes when in auto mode */ if (!ov511->auto_brt) { rc = ov51x_i2c_write(ov511, OV7610_REG_BRT, val >> 8); if (rc < 0) goto out; } break; case SEN_SAA7111A: rc = ov51x_i2c_write(ov511, 0x0a, val >> 8); if (rc < 0) goto out; break; default: PDEBUG(3, "Unsupported with this sensor"); rc = -EPERM; goto out; } rc = 0; /* Success */ ov511->brightness = val;out: if (ov511_restart(ov511) < 0) return -EIO; return rc;}/* Gets sensor's brightness setting */static intsensor_get_brightness(struct usb_ov511 *ov511, unsigned short *val){ int rc; switch (ov511->sensor) { case SEN_OV7610: case SEN_OV7620AE: case SEN_OV7620: case SEN_OV6620: case SEN_OV6630: rc = ov51x_i2c_read(ov511, OV7610_REG_BRT); if (rc < 0) return rc; else *val = rc << 8; break; case SEN_SAA7111A: *val = ov511->brightness; break; default: PDEBUG(3, "Unsupported with this sensor"); return -EPERM; } PDEBUG(3, "%d", *val); ov511->brightness = *val; return 0;}/* -------------------------------------------------------------------------- *//* Sets sensor's saturation (color intensity) setting to "val" */static intsensor_set_saturation(struct usb_ov511 *ov511, unsigned short val){ int rc; PDEBUG(3, "%d", val); if (ov511->stop_during_set) if (ov511_stop(ov511) < 0) return -EIO; switch (ov511->sensor) { case SEN_OV7610: case SEN_OV7620AE: case SEN_OV6620: case SEN_OV6630: rc = ov51x_i2c_write(ov511, OV7610_REG_SAT, val >> 8); if (rc < 0) goto out; break; case SEN_OV7620:// /* Use UV gamma control instead. Bits 0 & 7 are reserved. */// rc = ov511_i2c_write(ov511->dev, 0x62, (val >> 9) & 0x7e);// if (rc < 0)// goto out; rc = ov51x_i2c_write(ov511, OV7610_REG_SAT, val >> 8); if (rc < 0) goto out; break; case SEN_SAA7111A: rc = ov51x_i2c_write(ov511, 0x0c, val >> 9); if (rc < 0) goto out; break; default: PDEBUG(3, "Unsupported with this sensor"); rc = -EPERM; goto out; } rc = 0; /* Success */ ov511->colour = val;out: if (ov511_restart(ov511) < 0) return -EIO; return rc;}/* Gets sensor's saturation (color intensity) setting */static intsensor_get_saturation(struct usb_ov511 *ov511, unsigned short *val){ int rc; switch (ov511->sensor) { case SEN_OV7610: case SEN_OV7620AE: case SEN_OV6620: case SEN_OV6630: rc = ov51x_i2c_read(ov511, OV7610_REG_SAT); if (rc < 0) return rc; else *val = rc << 8; break; case SEN_OV7620:// /* Use UV gamma reg instead. Bits 0 & 7 are reserved. */// rc = ov51x_i2c_read(ov511, 0x62);// if (rc < 0)// return rc;// else// *val = (rc & 0x7e) << 9; rc = ov51x_i2c_read(ov511, OV7610_REG_SAT); if (rc < 0) return rc; else *val = rc << 8; break; case SEN_SAA7111A: *val = ov511->colour; break; default: PDEBUG(3, "Unsupported with this sensor"); return -EPERM; } PDEBUG(3, "%d", *val); ov511->colour = *val; return 0;}/* -------------------------------------------------------------------------- *//* Sets sensor's hue (red/blue balance) setting to "val" */static intsensor_set_hue(struct usb_ov511 *ov511, unsigned short val){ int rc; PDEBUG(3, "%d", val); if (ov511->stop_during_set) if (ov511_stop(ov511) < 0) return -EIO; switch (ov511->sensor) { case SEN_OV7610: case SEN_OV6620: case SEN_OV6630: rc = ov51x_i2c_write(ov511, OV7610_REG_RED, 0xFF - (val >> 8)); if (rc < 0) goto out; rc = ov51x_i2c_write(ov511, OV7610_REG_BLUE, val >> 8); if (rc < 0) goto out; break; case SEN_OV7620:// Hue control is causing problems. I will enable it once it's fixed.#if 0 rc = ov51x_i2c_write(ov511, 0x7a, (unsigned char)(val >> 8) + 0xb); if (rc < 0) goto out; rc = ov51x_i2c_write(ov511, 0x79, (unsigned char)(val >> 8) + 0xb); if (rc < 0)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -