__s32 Scaler_Request(__u32 scaler_index) { __s32 ret = DIS_NO_RES; __u32 num_scalers; __u32 i; num_scalers = bsp_disp_feat_get_num_scalers(); DE_INF("Scaler_Request,%d\n", scaler_index); for(i=0; i<num_scalers; i++) { if(((scaler_index == i) || (scaler_index == 0xff)) && (!(gdisp.scaler[i].status & SCALER_USED))) { ret = i; Scaler_open(ret); gdisp.scaler[ret].b_close = FALSE; gdisp.scaler[ret].status |= SCALER_USED; break; } else if(((scaler_index == i) || (scaler_index == 0xff)) && (gdisp.scaler[i].b_close == TRUE)) { ret = 0; gdisp.scaler[ret].b_close = FALSE; gdisp.scaler[ret].status |= SCALER_USED; break; } } return ret; }
__s32 disp_video_exit() { __u32 num_screen; __u32 num_scalers; __u32 scaler_id; num_screen = bsp_disp_feat_get_num_screens(); num_scalers = bsp_disp_feat_get_num_scalers(); #ifdef __LINUX_OSAL__ for(scaler_id=0; scaler_id<num_scalers; scaler_id++) { if(maf_flag_mem[scaler_id][0]) { kfree(maf_flag_mem[scaler_id][0]); } if(maf_flag_mem[scaler_id][1]) { kfree(maf_flag_mem[scaler_id][1]); } } #else for(scaler_id=0; scaler_id<num_scalers; scaler_id++) { if(maf_flag_mem[scaler_id][0]) { OSAL_PhyFree(maf_flag_mem[scaler_id][0], maf_flag_mem_len); } if(maf_flag_mem[scaler_id][1]) { OSAL_PhyFree(maf_flag_mem[scaler_id][1], maf_flag_mem_len); } } #endif memset(g_video,0,sizeof(g_video)); return DIS_SUCCESS; }
void sync_event_proc(u32 screen_id) { u32 cur_line = 0, start_delay = 0; u32 num_scalers; #if defined(__LINUX_PLAT__) unsigned long flags; #endif if(screen_id < 2) { num_scalers = bsp_disp_feat_get_num_scalers(); cur_line = disp_al_lcd_get_cur_line(screen_id); start_delay = disp_al_lcd_get_start_delay(screen_id); if(cur_line > start_delay-4) { fcount_data.skip_count[screen_id] ++; return ; } } //fps proc fps_data[screen_id].counter++; if(fps_data[screen_id].counter == 100) { fps_data[screen_id].counter = 0; fps_data[screen_id].last_time = fps_data[screen_id].current_time; fps_data[screen_id].current_time = jiffies; } //capture sync event if(bsp_disp_capture_screen_finished(screen_id) == 1) gdisp.init_para.capture_event(screen_id); #if defined(__LINUX_PLAT__) spin_lock_irqsave(&gdisp.screen[screen_id].flag_lock, flags); #endif if(0 == bsp_disp_cfg_get(screen_id)) { gdisp.screen[screen_id].have_cfg_reg = true; #if defined(__LINUX_PLAT__) spin_unlock_irqrestore(&gdisp.screen[screen_id].flag_lock, flags); #endif disp_sync_all(screen_id); } else { #if defined(__LINUX_PLAT__) spin_unlock_irqrestore(&gdisp.screen[screen_id].flag_lock, flags); #endif } return ; }
__s32 Disp_set_out_interlace(__u32 screen_id) { __u32 i; __bool b_cvbs_out = 0; __u32 num_scalers; num_scalers = bsp_disp_feat_get_num_scalers(); if(gdisp.screen[screen_id].output_type==DISP_OUTPUT_TYPE_TV && (gdisp.screen[screen_id].tv_mode==DISP_TV_MOD_PAL || gdisp.screen[screen_id].tv_mode==DISP_TV_MOD_PAL_M || gdisp.screen[screen_id].tv_mode==DISP_TV_MOD_PAL_NC || gdisp.screen[screen_id].tv_mode==DISP_TV_MOD_NTSC)) { b_cvbs_out = 1; } gdisp.screen[screen_id].de_flicker_status |= DE_FLICKER_REQUIRED; bsp_disp_cfg_start(screen_id); /* when output device is cvbs */ if((gdisp.screen[screen_id].de_flicker_status & DE_FLICKER_REQUIRED) && b_cvbs_out) { DE_BE_deflicker_enable(screen_id, TRUE); for(i=0; i<num_scalers; i++) { if((gdisp.scaler[i].status & SCALER_USED) && (gdisp.scaler[i].screen_index == screen_id)) { Scaler_Set_Outitl(i, FALSE); gdisp.scaler[i].b_reg_change = TRUE; } } gdisp.screen[screen_id].de_flicker_status |= DE_FLICKER_USED; } else { DE_BE_deflicker_enable(screen_id, FALSE); for(i=0; i<num_scalers; i++) { if((gdisp.scaler[i].status & SCALER_USED) && (gdisp.scaler[i].screen_index == screen_id)) { Scaler_Set_Outitl(i, gdisp.screen[screen_id].b_out_interlace); gdisp.scaler[i].b_reg_change = TRUE; } } gdisp.screen[screen_id].de_flicker_status &= DE_FLICKER_USED_MASK; } DE_BE_Set_Outitl_enable(screen_id, gdisp.screen[screen_id].b_out_interlace); bsp_disp_cfg_finish(screen_id); return DIS_SUCCESS; }
s32 bsp_disp_exit(u32 mode) { u32 num_screens; u32 screen_id; u32 num_scalers; u32 scaler_id; struct disp_lcd *lcd; struct disp_manager *manager; num_screens = bsp_disp_feat_get_num_screens(); num_scalers = bsp_disp_feat_get_num_scalers(); if(mode == DISP_EXIT_MODE_CLEAN_ALL) { /* close all mod and unregister all irq */ for(scaler_id = 0; scaler_id < num_scalers; scaler_id++) { scaler_close(scaler_id); } scaler_exit(); for(screen_id = 0; screen_id < num_screens; screen_id++) { lcd = disp_get_lcd(screen_id); manager = disp_get_layer_manager(screen_id); manager->exit(manager); lcd->exit(lcd); } } else if(mode == DISP_EXIT_MODE_CLEAN_PARTLY) { /* unregister all irq */ // OSAL_InterruptDisable(AW_IRQ_DEBE0); // OSAL_UnRegISR(AW_IRQ_DEBE0, manager_event_proc, (void*)0); OSAL_InterruptDisable(AW_IRQ_LCD0); OSAL_UnRegISR(AW_IRQ_LCD0, disp_lcd_event_proc, (void*)0); // OSAL_InterruptDisable(AW_IRQ_DEBE1); // OSAL_UnRegISR(AW_IRQ_DEBE1, manager_event_proc, (void*)0); OSAL_InterruptDisable(AW_IRQ_LCD1); OSAL_UnRegISR(AW_IRQ_LCD1, disp_lcd_event_proc, (void*)0); } return DIS_SUCCESS; }
__s32 disp_video_init() { __u32 num_screens; __u32 num_scalers; __u32 scaler_id; num_screens = bsp_disp_feat_get_num_screens(); num_scalers = bsp_disp_feat_get_num_scalers(); memset(g_video,0,sizeof(g_video)); #ifdef __LINUX_OSAL__ for(scaler_id=0; scaler_id<num_scalers; scaler_id++) { if((bsp_disp_feat_get_layer_feats(scaler_id, DISP_LAYER_WORK_MODE_SCALER, scaler_id) & DISP_LAYER_FEAT_DE_INTERLACE)) bsp_disp_lcd_delay_ms(10); maf_flag_mem[scaler_id][0] = (void*)__pa((char __iomem *)kmalloc(maf_flag_mem_len, GFP_KERNEL | __GFP_ZERO)); maf_flag_mem[scaler_id][1] = (void*)__pa((char __iomem *)kmalloc(maf_flag_mem_len, GFP_KERNEL | __GFP_ZERO)); DE_INF("maf_flag_mem[%d][%d]=0x%8x, maf_flag_mem[%d][%d]=0x%8x\n",scaler_id, 0, (unsigned int)maf_flag_mem[scaler_id][0], scaler_id, 1, (unsigned int)maf_flag_mem[scaler_id][1]); if((maf_flag_mem[scaler_id][0] == NULL) || (maf_flag_mem[scaler_id][1] == NULL)) { DE_WRN("maf memory[%d] request fail\n", scaler_id); } } #else for(scaler_id=0; scaler_id<num_scalers; scaler_id++) { if((bsp_disp_feat_get_layer_feats(scaler_id, DISP_LAYER_WORK_MODE_SCALER, scaler_id) & DISP_LAYER_FEAT_DE_INTERLACE)) maf_flag_mem[scaler_id][0] = OSAL_PhyAlloc(maf_flag_mem_len); maf_flag_mem[scaler_id][1] = OSAL_PhyAlloc(maf_flag_mem_len); DE_INF("maf_flag_mem[%d][%d]=0x%8x, maf_flag_mem[%d][%d]=0x%8x\n",scaler_id, 0, (unsigned int)maf_flag_mem[scaler_id][0], scaler_id, 1, (unsigned int)maf_flag_mem[scaler_id][1]); if((maf_flag_mem[scaler_id][0] == NULL) || (maf_flag_mem[scaler_id][1] == NULL)) { DE_WRN("maf memory[%d] request fail\n", scaler_id); } } #endif for(scaler_id=0; scaler_id<num_scalers; scaler_id++) { dit_mode_default[scaler_id] = DIT_MODE_MAF; } return DIS_SUCCESS; }
void LCD_vbi_event_proc(__u32 screen_id, __u32 tcon_index) { __u32 cur_line = 0, start_delay = 0; __u32 i = 0; __u32 num_scalers; #ifdef __LINUX_OSAL__ unsigned long flags; #endif num_scalers = bsp_disp_feat_get_num_scalers(); disp_vint_checkin(screen_id); disp_lcd_set_fps(screen_id); Video_Operation_In_Vblanking(screen_id, tcon_index); disp_capture_screen_proc(screen_id); cur_line = TCON_get_cur_line(screen_id, tcon_index); start_delay = TCON_get_start_delay(screen_id, tcon_index); if(cur_line > start_delay-4) { //DE_INF("int:%d,%d\n", cur_line,start_delay); /* return while not trigger mode */ if(gpanel_info[screen_id].lcd_fresh_mode == 0) { return ; } } #ifdef __LINUX_OSAL__ spin_lock_irqsave(&gdisp.screen[screen_id].flag_lock, flags); #endif if(gdisp.screen[screen_id].cache_flag == FALSE && gdisp.screen[screen_id].cfg_cnt == 0) { gdisp.screen[screen_id].have_cfg_reg = TRUE; #ifdef __LINUX_OSAL__ spin_unlock_irqrestore(&gdisp.screen[screen_id].flag_lock, flags); #endif DE_BE_Cfg_Ready(screen_id); IEP_CMU_Operation_In_Vblanking(screen_id); for(i=0; i<num_scalers; i++) { if((gdisp.scaler[i].status & SCALER_USED) && (gdisp.scaler[i].screen_index == screen_id)) { __u32 hid; if(gdisp.scaler[i].b_close == TRUE) { Scaler_close(i); gdisp.scaler[i].b_close = FALSE; } else { hid = gdisp.scaler[i].layer_id; DE_SCAL_Set_Reg_Rdy(i); //DE_SCAL_Reset(i); //DE_SCAL_Start(i); disp_deu_set_frame_info(screen_id, IDTOHAND(hid)); disp_deu_output_select(screen_id, IDTOHAND(hid), screen_id); IEP_Deu_Operation_In_Vblanking(i); } gdisp.scaler[i].b_reg_change = FALSE; } } if(DISP_OUTPUT_TYPE_LCD == bsp_disp_get_output_type(screen_id)) { IEP_Drc_Operation_In_Vblanking(screen_id); } if(gdisp.init_para.take_effect) { gdisp.init_para.take_effect(screen_id); } } else { #ifdef __LINUX_OSAL__ spin_unlock_irqrestore(&gdisp.screen[screen_id].flag_lock, flags); #endif } #if 0 cur_line = LCDC_get_cur_line(screen_id, tcon_index); if(cur_line > 5) { DE_INF("%d\n", cur_line); } #endif return ; }