#include #include "SN761662Tuner.h" #include "IicComm.h" int TunerSN761662SendChannel(unsigned int uiChannel, CHANNEL_TABLE_TYPE iChannelTable, TYPE_SN761662TUNER_REF_DIVIDER_RATIO iRefDividerRatio,TYPE_SN761662TUNER_ATC iATC, TYPE_SN761662TUNER_CP iCP,TYPE_SN761662TUNER_IFOSW iIFOSW,TYPE_SN761662TUNER_AGC_TOP_LEVEL_0_LEVEL_1 iAGCTop, TYPE_SN761662TUNER_RFAGC_SHIFT_XTALOUT_CONTROL iRFAGCShiftXtalOut) { unsigned long ulFrequency = TunerSN761662GetFrequency(uiChannel,iChannelTable); if(0 == ulFrequency) return SN761662_CHANNEL_DOES_NOT_FIT_ANY_FREQUENCY; return TunerSN761662SendFreq(ulFrequency, iRefDividerRatio, iATC, iCP, iIFOSW, iAGCTop, iRFAGCShiftXtalOut); } int TunerSN761662SendFreq(unsigned long ulFrequency, TYPE_SN761662TUNER_REF_DIVIDER_RATIO iRefDividerRatio,TYPE_SN761662TUNER_ATC iATC, TYPE_SN761662TUNER_CP iCP,TYPE_SN761662TUNER_IFOSW iIFOSW,TYPE_SN761662TUNER_AGC_TOP_LEVEL_0_LEVEL_1 iAGCTop, TYPE_SN761662TUNER_RFAGC_SHIFT_XTALOUT_CONTROL iRFAGCShiftXtalOut) { int iMult; unsigned char ucaBytesToSend[5]; unsigned short usTmp; int iBand; ucaBytesToSend[0] = 0; ucaBytesToSend[1] = 0; ucaBytesToSend[2] = 0x80; ucaBytesToSend[3] = 0xCC; ucaBytesToSend[4] = 0xC0; if(iRefDividerRatio < SN761662TUNER_REF_DIVIDER_RATIO_24 || iRefDividerRatio > SN761662TUNER_REF_DIVIDER_RATIO_80) return SN761662_INCORRECT_REF_DIVIDER_RATIO; if(iIFOSW != TYPE_SN761662TUNER_IFOSW_IFOUT1_ENABLE_IFOUT2_DISABLE && iIFOSW != TYPE_SN761662TUNER_IFOSW_IFOUT1_DISABLE_IFOUT2_ENABLE) return SN761662_INCORRECT_IFOSW; if(iRFAGCShiftXtalOut < TYPE_SN761662TUNER_RFAGC_SHIFT_XTALOUT_CONTROL_IFOUT_0_OUTPUT_ENABLE || iRFAGCShiftXtalOut > TYPE_SN761662TUNER_RFAGC_SHIFT_XTALOUT_CONTROL_IFOUT_1_OUTPUT_DISABLE) return SN761662_INCORRECT_RFAGC_SHIFT_XTALOUT_CONTROL; switch(iRefDividerRatio){ case SN761662TUNER_REF_DIVIDER_RATIO_24: iMult = 24; break; case SN761662TUNER_REF_DIVIDER_RATIO_28: iMult = 28; break; case SN761662TUNER_REF_DIVIDER_RATIO_50: iMult = 50; break; case SN761662TUNER_REF_DIVIDER_RATIO_64: iMult = 64; break; case SN761662TUNER_REF_DIVIDER_RATIO_128: iMult = 128; break; case SN761662TUNER_REF_DIVIDER_RATIO_80: iMult = 80; break; } usTmp = (unsigned short)((ulFrequency + 44000)* iMult / 4000); if (usTmp == 0 || usTmp >= SN761662_N_MAX) { //15 bits return SN761662_FREQUENCY_VALUE_OUT_OF_RANGE; } ucaBytesToSend[0] = usTmp >> 8; ucaBytesToSend[1] = usTmp & 0xff; //ATC if(iATC == 0) ucaBytesToSend[4] &= ~0x20; else if(iATC == 1) ucaBytesToSend[4] |= 0x20; else return SN761662_INCORRECT_ATC; //CP //first set bits 6,7 to 0 ucaBytesToSend[3] &= ~0xC0; ucaBytesToSend[3] |= (iCP << 6); //BS ucaBytesToSend[3] &= ~0x0F; if(ulFrequency > 54000 && ulFrequency <= 174000) iBand = 0x01; else if(ulFrequency > 174000 && ulFrequency <= 468000) iBand = 0x02; else if(ulFrequency > 468000 && ulFrequency <= 864000) iBand = 0x08; else iBand = 0x03; ucaBytesToSend[3] |= iBand; ucaBytesToSend[3] |= (iIFOSW << 5); ucaBytesToSend[2] |= (iAGCTop << 3); ucaBytesToSend[2] |= iRefDividerRatio; ucaBytesToSend[4] |= iRFAGCShiftXtalOut; //open 2nd IIC channel if( !TunerSN761662BeforeSendBytes()) return SN761662_BEFORE_SEND_BYTES_FAILED; if (IicTransmit((unsigned char)SN761662_DEVICE_ADDRESS_WRITE, ucaBytesToSend, 5)) { return SN761662_SEND_CONTROL_DATA_FAILED; } //close 2nd IIC channel if( !TunerSN761662AfterSendBytes()) return SN761662_AFTER_SEND_BYTES_FAILED; else return SN761662_SUCCESS; //return TRUE; } int TunerSN761662SendPicCarrier(unsigned long ulFrequency, TYPE_SN761662TUNER_REF_DIVIDER_RATIO iRefDividerRatio,TYPE_SN761662TUNER_ATC iATC, TYPE_SN761662TUNER_CP iCP,TYPE_SN761662TUNER_IFOSW iIFOSW,TYPE_SN761662TUNER_AGC_TOP_LEVEL_0_LEVEL_1 iAGCTop, TYPE_SN761662TUNER_RFAGC_SHIFT_XTALOUT_CONTROL iRFAGCShiftXtalOut) { return TunerSN761662SendFreq(ulFrequency + 1750, iRefDividerRatio, iATC, iCP, iIFOSW, iAGCTop, iRFAGCShiftXtalOut); } BOOLEAN TunerSN761662BeforeSendBytes() { if(IIC_COM_SUCCESS != SendHostControl(0, 0)) return FALSE; else return TRUE; } BOOLEAN TunerSN761662AfterSendBytes() { if(IIC_COM_SUCCESS != SendHostControl(0x80, 0)) return FALSE; else return TRUE; } unsigned long TunerSN761662GetFrequency(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; }