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_hdmi_sys_remove(void) { hdmi_dbg(hdmi->dev, "[%s]\n", __FUNCTION__); #ifdef SUPPORT_HDCP cancel_delayed_work_sync(&hdcp_delay_work); HDMITX_EnableHDCP(FALSE); #endif HDMITX_DisableVideoOutput(); if(getHDMI_PowerStatus()==TRUE) HDMITX_PowerDown(); return 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); }
int cat66121_hdmi_sys_config_video(struct hdmi_video_para *vpara) { struct fb_videomode *mode; HDMI_Aspec aspec ; HDMI_Colorimetry Colorimetry ; VIDEOPCLKLEVEL level ; if(vpara == NULL) { hdmi_err(hdmi->dev, "[%s] input parameter error\n", __FUNCTION__); return -1; } #ifdef SUPPORT_HDCP HDMITX_EnableHDCP(FALSE); #endif // output Color mode #ifndef DISABLE_HDMITX_CSC switch(vpara->output_color) { case HDMI_COLOR_YCbCr444: bOutputColorMode = F_MODE_YUV444 ; break ; case HDMI_COLOR_YCbCr422: bOutputColorMode = F_MODE_YUV422 ; break ; case HDMI_COLOR_RGB: default: bOutputColorMode = F_MODE_RGB444 ; break ; } #else bOutputColorMode = F_MODE_RGB444 ; #endif // Set ext video mode = (struct fb_videomode *)hdmi_vic_to_videomode(vpara->vic); if(mode == NULL) { hdmi_err(hdmi->dev, "[%s] not found vic %d\n", __FUNCTION__, vpara->vic); return -ENOENT; } hdmi->tmdsclk = mode->pixclock; switch(vpara->vic) { case HDMI_640x480p60: pixelrep = 0 ; aspec = HDMI_4x3 ; Colorimetry = HDMI_ITU601 ; break ; case HDMI_480p60: pixelrep = 0 ; aspec = HDMI_4x3 ; Colorimetry = HDMI_ITU601 ; break ; case HDMI_480p60_16x9: pixelrep = 0 ; aspec = HDMI_16x9 ; Colorimetry = HDMI_ITU601 ; break ; case HDMI_720p60: pixelrep = 0 ; aspec = HDMI_16x9 ; Colorimetry = HDMI_ITU709 ; break ; case HDMI_1080i60: pixelrep = 0 ; aspec = HDMI_16x9 ; Colorimetry = HDMI_ITU709 ; break ; case HDMI_480i60: pixelrep = 1 ; aspec = HDMI_4x3 ; Colorimetry = HDMI_ITU601 ; break ; case HDMI_480i60_16x9: pixelrep = 1 ; aspec = HDMI_16x9 ; Colorimetry = HDMI_ITU601 ; break ; case HDMI_1080p60: pixelrep = 0 ; aspec = HDMI_16x9 ; Colorimetry = HDMI_ITU709 ; break ; case HDMI_576p50: pixelrep = 0 ; aspec = HDMI_4x3 ; Colorimetry = HDMI_ITU601 ; break ; case HDMI_576p50_16x9: pixelrep = 0 ; aspec = HDMI_16x9 ; Colorimetry = HDMI_ITU601 ; break ; case HDMI_720p50: pixelrep = 0 ; aspec = HDMI_16x9 ; Colorimetry = HDMI_ITU709 ; break ; case HDMI_1080i50: pixelrep = 0 ; aspec = HDMI_16x9 ; Colorimetry = HDMI_ITU709 ; break ; case HDMI_576i50: pixelrep = 1 ; aspec = HDMI_4x3 ; Colorimetry = HDMI_ITU601 ; break ; case HDMI_576i50_16x9: pixelrep = 1 ; aspec = HDMI_16x9 ; Colorimetry = HDMI_ITU601 ; break ; case HDMI_1080p50: pixelrep = 0 ; aspec = HDMI_16x9 ; Colorimetry = HDMI_ITU709 ; break ; case HDMI_1080p24: pixelrep = 0 ; aspec = HDMI_16x9 ; Colorimetry = HDMI_ITU709 ; break ; case HDMI_1080p25: pixelrep = 0 ; aspec = HDMI_16x9 ; Colorimetry = HDMI_ITU709 ; break ; case HDMI_1080p30: pixelrep = 0 ; aspec = HDMI_16x9 ; Colorimetry = HDMI_ITU709 ; break ; case HDMI_720p30: pixelrep = 0 ; aspec = HDMI_16x9 ; Colorimetry = HDMI_ITU709 ; default: aspec = HDMI_16x9 ; Colorimetry = HDMI_ITU709 ; } if( Colorimetry == HDMI_ITU709 ) { bInputColorMode |= F_VIDMODE_ITU709 ; } else { bInputColorMode &= ~F_VIDMODE_ITU709 ; } if( vpara->vic != HDMI_640x480p60) { bInputColorMode |= F_VIDMODE_16_235 ; } else { bInputColorMode &= ~F_VIDMODE_16_235 ; } if( (hdmi->tmdsclk*(pixelrep+1))>80000000L ) { level = PCLK_HIGH ; } else if((hdmi->tmdsclk*(pixelrep+1))>20000000L) { level = PCLK_MEDIUM ; } else { level = PCLK_LOW ; } HDMITX_EnableVideoOutput(level,bInputColorMode,bOutputColorMode ,vpara->output_mode); if(vpara->output_mode == OUTPUT_HDMI) { cat66121_sys_config_avi(vpara->vic, bOutputColorMode, aspec, Colorimetry, pixelrep); #ifdef OUTPUT_3D_MODE ConfigfHdmiVendorSpecificInfoFrame(OUTPUT_3D_MODE); #endif } else { HDMITX_EnableAVIInfoFrame(FALSE ,NULL); HDMITX_EnableVSInfoFrame(FALSE,NULL); } setHDMITX_VideoSignalType(INPUT_SIGNAL_TYPE); #ifdef SUPPORT_SYNCEMBEDDED if(INPUT_SIGNAL_TYPE & T_MODE_SYNCEMB) { setHDMITX_SyncEmbeddedByVIC(vpara->vic,INPUT_SIGNAL_TYPE); } #endif return HDMI_ERROR_SUCESS; }