/* * $Id: TdquTuner.c,v 1.1 2011/07/08 03:43:59 megakiss Exp $ * $Revision: 1.1 $ * $DateTime: 2005/08/24 19:03:17 $ * $Change: 28028 $ * $Author: megakiss $ */ #include "TdquTuner.h" #include "Cas2BRoutines.h" #include "IicComm.h" #include #define TDQU_DBG #if NIMTN_TYPE==NIMTN_TDQU #define F_IF 44000 //in KHz #define N_MAX 32768 //15 bits #define BitAtPosition(pos) ((unsigned char)1 << (pos)) #define GetBitMacro(bitfield, index) ((bitfield) & BitAtPosition(index)) #define SetBitMacro(bitfield, index) ((bitfield) |= BitAtPosition(index)) #define RemoveBitMacro(bitfield, index) ((bitfield) &= ~BitAtPosition(index)) int TunerTdquSendCenterFrequency(unsigned long ulFrequency,TYPE_TUNER_TDQU_REF_DIVIDER_RATIO iReferenceDividerRatio,TYPE_TUNER_TDQU_CHARGE_PUMP iChargePump,TYPE_TUNER_TDQU_AGST iAgst) { unsigned char ucaDataBytes[5]; unsigned long ulMult,ulN; ucaDataBytes[0] = 0x20;//0x00; ucaDataBytes[1] = 0x50;//0x00; ucaDataBytes[2] = 0x8B;//0x80; ucaDataBytes[3] = 0xAA;//0x20; /* byte5 bit5, 4 = 1, 0 */ ucaDataBytes[4] = 0xC6;//0xE6; /* byte6 IFBW2, IFBW1 = 1,0 XLO1,XLO0 = 1, 1 */ switch(iReferenceDividerRatio){ case TUNER_TDQU_REF_DIVIDER_RATIO_166_666: ulMult = 24; RemoveBitMacro(ucaDataBytes[2],0); RemoveBitMacro(ucaDataBytes[2],1); RemoveBitMacro(ucaDataBytes[2],2); break; case TUNER_TDQU_REF_DIVIDER_RATIO_142_857: ulMult = 28; SetBitMacro(ucaDataBytes[2],0); RemoveBitMacro(ucaDataBytes[2],1); RemoveBitMacro(ucaDataBytes[2],2); break; case TUNER_TDQU_REF_DIVIDER_RATIO_80: ulMult = 50; RemoveBitMacro(ucaDataBytes[2],0); SetBitMacro(ucaDataBytes[2],1); RemoveBitMacro(ucaDataBytes[2],2); break; case TUNER_TDQU_REF_DIVIDER_RATIO_62_5: ulMult = 64; SetBitMacro(ucaDataBytes[2],0); SetBitMacro(ucaDataBytes[2],1); RemoveBitMacro(ucaDataBytes[2],2); break; case TUNER_TDQU_REF_DIVIDER_RATIO_31_25: ulMult = 128; RemoveBitMacro(ucaDataBytes[2],0); RemoveBitMacro(ucaDataBytes[2],1); SetBitMacro(ucaDataBytes[2],2); break; default: return TDQU_UNDEFINED_REFERENCE_DIVIDER_RATIO; } switch(iAgst) { case TUNER_TDQU_AGST_RF_AGC_DISABLE : RemoveBitMacro(ucaDataBytes[2],3); RemoveBitMacro(ucaDataBytes[2],4); RemoveBitMacro(ucaDataBytes[2],5); break; case TUNER_TDQU_AGST_MINUS_6: SetBitMacro(ucaDataBytes[2],3); RemoveBitMacro(ucaDataBytes[2],4); RemoveBitMacro(ucaDataBytes[2],5); break; case TUNER_TDQU_AGST_MINUS_4: RemoveBitMacro(ucaDataBytes[2],3); SetBitMacro(ucaDataBytes[2],4); RemoveBitMacro(ucaDataBytes[2],5); break; case TUNER_TDQU_AGST_MINUS_2: SetBitMacro(ucaDataBytes[2],3); SetBitMacro(ucaDataBytes[2],4); RemoveBitMacro(ucaDataBytes[2],5); break; case TUNER_TDQU_AGST_0: RemoveBitMacro(ucaDataBytes[2],3); RemoveBitMacro(ucaDataBytes[2],4); SetBitMacro(ucaDataBytes[2],5); break; case TUNER_TDQU_AGST_2: SetBitMacro(ucaDataBytes[2],3); RemoveBitMacro(ucaDataBytes[2],4); SetBitMacro(ucaDataBytes[2],5); break; case TUNER_TDQU_AGST_4: RemoveBitMacro(ucaDataBytes[2],3); SetBitMacro(ucaDataBytes[2],4); SetBitMacro(ucaDataBytes[2],5); break; case TUNER_TDQU_AGST_6: SetBitMacro(ucaDataBytes[2],3); SetBitMacro(ucaDataBytes[2],4); SetBitMacro(ucaDataBytes[2],5); break; } if(iAgst > TUNER_TDQU_AGST_6) return TDQU_UNDEFINED_AGST; // calculate N ulN = ((ulFrequency + 44000/*F_IF*/) * ulMult) / 4000; #if 0 /* This doesn't make sense */ if(ulN > 32768/*15 bits*/){ //max n in 14 bits ulN = (ulN/2 * 10 + 5)/10; } #endif if (ulN >= 32768) //15 bits return TDQU_N_CALCULATION_FAILED; ucaDataBytes[0] = (unsigned char)((ulN & 0x07f00) >> 8); ucaDataBytes[1] = (unsigned char)(ulN & 0xff); //ucaDataBytes[2] |= (unsigned char)iReferenceDividerRatio; /* R2, R1, R0 */ //ucaDataBytes[2] |= (unsigned char)(iAgst << 3); if(ulFrequency >= 54000 && ulFrequency < 82000) ucaDataBytes[3] = 0x60; else if(ulFrequency >= 82000 && ulFrequency < 88000) ucaDataBytes[3] = 0x61; else if(ulFrequency >= 88000 && ulFrequency < 162000) ucaDataBytes[3] = 0x60; else if(ulFrequency >= 162000 && ulFrequency < 426000) ucaDataBytes[3] = 0x62; else if(ulFrequency >= 426000 && ulFrequency < 782000) ucaDataBytes[3] = 0xAA;//0xAB; else if(ulFrequency >= 782000 && ulFrequency < 864000) ucaDataBytes[3] = 0x2A;//0xEB; else//like low band ucaDataBytes[3] = 0x60; #if 0 /* Charge pump is now implied by frequency band */ if(iChargePump > TUNER_TDQU_CHARGE_PUMP_1_2_MA) return TDQU_UNDEFINED_CHURGE_PUMP; switch(iChargePump) { case TUNER_TDQU_CHARGE_PUMP_70: /* CP1=x CP0=x CP2=1 */ ucaDataBytes[4] |= 0x8 ; break; case TUNER_TDQU_CHARGE_PUMP_150: /* CP1=0 CP0=1 CP2=0 */ ucaDataBytes[3] |= 0x40 ; break; case TUNER_TDQU_CHARGE_PUMP_300: /* CP1=1 CP0=0 CP2=0 */ ucaDataBytes[3] |= 0x80 ; break; case TUNER_TDQU_CHARGE_PUMP_700: /* CP1=1 CP0=1 CP2=0 */ ucaDataBytes[3] |= 0xC0 ; break; case TUNER_TDQU_CHARGE_PUMP_1_2_MA: /* CP1=0 CP0=0 CP2=0 */ break; default: return TDQU_UNDEFINED_CHURGE_PUMP; } #endif if(FALSE == BeforeTunerSendBytes()) return TDQU_SEND_CONTROL_DATA_FAILED; if(0!=DHL_SYS_I2cWrite(I2C_TDQU_WRITE_ADDR, FALSE, 0, ucaDataBytes, 5)){ //if (0 != IicTransmit(TLSys_TunerDeviceAddress(I2CWRITE), ucaDataBytes, 5)) { return TDQU_SEND_CONTROL_DATA_FAILED; } if(FALSE == AfterTunerSendBytes()) return TDQU_SEND_CONTROL_DATA_FAILED; return TDQU_SUCCESS; } int TunerTdquSendPicCarrier(unsigned long ulFrequency,TYPE_TUNER_TDQU_REF_DIVIDER_RATIO iReferenceDividerRatio,TYPE_TUNER_TDQU_CHARGE_PUMP iChargePump,TYPE_TUNER_TDQU_AGST iAgst) { #ifdef TDQU_DBG printf("Tdqu send pic carrier\n"); #endif return TunerTdquSendCenterFrequency(ulFrequency + 1750,iReferenceDividerRatio,iChargePump,iAgst); } int TunerTdquSendChannel(unsigned int uiChannel,CHANNEL_TABLE_TYPE iChannelTable,TYPE_TUNER_TDQU_REF_DIVIDER_RATIO iReferenceDividerRatio,TYPE_TUNER_TDQU_CHARGE_PUMP iChargePump,TYPE_TUNER_TDQU_AGST iAgst) { unsigned long ulFrequency = TunerTdquGetFrequency(uiChannel,iChannelTable); #ifdef TDQU_DBG printf("Tdqu send Channel\n"); #endif if(0 == ulFrequency) return TDQU_CHANNEL_DOES_NOT_FIT_ANY_FREQUENCY; return TunerTdquSendCenterFrequency(ulFrequency ,iReferenceDividerRatio,iChargePump,iAgst); } unsigned long TunerTdquGetFrequency(unsigned int uiChannelNumber,CHANNEL_TABLE_TYPE iChannelTable) { unsigned long ulFrequency = 0; if(0 == iChannelTable){//terrestrial if ((uiChannelNumber >= 2) && (uiChannelNumber <= 6)) { switch (uiChannelNumber) { case 2: ulFrequency = 57; break; case 3: ulFrequency = 63; break; case 4: ulFrequency = 69; break; case 5: ulFrequency = 79; break; case 6: ulFrequency = 85; break; } } else if ((uiChannelNumber >= 7) && (uiChannelNumber <= 13)) { ulFrequency = 174 + ((uiChannelNumber - 7) * 6) + 3; } else if ((uiChannelNumber >= 14) && (uiChannelNumber <= 69)) { ulFrequency = 470 + ((uiChannelNumber - 14) * 6) + 3; } return ulFrequency * 1000; } else if(1 == iChannelTable){//CATV if ((uiChannelNumber >= 1) && (uiChannelNumber <= 6)) { switch (uiChannelNumber) { case 1: ulFrequency = 75; break; case 2: ulFrequency = 57; break; case 3: ulFrequency = 63; break; case 4: ulFrequency = 69; break; case 5: ulFrequency = 79; break; case 6: ulFrequency = 85; break; } } else if ((uiChannelNumber >= 95) && (uiChannelNumber <= 99)) { ulFrequency = 90 + ((uiChannelNumber - 95) * 6) + 3; } else if ((uiChannelNumber >= 7) && (uiChannelNumber <= 13)) { ulFrequency = 174 + ((uiChannelNumber - 7) * 6) + 3; } else if ((uiChannelNumber >= 14) && (uiChannelNumber <= 22)) { ulFrequency = 120 + ((uiChannelNumber - 14) * 6) + 3; } else if ((uiChannelNumber >= 23) && (uiChannelNumber <= 94)) { ulFrequency = 216 + ((uiChannelNumber - 23) * 6) + 3; } else if ((uiChannelNumber >= 100) && (uiChannelNumber <= 135)) { ulFrequency = 648 + ((uiChannelNumber - 100) * 6) + 3; } return ulFrequency * 1000; } else if(2 == iChannelTable){//IRC if ((uiChannelNumber >= 1) && (uiChannelNumber <= 6)) { switch (uiChannelNumber) { case 1: ulFrequency = 75; break; case 2: ulFrequency = 57; break; case 3: ulFrequency = 63; break; case 4: ulFrequency = 69; break; case 5: ulFrequency = 81; break; case 6: ulFrequency = 87; break; } } else if ((uiChannelNumber >= 95) && (uiChannelNumber <= 99)) { ulFrequency = 90 + ((uiChannelNumber - 95) * 6) + 3; } else if ((uiChannelNumber >= 7) && (uiChannelNumber <= 13)) { ulFrequency = 174+ ((uiChannelNumber - 7) * 6) + 3; } else if ((uiChannelNumber >= 14) && (uiChannelNumber <= 22)) { ulFrequency = 120 + ((uiChannelNumber - 14) * 6) + 3; } else if ((uiChannelNumber >= 23) && (uiChannelNumber <= 94)) { ulFrequency = 216 + ((uiChannelNumber - 23) * 6) + 3; } else if ((uiChannelNumber >= 100) && (uiChannelNumber <= 135)) { ulFrequency = 648 + ((uiChannelNumber - 100) * 6) + 3; } return ulFrequency * 1000; } else if(3 == iChannelTable){//HRC if ((uiChannelNumber >= 1) && (uiChannelNumber <= 6)) { switch (uiChannelNumber) { case 1: ulFrequency = 75000; break; case 2: ulFrequency = 55753; break; case 3: ulFrequency = 61753; break; case 4: ulFrequency = 66753; break; case 5: ulFrequency = 79754; break; case 6: ulFrequency = 85754; break; } } else if ((uiChannelNumber >= 95) && (uiChannelNumber <= 99)) { ulFrequency = (917545 + ((uiChannelNumber - 95) * 60003))/10; } else if ((uiChannelNumber >= 7) && (uiChannelNumber <= 13)) { ulFrequency = (1757587 + ((uiChannelNumber - 7) * 60003))/10; } else if ((uiChannelNumber >= 14) && (uiChannelNumber <= 22)) { ulFrequency = (1217560 + ((uiChannelNumber - 14) * 60003))/10; } else if ((uiChannelNumber >= 23) && (uiChannelNumber <= 94)) { ulFrequency = (2177608 + ((uiChannelNumber - 23) * 60003))/10; } else if ((uiChannelNumber >= 100) && (uiChannelNumber <= 135)) { ulFrequency = (6497824 + ((uiChannelNumber - 100) * 60003))/10; } return ulFrequency ; } else return 0; } int TunerTdquPrintLockStatus() { unsigned char ucaDataBytes; if(FALSE == BeforeTunerSendBytes()) return TDQU_SEND_CONTROL_DATA_FAILED; if(0!=DHL_SYS_I2cRead(I2C_TDQU_READ_ADDR, FALSE, 0, &ucaDataBytes, 5)){ //if (0 != IicTransmit(TLSys_TunerDeviceAddress(I2CWRITE), ucaDataBytes, 5)) { return TDQU_SEND_CONTROL_DATA_FAILED; } if(FALSE == AfterTunerSendBytes()) return TDQU_SEND_CONTROL_DATA_FAILED; if(GetBitMacro(ucaDataBytes,6)) printf("Tuner TDQU PLL locked!\n"); else printf("Tuner TDQU PLL NOT locked!\n"); return TDQU_SUCCESS; } #endif//#if NIMTN_TYPE==NIMTN_TDQU