/**************************************************************************** * Module: DTF8640 * * Description: Tuner Driver for DTF8640 Main Routines * * Notes: 20041019/hwatk * * TO DO * * ChannelChange() ¿¡ ´ëÇÑ ÀÎÀÚ¸¦ ´Ù½ÃÈ®ÀÎÇÏÀÚ. * ************************************************************************^^*/ #include "dsthalcommon.h" #include "dstconfig.h" #include "Cas2BGeneralDefinitions.h" #include "TdquTuner.h" #include "TunerDTT7611.h" #include "Cascade2C.h" #ifdef DMALLOC #include #endif extern DS_U32 gdhlExtDbgLvl; /*================================================================== Configuration Section - USE_CODE_SWITCH : 2B / 2C Switch Code »ç¿ë ¿©ºÎ - USE_2B : 2B / 2C »ç¿ë ¿©ºÎ ==================================================================*/ #define USE_CODE_SWITCH 0 #define DELAY_CHANNEL_TUNE 1 //#define TDA9885_ADDR 0x84 //#define I2C_NIM_TDA9885 ((I2C_BUS1<<12) | I2C_100_KHZ_SETTING | I2C_08_SUB_TYPE | 0x86) //#define I2C_NIM_TDA9885 I2C_DEVICE_INFO(DTT7611_SLAVE_ADDRESS,NIM_I2C_BUS,I2C_08_SUB_TYPE,I2C_100_KHZ_SETTING) #if (NIMTN_TYPE==NIMTN_DTT7611) #define I2C_NIM_TDA9885 0x86 //DTT7611_SLAVE_ADDRESS #elif (NIMTN_TYPE==NIMTN_DTT7612) #define I2C_NIM_TDA9885 DTT7612_SLAVE_ADDRESS #endif #if ((NIMTN_TYPE==NIMTN_DTT7611)||(NIMTN_TYPE==NIMTN_DTT7612)) int DTT7611_NTSC_AGC = (int)TUNERDTT7611_AGC_WIDE_BAND_OFF; int DTT7611_DTV_AGC = (int)TUNERDTT7611_AGC_93; #endif CAS_2B_TYPE_RECEIVER_MODE g_Ntsc_Mode = CAS_2B_RECEIVER_MODE_AUDIO_US_BTSC; //static CAS_2B_TYPE_RECEIVER_MODE g_Ntsc_Mode = CAS_2B_RECEIVER_MODE_AUDIO_A2_KOREA; extern unsigned char codeDSP[]; extern unsigned int codeDSPSize; extern unsigned char dataDSP[]; extern unsigned int dataDSPSize; int g_ChannelChangeCount = 0; #include "SnrCalcTable.h" #include "Cas2BRoutines.h" #include "TunerDTT7611.h" #include "TdquTuner.h" #include "iicComm.h" typedef struct tag_CAS2C_info { OS_SEMAPHORE_ID Mutex; DS_U32 OrenI2cAddr; /* DS_U16 Tda9885Addr; */ /* DS_U16 TunerAddr; TunerAddrÀº »ç¿ëµÇÁö ¾ÊÀ½. -- OREN DemodulatorÀÇ I2C¿¡ ¹°·ÁÀÖÀ½. */ /* Current FAT channel information. */ DS_U32 FATFreq; TunerDemod CurFATDemod; DS_U8 *pMicroCode; DS_U16 microCodeLen; DS_U32 bInitialized; DS_U8 isNtsc; } *P_CAS2C_INFO, CAS2C_INFO; CAS2C_INFO g_CAS2C_info; P_CAS2C_INFO pCAS2C = &g_CAS2C_info; CAS_2B_AUDIO_MESSAGE_PARAMETERS g_AudioParameters; DS_U16 GetHwVer(void); DS_U32 GetCodeVer(void); int CAS2C_GetVersion( DS_U32 *pVersion ) { DS_U32 version; version = 0x00000001; *pVersion = version; return 0; } int CAS2C_Initialize(void) { int retVal = 0; int result; int piError; INT32 retry_cnt=5; CAS_2B_CODE_VERSION stCodeVersion; static char sem_initialized = 0; // // ¿ì¼± 400kHz·Î º¯°æ! // DHL_SYS_SetI2CSpeed( 0, 400000 ); DHL_SYS_SetGPIO( GPIO_OREN_RESET, 0 ); OS_Delay(100); DHL_SYS_SetGPIO( GPIO_OREN_RESET, 1 ); stCodeVersion.usaVector[0]=0; stCodeVersion.usaVector[1]=0; stCodeVersion.usaVector[2]=0; stCodeVersion.usaVector[3]=0; stCodeVersion.usaVector[4]=0; stCodeVersion.usaVector[5]=0; if ( sem_initialized == 0 ) { pCAS2C->Mutex = OS_CreateBinarySemaphore( "CAS2C_Sema4", 0, 1 ); if ( pCAS2C->Mutex == (OS_SEMAPHORE_ID)0 ) { DHL_DbgPrintf(gdhlExtDbgLvl,DHLDBG_EXT, "ERROR: OS_CreateMutexSemaphore\n"); retVal = -1; goto done; } pCAS2C->OrenI2cAddr = CASCADE_WRITE_ADDRESS; sem_initialized = 1; } /* Reset the Checksum register */ //ResetChecksum(); DHL_DbgPrintf(gdhlExtDbgLvl,DHLDBG_EXT,"HW Ver = 0x%x\n", GetHwVer() ); /* Load the DSP code and data files */ result = SendCodeAndData(codeDSP,codeDSPSize,dataDSP,dataDSPSize); if ( result != CAS_2B_API_SUCCESS ) { #if 1 //BKNOTE: ½ÇÆÐÇßÀ» °æ¿ì (resetÇϰí) õõÈ÷ ¸î ¹ø ´õ ½ÃµµÇØ º»´Ù. while((result!=CAS_2B_API_SUCCESS)&&retry_cnt--) { DHL_DbgPrintf(0,DHLDBG_EXT,"Retry to initialize OREN. line=%d\n",__LINE__); //BKTODO: À̰÷¿¡ Oren demodÀÇ GPIO HW reset³ÖÀ» °Í DHL_SYS_SetGPIO( GPIO_OREN_RESET, 0 ); OS_Delay(100); DHL_SYS_SetGPIO( GPIO_OREN_RESET, 1 ); OS_mDelay(10); ResetChecksum(); OS_mDelay(10); result = SendCodeAndData(codeDSP,codeDSPSize,dataDSP,dataDSPSize); } #endif if(result!=CAS_2B_API_SUCCESS) { DHL_DbgPrintf(0,DHLDBG_EXT,"Can not Load DSP Data. (%dline result = 0x%x)\n", __LINE__, (unsigned int)result ); retVal = -1; goto done; } } #if 0 /* Check the Checksum result for the code and data load */ piError = 0; checksumResult = GetChecksumFlag(&piError); if (checksumResult != CHECKSUM_STATUS_CORRECT) { DHL_DbgPrintf(gdhlExtDbgLvl,DHLDBG_EXT, "Checksum is not correct \n"); return(-1); } /* Start the DSP RUN_FLAG */ result = SendCas2BRunFlag(); if (result != 0) { DHL_DbgPrintf(gdhlExtDbgLvl,DHLDBG_EXT, "Can not Start the Cascade2B DSP. result=%d... Check for proper code and data load\n", (int)result); return(-1); } #endif OS_mDelay(15);/* 15ms deley */ InitAudioMessageStructToDefault( &g_AudioParameters ); g_AudioParameters.iMasterSlaveMode = TYPE_AUDIO_MASTER_MODE; g_AudioParameters.iIisMode = TYPE_IIS_MODE_IIS; /* Check the DSP Firmware Version ID Code */ stCodeVersion = GetDSPFirmwareVersion(&piError); DHL_DbgPrintf(gdhlExtDbgLvl,DHLDBG_EXT,"DSP Firmware Version ID = %.4x,%.4x,%.4x,%.4x,%.4x,%.4x\n", (int)stCodeVersion.usaVector[0],(int)stCodeVersion.usaVector[1],(int)stCodeVersion.usaVector[2],(int)stCodeVersion.usaVector[3],(int)stCodeVersion.usaVector[4],(int)stCodeVersion.usaVector[5]); // // ÀÌ ½ÃÁ¡ ÀÌÈĺÎÅÍ 100kHz·Î º¯°æ! // DHL_SYS_SetI2CSpeed( 0, 100000 ); #if(( NIMTN_TYPE==NIMTN_DTT7611)||(NIMTN_TYPE==NIMTN_DTT7612)) retVal = CAS2C_InitTDA9885(); if(retVal){ DHL_DbgPrintf(gdhlExtDbgLvl,DHLDBG_EXT,"TDA9985 Initialize failed!\n"); }else{ DHL_DbgPrintf(gdhlExtDbgLvl,DHLDBG_EXT,"TDA9985 Init |success|\n"); } #endif done: return retVal; } /**************************************************************************** CAS2C_Start() Summary : Start Oren demodulator. Returns : 0 on success, others on failure. ************************************************************************^^*/ int CAS2C_Start( TunerDemod Demod, int Ntsc, int Cable ) { int retVal = 0; DS_U32 semErr; // int casResult; unsigned int uResult; int needChannelChange; CAS_2B_TUNER_PARAMETERS TunerParam; CAS_2B_CHANNEL_CHANGE_PARAMETERS ChannelParam; CAS_2B_TYPE_RECEIVER_MODE rMode; /* Take Mutex. */ semErr = OS_TakeSemaphore( pCAS2C->Mutex ); if ( semErr != 0 ) return -1; needChannelChange = (Ntsc != pCAS2C->isNtsc) || (Ntsc); #if (NIMTN_TYPE==NIMTN_FQD1236) TunerParam.iTunerType = (TUNER_TYPE)TUNER_FQD1236; #elif (NIMTN_TYPE==NIMTN_DTT7611) TunerParam.iTunerType = (TUNER_TYPE)TUNER_DTT7611; #elif (NIMTN_TYPE== NIMTN_TDQU) TunerParam.iTunerType = (TUNER_TYPE)TUNER_TDQU; #else #error Need to define NIMTN_TYPE #endif TunerParam.iTunerSet = TUNER_SET_CENTER_FREQUENCY_KHZ; TunerParam.ulSetValue = pCAS2C->FATFreq; if ( Cable ) TunerParam.iChannelTableType = NA_CATV; else TunerParam.iChannelTableType = NA_TERRESTRIAL; if ( Ntsc == 0 ) TunerParam.iAgcMode = TUNER_AGC_MODE_INTERNAL_DIGITAL; else TunerParam.iAgcMode = TUNER_AGC_MODE_INTERNAL_ANALOG; if(Cable) TunerParam.iInputSelection = TUNER_INPUT_SELECTION_CABLE; else TunerParam.iInputSelection = TUNER_INPUT_SELECTION_TERRESTRIAL; switch ( Demod ) { case DEMOD_8VSB: rMode = CAS_2B_RECEIVER_MODE_VSB_8_TR; break; case DEMOD_64QAM: rMode = CAS_2B_RECEIVER_MODE_ITUB_64; break; case DEMOD_256QAM: rMode = CAS_2B_RECEIVER_MODE_ITUB_256; break; case DEMOD_QAM: rMode = CAS_2B_RECEIVER_MODE_ITUB_AUTO_DETECT; break; case DEMOD_NTSC: rMode = g_Ntsc_Mode; break; /* NTSC Mode°¡ µû·Î ¾øÀ½. */ // case DEMOD_NTSC: rMode = CAS_2B_RECEIVER_MODE_VSB_8_TR; break; /* NTSC Mode°¡ µû·Î ¾øÀ½. */ default: DHL_DbgPrintf(gdhlExtDbgLvl,DHLDBG_EXT,"|%s| error, line = %d, Demod = %d\n", __LINE__, Demod ); retVal = -1; goto done; } pCAS2C->CurFATDemod = Demod; ChannelParam.iCarrierAcquisition = CARRIER_ACQUISITION_NORMAL; ChannelParam.iInverseSpectrum = INVERSE_SPECTRUM_OFF; ChannelParam.iReceiverMode = rMode; if ( Ntsc == 0 ) ChannelParam.iNtscSignalDetection = NORMAL_VSB; else ChannelParam.iNtscSignalDetection = NTSC_SIGNAL_DETECTION; uResult = SetChannel( TunerParam, DELAY_CHANNEL_TUNE, &ChannelParam ); if ( uResult != IIC_COM_SUCCESS ) { DHL_DbgPrintf(gdhlExtDbgLvl,DHLDBG_EXT,"|%s| line = %d, result = 0x%x\n", __LINE__, uResult ); retVal = -1; goto done; } #if 0 uResult = SendVsbMessage( VSB_CHANNEL_CONDITION_AUTO, VSB_NTSC_REJECTION_FILTER_AUTO,//BK<-VSB_NTSC_REJECTION_FILTER_ON, //MPEG_OUTPUT_MODE_PARALLEL, //MPEG_OUTPUT_MODE_CONTROLED_BY_PRM_PINS, MPEG_OUTPUT_MODE_SERIAL, TUNER_PHASE_NOISE_NORMAL ); if ( uResult != IIC_COM_SUCCESS ) { DHL_DbgPrintf(gdhlExtDbgLvl,DHLDBG_EXT,"|%s| line = %d, result = 0x%x\n", __LINE__, uResult ); retVal = -1; goto done; } #endif if ( Demod == DEMOD_NTSC ) { uResult = SendAudioMessage( 1, g_AudioParameters ); if ( uResult != CAS_2B_API_SUCCESS ) { DHL_DbgPrintf(0,DHLDBG_EXT,"line = %d, result = 0x%x\n", __LINE__, uResult ); retVal = -1; goto done; } uResult = SendAudioMessage( 2, g_AudioParameters ); if ( uResult != CAS_2B_API_SUCCESS ) { DHL_DbgPrintf(gdhlExtDbgLvl,DHLDBG_EXT,"line = %d, result = 0x%x\n", __LINE__, uResult ); retVal = -1; goto done; } uResult = SendAudioMessage( 3, g_AudioParameters ); if ( uResult != CAS_2B_API_SUCCESS ) { DHL_DbgPrintf(gdhlExtDbgLvl,DHLDBG_EXT,"line = %d, result = 0x%x\n", __LINE__, uResult ); retVal = -1; goto done; } } g_ChannelChangeCount++; pCAS2C->isNtsc = Ntsc; done: /* Give Mutex. */ semErr = OS_GiveSemaphore( pCAS2C->Mutex ); if ( semErr != 0 ) retVal = -1; if (!retVal) DHL_DbgPrintf(gdhlExtDbgLvl,DHLDBG_EXT,"success.\n"); else DHL_DbgPrintf(gdhlExtDbgLvl,DHLDBG_EXT,"failure.\n"); return retVal; } /**************************************************************************** CAS2C_Stop() Summary : Stop the Oren demodulator. Returns : 0 on success, others on failure. ************************************************************************^^*/ int CAS2C_Stop(void) { int retVal = 0; DS_U32 semErr; /* Take Mutex. */ semErr = OS_TakeSemaphore( pCAS2C->Mutex ); if ( semErr != 0 ) return -1; /* DO NOTHING. */ /* Give Mutex. */ semErr = OS_GiveSemaphore( pCAS2C->Mutex ); if ( semErr != 0 ) retVal = -1; return retVal; } /**************************************************************************** CAS2C_Close() Summary : Close the Oren demodulator. Returns : 0 on success, others on failure. ************************************************************************^^*/ int CAS2C_Close(void) { int retVal = 0; DS_U32 semErr; /* Take Mutex. */ semErr = OS_TakeSemaphore( pCAS2C->Mutex ); if ( semErr != 0 ) return -1; /* DO NOTHING */ goto done; done: /* Give Mutex. */ semErr = OS_GiveSemaphore( pCAS2C->Mutex ); if ( semErr != 0 ) retVal = -1; return retVal; } /**************************************************************************** CAS2C_Reset() Summary : Reset the Oren demodulator. Returns : 0 on success, others on failure. ************************************************************************^^*/ int CAS2C_Reset(void) { int retVal = 0; DS_U32 semErr; unsigned int stat; DS_U8 buff[2] = {0x66, 0xc0}; /* Take Mutex. */ semErr = OS_TakeSemaphore( pCAS2C->Mutex ); if ( semErr != 0 ) return -1; stat = OrenIicTransmit(0x2a, &buff[0], 2); if(stat != 0){ DHL_DbgPrintf(0,DHLDBG_EXT," Reset Failed Error!, %d\n",__LINE__); return -1; } /* Give Mutex. */ semErr = OS_GiveSemaphore( pCAS2C->Mutex ); if ( semErr != 0 ) retVal = -1; return retVal; } /**************************************************************************** CAS2C_SetFrequency() Summary : Set Frequency Returns : 0 on success, others on failure. ************************************************************************^^*/ int CAS2C_SetFrequencyDTV( DS_U32 dMHz ) { int retVal = 0; DS_U32 semErr; DS_U32 freq; int casResult; /* Take Mutex. */ semErr = OS_TakeSemaphore( pCAS2C->Mutex ); if ( semErr != 0 ) return -1; freq = (DS_U32)dMHz; pCAS2C->FATFreq = freq; DHL_DbgPrintf(gdhlExtDbgLvl,DHLDBG_EXT,"dMHz = %d\n", (int)freq ); #if (NIMTN_TYPE==NIMTN_DTT7611) /* hwatk/050427, ½ÇÁ¦·Î TuningÇϵµ·Ï... */ casResult = TunerDTT7611SendFreq( dMHz, TUNERDTT7611_REF_DIVIDER_RATIO_62_5, (TYPE_TUNERDTT7611_AGC)DTT7611_DTV_AGC/*TUNERDTT7611_AGC_WIDE_BAND_OFF*/, TUNER_AGC_MODE_INTERNAL_ANALOG, TUNERDTT7611_CHARGE_PUMP_60, TUNERDTT7611_AGC_TIME_CONSTANT_2_SEC ); if ( casResult != DTT7611_SUCCESS ) { DHL_DbgPrintf(0,DHLDBG_EXT,"ERROR: line=%d, casResult = %d\n", __LINE__, casResult ); } #elif (NIMTN_TYPE==NIMTN_TDQU) casResult = TunerTdquSendCenterFrequency( dMHz, TUNER_TDQU_REF_DIVIDER_RATIO_62_5, TUNER_TDQU_CHARGE_PUMP_300, TUNER_TDQU_AGST_0); if ( casResult != TDQU_SUCCESS ) { DHL_DbgPrintf(0,DHLDBG_EXT,"ERROR: line=%d, casResult = %d\n", __LINE__, casResult ); } //TunerTdquPrintLockStatus(); #endif goto done; done: /* Give Mutex. */ semErr = OS_GiveSemaphore( pCAS2C->Mutex ); if ( semErr != 0 ) retVal = -1; return retVal; } int CAS2C_SetFrequencyNTSC( DS_U32 dMHz ) { int retVal = 0; DS_U32 semErr; DS_U32 freq; int casResult; /* Take Mutex. */ semErr = OS_TakeSemaphore( pCAS2C->Mutex ); if ( semErr != 0 ) return -1; freq = (DS_U32)dMHz; pCAS2C->FATFreq = freq; DHL_DbgPrintf(gdhlExtDbgLvl,DHLDBG_EXT,"dMHz = %d\n", (int)freq ); #if NIMTN_TYPE==NIMTN_DTT7611 /* hwatk/050427, ½ÇÁ¦·Î TuningÇϵµ·Ï... */ casResult = TunerDTT7611SendFreq( dMHz, TUNERDTT7611_REF_DIVIDER_RATIO_62_5, (TYPE_TUNERDTT7611_AGC)DTT7611_NTSC_AGC/*TUNERDTT7611_AGC_WIDE_BAND_OFF*/, /*TUNER_AGC_MODE_INTERNAL_ANALOG*/2, TUNERDTT7611_CHARGE_PUMP_60, TUNERDTT7611_AGC_TIME_CONSTANT_2_SEC ); if ( casResult != DTT7611_SUCCESS ) { DHL_DbgPrintf(gdhlExtDbgLvl,DHLDBG_EXT,"ERROR: line=%d, casResult = %d\n", __LINE__, casResult ); retVal = -1; } #elif NIMTN_TYPE==NIMTN_TDQU casResult = TunerTdquSendCenterFrequency( dMHz, TUNER_TDQU_REF_DIVIDER_RATIO_62_5, TUNERDTT7611_CHARGE_PUMP_60, TUNER_TDQU_AGST_0 ); // by Zhong Yang. if ( casResult != TDQU_SUCCESS ) { DHL_DbgPrintf(gdhlExtDbgLvl,DHLDBG_EXT,"ERROR: line=%d, casResult = %d\n", __LINE__, casResult ); retVal = -1; } #else casResult=0; #endif /* Give Mutex. */ semErr = OS_GiveSemaphore( pCAS2C->Mutex ); if ( semErr != 0 ) retVal = -1; return retVal; } // // Tuner Á¦¾îÇÏÁö ¾Ê°í, ³»ºÎÀûÀ¸·Î TuningÇÒ Á֯ļö¸¦ ¸í½ÃÇÏ´Â ÇÔ¼ö. // ¼³Á¤µÈ Á֯ļö´Â ´ÙÀ½ CAS2C_Start() È£Ã⠽ÿ¡ Àû¿ëµÊ. // int CAS2C_SetFrequency( DS_U32 dMHz ) { int retVal = 0; DS_U32 semErr; DS_U32 freq; /* Take Mutex. */ semErr = OS_TakeSemaphore( pCAS2C->Mutex ); if ( semErr != 0 ) return -1; freq = (DS_U32)dMHz; pCAS2C->FATFreq = freq; DHL_DbgPrintf(gdhlExtDbgLvl,DHLDBG_EXT,"dMHz = %d\n", (int)freq ); /* Give Mutex. */ semErr = OS_GiveSemaphore( pCAS2C->Mutex ); if ( semErr != 0 ) retVal = -1; return retVal; } DS_U32 CAS2C_GetFrequency(void) { return pCAS2C->FATFreq; } /**************************************************************************** CAS2C_GetLockStatus() Summary : Set Frequency Returns : 0 on success, others on failure. ************************************************************************^^*/ int CAS2C_GetLockStatus( int *pLockStatus ) { int retVal = 0; DS_U32 semErr; int err; LOCK_STATUS lockStatus, fecLock; TunerDemod demod; // long offset; // int SQI; /* Take Mutex. */ semErr = OS_TakeSemaphore( pCAS2C->Mutex ); if ( semErr != 0 ) return -1; *pLockStatus = 0; lockStatus = IsLocked( &err ); if ( err != CAS_2B_API_SUCCESS ) { DHL_DbgPrintf(0,DHLDBG_EXT,"ERROR: line = %d\n", __LINE__); retVal = -1; goto done; } fecLock = IsFECLocked( &err ); if ( err != CAS_2B_API_SUCCESS ) { DHL_DbgPrintf(0,DHLDBG_EXT,"ERROR: line = %d\n", __LINE__); retVal = -1; goto done; } #if 1 // // Workaround. // ù¹øÂ° QAM ä³Î Àüȯ ½Ã ½ÅÈ£°¡ ³·À½. // if ( pCAS2C->CurFATDemod == DEMOD_QAM || pCAS2C->CurFATDemod == DEMOD_256QAM || pCAS2C->CurFATDemod == DEMOD_64QAM ) { if ( fecLock == LOCKED && lockStatus == UNLOCKED && g_ChannelChangeCount <= 1 ) { /* Give Mutex. */ semErr = OS_GiveSemaphore( pCAS2C->Mutex ); if ( semErr != 0 ) retVal = -1; printf("%s| force tune!\n", __FUNCTION__); demod = pCAS2C->CurFATDemod; CAS2C_Start( DEMOD_NTSC, 1, 0 ); CAS2C_Start( demod, 0, 1 ); *pLockStatus = 0; return retVal; } } #else demod = 0; #endif if ( lockStatus == LOCKED ) *pLockStatus = 1; else *pLockStatus = 0; done: /* Give Mutex. */ semErr = OS_GiveSemaphore( pCAS2C->Mutex ); if ( semErr != 0 ) retVal = -1; return retVal; } int CAS2C_GetLockStatusNTSC( int *pLockStatus ) { int retVal = 0; DS_U32 semErr; // long offset; DS_U8 tdaData; #if NIMTN_TYPE==NIMTN_TDQU DS_U8 H_Sync_Status; DS_U8 AFT_Status; #endif // int SQI; /* Take Mutex. */ semErr = OS_TakeSemaphore( pCAS2C->Mutex ); if ( semErr != 0 ) return -1; *pLockStatus = 0; #if 0 ntscLockStatus = IsNtscChannelDetected( &err ); if ( err != CAS_2B_API_SUCCESS ) { DHL_DbgPrintf(0,DHLDBG_EXT,"ERROR: line = %d\n", __LINE__); retVal = -1; goto done; } *pLockStatus = ntscLockStatus; goto done; #endif #if NIMTN_TYPE==NIMTN_DTT7611 if ( !TunerDTT7611BeforeSendBytes() ) { DHL_DbgPrintf(0,DHLDBG_EXT,"ERROR: line = %d\n", __LINE__); retVal = -1; goto done; } OS_mDelay(1); /* 1 ms */ if ( DHL_SYS_I2cRead( I2C_NIM_TDA9885,FALSE, 0, &tdaData, 1 ) ) { DHL_DbgPrintf(0,DHLDBG_EXT,"ERROR: line = %d\n", __LINE__); retVal = -1; } if ( !TunerDTT7611AfterSendBytes() ) { DHL_DbgPrintf(0,DHLDBG_EXT,"ERROR: line = %d\n", __LINE__); retVal = -1; goto done; } tdaData = ( tdaData >> 1 ) & 0x0F; if ( tdaData == 0x07 || tdaData == 0x08 ) { *pLockStatus = 0; } else { *pLockStatus = 1; /* hwatk/050427, TDA9885 Data¸¸À¸·Î ÆÇ´Ü */ } #elif NIMTN_TYPE==NIMTN_TDQU if(FALSE == BeforeTunerSendBytes()) { DHL_DbgPrintf(0,DHLDBG_EXT,"ERROR: line = %d\n", __LINE__); retVal = -1; goto done; } OS_mDelay(50); if ( DHL_SYS_I2cRead( I2C_TDQU_READ_ADDR,FALSE, 0, &tdaData, 1 ) ) { DHL_DbgPrintf(0,DHLDBG_EXT,"ERROR: line = %d\n", __LINE__); retVal = -1; } if(tdaData==0x7B)// ||tdaData==0x7A||tdaData==0x79)//tdadata == 1/2/3 || tdaData==0x79 AFT_Status = 1; else AFT_Status = 0; DHL_FE_AnalogGetLockStatus(TUNER_FAT, &H_Sync_Status); DHL_DbgPrintf(0,DHLDBG_EXT,"====DETERMINE: H_Sync_Status=%d\n",H_Sync_Status); if(tdaData==0x7B)//||tdaData==0x7A)// ||tdaData==0x79)//tdadata == 1/2/3 || tdaData==0x79 / ZhongYang AFT_Status = 1; else AFT_Status = 0; DHL_DbgPrintf(0,DHLDBG_EXT,"====DETERMINE: AFT_Status=0x%x\n",tdaData); if(FALSE == AfterTunerSendBytes()) { DHL_DbgPrintf(0,DHLDBG_EXT,"ERROR: line = %d\n", __LINE__); retVal = -1; goto done; } #if 0 if(tdaData==0x7B&&H_Sync_Status==0) { OS_mDelay(4); DHL_FE_AnalogGetLockStatus(TUNER_FAT, &H_Sync_Status); DHL_DbgPrintf(0,DHLDBG_EXT,"====DETERMINE 2: H_Sync_Status=%d\n",H_Sync_Status); } #endif if(H_Sync_Status==1&&AFT_Status==1) *pLockStatus = 1; else *pLockStatus = 0; #endif done: /* Give Mutex. */ semErr = OS_GiveSemaphore( pCAS2C->Mutex ); if ( semErr != 0 ) retVal = -1; return retVal; } /**************************************************************************** CAS2C_GetSignalStrength() Summary : Get signal strength from demodulator. Returns : 0 on success, others on failure. ************************************************************************^^*/ int CAS2C_GetSignalStrength( int *pSQI ) { int retVal = 0; DS_U32 semErr; DS_U8 sqi; int err; CAS_2B_TYPE_RECEIVER_MODE rMode; int minVal, maxVal, Val; DS_U16 snr; if ( pCAS2C->CurFATDemod == DEMOD_NTSC ) { *pSQI = 0; return 0; } /* Take Mutex. */ semErr = OS_TakeSemaphore( pCAS2C->Mutex ); if ( semErr != 0 ) return -1; switch ( pCAS2C->CurFATDemod ) { case DEMOD_8VSB: rMode = CAS_2B_RECEIVER_MODE_VSB_8_TR; break; case DEMOD_64QAM: rMode = CAS_2B_RECEIVER_MODE_ITUB_64; break; case DEMOD_256QAM: rMode = CAS_2B_RECEIVER_MODE_ITUB_256; break; case DEMOD_QAM: rMode = CAS_2B_RECEIVER_MODE_ITUB_AUTO_DETECT; break; case DEMOD_NTSC: rMode = g_Ntsc_Mode; break; /* NTSC Mode°¡ µû·Î ¾øÀ½. */ default: DHL_DbgPrintf(0,DHLDBG_EXT,"ERROR: line = %d, Demod = %d\n", __LINE__, pCAS2C->CurFATDemod); retVal = -1; goto done; } #if 0 sqi = GetSignalQuality( rMode, &err ); if ( err != CAS_2B_API_SUCCESS ) { DHL_DbgPrintf(0,DHLDBG_EXT,"ERROR: line = %d, err = %d\n", __LINE__, err ); retVal = -1; goto done; } #else switch ( pCAS2C->CurFATDemod ) { case DEMOD_8VSB: minVal = 10; maxVal = 32; break; case DEMOD_64QAM: minVal = 15; maxVal = 35; break; case DEMOD_256QAM: minVal = 18; maxVal = 35; break; case DEMOD_QAM: minVal = 15; maxVal = 35; break; case DEMOD_NTSC: minVal = 10; maxVal = 32; break; default: DHL_DbgPrintf(0,DHLDBG_EXT,"ERROR: line = %d, Demod = %d\n", __LINE__, pCAS2C->CurFATDemod); retVal = -1; goto done; } snr = GetSnrAfterEqualization( rMode, &err ); if ( err != IIC_COM_SUCCESS ) { DHL_DbgPrintf(0,DHLDBG_EXT,"ERROR: line = %d, err = %d\n", __LINE__, err ); retVal = -1; goto done; } Val = (snr-minVal)*100; Val /= (maxVal-minVal); if ( Val > 100 ) Val = 100; if ( Val < 0 ) Val = 0; sqi = Val; #endif *pSQI = sqi; done: /* Give Mutex. */ semErr = OS_GiveSemaphore( pCAS2C->Mutex ); if ( semErr != 0 ) retVal = -1; return retVal; } int CAS2C_GetSignalPower( int *pPower ) { int retVal = 0; DS_U32 semErr; DS_U8 sqi; int Val; int err; NUMERATOR_DENOMINATOR stResult; /* Take Mutex. */ semErr = OS_TakeSemaphore( pCAS2C->Mutex ); if ( semErr != 0 ) return -1; // sqi = GetSignalStrength( &err, TYPE_AGC_AMPLIFIER_UPC3217 ); // sqi = GetSignalStrength( &err, TYPE_AGC_AMPLIFIER_UPC3219 ); err = 0; stResult = GetAgcIfCommand( &err ); if ( err != 0 ) { DHL_DbgPrintf(gdhlExtDbgLvl,DHLDBG_EXT,"ERROR: piError = %d\n", (unsigned int)err ); retVal = -1; goto done; } DHL_DbgPrintf(gdhlExtDbgLvl,DHLDBG_EXT,"IF AGC = %d, %f\n", (int)stResult.Numerator.lNumerator, (float)stResult.Denominator.lDenominator ); Val = (int)(stResult.Numerator.lNumerator - 3000) * 100; Val /= (19000-300); if ( Val > 100 ) Val = 100; if ( Val < 0 ) Val = 0; sqi = Val; *pPower = sqi; done: /* Give Mutex. */ semErr = OS_GiveSemaphore( pCAS2C->Mutex ); if ( semErr != 0 ) retVal = -1; return retVal; } /**************************************************************************** CAS2C_GetSNR Summary : Get signal strength from demodulator. Returns : 0 on success, others on failure. ************************************************************************^^*/ int CAS2C_GetSNR( float *pSNR ) { int retVal = 0; DS_U32 semErr; DS_U16 snr; int err; float SNR; CAS_2B_TYPE_RECEIVER_MODE rMode; /* Take Mutex. */ semErr = OS_TakeSemaphore( pCAS2C->Mutex ); if ( semErr != 0 ) return -1; if ( pCAS2C->isNtsc ) { *pSNR = (float)6; } else { err = IIC_COM_SUCCESS; switch ( pCAS2C->CurFATDemod ) { case DEMOD_8VSB: rMode = CAS_2B_RECEIVER_MODE_VSB_8_TR; break; case DEMOD_64QAM: rMode = CAS_2B_RECEIVER_MODE_ITUB_64; break; case DEMOD_256QAM: rMode = CAS_2B_RECEIVER_MODE_ITUB_256; break; case DEMOD_QAM: rMode = CAS_2B_RECEIVER_MODE_ITUB_AUTO_DETECT; break; case DEMOD_NTSC: rMode = g_Ntsc_Mode; break; /* NTSC Mode°¡ µû·Î ¾øÀ½. */ default: DHL_DbgPrintf(gdhlExtDbgLvl,DHLDBG_EXT,"ERROR: Line = %d, Demod = %d\n", __LINE__, pCAS2C->CurFATDemod ); retVal = -1; goto done; } snr = GetSnrAfterEqualization( rMode, &err ); if ( err != IIC_COM_SUCCESS ) { DHL_DbgPrintf(gdhlExtDbgLvl,DHLDBG_EXT,"ERROR: Line = %d, err = %d\n", __LINE__, err ); retVal = -1; goto done; } SNR = (float)snr; *pSNR = SNR; } done: /* Give Mutex. */ semErr = OS_GiveSemaphore( pCAS2C->Mutex ); if ( semErr != 0 ) retVal = -1; return retVal; } /**************************************************************************** CAS2C_GetModFormat Summary : Get signal strength from demodulator. Returns : 0 on success, others on failure. ************************************************************************^^*/ int CAS2C_GetModFormat( TunerDemod *mode ) { int retVal = 0; int err; DS_U32 semErr; CAS_2B_TYPE_RECEIVER_MODE iRMode; /* Take Mutex. */ semErr = OS_TakeSemaphore( pCAS2C->Mutex ); if ( semErr != 0 ) return -1; #if 0 if ( pCAS2C->isNtsc == 1 ) *mode = DEMOD_NTSC; else *mode = DEMOD_8VSB; #else if ( pCAS2C->CurFATDemod == DEMOD_QAM ) { iRMode = GetReceiveMode( &err ); if ( err != IIC_COM_SUCCESS ) { DHL_DbgPrintf(gdhlExtDbgLvl,DHLDBG_EXT,"ERROR: line = %d, err = %d\n", __LINE__, err ); retVal = -1; goto done; } switch (iRMode) { case CAS_2B_RECEIVER_MODE_VSB_8_TR: *mode = DEMOD_8VSB; break; case CAS_2B_RECEIVER_MODE_ITUB_64: *mode = DEMOD_64QAM; break; case CAS_2B_RECEIVER_MODE_ITUB_256: *mode =DEMOD_256QAM; break; default: DHL_DbgPrintf(gdhlExtDbgLvl,DHLDBG_EXT,"ERROR, LINE=%d\n", __LINE__); } } else { *mode = pCAS2C->CurFATDemod; } #endif done: /* Give Mutex. */ semErr = OS_GiveSemaphore( pCAS2C->Mutex ); if ( semErr != 0 ) retVal = -1; return retVal; } /**************************************************************************** CAS2C_GetErrCount Summary : Get signal strength from demodulator. Returns : 0 on success, others on failure. ************************************************************************^^*/ int CAS2C_GetErrCount( DS_U32 *pRSErrCnt ) { int retVal = 0; DS_U32 semErr; int err; DS_U8 ser; /* Take Mutex. */ semErr = OS_TakeSemaphore( pCAS2C->Mutex ); if ( semErr != 0 ) return -1; ser = Get1SecSer( &err ); if ( err != IIC_COM_SUCCESS ) { DHL_DbgPrintf(gdhlExtDbgLvl,DHLDBG_EXT,"ERROR: line = %d, err = %d\n", __LINE__, err ); retVal = -1; goto done; } *pRSErrCnt = ser; done: /* Give Mutex. */ semErr = OS_GiveSemaphore( pCAS2C->Mutex ); if ( semErr != 0 ) retVal = -1; return retVal; } /**************************************************************************** CAS2C_GetTDA9885Reg Summary : Returns : 0 on success, others on failure. ************************************************************************^^*/ int CAS2C_GetTDA9885Reg( DS_U8 *pStatus ) { #if(( NIMTN_TYPE==NIMTN_DTT7611)||(NIMTN_TYPE==NIMTN_DTT7612)) int retVal = 0; DS_U32 semErr; DS_U8 data; /* Take Mutex. */ semErr = OS_TakeSemaphore( pCAS2C->Mutex ); if ( semErr != 0 ) return -1; #if NIMTN_TYPE==NIMTN_DTT7611 if ( !TunerDTT7611BeforeSendBytes() ) { DHL_DbgPrintf(0,DHLDBG_EXT,"ERROR: line = %d\n", __LINE__); retVal = -1; goto done; } #endif OS_mDelay(1); /* 1 ms */ if ( DHL_SYS_I2cRead( I2C_NIM_TDA9885 | 0x01, FALSE, 0, &data, 1 ) ) { DHL_DbgPrintf(0,DHLDBG_EXT,"ERROR: line = %d\n", __LINE__); retVal = -1; goto done; } *pStatus = data; //*pStatus = (data<<2); #if NIMTN_TYPE==NIMTN_DTT7611 if ( !TunerDTT7611AfterSendBytes() ) { DHL_DbgPrintf(0,DHLDBG_EXT,"ERROR: line = %d\n", __LINE__); retVal = -1; goto done; } #endif done: /* Give Mutex. */ semErr = OS_GiveSemaphore( pCAS2C->Mutex ); if ( semErr != 0 ) retVal = -1; return retVal; #else return 1; #endif } int CAS2C_GetTdquAFTReg( DS_U8 *pStatus ) { int retVal = 0; DS_U32 semErr; DS_U8 data; /* Take Mutex. */ semErr = OS_TakeSemaphore( pCAS2C->Mutex ); if ( semErr != 0 ) return -1; if(FALSE == BeforeTunerSendBytes()) { DHL_DbgPrintf(0,DHLDBG_EXT,"ERROR: line = %d\n", __LINE__); retVal = -1; goto done; } if ( DHL_SYS_I2cRead( I2C_TDQU_READ_ADDR,FALSE, 0, &data, 1 ) ) { DHL_DbgPrintf(0,DHLDBG_EXT,"ERROR: line = %d\n", __LINE__); retVal = -1; } #if 0 if(data==0x7B) *pStatus =3; else if(data==0x78) *pStatus =0; else if(data==0x79) *pStatus =1; else if(data==0x7A) *pStatus =2; else if(data==0x7C) *pStatus =4; else *pStatus=5; #else *pStatus = (data & 0x7); #endif if(FALSE == AfterTunerSendBytes()) { DHL_DbgPrintf(0,DHLDBG_EXT,"ERROR: line = %d\n", __LINE__); retVal = -1; goto done; } done: /* Give Mutex. */ semErr = OS_GiveSemaphore( pCAS2C->Mutex ); if ( semErr != 0 ) retVal = -1; return retVal; } /**************************************************************************** CAS2C_WriteTDA9885Reg Summary : Returns : 0 on success, others on failure. ************************************************************************^^*/ int CAS2C_WriteTDA9885Reg( DS_U8 *pData, int Len ) { #if(( NIMTN_TYPE==NIMTN_DTT7611)||(NIMTN_TYPE==NIMTN_DTT7612)) int retVal = 0; DS_U32 semErr; /* Take Mutex. */ semErr = OS_TakeSemaphore( pCAS2C->Mutex ); if ( semErr != 0 ) return -1; #if NIMTN_TYPE==NIMTN_DTT7611 if ( !TunerDTT7611BeforeSendBytes() ) { DHL_DbgPrintf(0,DHLDBG_EXT,"ERROR: line = %d\n", __LINE__); retVal = -1; } #endif if( DHL_SYS_I2cWrite(I2C_NIM_TDA9885, TRUE, 0, pData, Len)) { DHL_DbgPrintf(gdhlExtDbgLvl,DHLDBG_EXT,"!! Error Tda9885_WriteReg(): Check if IF section is enabled or not. \n"); retVal = -1; } #if 0 if ( IicTransmit( TDA9885_ADDR, data, Len ) != IIC_COM_SUCCESS ) DHL_DbgPrintf(0,DHLDBG_EXT,"ERROR: line = %d\n", __LINE__); #endif #if NIMTN_TYPE==NIMTN_DTT7611 if ( !TunerDTT7611AfterSendBytes() ) { DHL_DbgPrintf(0,DHLDBG_EXT,"ERROR: line = %d\n", __LINE__); retVal = -1; } #endif //done: /* Give Mutex. */ semErr = OS_GiveSemaphore( pCAS2C->Mutex ); if ( semErr != 0 ) retVal = -1; return retVal; #else return 1; #endif } #if 0 int gettda() { DS_U8 data; CAS2C_GetTDA9885Reg( &data ); return data; } int writetda(int b, int c, int d) { DS_U8 tdaData[3]; tdaData[0] = b & 0xFF; tdaData[1] = c & 0xFF; tdaData[2] = d & 0xFF; return CAS2C_WriteTDA9885Reg( tdaData, 3 ); } #endif typedef struct tag_NTSCStatus { DS_U32 NtscCarrierOffset; DS_BOOL isStereo; DS_BOOL isSAP; DS_U32 AudioStandard; } NTSC_STATUS, *P_NTSC_STATUS; typedef struct tag_NTSCExtStatus { DS_BOOL isMaster; DS_U32 IISMode; DS_U32 IISOutRate; DS_U32 SCL_WS_Ratio; } NTSC_EXT_STATUS, *P_NTSC_EXT_STATUS; int CAS2C_GetNTSCStatus( NTSC_STATUS *pNTSCStat ) { long ntscCarrierOffset; DS_BOOLEAN isStereo; DS_BOOLEAN isSAP; TYPE_AUDIO_STANDARD audioStandard; int iError; int err = 0; ntscCarrierOffset = GetNtscCarrierOffset( CAS_2B_RECEIVER_MODE_AUDIO_US_BTSC, &iError ); if ( iError != CAS_2B_API_SUCCESS ) { DHL_DbgPrintf(gdhlExtDbgLvl,DHLDBG_EXT,"ERROR: Line=%d\n", __LINE__); err = -1; goto done; } isStereo = IsStereoDetected( &iError ); if ( iError != CAS_2B_API_SUCCESS ) { DHL_DbgPrintf(gdhlExtDbgLvl,DHLDBG_EXT,"ERROR: Line=%d\n", __LINE__); err = -1; goto done; } isSAP = IsBilingualSapDetected( &iError ); if ( iError != CAS_2B_API_SUCCESS ) { DHL_DbgPrintf(gdhlExtDbgLvl,DHLDBG_EXT,"ERROR: Line=%d\n", __LINE__); err = -1; goto done; } audioStandard = AUDIO_STANDARD_BTSC; audioStandard = GetAudioStandard( &iError ); #if 0 if ( iError != CAS_2B_API_SUCCESS || iError != RECEIVED_UNDEFINED_AUDIO_STANDARD ) { DHL_DbgPrintf(gdhlExtDbgLvl,DHLDBG_EXT,"ERROR: Line=%d\n", __LINE__); err = -1; goto done; } #endif if ( pNTSCStat ) { pNTSCStat->NtscCarrierOffset = ntscCarrierOffset; pNTSCStat->isStereo = isStereo; pNTSCStat->isSAP = isSAP; pNTSCStat->AudioStandard = audioStandard; } printf("\n\n\n *** NTSC Status ***\n"); printf(" NTSC Carrier Offset: %d\n", (int)ntscCarrierOffset); printf(" Audio Mode: %s - %s\n", isStereo ? "Stereo" : "Mono", isSAP ? "SAP" : "NO-SAP" ); printf(" Audio Standard: %s\n", audioStandard == AUDIO_STANDARD_BTSC ? "BTSC" : audioStandard == AUDIO_STANDARD_KOREA ? "A2-KOREA" : audioStandard == AUDIO_STANDARD_RADIO_FM ? "RADIO-FM" : "Unknown" ); done: return err; } // // Notes: Standard ÁöÁ¤Çϸé, ´ÙÀ½ Æ©´× ¶§¿¡ Àû¿ëµÊ. // int CAS2C_SetAudioStandard( DS_U32 AudioStandard) { int err = 0; switch( (FEAudioStandard_t)AudioStandard ) { case FE_AUDIO_BTSC: g_Ntsc_Mode = CAS_2B_RECEIVER_MODE_AUDIO_US_BTSC; break; case FE_DUALFM: g_Ntsc_Mode = CAS_2B_RECEIVER_MODE_AUDIO_A2_KOREA; break; default: g_Ntsc_Mode = CAS_2B_RECEIVER_MODE_AUDIO_A2_KOREA; } return err; } void set_ntsc_vol(int vol) { int iError = CAS_2B_API_SUCCESS; g_AudioParameters.usLeftOutputGain = vol; g_AudioParameters.usRightOutputGain = vol; iError = SendAudioMessage( 2, g_AudioParameters ); if ( iError != IIC_COM_SUCCESS ) { DHL_DbgPrintf(gdhlExtDbgLvl,DHLDBG_EXT,"ERROR: Line=%d\n", __LINE__); } } int CAS2C_SetAudioMode( DS_U32 AudioMode ) { int err = 0; int iError = CAS_2B_API_SUCCESS; switch( AudioMode ) { case 0: /* Mono */ g_AudioParameters.bAudioForcedMonoMode = TRUE; g_AudioParameters.iNRSwithch = AUDIO_NR_SWITCH_STEREO; g_AudioParameters.usLeftOutputGain = 65; g_AudioParameters.usRightOutputGain = 65; break; case 1: /* Stereo */ g_AudioParameters.bAudioForcedMonoMode = FALSE; g_AudioParameters.iNRSwithch = AUDIO_NR_SWITCH_STEREO; g_AudioParameters.usLeftOutputGain = 65; g_AudioParameters.usRightOutputGain = 65; break; case 2: case 3: /* SAP */ g_AudioParameters.bAudioForcedMonoMode = FALSE; g_AudioParameters.iNRSwithch = AUDIO_NR_SWITCH_SAP; g_AudioParameters.usLeftOutputGain = 50; g_AudioParameters.usRightOutputGain = 50; break; default: DHL_DbgPrintf(gdhlExtDbgLvl,DHLDBG_EXT,"ERROR: Invalid Audio Mode %d\n", (int)AudioMode ); } iError = SendAudioMessage( 1, g_AudioParameters ); if ( iError != IIC_COM_SUCCESS ) { DHL_DbgPrintf(gdhlExtDbgLvl,DHLDBG_EXT,"ERROR: Line=%d\n", __LINE__); err = -1; goto done; } iError = SendAudioMessage( 2, g_AudioParameters ); if ( iError != IIC_COM_SUCCESS ) { DHL_DbgPrintf(gdhlExtDbgLvl,DHLDBG_EXT,"ERROR: Line=%d\n", __LINE__); err = -1; goto done; } done: return err; } int CAS2C_GetAudioMode( DS_U32 *pAudioMode ) { int err = 0; DS_BOOLEAN isStereo, isSAP; int iError; isStereo = IsStereoDetected( &iError ); if ( iError != CAS_2B_API_SUCCESS ) { DHL_DbgPrintf(gdhlExtDbgLvl,DHLDBG_EXT,"ERROR: Line=%d\n", __LINE__); err = -1; goto done; } isSAP = IsBilingualSapDetected( &iError ); if ( iError != CAS_2B_API_SUCCESS ) { DHL_DbgPrintf(gdhlExtDbgLvl,DHLDBG_EXT,"ERROR: Line=%d\n", __LINE__); err = -1; goto done; } if ( isStereo ) { if ( isSAP ) *pAudioMode = (DS_U32)FE_AUDIO_SAP; /* Stereo and SAP */ else *pAudioMode = (DS_U32)FE_AUDIO_STEREO; /* Stereo and no SAP */ } else { if ( isSAP ) *pAudioMode = (DS_U32)FE_AUDIO_MONO_SAP; /* Mono and SAP */ else *pAudioMode = (DS_U32)FE_AUDIO_MONO; /* Mono and no SAP */ } done: return err; } int CAS2C_GetAudioStandard( DS_U32 *pAudioStandard ) { switch(g_Ntsc_Mode){ case CAS_2B_RECEIVER_MODE_AUDIO_US_BTSC: *pAudioStandard = FE_AUDIO_BTSC; break; case CAS_2B_RECEIVER_MODE_AUDIO_A2_KOREA: *pAudioStandard = FE_DUALFM; break; default: *pAudioStandard = FE_AUDIO_BTSC; } //*pAudioStandard = (DS_U32)g_Ntsc_Mode; return 0; } int CAS2C_GetNTSCExtStatus( NTSC_EXT_STATUS *pExt ) { int err = 0; TYPE_AUDIO_MASTER_SLAVE_MODE isMaster; TYPE_SCL_TO_WS_RATIO scl_ws_ratio; TYPE_IIS_OUT_RATE iisRate; TYPE_IIS_MODE iisMode; NUMERATOR_DENOMINATOR leftGain; NUMERATOR_DENOMINATOR rightGain; int iError = CAS_2B_API_SUCCESS; isMaster = GetMasterSlaveMode( &iError ); if ( iError != CAS_2B_API_SUCCESS ) { DHL_DbgPrintf(gdhlExtDbgLvl,DHLDBG_EXT,"ERROR: Line=%d\n", __LINE__); err = -1; goto done; } scl_ws_ratio = GetSclToWsRatio( &iError ); if ( iError != CAS_2B_API_SUCCESS ) { DHL_DbgPrintf(gdhlExtDbgLvl,DHLDBG_EXT,"ERROR: Line=%d\n", __LINE__); err = -1; goto done; } iisRate = GetIISOuputRate( &iError ); if ( iError != CAS_2B_API_SUCCESS ) { DHL_DbgPrintf(gdhlExtDbgLvl,DHLDBG_EXT,"ERROR: Line=%d\n", __LINE__); err = -1; goto done; } iisMode = GetIISMode( &iError ); if ( iError != CAS_2B_API_SUCCESS ) { DHL_DbgPrintf(gdhlExtDbgLvl,DHLDBG_EXT,"ERROR: Line=%d\n", __LINE__); err = -1; goto done; } leftGain = GetSoundLeftOutputGain( &iError ); if ( iError != CAS_2B_API_SUCCESS ) { DHL_DbgPrintf(gdhlExtDbgLvl,DHLDBG_EXT,"ERROR: Line=%d\n", __LINE__); err = -1; goto done; } rightGain = GetSoundRightOutputGain( &iError ); if ( iError != CAS_2B_API_SUCCESS ) { DHL_DbgPrintf(gdhlExtDbgLvl,DHLDBG_EXT,"ERROR: Line=%d\n", __LINE__); err = -1; goto done; } printf("\n\n\n *** NTSC Ext. Status ***\n"); printf(" I2S Master/Slave: %s\n", isMaster == TYPE_AUDIO_SLAVE_MODE ? "SLAVE" : isMaster == TYPE_AUDIO_MASTER_MODE ? "MASTER" : "Unknown" ); printf(" SCL/WS Ratio: %s\n", scl_ws_ratio == TYPE_SCL_TO_WS_RATIO_32 ? "32" : scl_ws_ratio == TYPE_SCL_TO_WS_RATIO_48 ? "48" : scl_ws_ratio == TYPE_SCL_TO_WS_RATIO_64 ? "64" : "Unknown" ); printf(" IIS Rate: %s\n", iisRate == TYPE_IIS_OUT_RATE_48 ? "48KHz" : iisRate == TYPE_IIS_OUT_RATE_96 ? "96KHz" : iisRate == TYPE_IIS_OUT_RATE_44_1 ? "44.1KHz" : iisRate == TYPE_IIS_OUT_RATE_88_2 ? "88.2KHz" : iisRate == TYPE_IIS_OUT_RATE_32 ? "32KHz" : "Unknown" ); printf(" I2S Mode: %s\n", iisMode == TYPE_IIS_MODE_IIS ? "I2S" : iisMode == TYPE_IIS_MODE_LJ ? "Left-justified" : iisMode == TYPE_IIS_MODE_RJ ? "Right-justified" : "Unknown" ); printf(" Left Audio Gain: %d\n", (int)leftGain.Numerator.lNumerator ); printf(" Right Audio Gain: %d\n", (int)rightGain.Numerator.lNumerator ); done: return err; } //int __stdcall SendAudioMessage(unsigned char ucReceiveRegisterNumber, CAS_2B_AUDIO_MESSAGE_PARAMETERS stAudiomessageParameters) //void __stdcall InitAudioMessageStructToDefault(CAS_2B_AUDIO_MESSAGE_PARAMETERS* pstAudiomessageParameters) /**************************************************************************** CAS2C_InitTDA9885Reg Summary : Returns : 0 on success, others on failure. ************************************************************************^^*/ int CAS2C_InitTDA9885(void) { #if(( NIMTN_TYPE==NIMTN_DTT7611)||(NIMTN_TYPE==NIMTN_DTT7612)) int retVal = 0; DS_U32 semErr; DS_U8 data[3] = { 0xD4, 0x30, 0x04 }; /* Take Mutex. */ semErr = OS_TakeSemaphore( pCAS2C->Mutex ); if ( semErr != 0 ) return -1; #if (NIMTN_TYPE==NIMTN_DTT7611) if ( !TunerDTT7611BeforeSendBytes() ) DHL_DbgPrintf(0,DHLDBG_EXT,"ERROR: line = %d\n", __LINE__); #endif if( DHL_SYS_I2cWrite(I2C_NIM_TDA9885, TRUE, 0, &data[0], 3)) { DHL_DbgPrintf(gdhlExtDbgLvl,DHLDBG_EXT,"ERROR: Tda9885_WriteReg(): Check if IF section is enabled or not. %d\n",__LINE__); retVal = -1; } #if NIMTN_TYPE==NIMTN_DTT7611 if ( !TunerDTT7611AfterSendBytes() ) { DHL_DbgPrintf(0,DHLDBG_EXT,"ERROR: line = %d\n", __LINE__); retVal = -1; } #endif //done: /* Give Mutex. */ semErr = OS_GiveSemaphore( pCAS2C->Mutex ); if ( semErr != 0 ) retVal = -1; return retVal; #else return 1; #endif } DS_U16 GetHwVer(void) { DS_U8 data; int err; data = GetHardwareVersion( &err ); if ( data == 0 ) { if ( err == SEND_HOST_CONTROL_FUNCTION_FAILED ) { DHL_DbgPrintf(gdhlExtDbgLvl,DHLDBG_EXT,"ERROR: host control function failed.\n"); return 0; } } return data; } DS_U32 GetCodeVer(void) { CAS_2B_CODE_VERSION ver; DS_U32 version; int err; ver.usaVector[0]=0; ver.usaVector[1]=0; ver.usaVector[2]=0; ver.usaVector[3]=0; ver.usaVector[4]=0; ver.usaVector[5]=0; ver = GetDSPFirmwareVersion( &err ); if ( err != IIC_COM_SUCCESS ) { DHL_DbgPrintf(gdhlExtDbgLvl,DHLDBG_EXT,"ERROR: i2c communication.\n"); return (DS_U32)-1; } DHL_DbgPrintf(gdhlExtDbgLvl,DHLDBG_EXT,"Version = 0x%x / 0x%x / 0x%x / 0x%x / 0x%x / 0x%x\n", (unsigned int)ver.usaVector[0], (unsigned int)ver.usaVector[1], (unsigned int)ver.usaVector[2], (unsigned int)ver.usaVector[3], (unsigned int)ver.usaVector[4], (unsigned int)ver.usaVector[5] ); version = ver.usaVector[0] << 16; version |= ver.usaVector[1]; // version |= ver.usaVector[2] << 8; // version |= ver.usaVector[3]; return version; } unsigned char CAS2C_GetMode() { int err; int semErr; unsigned char retVal; unsigned short reg; /* Take Mutex. */ semErr = OS_TakeSemaphore( pCAS2C->Mutex ); if ( semErr != 0 ) return -1; retVal = GetMode(&err); DHL_DbgPrintf(gdhlExtDbgLvl,DHLDBG_EXT,"Mode = 0x%x\n", (unsigned int)retVal ); reg = GetStatusReg(&err); DHL_DbgPrintf(gdhlExtDbgLvl,DHLDBG_EXT,"Reg = 0x%x\n", (unsigned int)reg ); reg = GetChecksum(&err); DHL_DbgPrintf(gdhlExtDbgLvl,DHLDBG_EXT,"Checksum = 0x%x\n", (unsigned int)reg ); /* Give Mutex. */ semErr = OS_GiveSemaphore( pCAS2C->Mutex ); if ( semErr != 0 ) retVal = -1; return retVal; } DS_U8 CAS2C_GetTunerStatus(void) { return 0x40; } void get_ifagc() { NUMERATOR_DENOMINATOR stResult; int piError; piError = 0; stResult = GetAgcIfCommand( &piError ); if ( piError != 0 ) { DHL_DbgPrintf(gdhlExtDbgLvl,DHLDBG_EXT,"ERROR: piError = %d\n", (unsigned int)piError ); return; } printf("IF AGC = %d, %f\n", (int)stResult.Numerator.lNumerator, (float)stResult.Denominator.lDenominator ); } void get_ifagc2() { NUMERATOR_DENOMINATOR stResult; int piError; piError = 0; stResult = GetAGCSensor( &piError ); if ( piError != 0 ) { DHL_DbgPrintf(gdhlExtDbgLvl,DHLDBG_EXT,"ERROR: piError = %d\n", (unsigned int)piError ); return; } printf("IF AGC Sensor = %d\n", (int)stResult.Numerator.lNumerator ); } void dump_ntsc_status(void) { static NTSC_STATUS nt; static NTSC_EXT_STATUS ent; CAS2C_GetNTSCStatus ( &nt ); CAS2C_GetNTSCExtStatus ( &ent ); } #if 0 typedef union{ struct{ unsigned AFCWIN :1; unsigned VIFL :1; unsigned FMIFL :1; signed AFC :4; // AFC4, AFC3, AFC2, AFC1 unsigned PONR :1; } Part; // ±¸Á¶Ã¼ ¸É¹ö Á¢±Ù DS_U8 Byte; // ¹ÙÀÌÆ® Á¢±Ù }UTda9885ReadReg; static int bStart = 1; void tAutoFreqTune(void) { UTda9885ReadReg tdadata; int afc_status; DS_U32 frequency; DS_U8 isNtsc; int bLoop = 1; while ( bLoop ) { /* Delay 500 msec */ OS_Delay(30); if ( bStart == 0 ) continue; isNtsc = pCAS2C->isNtsc; frequency = pCAS2C->FATFreq; if ( CAS2C_GetTDA9885Reg( &tdadata.Byte ) == 0 ) { afc_status = tdadata.Part.AFC; switch (afc_status) { // TUV1236D - AFC Status ÂüÁ¶ // case 7 : frequency += 188; break; case 6 : frequency += 162; break; case 5 : frequency += 137; break; case 4 : frequency += 112; break; case 3 : frequency += 87; break; case 2 : frequency += 62; break; case 1 : case 0 : case -1 : case -2 : break; case -3 : frequency -= 62; break; case -4 : frequency -= 87; break; case -5 : frequency -= 112; break; case -6 : frequency -= 137; break; case -7 : frequency -= 162; break; case -8 : frequency -= 188; break; } } if ( pCAS2C->FATFreq != frequency ) { DHL_DbgPrintf(gdhlExtDbgLvl,DHLDBG_EXT,"new frequency = %d (old=%d)\n", frequency, pCAS2C->FATFreq ); CAS2C_SetFrequencyNTSC( frequency ); } } } void go_aft(void) { OS_TASK_ID taskId; taskId = OS_SpawnTask( tAutoFreqTune, "tAFT", 120, 4096, 0 ); bStart = 1; DHL_DbgPrintf(gdhlExtDbgLvl,DHLDBG_EXT,"Creation of tAFT, id=0x%x\n", taskId ); } void stop_aft(void) { bStart = 0; } #endif