__s32 bsp_disp_drc_set_mode(__u32 screen_id,__u32 mode) { gdisp.screen[screen_id].drc.mode = mode; if(bsp_disp_drc_get_enable(screen_id) == 1) { IEP_Drc_Set_Mode(screen_id,mode); } return DIS_SUCCESS; }
__s32 disp_drc_start_video_mode(__u32 screen_id) { gdisp.screen[screen_id].drc.mode = IEP_DRC_MODE_VIDEO; if(bsp_disp_drc_get_enable(screen_id) == 1) { bsp_disp_cfg_start(screen_id); DE_BE_Set_Enhance_ex(screen_id, 3, DISP_COLOR_RANGE_0_255, 0,50, 50, 50,50); IEP_Drc_Set_Mode(screen_id,gdisp.screen[screen_id].drc.mode); bsp_disp_cfg_finish(screen_id); } return DIS_SUCCESS; }
//todo : csc->set_mode or set_mode->csc? __s32 bsp_disp_drc_enable(__u32 screen_id, __u32 en) { if((DISP_OUTPUT_TYPE_LCD == bsp_disp_get_output_type(screen_id)) && disp_drc_get_support(screen_id)) { __iep_drc_t *drc; drc = &gdisp.screen[screen_id].drc; if((1 == en) && (0 == drc->enable)) { IEP_Drc_Set_Imgsize(screen_id, bsp_disp_get_screen_width(screen_id), bsp_disp_get_screen_height(screen_id)); IEP_Drc_Set_Winodw(screen_id, drc->rect); IEP_Drc_Set_Mode(screen_id,drc->mode); bsp_disp_cfg_start(screen_id); /* video mode */ if(drc->mode == IEP_DRC_MODE_VIDEO) { //todo? yuv output DE_BE_Set_Enhance_ex(screen_id, 3, DISP_COLOR_RANGE_0_255, 0,50, 50, 50,50); } /* UI mode */ else { DE_BE_Set_Enhance_ex(screen_id, 0,DISP_COLOR_RANGE_0_255, 0,50, 50, 50,50); } IEP_Drc_Enable(screen_id,TRUE); bsp_disp_cfg_finish(screen_id); gdisp.screen[screen_id].drc.enable = 1; } else if((0 == en) && (1 == drc->enable)) { bsp_disp_cfg_start(screen_id); IEP_Drc_Enable(screen_id,en); /* video mode */ if(drc->mode == IEP_DRC_MODE_VIDEO) { //todo? change to RGB output DE_BE_Set_Enhance_ex(screen_id, 0,DISP_COLOR_RANGE_0_255, 0,50, 50, 50,50); } bsp_disp_cfg_finish(screen_id); gdisp.screen[screen_id].drc.enable = 0; } return DIS_SUCCESS; } return DIS_NOT_SUPPORT; }
__s32 IEP_Drc_Init(__u32 sel) { #ifdef DRC_DEFAULT_ENABLE __disp_rect_t regn; #endif __u32 lcdgamma; int value = 1; char primary_key[20]; int ret; memset(&giep[sel], 0, sizeof(__drc_t)); memset(&gpwrsv[sel], 0, sizeof(__drc_pwrsv_t)); drc_clk_init(sel); drc_clk_open(sel, 0); #ifdef __LINUX_OSAL__ pttab[sel] = kmalloc(IEP_LGC_TAB_SIZE, GFP_KERNEL | __GFP_ZERO); #else pttab[sel] = OSAL_PhyAlloc(IEP_LGC_TAB_SIZE); #endif sprintf(primary_key, "lcd%d_para", sel); ret = OSAL_Script_FetchParser_Data(primary_key, "lcdgamma4iep", &value, 1); if(ret < 0) { DE_WRN("lcdgamma4iep for lcd%d not exist.\n", sel); lcdgamma = 6; //default gamma = 2.2; } else { DE_INF("lcdgamma4iep for lcd%d = %d.\n", sel, value); if(value > 30 || value < 10) { DE_WRN("lcdgamma4iep for lcd%d too small or too large. default value 22 will be set. please set it between 10 and 30 to make it valid.\n",sel); lcdgamma = 6;//default gamma = 2.2; } else { lcdgamma = (value - 10)/2; } } memcpy(pttab[sel], pwrsv_lgc_tab[128*lcdgamma], IEP_LGC_TAB_SIZE); ret = OSAL_Script_FetchParser_Data(primary_key, "smartbl_low_limit", &value, 1); if(ret < 0) { DE_INF("smartbl_low_limit for lcd%d not exist.\n", sel); } else { DE_INF("smartbl_low_limit for lcd%d = %d.\n", sel, value); if(value > 255 || value < 20) { DE_INF("smartbl_low_limit for lcd%d too small or too large. default value 85 will be set. please set it between 20 and 255 to make it valid.\n",sel); } else { PWRSAVE_PROC_THRES = value; } } #ifdef DRC_DEFAULT_ENABLE #ifdef DRC_DEMO_HALF_SCREEN regn.x = bsp_disp_get_screen_width(sel)/2; //TBD regn.y = 0; regn.width = bsp_disp_get_screen_width(sel)/2; regn.height = bsp_disp_get_screen_height(sel); #else regn.x = 0; regn.y = 0; regn.width = bsp_disp_get_screen_width(sel); regn.height = bsp_disp_get_screen_height(sel); #endif IEP_Drc_Set_Mode(sel, 0); //default running HSV mode when default open when DRC_DEFAULT_ENABLE==1 IEP_Drc_Enable(sel, 1); IEP_Drc_Set_Winodw(sel, regn); #endif return DIS_SUCCESS; }