BOOL hdmitx_isInputInterlace()
{
    BYTE uc ;

    HDMITX_SetI2C_Byte(0x0F,1,0) ;
    HDMITX_SetI2C_Byte(0xA8,8,8) ;

    uc = HDMITX_ReadI2C_Byte(0xA5) ;
    HDMITX_SetI2C_Byte(0xA8,8,0) ;
    return uc&(1<<4)?TRUE:FALSE ;
}
USHORT hdmitx_getInputVTotal()
{
    BYTE uc ;
    USHORT vTotal ;
    HDMITX_SetI2C_Byte(0x0F,1,0) ;
    HDMITX_SetI2C_Byte(0xA8,8,8) ;

    uc = HDMITX_ReadI2C_Byte(0x99) ;
    vTotal = ((USHORT)uc&0xF)<<8 ;
    uc = HDMITX_ReadI2C_Byte(0x98) ;
    vTotal |= uc;
    HDMITX_SetI2C_Byte(0xA8,8,0) ;
    return vTotal ;
}
USHORT hdmitx_getInputHTotal()
{
    BYTE uc ;
    USHORT hTotal ;
    HDMITX_SetI2C_Byte(0x0F,1,0) ;
    HDMITX_SetI2C_Byte(0xA8,8,8) ;

    uc = HDMITX_ReadI2C_Byte(0xB2) ;
    hTotal = (uc&1)?(1<<12):0 ;
    uc = HDMITX_ReadI2C_Byte(0x91) ;
    hTotal |= ((USHORT)uc)<<4 ;
    uc = HDMITX_ReadI2C_Byte(0x90) ;
    hTotal |= (uc&0xF0) >> 4 ;
    HDMITX_SetI2C_Byte(0xA8,8,0) ;
    return hTotal ;
}
示例#4
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);
}
LONG CalcPCLK()
{
	BYTE uc, div ;
	int i ;
	long sum , count, PCLK   ;

	Switch_HDMITX_Bank(0);
	uc = HDMITX_ReadI2C_Byte(0x5F) & 0x80 ;

	if( ! uc )
	{
	    return 0 ;
	}
    // InitCEC();
    // // uc = CEC_ReadI2C_Byte(0x09) & 0xFE ;
    // CEC_WriteI2C_Byte(0x09, 1);
    // delay1ms(100);
    // CEC_WriteI2C_Byte(0x09, 0);
    // RCLK = CEC_ReadI2C_Byte(0x47);
    // RCLK <<= 8 ;
    // RCLK |= CEC_ReadI2C_Byte(0x46);
    // RCLK <<= 8 ;
    // RCLK |= CEC_ReadI2C_Byte(0x45);
    // DisableCEC();
    // // RCLK *= 160 ; // RCLK /= 100 ;
    // // RCLK in KHz.

	HDMITX_SetI2C_Byte(0xD7, 0xF0, 0x80);
	delay1ms(1);
	HDMITX_SetI2C_Byte(0xD7, 0x80, 0x00);

	count = HDMITX_ReadI2C_Byte(0xD7) & 0xF ;
	count <<= 8 ;
	count |= HDMITX_ReadI2C_Byte(0xD8);

	for( div = 7 ; div > 0 ; div-- )
	{
	    // printf("div = %d\n",(int)div) ;
		if(count < (1<<(11-div)) )
		{
			break ;
		}
	}
	HDMITX_SetI2C_Byte(0xD7, 0x70, div<<4);

    uc = HDMITX_ReadI2C_Byte(0xD7) & 0x7F ;
	for( i = 0 , sum = 0 ; i < 100 ; i ++ )
	{
		HDMITX_WriteI2C_Byte(0xD7, uc|0x80) ;
		delay1ms(1);
		HDMITX_WriteI2C_Byte(0xD7, uc) ;

		count = HDMITX_ReadI2C_Byte(0xD7) & 0xF ;
		count <<= 8 ;
		count |= HDMITX_ReadI2C_Byte(0xD8);
		sum += count ;
	}
	sum /= 100 ; count = sum ;

    HDMITX_DEBUG_PRINTF1(("RCLK(in GetPCLK) = %ld\n",hdmiTxDev[0].RCLK));
	HDMITX_DEBUG_PRINTF1(("div = %d, count = %d\n",(int)div,(int)count) );
	HDMITX_DEBUG_PRINTF1(("count = %ld\n",count) );

	PCLK = hdmiTxDev[0].RCLK * 128 / count * 16 ;
	PCLK *= (1<<div);

	if( HDMITX_ReadI2C_Byte(0x70) & 0x10 )
	{
		PCLK /= 2 ;
	}

	HDMITX_DEBUG_PRINTF1(("PCLK = %ld\n",PCLK) );
	return PCLK ;
}