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