Beispiel #1
0
/*!
* \brief	check device plugin status
*		
* \retval  None
*/ 
int sil902x_check_plugin(int hotplug)
{
	int plugin = 0;
	unsigned char *buf;
	int option = 0; 

//	sil902x_clr_interrupt();
	plugin = (ReadByte(0x3D) & 0x04)? 1:0;
	if( hotplug ){
		if (plugin){
			buf = (unsigned char *)vout_get_edid(VOUT_DVO2HDMI);
			option = edid_parse_option(buf);
			sil902x_hdmi_edid = (option & EDID_OPT_HDMI)? 1:0;
			
			sil902x_active( sil902x_videoMode) ;
		}
		else {
#ifdef SIL902X_CONTENT_PROTECT
			sil902x_CP_enable(0);
#endif
			sil902x_set_power_mode(SIL902X_PWR_STANDBY);
		}
		DPRINT("[SIL902X] HDMI plug%s,option 0x%x\n",(plugin)?"in":"out",option);
	}
	vout_set_int_type(2);
	return plugin;
} /* End of sil902x_check_plugin */
Beispiel #2
0
int vout_get_edid_option(int no)
{
	vout_t *vo;

	DBG_DETAIL("(%d)\n",no);

	if( (vo = vout_get_entry(no)) == 0 ){
		return 0;
	}

	if( vo->edid_info.option ){
		return vo->edid_info.option;
	}

	if( vout_get_edid(no) == 0 ){
		return 0;
	}

	edid_parse(vo->edid,&vo->edid_info);
	return vo->edid_info.option;
}
Beispiel #3
0
vpp_timing_t *vout_find_video_mode(int no,vout_info_t *info)
{
	vout_t *vo;
	char *edid = 0;
	unsigned int vo_option;
	vpp_timing_t *p_timing = 0;
	unsigned int opt = 0;
	int index = 0;
	vpp_timing_t *edid_timing = 0;

	if( (vo = vout_get_entry(no)) == 0 )
		return 0;

//	if( vo->num != VPP_VOUT_NUM_HDMI )	// wm3445 simulate dual display
	{
	if( info->fixed_timing ){
		p_timing = info->fixed_timing;
		DBG_MSG("%d(fixed timer)\n",no);
		goto find_video_mode;
	}
	}

	vo_option = vo->option[1];
	DBG_MSG("(%d,%dx%d@%d,%d),%s\n",no,info->resx,info->resy,info->pixclk,info->fps,(vo_option & VOUT_OPT_INTERLACE)?"i":"p");
	if( vo->status & VPP_VOUT_STS_PLUGIN ){
		if( (edid = vout_get_edid(no)) ){
			if( edid_parse(edid,&vo->edid_info) == 0 ){
				edid = 0;
			}
			else {
				opt = info->fps | ((vo_option & VOUT_OPT_INTERLACE)? EDID_TMR_INTERLACE:0);
				if( edid_find_support(&vo->edid_info,info->resx,info->resy,opt,&edid_timing) ){
					if( edid_timing ){
						p_timing = edid_timing;
						DBG_MSG("Use EDID detail timing\n");
						goto find_video_mode;
					}
				}
			}
		}
	}

	do {
		p_timing = vpp_get_video_mode(info->resx,info->resy,info->pixclk,&index);
		DBG_MSG("find(%dx%d@%d) -> %dx%d\n",info->resx,info->resy,info->pixclk,p_timing->hpixel,p_timing->vpixel);
		info->resx = p_timing->hpixel;
		info->resy = p_timing->vpixel;
		if( p_timing->option & VPP_OPT_INTERLACE ){
			info->resy *= 2;
		}
		info->fps = VPP_GET_OPT_FPS(p_timing->option);
		opt = info->fps | ((vo_option & VOUT_OPT_INTERLACE)? EDID_TMR_INTERLACE:0);
		if( edid == 0 )
			break;

		DBG_MSG("find edid %dx%d@%d%s\n",info->resx,info->resy,info->fps,(opt & EDID_TMR_INTERLACE)?"i":"p");
		if( edid_find_support(&vo->edid_info,info->resx,info->resy,opt,&edid_timing) ){
			break;
		}

		opt = info->fps | ((vo_option & VOUT_OPT_INTERLACE)? 0:EDID_TMR_INTERLACE);
		DBG_MSG("find edid %dx%d@%d%s\n",info->resx,info->resy,info->fps,(opt & EDID_TMR_INTERLACE)?"i":"p");
		if( edid_find_support(&vo->edid_info,info->resx,info->resy,opt,&edid_timing) ){
			break;
		}

		if( (info->resx <= vpp_video_mode_table[0].hpixel) || (index <=1) ){
			info->resx = vpp_video_mode_table[0].hpixel;
			info->resy = vpp_video_mode_table[0].vpixel;
			break;
		}
		
		do {
			index--;
			p_timing = (vpp_timing_t *) &vpp_video_mode_table[index];
			if( info->resx == p_timing->hpixel ){
				int vpixel;

				vpixel = p_timing->vpixel;
				if( p_timing->option & VPP_OPT_INTERLACE ){
					vpixel *= 2;
					index--;
				}
				if( info->resy == vpixel ){
					continue;
				}
			}
			break;
		} while(1);
		info->resx = vpp_video_mode_table[index].hpixel;
		info->resy = vpp_video_mode_table[index].vpixel;
		if(vpp_video_mode_table[index].option & VPP_OPT_INTERLACE){
			info->resy *= 2;
		}
	} while(1);

	if( edid_timing ){
		p_timing = edid_timing;
		DBG_MSG("Use EDID detail timing\n");
	}
	else {
		if( opt & EDID_TMR_INTERLACE )
			vo_option |= VOUT_OPT_INTERLACE;
		else 
			vo_option &= ~VOUT_OPT_INTERLACE;
		
		p_timing = vpp_get_video_mode_ext(info->resx,info->resy,info->fps,vo_option);
	}
find_video_mode:
	{
		int hpixel,vpixel;
		
		info->resx = p_timing->hpixel;
		info->resy = p_timing->vpixel;
		hpixel = p_timing->hpixel + p_timing->hsync + p_timing->hfp + p_timing->hbp;
		vpixel = p_timing->vpixel + p_timing->vsync + p_timing->vfp + p_timing->vbp;
		if( p_timing->option & VPP_OPT_INTERLACE ) {
			info->resy *= 2;
//			vpixel *= 2;
		}
		info->pixclk = p_timing->pixel_clock;
		info->fps = info->pixclk / (hpixel * vpixel);
		info->resx_virtual = vpp_calc_fb_width(g_vpp.mb_colfmt,info->resx);
		info->resy_virtual = info->resy;
	}
	DBG_MSG("Leave (%dx%d@%d,%d)\n",p_timing->hpixel,p_timing->vpixel,p_timing->pixel_clock,info->fps);
	return p_timing;
}