static int s3c_fimc_v4l2_s_ctrl(struct file *filp, void *fh,
                                struct v4l2_control *c)
{
    struct s3c_fimc_control *ctrl = (struct s3c_fimc_control *) fh;
    struct s3c_fimc_out_frame *frame = &ctrl->out_frame;
    struct s3c_fimc_window_offset *offset = &ctrl->in_cam->offset;

    switch (c->id) {
    case V4L2_CID_EFFECT_ORIGINAL:
        frame->effect.type = EFFECT_ORIGINAL;
        s3c_fimc_change_effect(ctrl);
        break;

    case V4L2_CID_EFFECT_NEGATIVE:
        frame->effect.type = EFFECT_NEGATIVE;
        s3c_fimc_change_effect(ctrl);
        break;

    case V4L2_CID_EFFECT_EMBOSSING:
        frame->effect.type = EFFECT_EMBOSSING;
        s3c_fimc_change_effect(ctrl);
        break;

    case V4L2_CID_EFFECT_ARTFREEZE:
        frame->effect.type = EFFECT_ARTFREEZE;
        s3c_fimc_change_effect(ctrl);
        break;

    case V4L2_CID_EFFECT_SILHOUETTE:
        frame->effect.type = EFFECT_SILHOUETTE;
        s3c_fimc_change_effect(ctrl);
        break;

    case V4L2_CID_EFFECT_ARBITRARY:
        frame->effect.type = EFFECT_ARBITRARY;
        frame->effect.pat_cb = PAT_CB(c->value);
        frame->effect.pat_cr = PAT_CR(c->value);
        s3c_fimc_change_effect(ctrl);
        break;

    case V4L2_CID_ROTATE_ORIGINAL:
        frame->flip = FLIP_ORIGINAL;
        ctrl->rot90 = 0;
        s3c_fimc_change_rotate(ctrl);
        break;

    case V4L2_CID_HFLIP:
        frame->flip = FLIP_X_AXIS;
        ctrl->rot90 = 0;
        s3c_fimc_change_rotate(ctrl);
        break;

    case V4L2_CID_VFLIP:
        frame->flip = FLIP_Y_AXIS;
        ctrl->rot90 = 0;
        s3c_fimc_change_rotate(ctrl);
        break;

    case V4L2_CID_ROTATE_180:
        frame->flip = FLIP_XY_AXIS;
        ctrl->rot90 = 0;
        s3c_fimc_change_rotate(ctrl);
        break;

    case V4L2_CID_ROTATE_90:
        frame->flip = FLIP_ORIGINAL;
        ctrl->rot90 = 1;
        s3c_fimc_change_rotate(ctrl);
        break;

    case V4L2_CID_ROTATE_270:
        frame->flip = FLIP_XY_AXIS;
        ctrl->rot90 = 1;
        s3c_fimc_change_rotate(ctrl);
        break;

    case V4L2_CID_ROTATE_90_HFLIP:
        frame->flip = FLIP_X_AXIS;
        ctrl->rot90 = 1;
        s3c_fimc_change_rotate(ctrl);
        break;

    case V4L2_CID_ROTATE_90_VFLIP:
        frame->flip = FLIP_Y_AXIS;
        ctrl->rot90 = 1;
        s3c_fimc_change_rotate(ctrl);
        break;

    case V4L2_CID_ZOOM_IN:
        if (s3c_fimc_check_zoom(ctrl, c->id) == 0) {
            offset->h1 += S3C_FIMC_ZOOM_PIXELS;
            offset->h2 += S3C_FIMC_ZOOM_PIXELS;
            offset->v1 += S3C_FIMC_ZOOM_PIXELS;
            offset->v2 += S3C_FIMC_ZOOM_PIXELS;
            s3c_fimc_restart_dma(ctrl);
        }

        break;

    case V4L2_CID_ZOOM_OUT:
        if (s3c_fimc_check_zoom(ctrl, c->id) == 0) {
            offset->h1 -= S3C_FIMC_ZOOM_PIXELS;
            offset->h2 -= S3C_FIMC_ZOOM_PIXELS;
            offset->v1 -= S3C_FIMC_ZOOM_PIXELS;
            offset->v2 -= S3C_FIMC_ZOOM_PIXELS;
            s3c_fimc_restart_dma(ctrl);
        }

        break;

    case V4L2_CID_AUTO_WHITE_BALANCE:
        s3c_fimc_i2c_command(ctrl, I2C_CAM_WB, c->value);
        break;

    case V4L2_CID_ACTIVE_CAMERA:
        s3c_fimc_set_active_camera(ctrl, c->value);
        s3c_fimc_i2c_command(ctrl, I2C_CAM_WB, WB_AUTO);
        break;

    case V4L2_CID_TEST_PATTERN:
        s3c_fimc_set_active_camera(ctrl, S3C_FIMC_TPID);
        s3c_fimc_set_test_pattern(ctrl, c->value);
        break;

    case V4L2_CID_NR_FRAMES:
        s3c_fimc_set_nr_frames(ctrl, c->value);
        break;

    case V4L2_CID_INPUT_ADDR:
        s3c_fimc_alloc_input_memory(&ctrl->in_frame, \
                                    (dma_addr_t) c->value);
        s3c_fimc_set_input_address(ctrl);
        break;

    case V4L2_CID_INPUT_ADDR_Y:
    case V4L2_CID_INPUT_ADDR_RGB:
        s3c_fimc_alloc_y_memory(&ctrl->in_frame, \
                                (dma_addr_t) c->value);
        s3c_fimc_set_input_address(ctrl);
        break;

    case V4L2_CID_INPUT_ADDR_CB:	/* fall through */
    case V4L2_CID_INPUT_ADDR_CBCR:
        s3c_fimc_alloc_cb_memory(&ctrl->in_frame, \
                                 (dma_addr_t) c->value);
        s3c_fimc_set_input_address(ctrl);
        break;

    case V4L2_CID_INPUT_ADDR_CR:
        s3c_fimc_alloc_cr_memory(&ctrl->in_frame, \
                                 (dma_addr_t) c->value);
        s3c_fimc_set_input_address(ctrl);
        break;

    case V4L2_CID_RESET:
        ctrl->rot90 = 0;
        ctrl->in_frame.flip = FLIP_ORIGINAL;
        ctrl->out_frame.flip = FLIP_ORIGINAL;
        ctrl->out_frame.effect.type = EFFECT_ORIGINAL;
        ctrl->scaler.bypass = 0;
        s3c_fimc_reset(ctrl);
        break;

    case V4L2_CID_JPEG_INPUT:	/* fall through */
    case V4L2_CID_SCALER_BYPASS:
        ctrl->scaler.bypass = 1;
        break;

    case V4L2_CID_THUMBNAIL_SIZE:
        frame->jpeg.thumb_res = c->value;
        break;

    case V4L2_CID_JPEG_QUALITY:
        frame->jpeg.quality = c->value - 1;
        break;

    default:
        err("invalid control id: %d\n", c->id);
        return -EINVAL;
    }

    return 0;
}
Exemplo n.º 2
0
static int nx_vip_v4l2_s_ctrl(struct file *filp, void *fh,
					struct v4l2_control *c)
{
	struct nx_vip_control *ctrl = (struct nx_vip_control *) fh;
	struct nx_vip_out_frame *frame = &ctrl->out_frame;
	struct nx_vip_window_offset *offset = &ctrl->in_cam->offset;

	switch (c->id) {
#if 0
	case V4L2_CID_EFFECT_ORIGINAL:
		frame->effect.type = EFFECT_ORIGINAL;
		nx_vip_change_effect(ctrl);
		break;

	case V4L2_CID_EFFECT_NEGATIVE:
		frame->effect.type = EFFECT_NEGATIVE;
		nx_vip_change_effect(ctrl);
		break;

	case V4L2_CID_EFFECT_EMBOSSING:
		frame->effect.type = EFFECT_EMBOSSING;
		nx_vip_change_effect(ctrl);
		break;

	case V4L2_CID_EFFECT_ARTFREEZE:
		frame->effect.type = EFFECT_ARTFREEZE;
		nx_vip_change_effect(ctrl);
		break;

	case V4L2_CID_EFFECT_SILHOUETTE:
		frame->effect.type = EFFECT_SILHOUETTE;
		nx_vip_change_effect(ctrl);
		break;

	case V4L2_CID_EFFECT_ARBITRARY:
		frame->effect.type = EFFECT_ARBITRARY;
		frame->effect.pat_cb = PAT_CB(c->value);
		frame->effect.pat_cr = PAT_CR(c->value);
		nx_vip_change_effect(ctrl);
		break;

	case V4L2_CID_ROTATE_ORIGINAL:
		frame->flip = FLIP_ORIGINAL;
		ctrl->rot90 = 0;
		nx_vip_change_rotate(ctrl);
		break;

	case V4L2_CID_HFLIP:
		frame->flip = FLIP_X_AXIS;
		ctrl->rot90 = 0;
		nx_vip_change_rotate(ctrl);
		break;

	case V4L2_CID_VFLIP:
		frame->flip = FLIP_Y_AXIS;
		ctrl->rot90 = 0;
		nx_vip_change_rotate(ctrl);
		break;

	case V4L2_CID_ROTATE_180:
		frame->flip = FLIP_XY_AXIS;
		ctrl->rot90 = 0;
		nx_vip_change_rotate(ctrl);
		break;

	case V4L2_CID_ROTATE_90:
		frame->flip = FLIP_ORIGINAL;
		ctrl->rot90 = 1;
		nx_vip_change_rotate(ctrl);
		break;

	case V4L2_CID_ROTATE_270:
		frame->flip = FLIP_XY_AXIS;
		ctrl->rot90 = 1;
		nx_vip_change_rotate(ctrl);
		break;

	case V4L2_CID_ROTATE_90_HFLIP:
		frame->flip = FLIP_X_AXIS;
		ctrl->rot90 = 1;
		nx_vip_change_rotate(ctrl);
		break;

	case V4L2_CID_ROTATE_90_VFLIP:
		frame->flip = FLIP_Y_AXIS;
		ctrl->rot90 = 1;
		nx_vip_change_rotate(ctrl);
		break;

	case V4L2_CID_ZOOM_IN:
		if (nx_vip_check_zoom(ctrl, c->id) == 0) {
			offset->h1 += NX_VIP_ZOOM_PIXELS;
			offset->h2 += NX_VIP_ZOOM_PIXELS;
			offset->v1 += NX_VIP_ZOOM_PIXELS;
			offset->v2 += NX_VIP_ZOOM_PIXELS;
			nx_vip_restart_dma(ctrl);
		}

		break;

	case V4L2_CID_ZOOM_OUT:
		if (nx_vip_check_zoom(ctrl, c->id) == 0) {
			offset->h1 -= NX_VIP_ZOOM_PIXELS;
			offset->h2 -= NX_VIP_ZOOM_PIXELS;
			offset->v1 -= NX_VIP_ZOOM_PIXELS;
			offset->v2 -= NX_VIP_ZOOM_PIXELS;
			nx_vip_restart_dma(ctrl);
		}

		break;

	case V4L2_CID_AUTO_WHITE_BALANCE:
		nx_vip_i2c_command(ctrl, I2C_CAM_WB, c->value);
		break;

	case V4L2_CID_ACTIVE_CAMERA:
		nx_vip_set_active_camera(ctrl, c->value);
		nx_vip_i2c_command(ctrl, I2C_CAM_WB, WB_AUTO);
		break;

	case V4L2_CID_TEST_PATTERN:
		nx_vip_set_active_camera(ctrl, NX_VIP_TPID);
		nx_vip_set_test_pattern(ctrl, c->value);
		break;

	case V4L2_CID_NR_FRAMES:
		nx_vip_set_nr_frames(ctrl, c->value);
		break;

	case V4L2_CID_INPUT_ADDR:
		nx_vip_alloc_input_memory(&ctrl->in_frame, \
						(dma_addr_t) c->value);
		nx_vip_set_input_address(ctrl);
		break;

	case V4L2_CID_INPUT_ADDR_Y:
	case V4L2_CID_INPUT_ADDR_RGB:
		nx_vip_alloc_y_memory(&ctrl->in_frame, \
						(dma_addr_t) c->value);
		nx_vip_set_input_address(ctrl);
		break;

	case V4L2_CID_INPUT_ADDR_CB:	/* fall through */
	case V4L2_CID_INPUT_ADDR_CBCR:
		nx_vip_alloc_cb_memory(&ctrl->in_frame, \
						(dma_addr_t) c->value);
		nx_vip_set_input_address(ctrl);
		break;

	case V4L2_CID_INPUT_ADDR_CR:
		nx_vip_alloc_cr_memory(&ctrl->in_frame, \
						(dma_addr_t) c->value);
		nx_vip_set_input_address(ctrl);
		break;

	case V4L2_CID_RESET:
		ctrl->rot90 = 0;
		ctrl->in_frame.flip = FLIP_ORIGINAL;
		ctrl->out_frame.flip = FLIP_ORIGINAL;
		ctrl->out_frame.effect.type = EFFECT_ORIGINAL;
		ctrl->scaler.bypass = 0;
		nx_vip_reset(ctrl);
		break;

	case V4L2_CID_JPEG_INPUT:	/* fall through */
	case V4L2_CID_SCALER_BYPASS:
		ctrl->scaler.bypass = 1;
		break;
#endif
	case V4L2_CID_BLACK_LEVEL:
	    // Do nothing but implemented..
	   
	    break;
	case V4L2_CID_BRIGHTNESS:
	    // Do nothing but implemeted..
	    nx_vip_i2c_command(ctrl, I2C_CAM_BRIGHTNESS, c->value);
	    break;

	case V4L2_CID_POWER_SAVE:
	    // Do nothing but implemeted..
	    nx_vip_i2c_command(ctrl, I2C_CAM_POWER_SAVE, c->value);
	    break;

	default:
		err("invalid control id: %d\n", c->id);
		return -EINVAL;
	}


	return 0;
}