__s32 Scaler_Set_Output_Size(__u32 sel, __disp_rectsz_t *size) { __disp_scaler_t * scaler; __scal_src_size_t in_size; __scal_out_size_t out_size; __scal_src_type_t in_type; __scal_out_type_t out_type; __scal_scan_mod_t in_scan; __scal_scan_mod_t out_scan; __u32 screen_index; scaler = &(gdisp.scaler[sel]); screen_index = gdisp.scaler[sel].screen_index; scaler->out_size.height = size->height; scaler->out_size.width = size->width; in_type.mod = Scaler_sw_para_to_reg(1,scaler->in_fb.mode); in_type.fmt = Scaler_sw_para_to_reg(0,scaler->in_fb.format); in_type.ps = Scaler_sw_para_to_reg(2,(__u8)scaler->in_fb.seq); in_type.byte_seq = 0; in_type.sample_method = 0; in_size.src_width = scaler->src_win.width; in_size.src_height = scaler->in_fb.size.height; in_size.x_off = scaler->src_win.x; in_size.y_off = scaler->src_win.y; in_size.scal_height= scaler->src_win.height; in_size.scal_width= scaler->src_win.width; out_type.byte_seq = scaler->out_fb.seq; out_type.fmt = scaler->out_fb.format; out_size.width = scaler->out_size.width; out_size.height = scaler->out_size.height; in_scan.field = FALSE; in_scan.bottom = FALSE; out_scan.field = (gdisp.screen[screen_index].de_flicker_status == DE_FLICKER_USED)?FALSE: gdisp.screen[screen_index].b_out_interlace; DE_SCAL_Set_Scaling_Factor(sel, &in_scan, &in_size, &in_type, &out_scan, &out_size, &out_type); if(scaler->enhance_en == TRUE) { Scaler_Set_Enhance(sel, scaler->bright, scaler->contrast, scaler->saturation, scaler->hue); } else { DE_SCAL_Set_CSC_Coef(sel, scaler->in_fb.cs_mode, DISP_BT601, get_fb_type(scaler->in_fb.format), DISP_FB_TYPE_RGB, scaler->in_fb.br_swap, 0); } DE_SCAL_Set_Scaling_Coef(sel, &in_scan, &in_size, &in_type, &out_scan, &out_size, &out_type, scaler->smooth_mode); DE_SCAL_Set_Out_Size(sel, &out_scan, &out_type, &out_size); return DIS_SUCCESS; }
__s32 Scaler_Set_Para(__u32 sel, __disp_scaler_t *scl) { __disp_scaler_t * scaler; __scal_buf_addr_t scal_addr; __scal_src_size_t in_size; __scal_out_size_t out_size; __scal_src_type_t in_type; __scal_out_type_t out_type; __scal_scan_mod_t in_scan; __scal_scan_mod_t out_scan; __u32 screen_index; scaler = &(gdisp.scaler[sel]); screen_index = gdisp.scaler[sel].screen_index; memcpy(&(scaler->in_fb), &(scl->in_fb), sizeof(__disp_fb_t)); memcpy(&(scaler->src_win), &(scl->src_win), sizeof(__disp_rect_t)); memcpy(&(scaler->out_size), &(scl->out_size), sizeof(__disp_rectsz_t)); in_type.mod = Scaler_sw_para_to_reg(1,scaler->in_fb.mode); in_type.fmt = Scaler_sw_para_to_reg(0,scaler->in_fb.format); in_type.ps = Scaler_sw_para_to_reg(2,(__u8)scaler->in_fb.seq); in_type.byte_seq = 0; in_type.sample_method = 0; scal_addr.ch0_addr = (__u32)OSAL_VAtoPA((void*)(scaler->in_fb.addr[0])); scal_addr.ch1_addr = (__u32)OSAL_VAtoPA((void*)(scaler->in_fb.addr[1])); scal_addr.ch2_addr = (__u32)OSAL_VAtoPA((void*)(scaler->in_fb.addr[2])); in_size.src_width = scaler->in_fb.size.width; in_size.src_height = scaler->in_fb.size.height; in_size.x_off = scaler->src_win.x; in_size.y_off = scaler->src_win.y; in_size.scal_height= scaler->src_win.height; in_size.scal_width= scaler->src_win.width; out_type.byte_seq = scaler->out_fb.seq; out_type.fmt = scaler->out_fb.format; out_size.width = scaler->out_size.width; out_size.height = scaler->out_size.height; in_scan.field = FALSE; in_scan.bottom = FALSE; out_scan.field = (gdisp.screen[screen_index].de_flicker_status & DE_FLICKER_USED)?FALSE: gdisp.screen[screen_index].b_out_interlace; if(scaler->in_fb.cs_mode > DISP_VXYCC) { scaler->in_fb.cs_mode = DISP_BT601; } if(scaler->in_fb.b_trd_src) { __scal_3d_inmode_t inmode; __scal_3d_outmode_t outmode = 0; __scal_buf_addr_t scal_addr_right; inmode = Scaler_3d_sw_para_to_reg(0, scaler->in_fb.trd_mode, 0); outmode = Scaler_3d_sw_para_to_reg(1, scaler->out_trd_mode, gdisp.screen[screen_index].b_out_interlace); DE_SCAL_Get_3D_In_Single_Size(inmode, &in_size, &in_size); if(scaler->b_trd_out) { DE_SCAL_Get_3D_Out_Single_Size(outmode, &out_size, &out_size); } scal_addr_right.ch0_addr= (__u32)OSAL_VAtoPA((void*)(scaler->in_fb.trd_right_addr[0])); scal_addr_right.ch1_addr= (__u32)OSAL_VAtoPA((void*)(scaler->in_fb.trd_right_addr[1])); scal_addr_right.ch2_addr= (__u32)OSAL_VAtoPA((void*)(scaler->in_fb.trd_right_addr[2])); DE_SCAL_Set_3D_Ctrl(sel, scaler->b_trd_out, inmode, outmode); DE_SCAL_Config_3D_Src(sel, &scal_addr, &in_size, &in_type, inmode, &scal_addr_right); } else { DE_SCAL_Config_Src(sel,&scal_addr,&in_size,&in_type,FALSE,FALSE); } DE_SCAL_Set_Scaling_Factor(sel, &in_scan, &in_size, &in_type, &out_scan, &out_size, &out_type); DE_SCAL_Set_Init_Phase(sel, &in_scan, &in_size, &in_type, &out_scan, &out_size, &out_type, FALSE); if(scaler->enhance_en == TRUE) { Scaler_Set_Enhance(sel, scaler->bright, scaler->contrast, scaler->saturation, scaler->hue); } else { DE_SCAL_Set_CSC_Coef(sel, scaler->in_fb.cs_mode, DISP_BT601, get_fb_type(scaler->in_fb.format), DISP_FB_TYPE_RGB, scaler->in_fb.br_swap, 0); } DE_SCAL_Set_Scaling_Coef(sel, &in_scan, &in_size, &in_type, &out_scan, &out_size, &out_type, scaler->smooth_mode); DE_SCAL_Set_Out_Format(sel, &out_type); DE_SCAL_Set_Out_Size(sel, &out_scan,&out_type, &out_size); return DIS_NULL; }
__s32 Scaler_Set_Para(__u32 scaler_index, __disp_scaler_t *scl) { __disp_scaler_t * scaler; __scal_buf_addr_t scal_addr; __scal_src_size_t in_size; __scal_out_size_t out_size; __scal_src_type_t in_type; __scal_out_type_t out_type; __scal_scan_mod_t in_scan; __scal_scan_mod_t out_scan; __u32 screen_index; scaler = &(gdisp.scaler[scaler_index]); screen_index = gdisp.scaler[scaler_index].screen_index; memcpy(&(scaler->in_fb), &(scl->in_fb), sizeof(__disp_fb_t)); memcpy(&(scaler->src_win), &(scl->src_win), sizeof(__disp_rect_t)); memcpy(&(scaler->out_size), &(scl->out_size), sizeof(__disp_rectsz_t)); in_type.fmt= Scaler_sw_para_to_reg(0,scaler->in_fb.mode, scaler->in_fb.format, scaler->in_fb.seq); in_type.mod= Scaler_sw_para_to_reg(1,scaler->in_fb.mode, scaler->in_fb.format, scaler->in_fb.seq); in_type.ps= Scaler_sw_para_to_reg(2,scaler->in_fb.mode, scaler->in_fb.format, (__u8)scaler->in_fb.seq); if(((__s32)in_type.fmt == DIS_FAIL) || ((__s32)in_type.mod== DIS_FAIL) || ((__s32)in_type.ps == DIS_FAIL)) { DE_WRN("not supported scaler input pixel format: mode=%d,fmt=%d,ps=%d\n", scaler->in_fb.mode, scaler->in_fb.format, scaler->in_fb.seq); } in_type.byte_seq = 0; in_type.sample_method = 0; scal_addr.ch0_addr = (__u32)OSAL_VAtoPA((void*)(scaler->in_fb.addr[0])); scal_addr.ch1_addr = (__u32)OSAL_VAtoPA((void*)(scaler->in_fb.addr[1])); scal_addr.ch2_addr = (__u32)OSAL_VAtoPA((void*)(scaler->in_fb.addr[2])); in_size.src_width = scaler->in_fb.size.width; in_size.src_height = scaler->in_fb.size.height; in_size.x_off = scaler->src_win.x; in_size.y_off = scaler->src_win.y; in_size.scal_height= scaler->src_win.height; in_size.scal_width= scaler->src_win.width; // out_type.byte_seq = Scaler_sw_para_to_reg(2,scaler->out_fb.seq); // out_type.fmt = Scaler_sw_para_to_reg(3, scaler->out_fb.format); if(get_fb_type(scaler->out_fb.format) == DISP_FB_TYPE_YUV) { if(scaler->out_fb.mode == DISP_MOD_NON_MB_PLANAR) { out_type.fmt = Scaler_sw_para_to_reg(3, scaler->out_fb.mode, scaler->out_fb.format, scaler->out_fb.seq); } else { DE_WRN("output mode:%d invalid in Scaler_Set_Para\n",scaler->out_fb.mode); return DIS_FAIL; } } else { if(scaler->out_fb.mode == DISP_MOD_NON_MB_PLANAR && (scaler->out_fb.format == DISP_FORMAT_RGB888 || scaler->out_fb.format == DISP_FORMAT_ARGB8888)) { out_type.fmt = DE_SCAL_OUTPRGB888; } else if(scaler->out_fb.mode == DISP_MOD_INTERLEAVED && scaler->out_fb.format == DISP_FORMAT_ARGB8888 && scaler->out_fb.seq == DISP_SEQ_ARGB) { out_type.fmt = DE_SCAL_OUTI1RGB888; }else if(scaler->out_fb.mode == DISP_MOD_INTERLEAVED && scaler->out_fb.format == DISP_FORMAT_ARGB8888 && scaler->out_fb.seq == DISP_SEQ_BGRA) { out_type.fmt = DE_SCAL_OUTI0RGB888; } else { DE_WRN("output para invalid in Scaler_Set_Para,mode:%d,format:%d\n",scaler->out_fb.mode, scaler->out_fb.format); return DIS_FAIL; } } out_type.byte_seq = Scaler_sw_para_to_reg(2,scaler->out_fb.mode, scaler->out_fb.format, scaler->out_fb.seq); out_type.alpha_en = 1; out_type.alpha_coef_type = 0; out_size.width = scaler->out_size.width; out_size.height = scaler->out_size.height; in_scan.field = FALSE; in_scan.bottom = FALSE; out_scan.field = (gdisp.screen[screen_index].de_flicker_status & DE_FLICKER_USED)?FALSE: gdisp.screen[screen_index].b_out_interlace; if(scaler->in_fb.cs_mode > DISP_VXYCC) { scaler->in_fb.cs_mode = DISP_BT601; } if(scaler->in_fb.b_trd_src) { __scal_3d_inmode_t inmode; __scal_3d_outmode_t outmode = 0; __scal_buf_addr_t scal_addr_right; if(bsp_disp_feat_get_layer_feats(scaler->screen_index, DISP_LAYER_WORK_MODE_SCALER, scaler_index) & DISP_LAYER_FEAT_3D) { inmode = Scaler_3d_sw_para_to_reg(0, scaler->in_fb.trd_mode, 0); outmode = Scaler_3d_sw_para_to_reg(1, scaler->out_trd_mode, gdisp.screen[screen_index].b_out_interlace); if(((__s32)inmode == DIS_FAIL) || ((__s32)outmode == DIS_FAIL)) { DE_WRN("input 3d para invalid in Scaler_Set_Para,trd_mode:%d,out_trd_mode:%d\n", scaler->in_fb.trd_mode, scaler->out_trd_mode); } DE_SCAL_Get_3D_In_Single_Size(inmode, &in_size, &in_size); if(scaler->b_trd_out) { DE_SCAL_Get_3D_Out_Single_Size(outmode, &out_size, &out_size); } scal_addr_right.ch0_addr= (__u32)OSAL_VAtoPA((void*)(scaler->in_fb.trd_right_addr[0])); scal_addr_right.ch1_addr= (__u32)OSAL_VAtoPA((void*)(scaler->in_fb.trd_right_addr[1])); scal_addr_right.ch2_addr= (__u32)OSAL_VAtoPA((void*)(scaler->in_fb.trd_right_addr[2])); DE_SCAL_Set_3D_Ctrl(scaler_index, scaler->b_trd_out, inmode, outmode); DE_SCAL_Config_3D_Src(scaler_index, &scal_addr, &in_size, &in_type, inmode, &scal_addr_right); } else { DE_WRN("This platform not support 3d output!\n"); DE_SCAL_Config_Src(scaler_index,&scal_addr,&in_size,&in_type,FALSE,FALSE); } } else { DE_SCAL_Config_Src(scaler_index,&scal_addr,&in_size,&in_type,FALSE,FALSE); } DE_SCAL_Set_Scaling_Factor(scaler_index, &in_scan, &in_size, &in_type, &out_scan, &out_size, &out_type); DE_SCAL_Set_Init_Phase(scaler_index, &in_scan, &in_size, &in_type, &out_scan, &out_size, &out_type, FALSE); if(scaler->enhance_en == TRUE) { Scaler_Set_Enhance(scaler_index, scaler->bright, scaler->contrast, scaler->saturation, scaler->hue); } else { DE_SCAL_Set_CSC_Coef(scaler_index, scaler->in_fb.cs_mode, DISP_BT601, get_fb_type(scaler->in_fb.format), get_fb_type(scaler->out_fb.format), scaler->in_fb.br_swap, 0); } DE_SCAL_Set_Scaling_Coef(scaler_index, &in_scan, &in_size, &in_type, &out_scan, &out_size, &out_type, scaler->smooth_mode); DE_SCAL_Set_Out_Format(scaler_index, &out_type); DE_SCAL_Set_Out_Size(scaler_index, &out_scan,&out_type, &out_size); return DIS_NULL; }
__s32 Scaler_Set_Para(__u32 sel, __disp_scaler_t *scl) { __disp_scaler_t * scaler; __scal_buf_addr_t scal_addr; __scal_src_size_t in_size; __scal_out_size_t out_size; __scal_src_type_t in_type; __scal_out_type_t out_type; __scal_scan_mod_t in_scan; __scal_scan_mod_t out_scan; scaler = &(gdisp.scaler[sel]); memcpy(&(scaler->in_fb), &(scl->in_fb), sizeof(__disp_fb_t)); memcpy(&(scaler->src_win), &(scl->src_win), sizeof(__disp_rect_t)); memcpy(&(scaler->out_size), &(scl->out_size), sizeof(__disp_rectsz_t)); in_type.mod = Scaler_sw_para_to_reg(1,scaler->in_fb.mode); in_type.fmt = Scaler_sw_para_to_reg(0,scaler->in_fb.format); in_type.ps = Scaler_sw_para_to_reg(2,(__u8)scaler->in_fb.seq); in_type.byte_seq = 0; scal_addr.ch0_addr = (__u32)OSAL_VAtoPA((void*)(scaler->in_fb.addr[0])); scal_addr.ch1_addr = (__u32)OSAL_VAtoPA((void*)(scaler->in_fb.addr[1])); scal_addr.ch2_addr = (__u32)OSAL_VAtoPA((void*)(scaler->in_fb.addr[2])); in_size.src_width = scaler->in_fb.size.width; in_size.x_off = scaler->src_win.x; in_size.y_off = scaler->src_win.y; in_size.scal_height= scaler->src_win.height; in_size.scal_width= scaler->src_win.width; out_type.byte_seq = scaler->out_fb.seq; out_type.fmt = scaler->out_fb.format; out_size.width = scaler->out_size.width; out_size.height = scaler->out_size.height; in_scan.field = FALSE; in_scan.bottom = FALSE; out_scan.field = scaler->out_scan_mode; if(scaler->in_fb.cs_mode > DISP_VXYCC) { scaler->in_fb.cs_mode = DISP_BT601; } DE_SCAL_Config_Src(sel,&scal_addr,&in_size,&in_type,FALSE,FALSE); DE_SCAL_Set_Scaling_Factor(sel, &in_scan, &in_size, &in_type, &out_scan, &out_size, &out_type); DE_SCAL_Set_Init_Phase(sel, &in_scan, &in_size, &in_type, &out_scan, &out_size, &out_type, FALSE); if(scaler->enhance_en == TRUE) { Scaler_Set_Enhance(sel, scaler->bright, scaler->contrast, scaler->saturation, scaler->hue); } else { DE_SCAL_Set_CSC_Coef(sel, scaler->in_fb.cs_mode, DISP_BT601, get_fb_type(scaler->in_fb.format), DISP_FB_TYPE_RGB); } DE_SCAL_Set_Scaling_Coef(sel, &in_scan, &in_size, &in_type, &out_scan, &out_size, &out_type, scaler->smooth_mode); DE_SCAL_Set_Out_Format(sel, &out_type); DE_SCAL_Set_Out_Size(sel, &out_scan,&out_type, &out_size); return 0; }