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; }
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; }
/* 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; }