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 ; }
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 ; }