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.
}
Exemplo n.º 2
0
int cat66121_hdmi_sys_detect_hpd(void)
{
	char HPD= 0;
	BYTE sysstat;

// Omegamoon >> Support for forced video mode
#ifdef AUTO_VIDEO_MODE_HANDLING
#ifdef SUPPORT_HDCP
	if((cat66121_hdmi->plug_status != 0) && (cat66121_hdmi->plug_status != 1))
		cat66121_hdmi->plug_status = HDMITX_ReadI2C_Byte(REG_TX_SYS_STATUS);
	
        sysstat = cat66121_hdmi->plug_status;
#else
        sysstat = HDMITX_ReadI2C_Byte(REG_TX_SYS_STATUS);
#endif

	HPD = ((sysstat & B_TX_HPDETECT) == B_TX_HPDETECT)?TRUE:FALSE;
	if(HPD)
		return HDMI_HPD_ACTIVED;
	else
		return HDMI_HPD_REMOVED;
#else
	/*
	   If autoconfig is disabled, the Hotplug feature is also disabled.
	   The driver then acts as if a HDMI display is always connected.
	*/
	if(hdmi->autoconfig == HDMI_DISABLE)
		return HDMI_HPD_ACTIVED;  
#endif  // AUTO_VIDEO_MODE_HANDLING
}
Exemplo n.º 3
0
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 ;
}
Exemplo n.º 4
0
static void check_status_func(struct work_struct *work)
{
	if(HDMITX_ReadI2C_Byte(REG_TX_SYS_STATUS) & B_TX_INT_ACTIVE){
		cat66121_irq_work_func(NULL);
	}
	schedule_delayed_work(&check_status_work, msecs_to_jiffies(5000));
}
Exemplo n.º 5
0
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 ;
}
Exemplo n.º 6
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);
	}
}
Exemplo n.º 7
0
int cat66121_detect_device(void)
{
	uint8_t VendorID0, VendorID1, DeviceID0, DeviceID1;

	Switch_HDMITX_Bank(0);
	VendorID0 = HDMITX_ReadI2C_Byte(REG_TX_VENDOR_ID0);
	VendorID1 = HDMITX_ReadI2C_Byte(REG_TX_VENDOR_ID1);
	DeviceID0 = HDMITX_ReadI2C_Byte(REG_TX_DEVICE_ID0);
	DeviceID1 = HDMITX_ReadI2C_Byte(REG_TX_DEVICE_ID1);
	printk("CAT66121: Reg[0-3] = 0x[%02x].[%02x].[%02x].[%02x]\n",
			VendorID0, VendorID1, DeviceID0, DeviceID1);
	if( (VendorID0 == 0x54) && (VendorID1 == 0x49))
	   //    	&&(DeviceID0 == 0x12) && (DeviceID1 == 0x16) )
		return 1;

	printk("[CAT66121] Device not found!\n");

	return 0;
}
Exemplo n.º 8
0
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 ;
}
Exemplo n.º 9
0
int cat66121_hdmi_sys_detect_hpd(void)
{
	char HPD= 0;
	BYTE sysstat;
	sysstat = HDMITX_ReadI2C_Byte(REG_TX_SYS_STATUS);

	HPD = ((sysstat & B_TX_HPDETECT) == B_TX_HPDETECT)?TRUE:FALSE;
	if(HPD)
		return HDMI_HPD_ACTIVED;
	else
		return HDMI_HPD_REMOVED;
}
Exemplo n.º 10
0
int cat66121_hdmi_sys_detect_hpd(void)
{
	char HPD= 0;
	BYTE sysstat;


#ifdef SUPPORT_HDCP
	if((cat66121_hdmi->plug_status != 0) && (cat66121_hdmi->plug_status != 1))
		cat66121_hdmi->plug_status = HDMITX_ReadI2C_Byte(REG_TX_SYS_STATUS);
	
        sysstat = cat66121_hdmi->plug_status;
#else
        sysstat = HDMITX_ReadI2C_Byte(REG_TX_SYS_STATUS);
#endif

	HPD = ((sysstat & B_TX_HPDETECT) == B_TX_HPDETECT)?TRUE:FALSE;
	if(HPD)
		return HDMI_HPD_ACTIVED;
	else
		return HDMI_HPD_REMOVED;
}
Exemplo n.º 11
0
LONG CalcAudFS()
{
    // LONG RCLK ;
    LONG Cnt ;
    LONG FS ;

    // RCLK = CalcRCLK();
    Switch_HDMITX_Bank(0);
    Cnt = (LONG)HDMITX_ReadI2C_Byte(0x60);
    FS =  hdmiTxDev[0].RCLK / 2 ;
	FS /= Cnt ;
	HDMITX_DEBUG_PRINTF1(("FS = %ld RCLK = %ld, Cnt = %ld\n",FS,hdmiTxDev[0].RCLK,Cnt)) ;
    return FS ;
}
Exemplo n.º 12
0
SYS_STATUS HDMITX_SetI2C_Byte(BYTE Reg,BYTE Mask,BYTE Value)
{
	BYTE Temp;
	if( Mask != 0xFF )
	{
		Temp=HDMITX_ReadI2C_Byte(Reg);
		Temp&=(~Mask);
		Temp|=Value&Mask;
	}
	else
	{
		Temp=Value;
	}
	return HDMITX_WriteI2C_Byte(Reg,Temp);
}
Exemplo n.º 13
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);
}
Exemplo n.º 14
0
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 ;
}
Exemplo n.º 15
0
BYTE hdmitx_getAudioCount()
{
    return HDMITX_ReadI2C_Byte(REG_TX_AUD_COUNT) ;
}