/* * $Id: TunerDTT7612.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 #include "TunerDTT7612.h" #include "IicComm.h" #if NIMTN_TYPE==NIMTN_DTT7612 int TunerDTT7612SendChannel(unsigned int uiChannel,CHANNEL_TABLE_TYPE iChannelTable,TYPE_TUNERDTT7612_REF_DIVIDER_RATIO iRefDividerRatio,unsigned int uiAgc, unsigned int uiAgcMode,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; DTT7612InitBytes(&Db1,&Db2,&Cb,&Bb,&Ab,&Cb2); ulFrequency = TunerDTT7612GetFrequency(uiChannel,iChannelTable); if(0 == ulFrequency) return DTT7612_CHANNEL_DOES_NOT_FIT_ANY_FREQUENCY; if(FALSE == TunerDTT7612SetRFFreq(ulFrequency,uiAgcMode,&Bb)) return DTT7612_FREQUENCY_VALUE_OUT_OF_RANGE; if(FALSE == DTT7612SetN( ulFrequency,iRefDividerRatio,&Db1,&Db2)) return DTT7612_COULD_NOT_SET_N; DTT7612SetCP(uiChargePump,&Cb); DTT7612SetStepSize( iRefDividerRatio, &Cb,&Cb2); DTT7612SetAGC(uiAgc,&Ab); DTT7612SetATC(uiAgcTimeConstant,&Ab); return DTT7612SendControlData(uiAgcMode,Db1,Db2,Cb,Bb,Ab,Cb2); } int TunerDTT7612SendFreq(unsigned long ulFrequency,TYPE_TUNERDTT7612_REF_DIVIDER_RATIO iRefDividerRatio,unsigned int uiAgc, unsigned int uiAgcMode,unsigned int uiChargePump,unsigned int uiAgcTimeConstant) { unsigned char Db1; unsigned char Db2; unsigned char Cb; unsigned char Bb; unsigned char Ab; unsigned char Cb2; DTT7612InitBytes(&Db1,&Db2,&Cb,&Bb,&Ab,&Cb2); if(FALSE == TunerDTT7612SetRFFreq(ulFrequency,uiAgcMode,&Bb)) return DTT7612_FREQUENCY_VALUE_OUT_OF_RANGE; if(FALSE == DTT7612SetN( ulFrequency,iRefDividerRatio, &Db1,&Db2)) return DTT7612_COULD_NOT_SET_N; DTT7612SetCP(uiChargePump,&Cb); DTT7612SetStepSize( iRefDividerRatio, &Cb,&Cb2); DTT7612SetAGC(uiAgc,&Ab); DTT7612SetATC(uiAgcTimeConstant,&Ab); return DTT7612SendControlData(uiAgcMode,Db1,Db2,Cb,Bb,Ab,Cb2); } int TunerDTT7612SendPicCarrier(unsigned long ulFrequency,TYPE_TUNERDTT7612_REF_DIVIDER_RATIO iRefDividerRatio,unsigned int uiAgc, unsigned int uiAgcMode,unsigned int uiChargePump,unsigned int uiAgcTimeConstant) { //add 1.75 MHz to the picture carrier frequency return TunerDTT7612SendFreq(ulFrequency + 1750 ,iRefDividerRatio,uiAgc, uiAgcMode,uiChargePump, uiAgcTimeConstant); } unsigned long TunerDTT7612GetFrequency(unsigned int uiChannelNumber,CHANNEL_TABLE_TYPE iChannelTable) { unsigned long ulFreq = 0; 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 <= 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 = 75000; break; case 2: ulFreq = 55753; break; case 3: ulFreq = 61753; break; case 4: ulFreq = 66753; 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 TunerDTT7612SetRFFreq(unsigned long ulFrequency,unsigned int uiAgcMode,unsigned char* pucBb) { *pucBb = 0; if ((ulFrequency >= DTT7612_LOW_BAND_MIN) && (ulFrequency <= DTT7612_LOW_BAND_MAX) ) { if(1 == uiAgcMode){ *pucBb = 0x39; } else if(2 == uiAgcMode){ *pucBb = 0x11; } } else if((ulFrequency >= DTT7612_MID_BAND_MIN) && (ulFrequency <= DTT7612_MID_BAND_MAX)){ if(1 == uiAgcMode){ *pucBb = 0x3a; } else if(2 == uiAgcMode){ *pucBb = 0x12; } } else if((ulFrequency >= DTT7612_HIGH_BAND_MIN) && (ulFrequency <= DTT7612_HIGH_BAND_MAX)){ if(1 == uiAgcMode){ *pucBb = 0x3c; } else if(2 == uiAgcMode){ *pucBb = 0x14; } } else return FALSE; return TRUE; } BOOLEAN DTT7612SetN(unsigned long ulFrequency,TYPE_TUNERDTT7612_REF_DIVIDER_RATIO iRefDividerRatio, unsigned char* pucDb1,unsigned char* pucDb2) { // calc N unsigned short usNval,usMultiplier=1; unsigned char ucNlow8,ucNbits8_14; //1/(dRefDividerRatio/1000) switch(iRefDividerRatio){ case TUNERDTT7612_REF_DIVIDER_RATIO_31_25: usMultiplier = 32; break; case TUNERDTT7612_REF_DIVIDER_RATIO_50: usMultiplier = 20; break; case TUNERDTT7612_REF_DIVIDER_RATIO_62_5: usMultiplier = 16; break; case TUNERDTT7612_REF_DIVIDER_RATIO_166_7: usMultiplier = 6; break; } usNval = (unsigned short)(((ulFrequency + DTT7612_F_IF_KHZ) * usMultiplier)/1000); if(usNval >= DTT7612_N_MAX){ //max n in 14 bits usNval = usNval/2 ; } // set N if (usNval == 0 || usNval >= DTT7612_N_MAX) { //15 bits return FALSE; } // clear N bits *pucDb1 = 0x00; *pucDb2 = 0x00; ucNlow8 = usNval & 0x00FF; ucNbits8_14 = (usNval & 0x07f00) >> 8; *pucDb2 = ucNlow8; *pucDb1 |= ucNbits8_14 ; return TRUE; } void DTT7612SetCP(unsigned int uiChargePump, unsigned char* pucCb) { *pucCb &= 0xbf; if(60 == uiChargePump){ *pucCb &= 0xbf; } else{//280 *pucCb |= 0x40; } } void DTT7612SetStepSize(TYPE_TUNERDTT7612_REF_DIVIDER_RATIO iRefDividerRatio, unsigned char* pucCb,unsigned char* pucCb2) { *pucCb &= 0xf9; *pucCb2 &= 0xf9; if (TUNERDTT7612_REF_DIVIDER_RATIO_50 == iRefDividerRatio) { *pucCb &= 0xf9; *pucCb2 &= 0xf9; } else if (TUNERDTT7612_REF_DIVIDER_RATIO_31_25 == iRefDividerRatio) { *pucCb |= 0x2; *pucCb2 |= 0x2; } else if (TUNERDTT7612_REF_DIVIDER_RATIO_166_7 == iRefDividerRatio) { *pucCb |= 0x4; *pucCb2 |= 0x4; } else if (TUNERDTT7612_REF_DIVIDER_RATIO_62_5 == iRefDividerRatio) { *pucCb |= 0x6; *pucCb2 |= 0x6; } } void DTT7612SetAGC(unsigned int uiAgc, unsigned char* pucAb) { *pucAb &= 0x8f; if (0 == uiAgc) { *pucAb &= 0x8f; } else if (1== uiAgc) { *pucAb |= 0x10; } else if (2 == uiAgc) { *pucAb |= 0x20; } else if (3 == uiAgc) { *pucAb |= 0x30; } else if (4 == uiAgc) { *pucAb |= 0x40; } else if (5 == uiAgc) { *pucAb |= 0x50; } else if (6 == uiAgc) { *pucAb |= 0x60; } } void DTT7612SetATC(unsigned int uiAgcTimeConstant,unsigned char* pucAb) { if (2 == uiAgcTimeConstant) *pucAb &= ~0x80; else if (50== uiAgcTimeConstant) *pucAb |= 0x80; } BOOLEAN TunerDTT7612BeforeSendBytes() { if(IIC_COM_SUCCESS != SendHostControl(0, 0)) return FALSE; else return TRUE; } BOOLEAN TunerDTT7612AfterSendBytes() { if(IIC_COM_SUCCESS != SendHostControl(0x80, 0)) return FALSE; else return TRUE; } unsigned int DTT7612SendControlData(unsigned int uiAgcMode,unsigned char Db1,unsigned char Db2,unsigned char Cb,unsigned char Bb,unsigned char Ab,unsigned char Cb2) { unsigned char str[10]; unsigned long ulWait = 1000; //open 2nd IIC channel if( !TunerDTT7612BeforeSendBytes()) return DTT7612_BEFORE_SEND_BYTES_FAILED; str[0] = Db1; str[1] = Db2; str[2] = Cb; str[3] = Bb; str[4]= '\0'; if (IicTransmit(DTT7612_DEVICE_ADDRESS_WRITE, str, 4)) { return DTT7612_SEND_CONTROL_DATA_FAILED; } if(1 == uiAgcMode){ //wait while(ulWait != 0) ulWait --; str[0] = Cb2; str[1] = Ab; str[2]= '\0'; if (IicTransmit(DTT7612_DEVICE_ADDRESS_WRITE, str, 2)) { return DTT7612_SEND_CONTROL_DATA_FAILED; } } //Send data byte if internal analog AGC mode. if(2 == uiAgcMode){ str[0] = 0x00; str[1] = 0xD4; if (IicTransmit(DTT7612_DEVICE_ADDRESS_WRITE, str, 2)) { return DTT7612_SEND_CONTROL_DATA_FAILED; } str[0] = 0x01; str[1] = 0x30; if (IicTransmit(DTT7612_DEVICE_ADDRESS_WRITE, str, 2)) { return DTT7612_SEND_CONTROL_DATA_FAILED; } str[0] = 0x02; str[1] = 0x04; if (IicTransmit(DTT7612_DEVICE_ADDRESS_WRITE, str, 2)) { return DTT7612_SEND_CONTROL_DATA_FAILED; } } //Send data byte if internal digital AGC mode. if(1 == uiAgcMode){ str[0] = 0x00; str[1] = 0xD4; if (IicTransmit(DTT7612_DEVICE_ADDRESS_WRITE, str, 2)) { return DTT7612_SEND_CONTROL_DATA_FAILED; } str[0] = 0x01; str[1] = 0x30; if (IicTransmit(DTT7612_DEVICE_ADDRESS_WRITE, str, 2)) { return DTT7612_SEND_CONTROL_DATA_FAILED; } str[0] = 0x02; str[1] = 0x24; if (IicTransmit(DTT7612_DEVICE_ADDRESS_WRITE, str, 2)) { return DTT7612_SEND_CONTROL_DATA_FAILED; } } //close 2nd IIC channel if( !TunerDTT7612AfterSendBytes()) return DTT7612_AFTER_SEND_BYTES_FAILED; else return DTT7612_SUCCESS; } void DTT7612InitBytes(unsigned char* pucDb1,unsigned char* pucDb2,unsigned char* pucCb,unsigned char* pucBb,unsigned char* pucAb,unsigned char* pucCb2) { *pucDb1 = 0; *pucDb2 = 0; *pucCb = 0x88; *pucBb = 0; *pucAb = 0; *pucCb2 = 0x98; } unsigned int DTT7612GetTunerStatusReg(unsigned char * pucStatusReg) { unsigned int uiError; unsigned long ulWait = 1000; if(NULL == pucStatusReg) return FUNCTION_RECEIVED_NULL_PARAMETER; *pucStatusReg = 0; //open 2nd IIC channel if( !TunerDTT7612BeforeSendBytes()){ return DTT7612_BEFORE_SEND_BYTES_FAILED; } //wait while(ulWait != 0) ulWait --; *pucStatusReg = ReceiveByteOfDataFromAddress(DTT7612_DEVICE_ADDRESS_WRITE+1,&uiError); //close 2nd IIC channel if( !TunerDTT7612AfterSendBytes()) return DTT7612_AFTER_SEND_BYTES_FAILED; return uiError; } #endif//#if NIMTN_TYPE==NIMTN_DTT7612