Exemple #1
0
bool _s5p_vlayer_start(void)
{
	int i;

	s5p_tv_vp_err verr;
	s5p_tv_vmx_err merr;
	s5p_video_img_address temp_addr;
	s5p_img_size img_size;

	s5p_vl_param param = s5ptv_status.vl_basic_param;

	u8 contrast = s5ptv_status.vl_contrast;

	u32 ty_addr = s5ptv_status.vl_top_y_address;
	u32 tc_addr = s5ptv_status.vl_top_c_address;
	u32 by_addr = s5ptv_status.vl_bottom_y_address;
	u32 bc_addr = s5ptv_status.vl_bottom_c_address;
	u32 endian = param.src_img_endian;
	u32 i_w  = param.src_width;
	u32 i_h  = param.src_height;
	u32 s_ox = s5ptv_status.vl_src_offset_x;
	u32 s_xf = s5ptv_status.vl_src_x_fact_step;
	u32 s_oy = s5ptv_status.vl_src_offset_y;
	u32 s_w  = s5ptv_status.vl_src_width;
	u32 s_h  = s5ptv_status.vl_src_height;
	u32 d_ox = s5ptv_status.vl_dest_offset_x;
	u32 d_oy = s5ptv_status.vl_dest_offset_y;
	u32 d_w  = s5ptv_status.vl_dest_width;
	u32 d_h  = s5ptv_status.vl_dest_height;
	u32 noise = s5ptv_status.vl_sharpness.th_noise;
	u32 saturation = s5ptv_status.vl_saturation;
	u32 alpha = param.alpha;
	u32 priority = param.priority;
	u32 br_offset = s5ptv_status.vl_bright_offset;

	bool ipc = s5ptv_status.vl2d_ipc;
	bool l_skip = s5ptv_status.vl_op_mode.line_skip;
	bool bypass = s5ptv_status.vl_bypass_post_process;
	bool po_def = s5ptv_status.vl_poly_filter_default;
	bool bright = s5ptv_status.us_vl_brightness;
	bool w_blend = param.win_blending;
	bool csc_en = s5ptv_status.vl_csc_control.csc_en;
	bool s_off_en = s5ptv_status.vl_csc_control.sub_y_offset_en;
	bool csc_coef_def = s5ptv_status.vl_csc_coef_default;

	s5p_vp_field f_id = s5ptv_status.field_id;
	s5p_vp_mem_mode m_mode = s5ptv_status.vl_op_mode.mem_mode;
	s5p_vp_chroma_expansion cro_ex = s5ptv_status.vl_op_mode.chroma_exp;
	s5p_vp_filed_id_toggle f_id_tog = s5ptv_status.vl_op_mode.toggle_id;
	s5p_vp_pxl_rate p_rate = s5ptv_status.vl_rate;
	s5p_vp_sharpness_control sharp = s5ptv_status.vl_sharpness.sharpness;
	s5p_vp_csc_type	csc_type = s5ptv_status.vl_csc_type;

	__s5p_tv_clk_set_vp_clk_onoff(true);
	__s5p_vp_sw_reset();
	__s5p_vp_init_field_id(f_id);
	__s5p_vp_init_op_mode(l_skip, m_mode, cro_ex, f_id_tog);
	__s5p_vp_init_pixel_rate_control(p_rate);

	temp_addr.y_address = param.top_y_address;
	temp_addr.c_address = param.top_c_address;
	img_size.img_width = param.src_width;
	img_size.img_height = param.src_height;

	_s5p_vlayer_set_top_address((unsigned long)&temp_addr);
	_s5p_vlayer_set_img_size((unsigned long)&img_size);
	_s5p_vlayer_set_src_size((unsigned long)&img_size);

	if (po_def)
		verr = __s5p_vp_init_layer_def_poly_filter_coef(ty_addr,
				tc_addr, by_addr, bc_addr, endian, i_w, i_h,
				s_ox, s_xf, s_oy, s_w, s_h, d_ox, d_oy, d_w,
				d_h, ipc);
	else
		verr = __s5p_vp_init_layer(ty_addr, tc_addr, by_addr, bc_addr,
				endian, i_w, i_h, s_ox, s_xf, s_oy, s_w, s_h,
				d_ox, d_oy, d_w, d_h, ipc);

	if (verr != VPROC_NO_ERROR)
		return false;

	__s5p_vp_init_bypass_post_process(bypass);
	__s5p_vp_init_sharpness(noise, sharp);
	__s5p_vp_init_saturation(saturation);
	__s5p_vp_init_brightness(bright);
	__s5p_vp_init_contrast(contrast);

	for (i = VProc_LINE_EQ_0 ; i <= VProc_LINE_EQ_7 ; i++) {
		if (s5ptv_status.vl_bc_control[i].eq_num == i)
			verr = __s5p_vp_init_brightness_contrast_control(
					s5ptv_status.vl_bc_control[i].eq_num,
					s5ptv_status.vl_bc_control[i].intc,
					s5ptv_status.vl_bc_control[i].slope);

		if (verr != VPROC_NO_ERROR)
			return false;
	}

	__s5p_vp_init_brightness_offset(br_offset);

	__s5p_vp_init_csc_control(s_off_en, csc_en);

	if (csc_en && csc_coef_def) {
		verr = __s5p_vp_init_csc_coef_default(csc_type);

		if (verr != VPROC_NO_ERROR)
			return false;
	}

	verr = __s5p_vp_start();

	if (verr != VPROC_NO_ERROR)
		return false;

#ifdef CONFIG_CPU_S5PC100
	merr = __s5p_vm_init_layer(VM_VIDEO_LAYER, true, w_blend, alpha,
				priority, VM_DIRECT_RGB565, false, false,
				false, 0, 0, 0, 0, 0, 0, 0, 0, 0);
#endif

#ifdef CONFIG_CPU_S5PV210
	merr = __s5p_vm_init_layer(s5ptv_status.tvout_param.disp_mode,
					VM_VIDEO_LAYER, true, w_blend,
					alpha, priority, VM_DIRECT_RGB565,
					false, false, false, 0, 0, 0, 0,
					0, 0, 0, 0, 0, 0, 0);
#endif

	if (merr != VPROC_NO_ERROR)
		return false;

	__s5p_vm_start();

	s5ptv_status.vp_layer_enable = true;

	return true;
}
Exemple #2
0
static int s5p_tv_v4l2_s_fmt_vid_out_overlay(struct file *file, void *fh,
	struct v4l2_format *f)
{

	struct v4l2_format *vid_out_fmt = f;

	V4L2PRINTK("(0x%08x)++\n", f->type);

	switch (vid_out_fmt->type) {

	case V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY: {

		struct v4l2_window_s5p_tvout vparam;
		memcpy(&vparam, vid_out_fmt->fmt.raw_data,
			sizeof(struct v4l2_window_s5p_tvout));

		s5ptv_status.vl_basic_param.win_blending =
			(vparam.flags & V4L2_FBUF_FLAG_CHROMAKEY) ? 1 : 0;
		s5ptv_status.vl_basic_param.alpha =
			(vparam.flags & V4L2_FBUF_FLAG_LOCAL_ALPHA) ? 1 : 0;
		s5ptv_status.vl_basic_param.priority =
			vparam.priority;
		s5ptv_status.vl_basic_param.src_offset_x =
			vparam.win.w.left;
		s5ptv_status.vl_basic_param.src_offset_y =
			vparam.win.w.top;
		s5ptv_status.vl_basic_param.src_width =
			vparam.win.w.width;
		s5ptv_status.vl_basic_param.src_height =
			vparam.win.w.height;
		V4L2PRINTK("[type 0x%08x] : left: [%d], top [%d],\
			width[%d], height[%d]\n",
			   f->type,
			   s5ptv_status.vl_basic_param.src_offset_x ,
			   s5ptv_status.vl_basic_param.src_offset_y ,
			   s5ptv_status.vl_basic_param.src_width,
			   s5ptv_status.vl_basic_param.src_height);

		if ((s5ptv_status.hpd_status) && s5ptv_status.vp_layer_enable) {
			struct s5p_img_offset	img_offset;
			struct s5p_img_size	img_size;

			img_offset.offset_x = vparam.win.w.left;
			img_offset.offset_y = vparam.win.w.top;
			img_size.img_width = vparam.win.w.width;
			img_size.img_height = vparam.win.w.height;
			_s5p_vlayer_set_blending(
				s5ptv_status.vl_basic_param.win_blending);
			_s5p_vlayer_set_alpha(
				s5ptv_status.vl_basic_param.alpha);
			_s5p_vlayer_set_priority(vparam.priority);
			_s5p_vlayer_set_src_position((unsigned long)
				&img_offset);
			_s5p_vlayer_set_src_size((unsigned long)
				&img_size);
		}

		break;
	}

	default:
		break;
	}

	V4L2PRINTK("()--\n");

	return 0;
}
Exemple #3
0
/* VIDIOC_S_FMT handlers */
static int s5p_tv_v4l2_s_fmt_vid_out(struct file *file, void *fh,
	struct v4l2_format *f)
{

	struct v4l2_format *vid_out_fmt = f;

	V4L2PRINTK("(0x%08x)++\n", f->type);

	switch (vid_out_fmt->type) {

	case V4L2_BUF_TYPE_VIDEO_OUTPUT: {

		struct v4l2_pix_format_s5p_tvout vparam;
		memcpy(&vparam, vid_out_fmt->fmt.raw_data,
			sizeof(struct v4l2_pix_format_s5p_tvout));

		s5ptv_status.vl_basic_param.src_width =
			vparam.pix_fmt.width;
		s5ptv_status.vl_basic_param.src_height =
			vparam.pix_fmt.height;
		s5ptv_status.src_color =
			vparam.pix_fmt.pixelformat;

		s5ptv_status.vl_basic_param.top_y_address =
			(unsigned int)vparam.base_y;
		s5ptv_status.vl_basic_param.top_c_address =
			(unsigned int)vparam.base_c;

		/* check progressive or not */
		if (vparam.pix_fmt.field == V4L2_FIELD_NONE) {

			/* progressive */

			switch (vparam.pix_fmt.pixelformat) {

			case V4L2_PIX_FMT_NV12:
				/* linear */
				s5ptv_status.src_color =
				VPROC_SRC_COLOR_NV12;
				break;
			case V4L2_PIX_FMT_NV12T:
				/* tiled */
				s5ptv_status.src_color =
				VPROC_SRC_COLOR_TILE_NV12;
				break;
			default:
				V4L2PRINTK("src img format not supported\n");
				break;
			}

			s5ptv_status.field_id = VPROC_TOP_FIELD;

			if ((s5ptv_status.hpd_status) && s5ptv_status.vp_layer_enable) {
				struct s5p_video_img_address temp_addr;
				struct s5p_img_size	img_size;

				temp_addr.y_address =
					(unsigned int)vparam.base_y;
				temp_addr.c_address =
					(unsigned int)vparam.base_c;
				img_size.img_width =
					(unsigned int)vparam.pix_fmt.width;
				img_size.img_height =
					(unsigned int)vparam.pix_fmt.height;

				_s5p_vlayer_set_top_address((unsigned long)
					&temp_addr);
				_s5p_vlayer_set_img_size((unsigned long)
					&img_size);
				_s5p_vlayer_set_src_size((unsigned long)
					&img_size);

			}
		} else if (vparam.pix_fmt.field == V4L2_FIELD_INTERLACED_TB) {

			/* interlaced */

			switch (vparam.pix_fmt.pixelformat) {

			case V4L2_PIX_FMT_NV12:
				/* linear */
				s5ptv_status.src_color =
				VPROC_SRC_COLOR_NV12IW;
				break;
			case V4L2_PIX_FMT_NV12T:
				/* tiled */
				s5ptv_status.src_color =
				VPROC_SRC_COLOR_TILE_NV12IW;
				break;
			default:
				V4L2PRINTK("src img format not supported\n");
				break;
			}

			if (vparam.pix_fmt.priv == V4L2_FIELD_BOTTOM)
				s5ptv_status.field_id = VPROC_BOTTOM_FIELD;
			else
				s5ptv_status.field_id = VPROC_TOP_FIELD;

			if ((s5ptv_status.hpd_status) && s5ptv_status.vp_layer_enable) {
				struct s5p_video_img_address temp_addr;
				struct s5p_img_size	img_size;

				temp_addr.y_address =
					(unsigned int)vparam.base_y;
				temp_addr.c_address =
					(unsigned int)vparam.base_c;
				img_size.img_width =
					(unsigned int)vparam.pix_fmt.width;
				img_size.img_height =
					(unsigned int)vparam.pix_fmt.height;

				_s5p_vlayer_set_top_address((unsigned long)
					&temp_addr);
				_s5p_vlayer_set_img_size((unsigned long)
					&img_size);
				_s5p_vlayer_set_src_size((unsigned long)
					&img_size);

			}

		} else {
			V4L2PRINTK("this field id not supported\n");
		}
		break;
	}

	default:
		break;
	}

	V4L2PRINTK("[type 0x%08x] : addr_y: [0x%08x], addr_c [0x%08x],\
		width[%d], height[%d]\n",
		   f->type,
		   s5ptv_status.vl_basic_param.top_y_address,
		   s5ptv_status.vl_basic_param.top_c_address,
		   s5ptv_status.vl_basic_param.src_width,
		   s5ptv_status.vl_basic_param.src_height);
	V4L2PRINTK("()--\n");

	return 0;
}