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;
}
Exemple #5
0
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 ;
}