/* * $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 "dsthalcommon.h" #include "dsthalcfg.h" #include "S5H1409Core.h" #ifndef NIMTN_TYPE #error NIMTN_TYPE shall be defined! #endif #if 1//NIMTN_TYPE==NIMTN_DTT7611 static BOOLEAN DTT7611SetN(unsigned long ulFrequency,TYPE_TUNERDTT7611_REF_DIVIDER_RATIO iRefDividerRatio, unsigned char* pucDb1,unsigned char* pucDb2); static void DTT7611SetCP(unsigned int uiChargePump,unsigned char* pucCb); static void DTT7611SetStepSize(TYPE_TUNERDTT7611_REF_DIVIDER_RATIO iRefDividerRatio, unsigned char* pucCb,unsigned char* pucCb2); static void DTT7611SetAGC(unsigned int uiAgc, unsigned char* pucAb); static void DTT7611SetATC(unsigned int uiAgcTimeConstant,unsigned char* pucAb); static unsigned int DTT7611SendControlData(unsigned int uiAgcMode,unsigned char Db1,unsigned char Db2,unsigned char Cb,unsigned char Bb,unsigned char Ab,unsigned char Cb2); static BOOLEAN TunerDTT7611BeforeSendBytes(void); static BOOLEAN TunerDTT7611AfterSendBytes(void); static void DTT7611InitBytes(unsigned char* pucDb1,unsigned char* pucDb2,unsigned char* pucCb,unsigned char* pucBb,unsigned char* pucAb,unsigned char* pucCb2); extern UINT32 gdhlExtDbgLvl; #undef DTT7611_DEVICE_ADDRESS_WRITE #define DTT7611_DEVICE_ADDRESS_WRITE 0xC2 extern int S5H1409_IicTransmit(unsigned char chipAddr, unsigned char *pBuffer, int len ); #define TRACE_DTT7611_DEBUG 0 #define SOUND_TRAP_BYPASS 1 int Tuner_DTT7611SendFreq(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); printf("Freq=%ld, ref=%d, uiAgc=%d, AgcMode=%d, Charge=%d, ATC=%d\n", ulFrequency, iRefDividerRatio, uiAgc, uiAgcMode, uiChargePump, uiAgcTimeConstant ); if(FALSE == Tuner_DTT7611SetRFFreq(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); } BOOLEAN Tuner_DTT7611SetRFFreq(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; } static 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; } static void DTT7611SetCP(unsigned int uiChargePump, unsigned char* pucCb) { *pucCb &= 0xbf; if(60 == uiChargePump){ *pucCb &= 0xbf; } else{//280 *pucCb |= 0x40; } } static 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; } } static 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; } } static void DTT7611SetATC(unsigned int uiAgcTimeConstant,unsigned char* pucAb) { if (2 == uiAgcTimeConstant) *pucAb &= ~0x80; else if (50== uiAgcTimeConstant) *pucAb |= 0x80; } static BOOLEAN TunerDTT7611BeforeSendBytes() { if ( Sdm_1409xRepeaterEnable() ) return 0; return 1; } static BOOLEAN TunerDTT7611AfterSendBytes() { if ( Sdm_1409xRepeaterDisable() ) return 0; return 1; } static 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 (S5H1409_IicTransmit(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 (S5H1409_IicTransmit(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 (S5H1409_IicTransmit(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 (S5H1409_IicTransmit(DTT7611_SLAVE_ADDRESS, str, 2)) { return DTT7611_SEND_CONTROL_DATA_FAILED; } str[0] = 0x01; str[1] = 0x30; if (S5H1409_IicTransmit(DTT7611_SLAVE_ADDRESS, str, 2)) { return DTT7611_SEND_CONTROL_DATA_FAILED; } str[0] = 0x02; str[1] = 0x04; if (S5H1409_IicTransmit(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 (S5H1409_IicTransmit(DTT7611_SLAVE_ADDRESS, str, 2)) { return DTT7611_SEND_CONTROL_DATA_FAILED; } str[0] = 0x01; str[1] = 0x30; if (S5H1409_IicTransmit(DTT7611_SLAVE_ADDRESS, str, 2)) { return DTT7611_SEND_CONTROL_DATA_FAILED; } str[0] = 0x02; str[1] = 0x24; if (S5H1409_IicTransmit(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; } static 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; } int Tuner_GetTDA9885(void) { int stat; if ( TunerDTT7611BeforeSendBytes() == 0 ) return -1; stat = S5H_IicReadOneRegister( DTT7611_SLAVE_ADDRESS, 0x00 ); //printf("|%s| stat=0x%x\n", __FUNCTION__, stat); if ( TunerDTT7611AfterSendBytes() == 0 ) return -1; return stat; } #if 0 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 #endif//#if NIMTN_TYPE==NIMTN_DTT7611