Ejemplo n.º 1
0
static
ssize_t s3c_fimc_write(struct file *filp, const char *b, size_t c, loff_t *offset)
{
	int ret;
	struct s3c_fimc_control *ctrl = filp->private_data;
	//printk("b is %s....\n",b);
	ret = my_strcmp(b, "on");
	//printk("ret = %d...\n",ret);
	if(ret > 0)
	{
		//printk("on...\n");
		s3c_fimc_i2c_command(ctrl, I2C_CAM_NIGHT_Y, 0);
	}
	else if(my_strcmp(b,"off"))
	{
		//printk("off...\n");
		s3c_fimc_i2c_command(ctrl, I2C_CAM_NIGHT_N, 0);
	}
	return 0;
}
Ejemplo n.º 2
0
void s3c_fimc_init_camera(struct s3c_fimc_control *ctrl)
{
	//printk("[CAM]s3c_fimc_init_camera");	
	struct s3c_fimc_camera *cam = ctrl->in_cam;
	
	if (cam && cam->id != S3C_FIMC_TPID && !cam->initialized) {
		//printk("[CAM]I2C_CAM_INIT.\n");
		s3c_fimc_i2c_command(ctrl, I2C_CAM_INIT, 0);
		s3c_fimc_change_resolution(ctrl, CAM_RES_DEFAULT);
		cam->initialized = 1;
	}
}
void s3c_fimc_change_resolution(struct s3c_fimc_control *ctrl,
					enum s3c_fimc_cam_res_t res)
{
	struct s3c_fimc_camera *cam = ctrl->in_cam;

	s3c_fimc_stop_scaler(ctrl);
	s3c_fimc_i2c_command(ctrl, I2C_CAM_RESOLUTION, res);

	switch (res) {
	case CAM_RES_QSVGA:
		info("resolution changed to QSVGA (400x300) mode\n");
		cam->width = 400;
		cam->height = 300;
		break;

	case CAM_RES_VGA:
		info("resolution changed to VGA (640x480) mode\n");
		cam->width = 640;
		cam->height = 480;
		break;

	case CAM_RES_SVGA:
		info("resolution changed to SVGA (800x600) mode\n");
		cam->width = 800;
		cam->height = 600;
		break;

	case CAM_RES_SXGA:
		info("resolution changed to SXGA (1280x1024) mode\n");
		cam->width = 1280;
		cam->height = 1024;
		break;

	case CAM_RES_UXGA:
		info("resolution changed to UXGA (1600x1200) mode\n");
		cam->width = 1600;
		cam->height = 1200;
		break;

	case CAM_RES_DEFAULT:	/* fall through */
	case CAM_RES_MAX:
		/* nothing to do */
		break;
	}
}
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;
}