#include "XC3028.h" #include "XC3028InitData.h" #include "IicComm.h" #if NIMTN_TYPE==NIMTN_XC3028 unsigned long TunerXC3028GetFrequencyFromChannel(unsigned int uiChannelNumber) { unsigned long ulCenterFrequency = XC3028_CHANNEL_DOES_NOT_FIT_ANY_FREQUENCY; if ((uiChannelNumber >= 2) && (uiChannelNumber <= 6)) { switch (uiChannelNumber) { case 2: ulCenterFrequency = 57; break; case 3: ulCenterFrequency = 63; break; case 4: ulCenterFrequency = 69; break; case 5: ulCenterFrequency = 79; break; case 6: ulCenterFrequency = 85; break; } } else if ((uiChannelNumber >= 7) && (uiChannelNumber <= 13)) { ulCenterFrequency = 174 + ((uiChannelNumber - 7) * 6) + 3; } else if ((uiChannelNumber >= 14) && (uiChannelNumber <= 69)) { ulCenterFrequency = 470 + ((uiChannelNumber - 14) * 6) + 3; } return ulCenterFrequency*1000; } int TunerXC3028SendChannel(unsigned int uiChannelNumber,BOOLEAN bLoadFirmware, int iMode) { unsigned long ulCenterFrequency; ulCenterFrequency = TunerXC3028GetFrequencyFromChannel(uiChannelNumber); if(0 == ulCenterFrequency) return XC3028_CHANNEL_DOES_NOT_FIT_ANY_FREQUENCY; return TunerXC3028SendCenterFreq( ulCenterFrequency,bLoadFirmware,iMode); } int TunerXC3028SendPicCarrier(unsigned long ulFrequency,BOOLEAN bLoadFirmware, int iMode) { return TunerXC3028SendCenterFreq( ulFrequency + 1750,bLoadFirmware,iMode); } int TunerXC3028SendCenterFreq(unsigned long ulFrequency,BOOLEAN bLoadFirmware, int iMode) { unsigned long ulVal; unsigned char ucaDataToSend[4]; int iRes; //if no path then no need to load the firmware. if(TRUE == bLoadFirmware){ if(XC3028_SUCCESS != (iRes = TunerXC3028LoadFirmware(iMode))) return iRes; } //open 2nd IIC channel if(!TunerXC3028BeforeSendBytes()) return XC3028_COMMUNICATION_ERROR; //Send configuration register ucaDataToSend[0] = 0x00; ucaDataToSend[1] = 0x02; ucaDataToSend[2] = 0x00; ucaDataToSend[3] = 0x00; iRes = IicTransmit(TLSys_TunerDeviceAddress(I2CWRITE),ucaDataToSend, 4); if(IIC_COM_SUCCESS != iRes){ return iRes; } //send the value for the conf register ulVal = ((ulFrequency - 1750)*8) / 125; ucaDataToSend[0] = (unsigned char)((ulVal & 0xff000000) >> 24); ucaDataToSend[1] = (unsigned char)((ulVal & 0x00ff0000) >> 16); ucaDataToSend[2] = (unsigned char)((ulVal & 0x0000ff00) >> 8); ucaDataToSend[3] = (unsigned char)(ulVal & 0x000000ff); iRes = IicTransmit(TLSys_TunerDeviceAddress(I2CWRITE),ucaDataToSend, 4); if(IIC_COM_SUCCESS != iRes){ return iRes; } //close 2nd IIC channel if(!TunerXC3028BeforeSendBytes()) return XC3028_COMMUNICATION_ERROR; return XC3028_SUCCESS; } BOOLEAN TunerXC3028BeforeSendBytes() { if(IIC_COM_SUCCESS != SendHostControl(0, 0)) return FALSE; else return TRUE; } BOOLEAN TunerXC3028AfterSendBytes() { if(IIC_COM_SUCCESS != SendHostControl(0x80, 0)) return FALSE; else return TRUE; } int TunerXC3028LoadFirmware(int iMode) { int i,iStartIndex, iPacketLenthInBytes,iTotalNumberOfBytes; short* psaStartPacketIndexes; unsigned char *pucaData,ucSend[3]; unsigned int uiError; unsigned short usReceiveData = 0,usSendByte = 0x8000; //Set reset to the tuner using the cascade DSP code //first check if code is loaded in to the DSP SendHostControl( 0, 0); usReceiveData = ReceiveWordOfData(&uiError); if(0 != uiError){ return XC3028_COMMUNICATION_ERROR; } switch(usReceiveData & 0xff){ case 0x05: case 0x06: case 0x30: case 0x31: case 0x32: case 0x23: case 0x25: case 0x2f: case 0xff: break; default: return XC3028_DSP_MODE_NOT_DEFINED; } //send to receive5 bit 15 - reset the XC3028 ucSend[1] = (char)(usSendByte >> 8); ucSend[2] = (char)(usSendByte); if(IIC_COM_SUCCESS != SendToReceive(5, ucSend, 2)) return XC3028_COMMUNICATION_ERROR; //open 2nd IIC channel if(!TunerXC3028BeforeSendBytes()) return XC3028_COMMUNICATION_ERROR; uiError = IicTransmit(TLSys_TunerDeviceAddress(I2CWRITE),XC3028Init0, XC3028_INIT_0_SIZE_IN_BYTES); if(IIC_COM_SUCCESS != uiError){ return uiError; } for(i = 0 ; XC3028Init1StartPacketIndexes[i] != -1 ; i++ ){ if(XC3028Init1StartPacketIndexes[i+1] != -1) iPacketLenthInBytes = XC3028Init1StartPacketIndexes[i+1] - XC3028Init1StartPacketIndexes[i]; else iPacketLenthInBytes = XC3028_INIT_1_SIZE_IN_BYTES - XC3028Init1StartPacketIndexes[i]; iStartIndex = XC3028Init1StartPacketIndexes[i]; uiError = IicTransmit(TLSys_TunerDeviceAddress(I2CWRITE),&XC3028Init1[iStartIndex], iPacketLenthInBytes); if(IIC_COM_SUCCESS != uiError){ return uiError; } } if(iMode == 1){ pucaData = XC3028MnNtscPal; psaStartPacketIndexes = XC3028MnNtscPalStartPacketIndexes; iTotalNumberOfBytes = XC3028_MN_NTSC_PAL_SIZE_IN_BYTES; } else if(iMode == 0){ pucaData = XC3028Dtv6Oren1; psaStartPacketIndexes = XC3028Dtv6Oren1StartPacketIndexes; iTotalNumberOfBytes = XC3028_DTV_6_OREN_1_SIZE_IN_BYTES; } else return XC3028_DSP_MODE_NOT_DEFINED; for(i = 0 ; psaStartPacketIndexes[i] != -1 ; i++ ){ if(psaStartPacketIndexes[i+1] != -1) iPacketLenthInBytes = psaStartPacketIndexes[i+1] - psaStartPacketIndexes[i]; else{ iPacketLenthInBytes = iTotalNumberOfBytes - psaStartPacketIndexes[i]; } iStartIndex = psaStartPacketIndexes[i]; uiError = IicTransmit(TLSys_TunerDeviceAddress(I2CWRITE),&pucaData[iStartIndex], iPacketLenthInBytes); if(IIC_COM_SUCCESS != uiError){ return uiError; } } //close 2nd IIC channel if(!TunerXC3028AfterSendBytes()) return XC3028_COMMUNICATION_ERROR; return XC3028_SUCCESS; } #endif//#if NIMTN_TYPE==NIMTN_XC3028