s32 bsp_disp_get_cur_vb_time(void) { u32 cur_line; u32 num_screens, screen_id; disp_video_timing tt; u32 vb_time = 200; num_screens = bsp_disp_feat_get_num_screens(); for(screen_id=0; screen_id<num_screens; screen_id++) { if(bsp_disp_get_output_type(screen_id) == DISP_OUTPUT_TYPE_LCD) { struct disp_lcd* lcd; u32 time_per_line = 0; u32 start_delay = 0; static disp_panel_para info; start_delay = disp_al_lcd_get_start_delay(screen_id); cur_line = disp_al_lcd_get_cur_line(screen_id); lcd = disp_get_lcd(screen_id); if(!lcd) { DE_WRN("get lcd%d fail\n", screen_id); } memset(&info, 0, sizeof(disp_panel_para)); if(lcd->get_panel_info) lcd->get_panel_info(lcd, &info); if(LCD_IF_EDP != info.lcd_if) { if(lcd->get_timing) { u32 fps = 0; lcd->get_timing(lcd, &tt); if((tt.ver_total_time != 0) && (tt.hor_total_time != 0)) fps = tt.pixel_clk*1000/(tt.ver_total_time*tt.hor_total_time); fps = (0 == fps)? 60:fps; time_per_line = 1000000 / fps / tt.ver_total_time; if(cur_line > start_delay) vb_time = 0; else vb_time = (start_delay - cur_line) * time_per_line; } } else { /* EDP PANEL */ #if defined(__LINUX_PLAT__) u32 count = gdisp.screen[screen_id].wait_count; wait_event_interruptible_timeout(gdisp.screen[screen_id].wait, count != gdisp.screen[screen_id].wait_count, msecs_to_jiffies(50)); vb_time = 150; #endif } } else if(bsp_disp_get_output_type(screen_id) == DISP_OUTPUT_TYPE_HDMI) { /* FIXME: add hdmi */ } } return vb_time; }
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 ; }
/* returns: us */ s32 bsp_disp_get_next_vb_time(void) { u32 cur_line; u32 num_screens, screen_id; disp_video_timing tt; u32 next_time = 16000; num_screens = bsp_disp_feat_get_num_screens(); for(screen_id=0; screen_id<num_screens; screen_id++) { if(bsp_disp_get_output_type(screen_id) == DISP_OUTPUT_TYPE_LCD) { struct disp_lcd* lcd; u32 time_per_line = 0; static disp_panel_para info; cur_line = disp_al_lcd_get_cur_line(screen_id); lcd = disp_get_lcd(screen_id); if(!lcd) { DE_WRN("get lcd%d fail\n", screen_id); } memset(&info, 0, sizeof(disp_panel_para)); if(lcd && lcd->get_panel_info) lcd->get_panel_info(lcd, &info); if(LCD_IF_EDP != info.lcd_if) { if(lcd && lcd->get_timing) { u32 fps = 0; lcd->get_timing(lcd, &tt); if((tt.ver_total_time != 0) && (tt.hor_total_time != 0)) fps = tt.pixel_clk*1000/(tt.ver_total_time*tt.hor_total_time); fps = (0 == fps)? 60:fps; time_per_line = 1000000 / fps / tt.ver_total_time; next_time = (tt.ver_total_time - cur_line) * time_per_line; } } else { /* EDP PANEL */ next_time = 16000;//fix to 16ms } } else if(bsp_disp_get_output_type(screen_id) == DISP_OUTPUT_TYPE_HDMI) { /* FIXME: add hdmi */ } } return next_time; }
s32 bsp_disp_get_vb_time(void) { u32 cur_line; u32 num_screens, screen_id; disp_video_timing tt; u32 vb_time = 0; num_screens = bsp_disp_feat_get_num_screens(); for(screen_id=0; screen_id<num_screens; screen_id++) { if(bsp_disp_get_output_type(screen_id) == DISP_OUTPUT_TYPE_LCD) { struct disp_lcd* lcd; u32 time_per_line = 0; u32 start_delay = 0; start_delay = disp_al_lcd_get_start_delay(screen_id); cur_line = disp_al_lcd_get_cur_line(screen_id); lcd = disp_get_lcd(screen_id); if(!lcd) { DE_WRN("get lcd%d fail\n", screen_id); } if(lcd && lcd->get_timing) { u32 fps = 0; lcd->get_timing(lcd, &tt); if((tt.ver_total_time != 0) && (tt.hor_total_time != 0)) fps = tt.pixel_clk*1000/(tt.ver_total_time*tt.hor_total_time); fps = (0 == fps)? 60:fps; time_per_line = 1000000 / fps / tt.ver_total_time; vb_time = (start_delay) * time_per_line; } else if(bsp_disp_get_output_type(screen_id) == DISP_OUTPUT_TYPE_HDMI) { /* FIXME: add hdmi */ } } } return vb_time; }
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) { return ; } } #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 /* set ready of all mod, todo? */ disp_sync_all(screen_id); } else { #if defined(__LINUX_PLAT__) spin_unlock_irqrestore(&gdisp.screen[screen_id].flag_lock, flags); #endif } return ; }
void sync_event_proc(u32 screen_id) { u32 cur_line = 0, start_delay = 0; #if defined(__LINUX_PLAT__) unsigned long flags; #endif bsp_disp_layer_deinterlace_cfg(screen_id);//de-interlace reg-config #if defined(__LINUX_PLAT__) #ifdef CONFIG_DEVFREQ_DRAM_FREQ_IN_VSYNC if(bsp_disp_get_output_type(screen_id) == DISP_OUTPUT_TYPE_LCD) { struct disp_lcd* lcd = NULL; static disp_panel_para info; lcd = disp_get_lcd(screen_id); if(NULL != lcd) { memset(&info, 0, sizeof(disp_panel_para)); if(lcd->get_panel_info) lcd->get_panel_info(lcd, &info); if(LCD_IF_EDP == info.lcd_if) { gdisp.screen[screen_id].wait_count++; wake_up_interruptible(&gdisp.screen[screen_id].wait); } } } #endif #endif #if defined(CONFIG_ARCH_SUN9IW1P1) if(screen_id < 2) { 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 ; } } #else if(screen_id < 2) { if(disp_al_lcd_check_time(screen_id, 200)) { fcount_data.skip_count[screen_id] ++; return ; } } #endif #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 } if(bsp_disp_get_output_type(screen_id) == DISP_OUTPUT_TYPE_LCD) { struct disp_lcd* m_lcd = NULL; static disp_panel_para m_info; m_lcd = disp_get_lcd(screen_id); if(NULL != m_lcd) { memset(&m_info, 0, sizeof(disp_panel_para)); if(m_lcd->get_panel_info) m_lcd->get_panel_info(m_lcd, &m_info); if(LCD_IF_EDP != m_info.lcd_if) { 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-1)) printk("LCD:%d\n", cur_line); } } } return ; }