/* * $Id: TunerDTT7611.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 "TunerDTT7611.h" #include "IicComm.h" #include "dsthalcfg.h" extern UINT32 gdhlExtDbgLvl; #undef DTT7611_DEVICE_ADDRESS_WRITE #define DTT7611_DEVICE_ADDRESS_WRITE 0xC2 #if NIMTN_TYPE==NIMTN_DTT7611 #define TRACE_DTT7611_DEBUG 0 #define SOUND_TRAP_BYPASS 1 int TunerDTT7611SendChannel(unsigned int uiChannel,CHANNEL_TABLE_TYPE iChannelTable,TYPE_TUNERDTT7611_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; DTT7611InitBytes(&Db1,&Db2,&Cb,&Bb,&Ab,&Cb2); DHL_DbgPrintf(gdhlExtDbgLvl,DHLDBG_EXT, "uiAgc = %d\n", uiAgc ); ulFrequency = TunerDTT7611GetFrequency(uiChannel,iChannelTable); if(0 == ulFrequency) return DTT7611_CHANNEL_DOES_NOT_FIT_ANY_FREQUENCY; if(FALSE == TunerDTT7611SetRFFreq(ulFrequency,uiAgcMode,&Bb)) return DTT7611_FREQUENCY_VALUE_OUT_OF_RANGE; if(FALSE == DTT7611SetN( ulFrequency,iRefDividerRatio,&Db1,&Db2)) return DTT7611_COULD_NOT_SET_N; DTT7611SetCP(uiChargePump,&Cb); DTT7611SetStepSize( iRefDividerRatio, &Cb,&Cb2); DTT7611SetAGC(uiAgc,&Ab); DTT7611SetATC(uiAgcTimeConstant,&Ab); return DTT7611SendControlData(uiAgcMode,Db1,Db2,Cb,Bb,Ab,Cb2); } int TunerDTT7611SendFreq(unsigned long ulFrequency,TYPE_TUNERDTT7611_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; DTT7611InitBytes(&Db1,&Db2,&Cb,&Bb,&Ab,&Cb2); DHL_DbgPrintf(gdhlExtDbgLvl,DHLDBG_EXT, "uiAgc = %d\n", uiAgc ); if(FALSE == TunerDTT7611SetRFFreq(ulFrequency,uiAgcMode,&Bb)) return DTT7611_FREQUENCY_VALUE_OUT_OF_RANGE; if(FALSE == DTT7611SetN( ulFrequency,iRefDividerRatio, &Db1,&Db2)) return DTT7611_COULD_NOT_SET_N; DTT7611SetCP(uiChargePump,&Cb); DTT7611SetStepSize( iRefDividerRatio, &Cb,&Cb2); DTT7611SetAGC(uiAgc,&Ab); DTT7611SetATC(uiAgcTimeConstant,&Ab); return DTT7611SendControlData(uiAgcMode,Db1,Db2,Cb,Bb,Ab,Cb2); } int TunerDTT7611SendPicCarrier(unsigned long ulFrequency,TYPE_TUNERDTT7611_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 TunerDTT7611SendFreq(ulFrequency + 1750 ,iRefDividerRatio,uiAgc, uiAgcMode,uiChargePump, uiAgcTimeConstant); } unsigned long TunerDTT7611GetFrequency(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 <= 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 TunerDTT7611SetRFFreq(unsigned long ulFrequency,unsigned int uiAgcMode,unsigned char* pucBb) { *pucBb = 0; if ((ulFrequency >= DTT7611_LOW_BAND_MIN) && (ulFrequency <= DTT7611_LOW_BAND_MAX) ) { if(1 == uiAgcMode){ *pucBb = 0x39; } else if(2 == uiAgcMode){ *pucBb = 0x11; } } else if((ulFrequency >= DTT7611_MID_BAND_MIN) && (ulFrequency <= DTT7611_MID_BAND_MAX)){ if(1 == uiAgcMode){ *pucBb = 0x3a; } else if(2 == uiAgcMode){ *pucBb = 0x12; } } else if((ulFrequency >= DTT7611_HIGH_BAND_MIN) && (ulFrequency <= DTT7611_HIGH_BAND_MAX)){ if(1 == uiAgcMode){ *pucBb = 0x3c; } else if(2 == uiAgcMode){ *pucBb = 0x14; } } else return FALSE; return TRUE; } BOOLEAN DTT7611SetN(unsigned long ulFrequency,TYPE_TUNERDTT7611_REF_DIVIDER_RATIO iRefDividerRatio, unsigned char* pucDb1,unsigned char* pucDb2) { // calc N unsigned short usNval,usMultiplier=0; unsigned char ucNlow8,ucNbits8_14; //1/(dRefDividerRatio/1000) switch(iRefDividerRatio){ case TUNERDTT7611_REF_DIVIDER_RATIO_31_25: usMultiplier = 32; break; case TUNERDTT7611_REF_DIVIDER_RATIO_50: usMultiplier = 20; break; case TUNERDTT7611_REF_DIVIDER_RATIO_62_5: usMultiplier = 16; break; case TUNERDTT7611_REF_DIVIDER_RATIO_166_7: usMultiplier = 6; break; } usNval = (unsigned short)(((ulFrequency + DTT7611_F_IF_KHZ) * usMultiplier)/1000); if(usNval >= DTT7611_N_MAX){ //max n in 14 bits usNval = usNval/2 ; } // set N if (usNval == 0 || usNval >= DTT7611_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 DTT7611SetCP(unsigned int uiChargePump, unsigned char* pucCb) { *pucCb &= 0xbf; if(60 == uiChargePump){ *pucCb &= 0xbf; } else{//280 *pucCb |= 0x40; } } void DTT7611SetStepSize(TYPE_TUNERDTT7611_REF_DIVIDER_RATIO iRefDividerRatio, unsigned char* pucCb,unsigned char* pucCb2) { *pucCb &= 0xf9; *pucCb2 &= 0xf9; if (TUNERDTT7611_REF_DIVIDER_RATIO_50 == iRefDividerRatio) { *pucCb &= 0xf9; *pucCb2 &= 0xf9; } else if (TUNERDTT7611_REF_DIVIDER_RATIO_31_25 == iRefDividerRatio) { *pucCb |= 0x2; *pucCb2 |= 0x2; } else if (TUNERDTT7611_REF_DIVIDER_RATIO_166_7 == iRefDividerRatio) { *pucCb |= 0x4; *pucCb2 |= 0x4; } else if (TUNERDTT7611_REF_DIVIDER_RATIO_62_5 == iRefDividerRatio) { *pucCb |= 0x6; *pucCb2 |= 0x6; } } void DTT7611SetAGC(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 DTT7611SetATC(unsigned int uiAgcTimeConstant,unsigned char* pucAb) { if (2 == uiAgcTimeConstant) *pucAb &= ~0x80; else if (50== uiAgcTimeConstant) *pucAb |= 0x80; } BOOLEAN TunerDTT7611BeforeSendBytes() { BOOL result; if(IIC_COM_SUCCESS != SendHostControl(0, 0)) result=FALSE; else result=TRUE; #if TRACE_DTT7611_DEBUG DHL_DbgPrintf(gdhlExtDbgLvl,DHLDBG_EXT, "RESULT : %s, %d\n",result?"TRUE":"FALSE",__LINE__); #endif return result; } BOOLEAN TunerDTT7611AfterSendBytes() { BOOL result; if(IIC_COM_SUCCESS != SendHostControl(0x80, 0)) result=FALSE; else result=TRUE; #if TRACE_DTT7611_DEBUG DHL_DbgPrintf(gdhlExtDbgLvl,DHLDBG_EXT, "%s| RESULT : %s, %d\n",result?"TRUE":"FALSE",__LINE__); #endif return result; } unsigned int DTT7611SendControlData(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]; #if 0 unsigned long ulWait = 1000; #endif //open 2nd IIC channel if( !TunerDTT7611BeforeSendBytes()) return DTT7611_BEFORE_SEND_BYTES_FAILED; str[0] = Db1; str[1] = Db2; str[2] = Cb; str[3] = Bb; str[4]= '\0'; if (OrenIicTransmit(DTT7611_DEVICE_ADDRESS_WRITE, str, 4)) { return DTT7611_SEND_CONTROL_DATA_FAILED; } if(1 == uiAgcMode){ //wait #if 0 while(ulWait != 0) ulWait --; #else OS_mDelay(1); /* 1 ms */ #endif str[0] = Cb2; str[1] = Ab; str[2]= '\0'; if (OrenIicTransmit(DTT7611_DEVICE_ADDRESS_WRITE, str, 2)) { return DTT7611_SEND_CONTROL_DATA_FAILED; } } if(2 == uiAgcMode){ //wait #if 0 while(ulWait != 0) ulWait --; #else OS_mDelay(1); /* 1 ms */ #endif str[0] = Cb2; str[1] = 0xE0; str[2]= '\0'; if (OrenIicTransmit(DTT7611_DEVICE_ADDRESS_WRITE, str, 2)) { return DTT7611_SEND_CONTROL_DATA_FAILED; } } //Send data byte if internal analog AGC mode. if(2 == uiAgcMode){ str[0] = 0x00; #if SOUND_TRAP_BYPASS str[1] = 0xD5; #else str[1] = 0xD4; #endif if (OrenIicTransmit(DTT7611_SLAVE_ADDRESS, str, 2)) { return DTT7611_SEND_CONTROL_DATA_FAILED; } str[0] = 0x01; str[1] = 0x30; if (OrenIicTransmit(DTT7611_SLAVE_ADDRESS, str, 2)) { return DTT7611_SEND_CONTROL_DATA_FAILED; } str[0] = 0x02; str[1] = 0x04; if (OrenIicTransmit(DTT7611_SLAVE_ADDRESS, str, 2)) { return DTT7611_SEND_CONTROL_DATA_FAILED; } } //Send data byte if internal digital AGC mode. if(1 == uiAgcMode){ str[0] = 0x00; #if SOUND_TRAP_BYPASS str[1] = 0xD5; #else str[1] = 0xD4; #endif if (OrenIicTransmit(DTT7611_SLAVE_ADDRESS, str, 2)) { return DTT7611_SEND_CONTROL_DATA_FAILED; } str[0] = 0x01; str[1] = 0x30; if (OrenIicTransmit(DTT7611_SLAVE_ADDRESS, str, 2)) { return DTT7611_SEND_CONTROL_DATA_FAILED; } str[0] = 0x02; str[1] = 0x24; if (OrenIicTransmit(DTT7611_SLAVE_ADDRESS, str, 2)) { return DTT7611_SEND_CONTROL_DATA_FAILED; } } //close 2nd IIC channel if( !TunerDTT7611AfterSendBytes()) return DTT7611_AFTER_SEND_BYTES_FAILED; else return DTT7611_SUCCESS; } void DTT7611InitBytes(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 DTT7611GetTunerStatusReg(unsigned char * pucStatusReg) { unsigned int uiError; #if 0 unsigned long ulWait = 1000; #endif if(NULL == pucStatusReg) return FUNCTION_RECEIVED_NULL_PARAMETER; *pucStatusReg = 0; //open 2nd IIC channel if( !TunerDTT7611BeforeSendBytes()){ return DTT7611_BEFORE_SEND_BYTES_FAILED; } //wait #if 0 while(ulWait != 0) ulWait --; #else OS_mDelay(1); /* 1 ms */ #endif *pucStatusReg = ReceiveByteOfDataFromAddress(DTT7611_SLAVE_ADDRESS,&uiError); //close 2nd IIC channel if( !TunerDTT7611AfterSendBytes()) return DTT7611_AFTER_SEND_BYTES_FAILED; return uiError; } #endif//#if NIMTN_TYPE==NIMTN_DTT7611