#include "TD6650TTuner.h" #include "IicComm.h" #if NIMTN_TYPE==NIMTN_TD6650T int TD6650TSendFreq(unsigned long ulFrequency,CHANNEL_TABLE_TYPE iChannelTable,TYPE_TD6650T_REF_DIVIDER_RATIO iReferenceDividerRatio,TYPE_TD6650T_AGC_TOP iAGCTakeOverPoint, TYPE_TD6650T_ATC iAtc) { unsigned char Db1=0; unsigned char Db2=0; unsigned char Cb1b=0xc0; unsigned char Cb1a=0x80; unsigned char Cb2=0; if(FALSE == TD6650TSetN(ulFrequency,iReferenceDividerRatio,&Db1,&Db2)) return TD6650T_FREQUENCY_VALUE_OUT_OF_RANGE; TD6650TSetCB2(ulFrequency,&Cb2) ; TD6650TSetStepSize(iReferenceDividerRatio,&Cb1b) ; TD6650TSetAGCTop(iAGCTakeOverPoint,&Cb1a) ; TD6650TSetATC( iAtc,&Cb1a ); return TD6650TSendControlData(Db1,Db2,Cb1b,Cb2,Cb1a); } int TD6650TSendPicCarrier(unsigned long ulFrequency,CHANNEL_TABLE_TYPE iChannelTable,TYPE_TD6650T_REF_DIVIDER_RATIO iReferenceDividerRatio,TYPE_TD6650T_AGC_TOP iAGCTakeOverPoint, TYPE_TD6650T_ATC iAtc) { return TD6650TSendFreq(ulFrequency + 1750,iChannelTable,iReferenceDividerRatio,iAGCTakeOverPoint,iAtc); } int TD6650TSendChannel(unsigned int uiChannel,CHANNEL_TABLE_TYPE iChannelTable,TYPE_TD6650T_REF_DIVIDER_RATIO iReferenceDividerRatio,TYPE_TD6650T_AGC_TOP iAGCTakeOverPoint, TYPE_TD6650T_ATC iAtc) { unsigned long ulFrequency = TunerTD6650TGetFrequency(uiChannel,iChannelTable); if(0 == ulFrequency) return TD6650T_CHANNEL_DOES_NOT_FIT_ANY_FREQUENCY; return TD6650TSendFreq(ulFrequency,iChannelTable,iReferenceDividerRatio,iAGCTakeOverPoint,iAtc); } unsigned int TD6650TSendControlData(unsigned char Db1,unsigned char Db2,unsigned char Cb1b,unsigned char Cb2,unsigned char Cb1a) { unsigned char str[10]; //open 2nd IIC channel if( !TD6650TBeforeSendBytes()) return TD6650T_BEFORE_SEND_BYTES_FAILED; str[0] = Db1; str[1] = Db2; str[2] = Cb1b; str[3] = Cb2; str[4] = Cb1a; if (IicTransmit(TLSys_TunerDeviceAddress(I2CWRITE), str, 5)) { return TD6650T_SEND_CONTROL_DATA_FAILED; } //close 2nd IIC channel if( !TD6650TAfterSendBytes()) return TD6650T_AFTER_SEND_BYTES_FAILED; else return TD6650T_SUCCESS; } unsigned long TunerTD6650TGetFrequency(unsigned int uiChannelNumber,CHANNEL_TABLE_TYPE iChannelTable) { unsigned long ulCenterFrequency = 0; if(NA_TERRESTRIAL == iChannelTable){//terrestrial if ((uiChannelNumber >= 2) && (uiChannelNumber <= 6)) { switch (uiChannelNumber) { case 2: ulCenterFrequency = 57; break; case 3: ulCenterFrequency = 63; break; case 4: ulCenterFrequency = 69; break; case 5: ulCenterFrequency = 79; break; case 6: ulCenterFrequency = 85; break; } } else if ((uiChannelNumber >= 7) && (uiChannelNumber <= 13)) { ulCenterFrequency = 174 + ((uiChannelNumber - 7) * 6) + 3; } else if ((uiChannelNumber >= 14) && (uiChannelNumber <= 69)) { ulCenterFrequency = 470 + ((uiChannelNumber - 14) * 6) + 3; } else{ return 0; } return ulCenterFrequency*1000; } else if(NA_CATV == iChannelTable){//CATV if ((uiChannelNumber >= 1) && (uiChannelNumber <= 6)) { switch (uiChannelNumber) { case 1: ulCenterFrequency = 75; break; case 2: ulCenterFrequency = 57; break; case 3: ulCenterFrequency = 63; break; case 4: ulCenterFrequency = 69; break; case 5: ulCenterFrequency = 79; break; case 6: ulCenterFrequency = 85; break; } } else if ((uiChannelNumber >= 95) && (uiChannelNumber <= 99)) { ulCenterFrequency = 90 + ((uiChannelNumber - 95) * 6) + 3; } else if ((uiChannelNumber >= 7) && (uiChannelNumber <= 13)) { ulCenterFrequency = 174 + ((uiChannelNumber - 7) * 6) + 3; } else if ((uiChannelNumber >= 14) && (uiChannelNumber <= 22)) { ulCenterFrequency = 120 + ((uiChannelNumber - 14) * 6) + 3; } else if ((uiChannelNumber >= 23) && (uiChannelNumber <= 94)) { ulCenterFrequency = 216 + ((uiChannelNumber - 23) * 6) + 3; } else if ((uiChannelNumber >= 100) && (uiChannelNumber <= 135)) { ulCenterFrequency = 648 + ((uiChannelNumber - 100) * 6) + 3; } else{ return 0; } return ulCenterFrequency*1000; } else if(IRC == iChannelTable){//IRC if ((uiChannelNumber >= 1) && (uiChannelNumber <= 6)) { switch (uiChannelNumber) { case 1: ulCenterFrequency = 75; break; case 2: ulCenterFrequency = 57; break; case 3: ulCenterFrequency = 63; break; case 4: ulCenterFrequency = 69; break; case 5: ulCenterFrequency = 81; break; case 6: ulCenterFrequency = 87; break; } } else if ((uiChannelNumber >= 95) && (uiChannelNumber <= 99)) { ulCenterFrequency = 90 + ((uiChannelNumber - 95) * 6) + 3; } else if ((uiChannelNumber >= 7) && (uiChannelNumber <= 13)) { ulCenterFrequency = 174 + ((uiChannelNumber - 7) * 6) + 3; } else if ((uiChannelNumber >= 14) && (uiChannelNumber <= 22)) { ulCenterFrequency = 120 + ((uiChannelNumber - 14) * 6) + 3; } else if ((uiChannelNumber >= 23) && (uiChannelNumber <= 94)) { ulCenterFrequency = 216 + ((uiChannelNumber - 23) * 6) + 3; } else if ((uiChannelNumber >= 100) && (uiChannelNumber <= 135)) { ulCenterFrequency = 648 + ((uiChannelNumber - 100) * 6) + 3; } else{ return 0; } return ulCenterFrequency * 1000; } else if(HRC == iChannelTable){//HRC if ((uiChannelNumber >= 1) && (uiChannelNumber <= 6)) { switch (uiChannelNumber) { case 1: ulCenterFrequency = 75000; break; case 2: ulCenterFrequency = 55753; break; case 3: ulCenterFrequency = 61753; break; case 4: ulCenterFrequency = 66753; break; case 5: ulCenterFrequency = 79754; break; case 6: ulCenterFrequency = 85754; break; } } else if ((uiChannelNumber >= 95) && (uiChannelNumber <= 99)) { ulCenterFrequency = (917545 + ((uiChannelNumber - 95) * 60003))/10; } else if ((uiChannelNumber >= 7) && (uiChannelNumber <= 13)) { ulCenterFrequency = (1757587 + ((uiChannelNumber - 7) * 60003))/10; } else if ((uiChannelNumber >= 14) && (uiChannelNumber <= 22)) { ulCenterFrequency = (1217560 + ((uiChannelNumber - 14) * 60003))/10; } else if ((uiChannelNumber >= 23) && (uiChannelNumber <= 94)) { ulCenterFrequency = (2177608 + ((uiChannelNumber - 23) * 60003))/10; } else if ((uiChannelNumber >= 100) && (uiChannelNumber <= 135)) { ulCenterFrequency = (6497824 + ((uiChannelNumber - 100) * 60003))/10; } else{ return 0; } return ulCenterFrequency; } else return 0; } void TD6650TSetStepSize(TYPE_TD6650T_REF_DIVIDER_RATIO iReferenceDividerRatio,unsigned char* pucCb1b) { if (TD6650T_REF_DIVIDER_RATIO_62_5 == iReferenceDividerRatio) { *pucCb1b |= 0; } else if (TD6650T_REF_DIVIDER_RATIO_142_86 == iReferenceDividerRatio) { *pucCb1b |= 1; } else if (TD6650T_REF_DIVIDER_RATIO_166_67 == iReferenceDividerRatio) { *pucCb1b |= 2; } else if (TD6650T_REF_DIVIDER_RATIO_50 == iReferenceDividerRatio) { *pucCb1b |= 3; } else if (TD6650T_REF_DIVIDER_RATIO_125 == iReferenceDividerRatio) { *pucCb1b |= 4; } } void TD6650TSetAGCTop(TYPE_TD6650T_AGC_TOP iAGCTakeOverPoint,unsigned char* pucCb1a) { if (TD6650T_AGC_TOP_124 == iAGCTakeOverPoint) { *pucCb1a |= 0; } else if (TD6650T_AGC_TOP_121 == iAGCTakeOverPoint) { *pucCb1a |= 1; } else if (TD6650T_AGC_TOP_118 == iAGCTakeOverPoint) { *pucCb1a |= 2; } else if (TD6650T_AGC_TOP_115 == iAGCTakeOverPoint) { *pucCb1a |= 3; } else if (TD6650T_AGC_TOP_112 == iAGCTakeOverPoint) { *pucCb1a |= 4; } else if (TD6650T_AGC_TOP_109 == iAGCTakeOverPoint) { *pucCb1a |= 5; } } void TD6650TSetATC(TYPE_TD6650T_ATC iAtc,unsigned char* pucCb1a ) { if (TD6650T_ATC_2_SEC == iAtc) { *pucCb1a &= 0xf7; } else if (TD6650T_ATC_50_MSEC == iAtc) { *pucCb1a |= 0x8; } } BOOLEAN TD6650TSetN(unsigned long ulFrequency,TYPE_TD6650T_REF_DIVIDER_RATIO iReferenceDividerRatio, unsigned char* pucDb1,unsigned char* pucDb2) { unsigned short usNval,usMultiplier; switch(iReferenceDividerRatio){ case TD6650T_REF_DIVIDER_RATIO_62_5: usMultiplier = 64; break; case TD6650T_REF_DIVIDER_RATIO_142_86: usMultiplier = 28; break; case TD6650T_REF_DIVIDER_RATIO_166_67: usMultiplier = 24; break; case TD6650T_REF_DIVIDER_RATIO_50: usMultiplier = 80; break; case TD6650T_REF_DIVIDER_RATIO_125: usMultiplier = 32; break; } // calc N usNval = (unsigned short)(((ulFrequency + TD6650T_F_IF)*usMultiplier)/4000); if(usNval > TD6650T_N_MAX){ //max n in 14 bits usNval = usNval/2 ; } if (usNval == 0 || usNval >= TD6650T_N_MAX) { //15 bits return FALSE; } // clear N bits *pucDb1 = 0x00; *pucDb2 = 0x00; *pucDb2 = usNval & 0x00ff; *pucDb1 = (usNval & 0x07f00) >> 8; return TRUE; } void TD6650TSetCB2(unsigned long ulFrequency,unsigned char* pucCb2) { //Set CB2 Automatically according to the frequency //low *pucCb2 = 0; if(ulFrequency > 57000 && ulFrequency <= 120000){ *pucCb2 = 0x41; } if(ulFrequency > 120000 && ulFrequency <= 150000){ *pucCb2 = 0x61; } if(ulFrequency > 150000 && ulFrequency <= 174000){ *pucCb2 = 0x81; } //Mid if(ulFrequency > 174000 && ulFrequency <= 350000){ *pucCb2 = 0x62; } if(ulFrequency > 350000 && ulFrequency <= 470000){ *pucCb2 = 0x82; } //high if(ulFrequency > 470000 && ulFrequency <= 650000){ *pucCb2 = 0xa8; } if(ulFrequency > 650000 && ulFrequency <= 8644000){ *pucCb2 = 0xc8; } } BOOLEAN TD6650TBeforeSendBytes() { if(IIC_COM_SUCCESS != SendHostControl(0, 0)) return FALSE; else return TRUE; } BOOLEAN TD6650TAfterSendBytes() { if(IIC_COM_SUCCESS != SendHostControl(0x80, 0)) return FALSE; else return TRUE; } #endif//#if NIMTN_TYPE==NIMTN_TD6650T