#include "Mt2121Tuner.h" #include "IicComm.h" #if NIMTN_TYPE==NIMTN_MT2121 unsigned long TunerMt2121GetFrequency(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 TunerMt2121SendChannel(unsigned int uiChannel,CHANNEL_TABLE_TYPE iChannelTable,TYPE_TUNER_MT2121_REF_DIVIDER_RATIO iRefDividerRatio) { unsigned long ulFrequency; ulFrequency = TunerMt2121GetFrequency(uiChannel,iChannelTable); if(0 == ulFrequency) return MT2121_CHANNEL_DOES_NOT_FIT_ANY_FREQUENCY; return TunerMt2121SendDataToTuner(ulFrequency,iChannelTable,iRefDividerRatio); } int TunerMt2121SendCenterFrequency(unsigned long ulFrequency,CHANNEL_TABLE_TYPE iChannelTable,TYPE_TUNER_MT2121_REF_DIVIDER_RATIO iRefDividerRatio) { return TunerMt2121SendDataToTuner( ulFrequency,iChannelTable,iRefDividerRatio); } int TunerMt2121SendPicCarrier(unsigned long ulFrequency,CHANNEL_TABLE_TYPE iChannelTable,TYPE_TUNER_MT2121_REF_DIVIDER_RATIO iRefDividerRatio) { return TunerMt2121SendCenterFrequency(ulFrequency + 1750,iChannelTable,iRefDividerRatio); } int TunerMt2121SendDataToTuner(unsigned long ulFrequency,CHANNEL_TABLE_TYPE iChannelTable,TYPE_TUNER_MT2121_REF_DIVIDER_RATIO iRefDividerRatio) { unsigned long ulMult,ulFlo1InKHZ,ulFlo2InKHZ,ulDiv1,ulNUM1,ulDiv2,ulNUM2; unsigned char ucaSendBytes[2]; switch (iRefDividerRatio) { case TUNER_MT2121_REF_DIVIDER_RATIO_31_25: ulMult = 31250; break; case TUNER_MT2121_REF_DIVIDER_RATIO_50: ulMult = 50000; break; case TUNER_MT2121_REF_DIVIDER_RATIO_62_5: ulMult = 62500; break; default: ulMult = 62500; } ulFlo1InKHZ = ulFrequency + GetFifAccordingToChannelTable(iChannelTable); //Round FLo1 with 250KHz ulFlo1InKHZ = (unsigned long)((ulFlo1InKHZ + 125)/250) * 250; ulFlo2InKHZ = ulFlo1InKHZ - ulFrequency - 44000; //check if the value divides in the reference divider ratio ulFlo2InKHZ = (unsigned long)((unsigned long)((1000*ulFlo2InKHZ + ulMult/2)/ulMult) * ulMult); ulFlo2InKHZ /= 1000; ulDiv1 = (unsigned long)ulFlo1InKHZ / 16000; //the calculation needs to be (8191 * (uiFlo1InKHZ / 16000.0 - floor(uiFlo1InKHZ / 16000.0)) + 0.5) //we play with the numbers because we dont have floating point numbers to use ulNUM1 = (ulFlo1InKHZ*100) / 16 - ulDiv1*100000; ulNUM1 = ((ulNUM1*8191)/10000 + 5)/10; ulDiv2 = (unsigned long)ulFlo2InKHZ / 16000; //the calculation needs to be (8191 * (uiFlo1InKHZ / 16000.0 - floor(uiFlo1InKHZ / 16000.0)) + 0.5) //we play with the numbers because we dont have floating point numbers to use ulNUM2 = (ulFlo2InKHZ*100) / 16 - ulDiv2*100000; ulNUM2 = ((ulNUM2*8191)/10000 + 5)/10; //open 2nd IIC channel if( !TunerMt2121BeforeSendBytes()) return MT2121_BEFORE_SEND_BYTES_FAILED; //send to tuner ucaSendBytes[0] = 0x01;//reg address ucaSendBytes[1] = (unsigned char) (ulNUM1 >> 8); if (IicTransmit(TLSys_TunerDeviceAddress(I2CWRITE), ucaSendBytes, 2)) { return MT2121_SEND_CONTROL_DATA_FAILED; } ucaSendBytes[0] = 0x02;//reg address ucaSendBytes[1] = (unsigned char) (ulNUM1 & 0xff); if (IicTransmit(TLSys_TunerDeviceAddress(I2CWRITE), ucaSendBytes, 2)) { return MT2121_SEND_CONTROL_DATA_FAILED; } ucaSendBytes[0] = 0x03;//reg address ucaSendBytes[1] = (unsigned char) (ulDiv1 & 0xff); if (IicTransmit(TLSys_TunerDeviceAddress(I2CWRITE), ucaSendBytes, 2)) { return MT2121_SEND_CONTROL_DATA_FAILED; } ucaSendBytes[0] = 0x04;//reg address ucaSendBytes[1] = (unsigned char) (ulNUM2 >> 8); if (IicTransmit(TLSys_TunerDeviceAddress(I2CWRITE), ucaSendBytes, 2)) { return MT2121_SEND_CONTROL_DATA_FAILED; } ucaSendBytes[0] = 0x05;//reg address ucaSendBytes[1] = (unsigned char) (ulNUM2 & 0xff); if (IicTransmit(TLSys_TunerDeviceAddress(I2CWRITE), ucaSendBytes, 2)) { return MT2121_SEND_CONTROL_DATA_FAILED; } ucaSendBytes[0] = 0x06;//reg address ucaSendBytes[1] = (unsigned char) (ulDiv2 & 0xff); if (IicTransmit(TLSys_TunerDeviceAddress(I2CWRITE), ucaSendBytes, 2)) { return MT2121_SEND_CONTROL_DATA_FAILED; } //close 2nd IIC channel if( !TunerMt2121AfterSendBytes()) return MT2121_AFTER_SEND_BYTES_FAILED; else return MT2121_SUCCESS; } unsigned long GetFifAccordingToChannelTable(CHANNEL_TABLE_TYPE iChannelTable) { switch(iChannelTable){ case NA_TERRESTRIAL: return 1221500; case NA_CATV: return 1217500; case IRC: return 1217525; case HRC: return 1218560; default: return 1217500; } } BOOLEAN TunerMt2121BeforeSendBytes() { if(IIC_COM_SUCCESS != SendHostControl(0, 0)) return FALSE; else return TRUE; } BOOLEAN TunerMt2121AfterSendBytes() { if(IIC_COM_SUCCESS != SendHostControl(0x80, 0)) return FALSE; else return TRUE; } #endif//#if NIMTN_TYPE==NIMTN_MT2121