void cat66121_InterruptClr(void)
{
	char intclr3,intdata4;
	intdata4= HDMITX_ReadI2C_Byte(0xEE);
	HDMITX_DEBUG_PRINTF(("REG_TX_INT_STAT4=%x \n",intdata4));
	intclr3 = (HDMITX_ReadI2C_Byte(REG_TX_SYS_STATUS))|B_TX_CLR_AUD_CTS | B_TX_INTACTDONE ;
	if( intdata4 )
	{
		HDMITX_WriteI2C_Byte(0xEE,intdata4); // clear ext interrupt ;
		HDMITX_DEBUG_PRINTF(("%s%s%s%s%s%s%s\n",
					(intdata4&0x40)?"video parameter change \n":"",
					(intdata4&0x20)?"HDCP Pj check done \n":"",
					(intdata4&0x10)?"HDCP Ri check done \n":"",
					(intdata4&0x8)? "DDC bus hang \n":"",
					(intdata4&0x4)? "Video input FIFO auto reset \n":"",
					(intdata4&0x2)? "No audio input interrupt  \n":"",
					(intdata4&0x1)? "Audio decode error interrupt \n":""));
	}
	
	HDMITX_WriteI2C_Byte(REG_TX_INT_CLR0,0xFF);
	HDMITX_WriteI2C_Byte(REG_TX_INT_CLR1,0xFF);
	HDMITX_WriteI2C_Byte(REG_TX_SYS_STATUS,intclr3); // clear interrupt.
	intclr3 &= ~(B_TX_INTACTDONE);
	HDMITX_WriteI2C_Byte(REG_TX_SYS_STATUS,intclr3); // INTACTDONE reset to zero.
}
LONG CalcRCLK()
{
	// BYTE uc ;
	int i ;
	long sum, RCLKCNT  ;

	InitCEC();
	sum = 0 ;
	for( i = 0 ; i < 5 ; i++ )
	{
		// uc = CEC_ReadI2C_Byte(0x09) & 0xFE ;
		CEC_WriteI2C_Byte(0x09, 1);
		delay1ms(100);
		CEC_WriteI2C_Byte(0x09, 0);
		RCLKCNT = CEC_ReadI2C_Byte(0x47);
		RCLKCNT <<= 8 ;
		RCLKCNT |= CEC_ReadI2C_Byte(0x46);
		RCLKCNT <<= 8 ;
		RCLKCNT |= CEC_ReadI2C_Byte(0x45);
		// HDMITX_DEBUG_PRINTF1(("RCLK = %ld\n",RCLKCNT) );
		sum += RCLKCNT ;
	}
	DisableCEC();
	RCLKCNT = sum * 32 ;
	HDMITX_DEBUG_PRINTF(("RCLK = %ld,%03ld,%03ld\n",RCLKCNT/1000000,(RCLKCNT%1000000)/1000,RCLKCNT%1000));
	return RCLKCNT ;
}
Esempio n. 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);
}