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. }
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 }
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 ; }
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)); }
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 ; }
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); } }
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; }
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 ; }
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; }
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; }
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 ; }
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); }
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 ; }
BYTE hdmitx_getAudioCount() { return HDMITX_ReadI2C_Byte(REG_TX_AUD_COUNT) ; }