Пример #1
0
static void hdcp_delay_work_func(struct work_struct *work)
{
	if(0==(B_TXVIDSTABLE&HDMITX_ReadI2C_Byte(REG_TX_SYS_STATUS)))
	{
		schedule_delayed_work(&hdcp_delay_work, msecs_to_jiffies(100));
		HDCP_DEBUG_PRINTF(("hdmitx_hdcp_Authenticate(): Video not stable\n"));
	}else{
		HDMITX_EnableHDCP(TRUE);
	}
}
Пример #2
0
int cat66121_hdmi_sys_remove(void)
{
	hdmi_dbg(hdmi->dev, "[%s]\n", __FUNCTION__);
#ifdef SUPPORT_HDCP
	cancel_delayed_work_sync(&hdcp_delay_work);
	HDMITX_EnableHDCP(FALSE);
#endif
	HDMITX_DisableVideoOutput();
	if(getHDMI_PowerStatus()==TRUE)
		HDMITX_PowerDown();
	return 0;
}
Пример #3
0
void cat66121_hdmi_interrupt(void)
{
	char sysstat = 0; 
	mutex_lock(&handler_mutex);
	sysstat = HDMITX_ReadI2C_Byte(REG_TX_SYS_STATUS);
	if(sysstat & B_TX_INT_ACTIVE){
    		char intdata1,intdata2,intdata3;
		intdata1 = HDMITX_ReadI2C_Byte(REG_TX_INT_STAT1);
		intdata2 = HDMITX_ReadI2C_Byte(REG_TX_INT_STAT2);
		intdata3 = HDMITX_ReadI2C_Byte(REG_TX_INT_STAT3);
		HDMITX_DEBUG_PRINTF(("REG_TX_INT_STAT1=%x \n",intdata1));
		HDMITX_DEBUG_PRINTF(("REG_TX_INT_STAT2=%x \n",intdata2));
		HDMITX_DEBUG_PRINTF(("REG_TX_INT_STAT3=%x \n",intdata3));
		if(getHDMI_PowerStatus()==FALSE){
			HDMITX_PowerOn();
		}

		/******* Clear interrupt **********/
		cat66121_InterruptClr();
		/******** handler interrupt event ********/
		
		if(intdata1 & B_TX_INT_DDCFIFO_ERR)
		{
			HDMITX_DEBUG_PRINTF(("DDC FIFO Error.\n"));
			hdmitx_ClearDDCFIFO();
		}
		if(intdata1 & B_TX_INT_DDC_BUS_HANG)
		{
			HDMITX_DEBUG_PRINTF(("DDC BUS HANG.\n"));
			hdmitx_AbortDDC();
		}
		if(intdata1 & B_TX_INT_AUD_OVERFLOW ){
			HDMITX_DEBUG_PRINTF(("AUDIO FIFO OVERFLOW.\n"));
			HDMITX_OrReg_Byte(REG_TX_SW_RST,(B_HDMITX_AUD_RST|B_TX_AREF_RST));
			HDMITX_AndReg_Byte(REG_TX_SW_RST,~(B_HDMITX_AUD_RST|B_TX_AREF_RST));
		}

		if(intdata3 & B_TX_INT_VIDSTABLE)
		{
			sysstat = HDMITX_ReadI2C_Byte(REG_TX_SYS_STATUS);
			if(sysstat & B_TXVIDSTABLE)
			{
				hdmitx_FireAFE();
			}
		}
		
#ifdef SUPPORT_HDCP
		if(intdata2 & B_TX_INT_AUTH_FAIL){
			if(getHDMITX_LinkStatus())
			{
				// AudioModeDetect();
				if(getHDMITX_AuthenticationDone() ==FALSE)
				{
					HDMITX_DEBUG_PRINTF(("getHDMITX_AuthenticationDone() ==FALSE\n") );
					HDMITX_EnableHDCP(TRUE);
					setHDMITX_AVMute(FALSE);
				}
			}
		}else if(intdata2 & B_TX_INT_AUTH_DONE){
			HDMITX_SetI2C_Byte(REG_TX_INT_MASK2, B_TX_AUTH_DONE_MASK, B_TX_AUTH_DONE_MASK);
			HDMITX_DEBUG_PRINTF(("getHDMITX_AuthenticationDone() ==SUCCESS\n") );
		}
#endif
		if(intdata1 & B_TX_INT_HPD_PLUG){
			if(sysstat & B_TX_HPDETECT){
				HDMITX_DEBUG_PRINTF(("HPD plug\n") );
			}else{
				HDMITX_DEBUG_PRINTF(("HPD unplug\n") );
			}
			if(hdmi->state == HDMI_SLEEP)
				hdmi->state = WAIT_HOTPLUG;
			queue_delayed_work(hdmi->workqueue, &hdmi->delay_work, msecs_to_jiffies(0));	
		}
	}
	mutex_unlock(&handler_mutex);
}
int cat66121_hdmi_sys_config_video(struct hdmi_video_para *vpara)
{
	struct fb_videomode *mode;
	HDMI_Aspec aspec ;
	HDMI_Colorimetry Colorimetry ;
	VIDEOPCLKLEVEL level ;

	if(vpara == NULL) {
		hdmi_err(hdmi->dev, "[%s] input parameter error\n", __FUNCTION__);
		return -1;
	}

#ifdef SUPPORT_HDCP
	HDMITX_EnableHDCP(FALSE);
#endif

	// output Color mode
#ifndef DISABLE_HDMITX_CSC
	switch(vpara->output_color)
	{
		case HDMI_COLOR_YCbCr444:
			bOutputColorMode = F_MODE_YUV444 ;
			break ;
		case HDMI_COLOR_YCbCr422:
			bOutputColorMode = F_MODE_YUV422 ;
			break ;
		case HDMI_COLOR_RGB:
		default:
			bOutputColorMode = F_MODE_RGB444 ;
			break ;
	}
#else
	bOutputColorMode = F_MODE_RGB444 ;
#endif

	// Set ext video
	mode = (struct fb_videomode *)hdmi_vic_to_videomode(vpara->vic);
	if(mode == NULL)
	{
		hdmi_err(hdmi->dev, "[%s] not found vic %d\n", __FUNCTION__, vpara->vic);
		return -ENOENT;
	}

	hdmi->tmdsclk = mode->pixclock;
	switch(vpara->vic)
	{
		case HDMI_640x480p60:
			pixelrep = 0 ;
			aspec = HDMI_4x3 ;
			Colorimetry = HDMI_ITU601 ;
			break ;
		case HDMI_480p60:
			pixelrep = 0 ;
			aspec = HDMI_4x3 ;
			Colorimetry = HDMI_ITU601 ;
			break ;
		case HDMI_480p60_16x9:
			pixelrep = 0 ;
			aspec = HDMI_16x9 ;
			Colorimetry = HDMI_ITU601 ;
			break ;
		case HDMI_720p60:
			pixelrep = 0 ;
			aspec = HDMI_16x9 ;
			Colorimetry = HDMI_ITU709 ;
			break ;
		case HDMI_1080i60:
			pixelrep = 0 ;
			aspec = HDMI_16x9 ;
			Colorimetry = HDMI_ITU709 ;
			break ;
		case HDMI_480i60:
			pixelrep = 1 ;
			aspec = HDMI_4x3 ;
			Colorimetry = HDMI_ITU601 ;
			break ;
		case HDMI_480i60_16x9:
			pixelrep = 1 ;
			aspec = HDMI_16x9 ;
			Colorimetry = HDMI_ITU601 ;
			break ;
		case HDMI_1080p60:
			pixelrep = 0 ;
			aspec = HDMI_16x9 ;
			Colorimetry = HDMI_ITU709 ;
			break ;
		case HDMI_576p50:
			pixelrep = 0 ;
			aspec = HDMI_4x3 ;
			Colorimetry = HDMI_ITU601 ;
			break ;
		case HDMI_576p50_16x9:
			pixelrep = 0 ;
			aspec = HDMI_16x9 ;
			Colorimetry = HDMI_ITU601 ;
			break ;
		case HDMI_720p50:
			pixelrep = 0 ;
			aspec = HDMI_16x9 ;
			Colorimetry = HDMI_ITU709 ;
			break ;
		case HDMI_1080i50:
			pixelrep = 0 ;
			aspec = HDMI_16x9 ;
			Colorimetry = HDMI_ITU709 ;
			break ;
		case HDMI_576i50:
			pixelrep = 1 ;
			aspec = HDMI_4x3 ;
			Colorimetry = HDMI_ITU601 ;
			break ;
		case HDMI_576i50_16x9:
			pixelrep = 1 ;
			aspec = HDMI_16x9 ;
			Colorimetry = HDMI_ITU601 ;
			break ;
		case HDMI_1080p50:
			pixelrep = 0 ;
			aspec = HDMI_16x9 ;
			Colorimetry = HDMI_ITU709 ;
			break ;
		case HDMI_1080p24:
			pixelrep = 0 ;
			aspec = HDMI_16x9 ;
			Colorimetry = HDMI_ITU709 ;
			break ;
		case HDMI_1080p25:
			pixelrep = 0 ;
			aspec = HDMI_16x9 ;
			Colorimetry = HDMI_ITU709 ;
			break ;
		case HDMI_1080p30:
			pixelrep = 0 ;
			aspec = HDMI_16x9 ;
			Colorimetry = HDMI_ITU709 ;
			break ;

		case HDMI_720p30:
			pixelrep = 0 ;
			aspec = HDMI_16x9 ;
			Colorimetry = HDMI_ITU709 ;		
		default:
			aspec = HDMI_16x9 ;
			Colorimetry = HDMI_ITU709 ;
	}
	if( Colorimetry == HDMI_ITU709 )
	{
		bInputColorMode |= F_VIDMODE_ITU709 ;
	}
	else
	{
		bInputColorMode &= ~F_VIDMODE_ITU709 ;
	}
	if( vpara->vic != HDMI_640x480p60)
	{
		bInputColorMode |= F_VIDMODE_16_235 ;
	}
	else
	{
		bInputColorMode &= ~F_VIDMODE_16_235 ;
	}
	
	if( (hdmi->tmdsclk*(pixelrep+1))>80000000L )
	{
		level = PCLK_HIGH ;
	}
	else if((hdmi->tmdsclk*(pixelrep+1))>20000000L)
	{
		level = PCLK_MEDIUM ;
	}
	else
	{
		level = PCLK_LOW ;
	}

	HDMITX_EnableVideoOutput(level,bInputColorMode,bOutputColorMode ,vpara->output_mode);

	if(vpara->output_mode == OUTPUT_HDMI) {
		cat66121_sys_config_avi(vpara->vic, bOutputColorMode, aspec, Colorimetry, pixelrep);
#ifdef OUTPUT_3D_MODE
		ConfigfHdmiVendorSpecificInfoFrame(OUTPUT_3D_MODE);
#endif

	}
	else {
		HDMITX_EnableAVIInfoFrame(FALSE ,NULL);
		HDMITX_EnableVSInfoFrame(FALSE,NULL);
	}
	setHDMITX_VideoSignalType(INPUT_SIGNAL_TYPE);
#ifdef SUPPORT_SYNCEMBEDDED
	if(INPUT_SIGNAL_TYPE & T_MODE_SYNCEMB)
	{
		setHDMITX_SyncEmbeddedByVIC(vpara->vic,INPUT_SIGNAL_TYPE);
	}
#endif

	return HDMI_ERROR_SUCESS;
}