static int hv7131r_get_ctrl(struct sn9c102_device* cam, struct v4l2_control* ctrl) { switch (ctrl->id) { case V4L2_CID_GAIN: if ((ctrl->value = sn9c102_i2c_read(cam, 0x30)) < 0) return -EIO; return 0; case V4L2_CID_RED_BALANCE: if ((ctrl->value = sn9c102_i2c_read(cam, 0x31)) < 0) return -EIO; ctrl->value = ctrl->value & 0x3f; return 0; case V4L2_CID_BLUE_BALANCE: if ((ctrl->value = sn9c102_i2c_read(cam, 0x33)) < 0) return -EIO; ctrl->value = ctrl->value & 0x3f; return 0; case SN9C102_V4L2_CID_GREEN_BALANCE: if ((ctrl->value = sn9c102_i2c_read(cam, 0x32)) < 0) return -EIO; ctrl->value = ctrl->value & 0x3f; return 0; case V4L2_CID_BLACK_LEVEL: if ((ctrl->value = sn9c102_i2c_read(cam, 0x01)) < 0) return -EIO; ctrl->value = (ctrl->value & 0x08) ? 1 : 0; return 0; default: return -EINVAL; } }
static int ov7660_get_ctrl(struct sn9c102_device *cam, struct v4l2_control *ctrl) { int err = 0; switch (ctrl->id) { case V4L2_CID_EXPOSURE: ctrl->value = sn9c102_i2c_read(cam, 0x10); if (ctrl->value < 0) return -EIO; break; case V4L2_CID_DO_WHITE_BALANCE: ctrl->value = sn9c102_read_reg(cam, 0x02); if (ctrl->value < 0) return -EIO; ctrl->value = (ctrl->value & 0x04) ? 1 : 0; break; case V4L2_CID_RED_BALANCE: ctrl->value = sn9c102_read_reg(cam, 0x05); if (ctrl->value < 0) return -EIO; ctrl->value &= 0x7f; break; case V4L2_CID_BLUE_BALANCE: ctrl->value = sn9c102_read_reg(cam, 0x06); if (ctrl->value < 0) return -EIO; ctrl->value &= 0x7f; break; case SN9C102_V4L2_CID_GREEN_BALANCE: ctrl->value = sn9c102_read_reg(cam, 0x07); if (ctrl->value < 0) return -EIO; ctrl->value &= 0x7f; break; case SN9C102_V4L2_CID_BAND_FILTER: ctrl->value = sn9c102_i2c_read(cam, 0x3b); if (ctrl->value < 0) return -EIO; ctrl->value &= 0x08; break; case V4L2_CID_GAIN: ctrl->value = sn9c102_i2c_read(cam, 0x00); if (ctrl->value < 0) return -EIO; ctrl->value &= 0x1f; break; case V4L2_CID_AUTOGAIN: ctrl->value = sn9c102_i2c_read(cam, 0x13); if (ctrl->value < 0) return -EIO; ctrl->value &= 0x01; break; default: return -EINVAL; } return err ? -EIO : 0; }
static int ov7648_get_ctrl(struct sn9c102_device* cam, struct v4l2_control* ctrl) { switch (ctrl->id) { case V4L2_CID_EXPOSURE: if ((ctrl->value = sn9c102_i2c_read(cam, 0x10)) < 0) return -EIO; break; case V4L2_CID_DO_WHITE_BALANCE: if ((ctrl->value = sn9c102_read_reg(cam, 0x02)) < 0) return -EIO; ctrl->value = (ctrl->value & 0x04) ? 1 : 0; break; case V4L2_CID_RED_BALANCE: ctrl->value = sn9c102_read_reg(cam, 0x05); break; case V4L2_CID_BLUE_BALANCE: ctrl->value = sn9c102_read_reg(cam, 0x06); break; case SN9C102_V4L2_CID_GREEN_BALANCE: ctrl->value = sn9c102_read_reg(cam, 0x07); break; case V4L2_CID_GAIN: if ((ctrl->value = sn9c102_i2c_read(cam, 0x00)) < 0) return -EIO; ctrl->value &= 0x3f; break; case V4L2_CID_AUTOGAIN: if ((ctrl->value = sn9c102_i2c_read(cam, 0x13)) < 0) return -EIO; ctrl->value &= 0x01; break; case V4L2_CID_VFLIP: if ((ctrl->value = sn9c102_i2c_read(cam, 0x75)) < 0) return -EIO; ctrl->value = (ctrl->value & 0x80) ? 1 : 0; break; case SN9C102_V4L2_CID_BAND_FILTER: if ((ctrl->value = sn9c102_i2c_read(cam, 0x2d)) < 0) return -EIO; ctrl->value = (ctrl->value & 0x02) ? 1 : 0; break; default: return -EINVAL; } return 0; }
static int hv7131r_set_ctrl(struct sn9c102_device* cam, const struct v4l2_control* ctrl) { int err = 0; switch (ctrl->id) { case V4L2_CID_GAIN: err += sn9c102_i2c_write(cam, 0x30, ctrl->value); break; case V4L2_CID_RED_BALANCE: err += sn9c102_i2c_write(cam, 0x31, ctrl->value); break; case V4L2_CID_BLUE_BALANCE: err += sn9c102_i2c_write(cam, 0x33, ctrl->value); break; case SN9C102_V4L2_CID_GREEN_BALANCE: err += sn9c102_i2c_write(cam, 0x32, ctrl->value); break; case V4L2_CID_BLACK_LEVEL: { int r = sn9c102_i2c_read(cam, 0x01); if (r < 0) return -EIO; err += sn9c102_i2c_write(cam, 0x01, (ctrl->value<<3) | (r&0xf7)); } break; default: return -EINVAL; } return err ? -EIO : 0; }
static int hv7131d_get_ctrl(struct sn9c102_device* cam, struct v4l2_control* ctrl) { switch (ctrl->id) { case V4L2_CID_EXPOSURE: { int r1 = sn9c102_i2c_read(cam, 0x26), r2 = sn9c102_i2c_read(cam, 0x27); if (r1 < 0 || r2 < 0) return -EIO; ctrl->value = (r1 << 8) | (r2 & 0xff); } return 0; case V4L2_CID_RED_BALANCE: ctrl->value = sn9c102_i2c_read(cam, 0x31); if (ctrl->value < 0) return -EIO; ctrl->value = 0x3f - (ctrl->value & 0x3f); return 0; case V4L2_CID_BLUE_BALANCE: ctrl->value = sn9c102_i2c_read(cam, 0x33); if (ctrl->value < 0) return -EIO; ctrl->value = 0x3f - (ctrl->value & 0x3f); return 0; case SN9C102_V4L2_CID_GREEN_BALANCE: ctrl->value = sn9c102_i2c_read(cam, 0x32); if (ctrl->value < 0) return -EIO; ctrl->value = 0x3f - (ctrl->value & 0x3f); return 0; case SN9C102_V4L2_CID_RESET_LEVEL: ctrl->value = sn9c102_i2c_read(cam, 0x30); if (ctrl->value < 0) return -EIO; ctrl->value &= 0x3f; return 0; case SN9C102_V4L2_CID_PIXEL_BIAS_VOLTAGE: ctrl->value = sn9c102_i2c_read(cam, 0x34); if (ctrl->value < 0) return -EIO; ctrl->value &= 0x07; return 0; default: return -EINVAL; } }
static int ov7630_get_ctrl(struct sn9c102_device* cam, struct v4l2_control* ctrl) { enum sn9c102_bridge bridge = sn9c102_get_bridge(cam); int err = 0; switch (ctrl->id) { case V4L2_CID_EXPOSURE: if ((ctrl->value = sn9c102_i2c_read(cam, 0x10)) < 0) return -EIO; break; case V4L2_CID_RED_BALANCE: if (bridge == BRIDGE_SN9C105 || bridge == BRIDGE_SN9C120) ctrl->value = sn9c102_pread_reg(cam, 0x05); else ctrl->value = sn9c102_pread_reg(cam, 0x07); break; case V4L2_CID_BLUE_BALANCE: ctrl->value = sn9c102_pread_reg(cam, 0x06); break; case SN9C102_V4L2_CID_GREEN_BALANCE: if (bridge == BRIDGE_SN9C105 || bridge == BRIDGE_SN9C120) ctrl->value = sn9c102_pread_reg(cam, 0x07); else ctrl->value = sn9c102_pread_reg(cam, 0x05); break; break; case V4L2_CID_GAIN: if ((ctrl->value = sn9c102_i2c_read(cam, 0x00)) < 0) return -EIO; ctrl->value &= 0x3f; break; case V4L2_CID_DO_WHITE_BALANCE: if ((ctrl->value = sn9c102_i2c_read(cam, 0x0c)) < 0) return -EIO; ctrl->value &= 0x3f; break; case V4L2_CID_WHITENESS: if ((ctrl->value = sn9c102_i2c_read(cam, 0x0d)) < 0) return -EIO; ctrl->value &= 0x3f; break; case V4L2_CID_AUTOGAIN: if ((ctrl->value = sn9c102_i2c_read(cam, 0x13)) < 0) return -EIO; ctrl->value &= 0x01; break; case V4L2_CID_VFLIP: if ((ctrl->value = sn9c102_i2c_read(cam, 0x75)) < 0) return -EIO; ctrl->value = (ctrl->value & 0x80) ? 1 : 0; break; case SN9C102_V4L2_CID_GAMMA: if ((ctrl->value = sn9c102_i2c_read(cam, 0x14)) < 0) return -EIO; ctrl->value = (ctrl->value & 0x02) ? 1 : 0; break; case SN9C102_V4L2_CID_BAND_FILTER: if ((ctrl->value = sn9c102_i2c_read(cam, 0x2d)) < 0) return -EIO; ctrl->value = (ctrl->value & 0x02) ? 1 : 0; break; default: return -EINVAL; } return err ? -EIO : 0; }