#include #include "dsthalcommon.h" #include "TunerFQD1236.h" #include "IicComm.h" #if NIMTN_TYPE==NIMTN_FQD1236 int TunerFQD1236SendCnannel(unsigned int uiChannel,CHANNEL_TABLE_TYPE iChannelTable,TYPE_TUNERFQD1236_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; FQD1236InitBytes(&Db1,&Db2,&Cb,&Bb,&Ab,&Cb2); ulFrequency = TunerFQD1236GetFrequency(uiChannel,iChannelTable); if(0 == ulFrequency) return FQD1236_CHANNEL_DOES_NOT_FIT_ANY_FREQUENCY; if(FALSE == TunerFQD1236SetRFFreq(ulFrequency,uiAgcMode,&Bb)) return FQD1236_FREQUENCY_VALUE_OUT_OF_RANGE; if(FALSE == FQD1236SetN( ulFrequency,iRefDividerRatio,&Db1,&Db2)) return FQD1236_COULD_NOT_SET_N; FQD1236SetCP(uiChargePump,&Cb); FQD1236SetStepSize( iRefDividerRatio, &Cb,&Cb2); FQD1236SetAGC(uiAgc,&Ab); FQD1236SetATC(uiAgcTimeConstant,&Ab); // OS_DbgPrintf("uiAgcMode = %d, Db1 = 0x%x, Db2 = 0x%x, Cb = 0x%x, Bb = 0x%x, Ab = 0x%x, Cb2 = 0x%x\n", (int)uiAgcMode, (int)Db1,(int)Db2,(int)Cb,(int)Bb,(int)Ab,(int)Cb2 ); return FQD1236SendControlData(uiAgcMode,Db1,Db2,Cb,Bb,Ab,Cb2); } int TunerFQD1236SendFreq(unsigned long ulFrequency,TYPE_TUNERFQD1236_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; FQD1236InitBytes(&Db1,&Db2,&Cb,&Bb,&Ab,&Cb2); if(FALSE == TunerFQD1236SetRFFreq(ulFrequency,uiAgcMode,&Bb)) return FQD1236_FREQUENCY_VALUE_OUT_OF_RANGE; if(FALSE == FQD1236SetN( ulFrequency,iRefDividerRatio, &Db1,&Db2)) return FQD1236_COULD_NOT_SET_N; FQD1236SetCP(uiChargePump,&Cb); FQD1236SetStepSize( iRefDividerRatio, &Cb,&Cb2); FQD1236SetAGC(uiAgc,&Ab); FQD1236SetATC(uiAgcTimeConstant,&Ab); // OS_DbgPrintf("uiAgcMode = %d, Db1 = 0x%x, Db2 = 0x%x, Cb = 0x%x, Bb = 0x%x, Ab = 0x%x, Cb2 = 0x%x\n", (int)uiAgcMode, (int)Db1,(int)Db2,(int)Cb,(int)Bb,(int)Ab,(int)Cb2 ); return FQD1236SendControlData(uiAgcMode,Db1,Db2,Cb,Bb,Ab,Cb2); } int TunerFQD1236SendPicCarrier(unsigned long ulFrequency,TYPE_TUNERFQD1236_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 TunerFQD1236SendFreq(ulFrequency + 1750 ,iRefDividerRatio,uiAgc, uiAgcMode,uiChargePump, uiAgcTimeConstant); } unsigned long TunerFQD1236GetFrequency(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 - 93) * 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 - 93) * 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 TunerFQD1236SetRFFreq(unsigned long ulFrequency,unsigned int uiAgcMode,unsigned char* pucBb) { *pucBb = 0; if ((ulFrequency >= FQD1236_LOW_BAND_MIN) && (ulFrequency <= FQD1236_LOW_BAND_MAX) ) { if(1 == uiAgcMode){ *pucBb = 0x01; } else if(2 == uiAgcMode){ *pucBb = 0x11; } } else if((ulFrequency >= FQD1236_MID_BAND_MIN) && (ulFrequency <= FQD1236_MID_BAND_MAX)){ if(1 == uiAgcMode){ *pucBb = 0x02; } else if(2 == uiAgcMode){ *pucBb = 0x12; } } else if((ulFrequency >= FQD1236_HIGH_BAND_MIN) && (ulFrequency <= FQD1236_HIGH_BAND_MAX)){ if(1 == uiAgcMode){ *pucBb = 0x04; } else if(2 == uiAgcMode){ *pucBb = 0x14; } } else return FALSE; return TRUE; } BOOLEAN FQD1236SetN(unsigned long ulFrequency,TYPE_TUNERFQD1236_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 TUNERFQD1236_REF_DIVIDER_RATIO_31_25: usMultiplier = 32; break; case TUNERFQD1236_REF_DIVIDER_RATIO_50: usMultiplier = 20; break; case TUNERFQD1236_REF_DIVIDER_RATIO_62_5: usMultiplier = 16; break; case TUNERFQD1236_REF_DIVIDER_RATIO_166_7: /* FQD1236¿¡¼­´Â 166.7KHz¸¦ Áö¿øÇÏÁö ¾ÊÀ½. */ usMultiplier = 16; break; } usNval = (unsigned short)(((ulFrequency + FQD1236_F_IF_KHZ) * usMultiplier)/1000); if(usNval >= FQD1236_N_MAX){ //max n in 14 bits usNval = usNval/2 ; } // set N if (usNval == 0 || usNval >= FQD1236_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 FQD1236SetCP(unsigned int uiChargePump, unsigned char* pucCb) { *pucCb &= 0xbf; if(50 == uiChargePump){ *pucCb &= 0xbf; } else{//280 *pucCb |= 0x40; } } void FQD1236SetStepSize(TYPE_TUNERFQD1236_REF_DIVIDER_RATIO iRefDividerRatio, unsigned char* pucCb,unsigned char* pucCb2) { *pucCb &= 0xf9; *pucCb2 &= 0xf9; if (TUNERFQD1236_REF_DIVIDER_RATIO_50 == iRefDividerRatio) { *pucCb &= 0xf9; *pucCb2 &= 0xf9; } else if (TUNERFQD1236_REF_DIVIDER_RATIO_31_25 == iRefDividerRatio) { *pucCb |= 0x2; *pucCb2 |= 0x2; } else if (TUNERFQD1236_REF_DIVIDER_RATIO_166_7 == iRefDividerRatio) { *pucCb |= 0x4; *pucCb2 |= 0x4; } else if (TUNERFQD1236_REF_DIVIDER_RATIO_62_5 == iRefDividerRatio) { *pucCb |= 0x6; *pucCb2 |= 0x6; } } void FQD1236SetAGC(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; } else if (7 == uiAgc) { *pucAb |= 0x70; } } void FQD1236SetATC(unsigned int uiAgcTimeConstant,unsigned char* pucAb) { if (2 == uiAgcTimeConstant) *pucAb &= ~0x80; else if (50== uiAgcTimeConstant) *pucAb |= 0x80; } BOOLEAN TunerFQD1236BeforeSendBytes() { if(IIC_COM_SUCCESS != SendHostControl(0, 0)) return FALSE; else return TRUE; } BOOLEAN TunerFQD1236AfterSendBytes() { if(IIC_COM_SUCCESS != SendHostControl(0x80, 0)) return FALSE; else return TRUE; } unsigned int FQD1236SendControlData(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( !TunerFQD1236BeforeSendBytes()) return FQD1236_BEFORE_SEND_BYTES_FAILED; str[0] = Db1; str[1] = Db2; str[2] = Cb; str[3] = Bb; str[4]= '\0'; if (IicTransmit(FQD1236_DEVICE_ADDRESS_WRITE, str, 4)) { return FQD1236_SEND_CONTROL_DATA_FAILED; } if(1 == uiAgcMode){ //wait while(ulWait != 0) ulWait --; str[0] = Cb2; str[1] = Ab; str[2]= '\0'; if (IicTransmit(FQD1236_DEVICE_ADDRESS_WRITE, str, 2)) { return FQD1236_SEND_CONTROL_DATA_FAILED; } } #if 0 // hwatk, TO DO - TDA9885°¡ ¾ÈµÈ´Ù. //Send data byte if internal analog AGC mode. if(2 == uiAgcMode){ str[0] = 0x00; str[1] = 0xD4; //OS_DbgPrintf("%s(), line=%d\n", __FUNCTION__, __LINE__); if (IicTransmit(FQD1236_SLAVE_ADDRESS, str, 2)) { return FQD1236_SEND_CONTROL_DATA_FAILED; } //OS_DbgPrintf("%s(), line=%d\n", __FUNCTION__, __LINE__); str[0] = 0x01; str[1] = 0x30; if (IicTransmit(FQD1236_SLAVE_ADDRESS, str, 2)) { return FQD1236_SEND_CONTROL_DATA_FAILED; } //OS_DbgPrintf("%s(), line=%d\n", __FUNCTION__, __LINE__); str[0] = 0x02; str[1] = 0x04; if (IicTransmit(FQD1236_SLAVE_ADDRESS, str, 2)) { return FQD1236_SEND_CONTROL_DATA_FAILED; } } //Send data byte if internal digital AGC mode. if(1 == uiAgcMode){ str[0] = 0x00; str[1] = 0xD4; //OS_DbgPrintf("%s(), line=%d\n", __FUNCTION__, __LINE__); if (IicTransmit(FQD1236_SLAVE_ADDRESS, str, 2)) { return FQD1236_SEND_CONTROL_DATA_FAILED; } //OS_DbgPrintf("%s(), line=%d\n", __FUNCTION__, __LINE__); str[0] = 0x01; str[1] = 0x30; if (IicTransmit(FQD1236_SLAVE_ADDRESS, str, 2)) { return FQD1236_SEND_CONTROL_DATA_FAILED; } OS_DbgPrintf("%s(), line=%d\n", __FUNCTION__, __LINE__); str[0] = 0x02; str[1] = 0x24; if (IicTransmit(FQD1236_SLAVE_ADDRESS, str, 2)) { return FQD1236_SEND_CONTROL_DATA_FAILED; } } #endif //close 2nd IIC channel if( !TunerFQD1236AfterSendBytes()) return FQD1236_AFTER_SEND_BYTES_FAILED; else return FQD1236_SUCCESS; } void FQD1236InitBytes(unsigned char* pucDb1,unsigned char* pucDb2,unsigned char* pucCb,unsigned char* pucBb,unsigned char* pucAb,unsigned char* pucCb2) { *pucDb1 = 0; *pucDb2 = 0; *pucCb = 0x80; *pucBb = 0; *pucAb = 0; *pucCb2 = 0x98; } unsigned int FQD1236GetTunerStatusReg(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( !TunerFQD1236BeforeSendBytes()){ return FQD1236_BEFORE_SEND_BYTES_FAILED; } //wait OS_mDelay(1); *pucStatusReg = ReceiveByteOfDataFromAddress(FQD1236_SLAVE_ADDRESS,&uiError); //close 2nd IIC channel if( !TunerFQD1236AfterSendBytes()) return FQD1236_AFTER_SEND_BYTES_FAILED; return uiError; } #endif//NIMTN_TYPE==NIMTN_FQD1236