/* * $Id: DTT7600Tuner.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 "DTT7600Tuner.h" #include "IicComm.h" BOOLEAN TunerDTT760xATSCBeforeSendBytes(void); BOOLEAN TunerDTT760xATSCAfterSendBytes(void); int TunerDTT760xATSCSendChannel(unsigned int uiChannel, CHANNEL_TABLE_TYPE iChannelTable, TYPE_TUNERDTT760xATSC_REF_DIVIDER_RATIO iRefDividerRatio,unsigned int uiAgc, BOOLEAN bUseExternalAgc,unsigned int uiChargePump,unsigned int uiAgcTimeConstant) { unsigned long ulFrequency; unsigned char Db1; unsigned char Db2; unsigned char Cb; unsigned char Bb; unsigned char Ab; unsigned char Cb2; TunerDTT760xATSCInitsendBytes(&Db1, &Db2, &Cb ,&Bb, &Ab,&Cb2); ulFrequency = TunerDTT760xATSCGetFrequency(uiChannel, iChannelTable); if(0 == ulFrequency) return TUNER_DTT760xATSC_CHANNEL_OUT_OF_RANGE; if(!TunerDTT760xATSCSetRFFreq(ulFrequency,bUseExternalAgc,&Bb)) return TUNER_DTT760xATSC_FREQUENCY_VALUE_OUT_OF_RANGE; if(!TunerDTT760xATSCSetN( ulFrequency,iRefDividerRatio,&Db1,&Db2)) return TUNER_DTT760xATSC_N_VALU_OUT_OF_RANGE; if(!TunerDTT760xATSCSetCP(uiChargePump,&Cb)) return TUNER_DTT760xATSC_CHARGE_PUMP_VALUE_OUT_OF_RANGE; if(!TunerDTT760xATSCSetStepSize(iRefDividerRatio,&Cb,&Cb2)) return TUNER_DTT760xATSC_STEP_SIZE_VALUE_OUT_OF_RANGE; if(!TunerDTT760xATSCSetAGC(uiAgc,&Ab)) return TUNER_DTT760xATSC_AGC_VALUE_OUT_OF_RANGE; if(!TunerDTT760xATSCSetATC(uiAgcTimeConstant,&Ab)) return TUNER_DTT760xATSC_ATC_VALUE_OUT_OF_RANGE; return TunerDTT760xATSCSendControlData(Db1, Db2, Cb, Bb, Ab,Cb2); } int TunerDTT760xATSCSendFreq(unsigned long ulFrequency,TYPE_TUNERDTT760xATSC_REF_DIVIDER_RATIO iRefDividerRatio,unsigned int uiAgc, BOOLEAN bUseExternalAgc,unsigned int uiChargePump,unsigned int uiAgcTimeConstant) { unsigned char Db1; unsigned char Db2; unsigned char Cb; unsigned char Bb; unsigned char Ab; unsigned char Cb2; TunerDTT760xATSCInitsendBytes(&Db1, &Db2, &Cb ,&Bb, &Ab,&Cb2); if(!TunerDTT760xATSCSetRFFreq(ulFrequency,bUseExternalAgc,&Bb)) return TUNER_DTT760xATSC_FREQUENCY_VALUE_OUT_OF_RANGE; if(!TunerDTT760xATSCSetN( ulFrequency,iRefDividerRatio,&Db1,&Db2)) return TUNER_DTT760xATSC_N_VALU_OUT_OF_RANGE; if(!TunerDTT760xATSCSetCP(uiChargePump,&Cb)) return TUNER_DTT760xATSC_CHARGE_PUMP_VALUE_OUT_OF_RANGE; if(!TunerDTT760xATSCSetStepSize(iRefDividerRatio,&Cb,&Cb2)) return TUNER_DTT760xATSC_STEP_SIZE_VALUE_OUT_OF_RANGE; if(!TunerDTT760xATSCSetAGC(uiAgc,&Ab)) return TUNER_DTT760xATSC_AGC_VALUE_OUT_OF_RANGE; if(!TunerDTT760xATSCSetATC(uiAgcTimeConstant,&Ab)) return TUNER_DTT760xATSC_ATC_VALUE_OUT_OF_RANGE; return TunerDTT760xATSCSendControlData( Db1, Db2, Cb , Bb, Ab,Cb2); } int TunerDTT760xATSCSendPicCarrier(unsigned long ulFrequency,TYPE_TUNERDTT760xATSC_REF_DIVIDER_RATIO iRefDividerRatio,unsigned int uiAgc, BOOLEAN bUseExternalAgc,unsigned int uiChargePump,unsigned int uiAgcTimeConstant) { //add 1.75 MHz to the picture carrier frequency return TunerDTT760xATSCSendFreq(ulFrequency + 1750 ,iRefDividerRatio,uiAgc, bUseExternalAgc,uiChargePump, uiAgcTimeConstant); } // Function name : TunerDTT760xATSCGetFrequency // Description : returns the frequency in KHz // Return type : unsigned short // Argument : unsigned int uiChannelNumber unsigned long TunerDTT760xATSCGetFrequency(unsigned int uiChannelNumber, CHANNEL_TABLE_TYPE iChannelTable) { unsigned long ulFreq = 0; #if 0 //old code only support ATSC 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; } else{ return 0; } return (1000*ulFrequency); #endif // to support digital cable for Lynx if(NA_TERRESTRIAL == iChannelTable){//terrestrial if ((uiChannelNumber >= 2) && (uiChannelNumber <= 6)) { switch (uiChannelNumber) { case 2: ulFreq = 57; break; case 3: ulFreq = 63; break; case 4: ulFreq = 69; break; case 5: ulFreq = 79; break; case 6: ulFreq = 85; break; } } else if ((uiChannelNumber >= 7) && (uiChannelNumber <= 13)) { ulFreq = 174 + ((uiChannelNumber - 7) * 6) + 3; } else if ((uiChannelNumber >= 14) && (uiChannelNumber <= 69)) { ulFreq = 470 + ((uiChannelNumber - 14) * 6) + 3; } else if ((uiChannelNumber >= 14) && (uiChannelNumber <= 77)) { ulFreq = 470 + ((uiChannelNumber - 14) * 6) + 3; } else{ return 0; } return ulFreq * 1000; } else if(NA_CATV == iChannelTable){//CATV if ((uiChannelNumber >= 1) && (uiChannelNumber <= 6)) { switch (uiChannelNumber) { case 1: ulFreq = 75; break; case 2: ulFreq = 57; break; case 3: ulFreq = 63; break; case 4: ulFreq = 69; break; case 5: ulFreq = 79; break; case 6: ulFreq = 85; break; } } else if ((uiChannelNumber >= 95) && (uiChannelNumber <= 99)) { ulFreq = 90 + ((uiChannelNumber - 95) * 6) + 3; } else if ((uiChannelNumber >= 7) && (uiChannelNumber <= 13)) { ulFreq = 174 + ((uiChannelNumber - 7) * 6) + 3; } else if ((uiChannelNumber >= 14) && (uiChannelNumber <= 22)) { ulFreq = 120 + ((uiChannelNumber - 14) * 6) + 3; } else if ((uiChannelNumber >= 23) && (uiChannelNumber <= 94)) { ulFreq = 216 + ((uiChannelNumber - 23) * 6) + 3; } else if ((uiChannelNumber >= 100) && (uiChannelNumber <= 135)) { ulFreq = 648 + ((uiChannelNumber - 100) * 6) + 3; } else{ return 0; } return ulFreq * 1000; } else if(IRC == iChannelTable){//IRC if ((uiChannelNumber >= 1) && (uiChannelNumber <= 6)) { switch (uiChannelNumber) { case 1: ulFreq = 75; break; case 2: ulFreq = 57; break; case 3: ulFreq = 63; break; case 4: ulFreq = 69; break; case 5: ulFreq = 81; break; case 6: ulFreq = 87; break; } } else if ((uiChannelNumber >= 95) && (uiChannelNumber <= 99)) { ulFreq = 90 + ((uiChannelNumber - 95) * 6) + 3; } else if ((uiChannelNumber >= 7) && (uiChannelNumber <= 13)) { ulFreq = 174 + ((uiChannelNumber - 7) * 6) + 3; } else if ((uiChannelNumber >= 14) && (uiChannelNumber <= 22)) { ulFreq = 120 + ((uiChannelNumber - 14) * 6) + 3; } else if ((uiChannelNumber >= 23) && (uiChannelNumber <= 94)) { ulFreq = 216 + ((uiChannelNumber - 23) * 6) + 3; } else if ((uiChannelNumber >= 100) && (uiChannelNumber <= 135)) { ulFreq = 648 + ((uiChannelNumber - 100) * 6) + 3; } else{ return 0; } return ulFreq * 1000; } else if(HRC == iChannelTable){//HRC if ((uiChannelNumber >= 1) && (uiChannelNumber <= 6)) { switch (uiChannelNumber) { case 1: ulFreq = 73753; break; case 2: ulFreq = 55753; break; case 3: ulFreq = 61753; break; case 4: ulFreq = 67753; break; case 5: ulFreq = 79754; break; case 6: ulFreq = 85754; break; } } else if ((uiChannelNumber >= 95) && (uiChannelNumber <= 99)) { ulFreq = (917545 + ((uiChannelNumber - 95) * 60003))/10; } else if ((uiChannelNumber >= 7) && (uiChannelNumber <= 13)) { ulFreq = (1757587 + ((uiChannelNumber - 7) * 60003))/10; } else if ((uiChannelNumber >= 14) && (uiChannelNumber <= 22)) { ulFreq = (1217560 + ((uiChannelNumber - 14) * 60003))/10; } else if ((uiChannelNumber >= 23) && (uiChannelNumber <= 94)) { ulFreq = (2177608 + ((uiChannelNumber - 23) * 60003))/10; } else if ((uiChannelNumber >= 100) && (uiChannelNumber <= 135)) { ulFreq = (6497824 + ((uiChannelNumber - 100) * 60003))/10; } else{ return 0; } return ulFreq ; } else return 0; } BOOLEAN TunerDTT760xATSCSetRFFreq(unsigned long ulFrequency,BOOLEAN bUseExternalAgc,unsigned char *Bb) { if ((ulFrequency >= DTT760xATSC_LOW_BAND_MIN) && (ulFrequency <= DTT760xATSC_LOW_BAND_MAX) ) { if(bUseExternalAgc){ *Bb &= ~0x08; *Bb &= ~0x04; *Bb &= ~0x02; *Bb |= 0x01; } else{ *Bb |= 0x08; *Bb &= ~0x04; *Bb &= ~0x02; *Bb |= 0x01; } } else if((ulFrequency >= DTT760xATSC_MID_BAND_MIN) && (ulFrequency <= DTT760xATSC_MID_BAND_MAX)){ if(bUseExternalAgc){ *Bb &= ~0x08; *Bb &= ~0x04; *Bb |= 0x02; *Bb &= ~0x01; } else{ *Bb |= 0x08; *Bb &= ~0x04; *Bb |= 0x02; *Bb &= ~0x01; } } else if((ulFrequency >= DTT760xATSC_HIGH_BAND_MIN) && (ulFrequency <= DTT760xATSC_HIGH_BAND_MAX)){ if(bUseExternalAgc){ *Bb &= ~0x08; *Bb |= 0x04; *Bb &= ~0x02; *Bb &= ~0x01; } else{ *Bb |= 0x08; *Bb |= 0x04; *Bb &= ~0x02; *Bb &= ~0x01; } } else return FALSE; return TRUE; } // Function name : TunerDTT760xATSCSetN // Description : gets the frequency as Khz and calculates the N value // Return type : BOOLEAN // Argument : unsigned long ulFrequency the frequency in Khz // Argument : unsigned char *Divider_Byte1 // Argument : unsigned char *Divider_Byte2 BOOLEAN TunerDTT760xATSCSetN( unsigned long ulFrequency, TYPE_TUNERDTT760xATSC_REF_DIVIDER_RATIO iRefDividerRatio,unsigned char *Divider_Byte1, unsigned char *Divider_Byte2) { // calc N unsigned short usNval,usMultiplier=0; unsigned char ucNlow8,ucNbits8_14; //1/(dRefDividerRatio/1000) switch(iRefDividerRatio){ case TUNERDTT760xATSC_REF_DIVIDER_RATIO_31_25: usMultiplier = 32; break; case TUNERDTT760xATSC_REF_DIVIDER_RATIO_50: usMultiplier = 20; break; case TUNERDTT760xATSC_REF_DIVIDER_RATIO_62_5: usMultiplier = 16; break; case TUNERDTT760xATSC_REF_DIVIDER_RATIO_166_7: usMultiplier = 6; break; } usNval = (unsigned short)(((ulFrequency + DTT760xATSC_F_IF_KHZ) * usMultiplier)/1000); if(usNval > DTT760xATSC_N_MAX){ //max n in 15 bits usNval = usNval/2; } // set N if (usNval <= 0 || usNval >= DTT760xATSC_N_MAX){ //15 bits return FALSE; } // clear N bits *Divider_Byte1 &= 0x00; *Divider_Byte2 &= 0x00; ucNlow8 = usNval & 0x00FF; ucNbits8_14 = (usNval & 0x07f00) >> 8; *Divider_Byte2 = ucNlow8; *Divider_Byte1 = 0x00; *Divider_Byte1 |= ucNbits8_14; return TRUE; } BOOLEAN TunerDTT760xATSCSetCP(unsigned int uiChargePump,unsigned char *Control_Byte1) { if(60 == uiChargePump) *Control_Byte1 &= ~0x40; else if(280 == uiChargePump) *Control_Byte1 |= 0x40; else return FALSE; return TRUE; } BOOLEAN TunerDTT760xATSCSetStepSize(TYPE_TUNERDTT760xATSC_REF_DIVIDER_RATIO iRefDividerRatio ,unsigned char *Control_Byte1,unsigned char *Control_Byte2) { if (TUNERDTT760xATSC_REF_DIVIDER_RATIO_50 == iRefDividerRatio) { *Control_Byte1 &= ~0x06; *Control_Byte2 &= ~0x06; } else if (TUNERDTT760xATSC_REF_DIVIDER_RATIO_31_25== iRefDividerRatio) { *Control_Byte1 |= 0x02; *Control_Byte1 &= ~0x04; *Control_Byte2 |= 0x02; *Control_Byte2 &= ~0x04; } else if (TUNERDTT760xATSC_REF_DIVIDER_RATIO_166_7 == iRefDividerRatio) { *Control_Byte1 &= ~0x02; *Control_Byte1 |= 0x04; *Control_Byte2 &= ~0x02; *Control_Byte2 |= 0x04; } else if (TUNERDTT760xATSC_REF_DIVIDER_RATIO_62_5 == iRefDividerRatio) { *Control_Byte1 |= 0x06; *Control_Byte2 |= 0x06; } else return FALSE; return TRUE; } BOOLEAN TunerDTT760xATSCSetAGC(unsigned int uiAgc,unsigned char *Auxiliary_Byte) { if (106 == uiAgc) { *Auxiliary_Byte |= ~0x70; } else if (103== uiAgc) { *Auxiliary_Byte |= 0x10; *Auxiliary_Byte &= ~0x20; *Auxiliary_Byte &= ~0x40; } else if (100 == uiAgc) { *Auxiliary_Byte &= ~0x10; *Auxiliary_Byte |= 0x20; *Auxiliary_Byte &= ~0x40; } else if (97 == uiAgc) { *Auxiliary_Byte |= 0x10; *Auxiliary_Byte |= 0x20; *Auxiliary_Byte &= ~0x40; } else if (94 == uiAgc) { *Auxiliary_Byte &= ~0x10; *Auxiliary_Byte &= ~0x20; *Auxiliary_Byte |= 0x40; } else if (91 == uiAgc) { *Auxiliary_Byte |= 0x10; *Auxiliary_Byte &= ~0x20; *Auxiliary_Byte |= 0x40; } else return FALSE; return TRUE; } BOOLEAN TunerDTT760xATSCSetATC(unsigned int uiATC,unsigned char *Auxiliary_Byte) { if (50 == uiATC) *Auxiliary_Byte |= 0x80; else if (2== uiATC) *Auxiliary_Byte &= ~0x80; else return FALSE; return TRUE; } unsigned int TunerDTT760xATSCSendControlData(unsigned char Divider_Byte1, unsigned char Divider_Byte2, unsigned char Control_Byte1, unsigned char Band_Switch_Byte, unsigned char Auxiliary_Byte,unsigned char Control_Byte2) { unsigned char str[10]; if( !TunerDTT760xATSCBeforeSendBytes()) return TUNER_DTT760xATSC_BEFORE_SEND_BYTES_FAILED; str[0] = Divider_Byte1; str[1] = Divider_Byte2; str[2] = Control_Byte1; str[3] = Band_Switch_Byte; str[4]= '\0'; if (IIC_COM_SUCCESS != OrenIicTransmit(DTT7600ATSC_DEVICE_ADDRESS_WRITE, str, 4)) { return TUNER_DTT760xATSC_SEND_CONTROL_DATA_FAILED; } str[0] = Control_Byte2; str[1] = Auxiliary_Byte; str[2]= '\0'; if (IIC_COM_SUCCESS != OrenIicTransmit(DTT7600ATSC_DEVICE_ADDRESS_WRITE, str, 2)) { return TUNER_DTT760xATSC_SEND_CONTROL_DATA_FAILED; } if( !TunerDTT760xATSCAfterSendBytes()) return TUNER_DTT760xATSC_AFTER_SEND_BYTES_FAILED; else return TUNER_DTT760xATSC_SUCCESS; } BOOLEAN TunerDTT760xATSCBeforeSendBytes(void) { if(IIC_COM_SUCCESS != SendHostControl(0, 0)) return FALSE; else return TRUE; } BOOLEAN TunerDTT760xATSCAfterSendBytes(void) { if(IIC_COM_SUCCESS != SendHostControl(0x80, 0)) return FALSE; else return TRUE; } void TunerDTT760xATSCInitsendBytes(unsigned char *Divider_Byte1, unsigned char *Divider_Byte2, unsigned char *Control_Byte1, unsigned char *Band_Switch_Byte, unsigned char *Auxiliary_Byte,unsigned char *Control_Byte2) { *Divider_Byte1 = 0; *Divider_Byte2 = 0; *Control_Byte1 = 0xcc; *Band_Switch_Byte = 0; *Band_Switch_Byte &= ~0xC0; *Auxiliary_Byte = 0; *Control_Byte2 = 0x98; }