| 1 | #include "XC3028.h" |
|---|
| 2 | #include "XC3028InitData.h" |
|---|
| 3 | #include "IicComm.h" |
|---|
| 4 | #if NIMTN_TYPE==NIMTN_XC3028 |
|---|
| 5 | unsigned long TunerXC3028GetFrequencyFromChannel(unsigned int uiChannelNumber) |
|---|
| 6 | { |
|---|
| 7 | unsigned long ulCenterFrequency = XC3028_CHANNEL_DOES_NOT_FIT_ANY_FREQUENCY; |
|---|
| 8 | if ((uiChannelNumber >= 2) && (uiChannelNumber <= 6)) { |
|---|
| 9 | switch (uiChannelNumber) { |
|---|
| 10 | case 2: |
|---|
| 11 | ulCenterFrequency = 57; |
|---|
| 12 | break; |
|---|
| 13 | case 3: |
|---|
| 14 | ulCenterFrequency = 63; |
|---|
| 15 | break; |
|---|
| 16 | case 4: |
|---|
| 17 | ulCenterFrequency = 69; |
|---|
| 18 | break; |
|---|
| 19 | case 5: |
|---|
| 20 | ulCenterFrequency = 79; |
|---|
| 21 | break; |
|---|
| 22 | case 6: |
|---|
| 23 | ulCenterFrequency = 85; |
|---|
| 24 | break; |
|---|
| 25 | } |
|---|
| 26 | } |
|---|
| 27 | else if ((uiChannelNumber >= 7) && (uiChannelNumber <= 13)) { |
|---|
| 28 | ulCenterFrequency = 174 + ((uiChannelNumber - 7) * 6) + 3; |
|---|
| 29 | } |
|---|
| 30 | else if ((uiChannelNumber >= 14) && (uiChannelNumber <= 69)) { |
|---|
| 31 | ulCenterFrequency = 470 + ((uiChannelNumber - 14) * 6) + 3; |
|---|
| 32 | } |
|---|
| 33 | |
|---|
| 34 | return ulCenterFrequency*1000; |
|---|
| 35 | } |
|---|
| 36 | |
|---|
| 37 | int TunerXC3028SendChannel(unsigned int uiChannelNumber,BOOLEAN bLoadFirmware, int iMode) |
|---|
| 38 | { |
|---|
| 39 | unsigned long ulCenterFrequency; |
|---|
| 40 | ulCenterFrequency = TunerXC3028GetFrequencyFromChannel(uiChannelNumber); |
|---|
| 41 | if(0 == ulCenterFrequency) |
|---|
| 42 | return XC3028_CHANNEL_DOES_NOT_FIT_ANY_FREQUENCY; |
|---|
| 43 | |
|---|
| 44 | return TunerXC3028SendCenterFreq( ulCenterFrequency,bLoadFirmware,iMode); |
|---|
| 45 | |
|---|
| 46 | |
|---|
| 47 | } |
|---|
| 48 | |
|---|
| 49 | int TunerXC3028SendPicCarrier(unsigned long ulFrequency,BOOLEAN bLoadFirmware, int iMode) |
|---|
| 50 | { |
|---|
| 51 | return TunerXC3028SendCenterFreq( ulFrequency + 1750,bLoadFirmware,iMode); |
|---|
| 52 | } |
|---|
| 53 | |
|---|
| 54 | int TunerXC3028SendCenterFreq(unsigned long ulFrequency,BOOLEAN bLoadFirmware, int iMode) |
|---|
| 55 | { |
|---|
| 56 | unsigned long ulVal; |
|---|
| 57 | unsigned char ucaDataToSend[4]; |
|---|
| 58 | int iRes; |
|---|
| 59 | //if no path then no need to load the firmware. |
|---|
| 60 | if(TRUE == bLoadFirmware){ |
|---|
| 61 | if(XC3028_SUCCESS != (iRes = TunerXC3028LoadFirmware(iMode))) |
|---|
| 62 | return iRes; |
|---|
| 63 | } |
|---|
| 64 | |
|---|
| 65 | //open 2nd IIC channel |
|---|
| 66 | if(!TunerXC3028BeforeSendBytes()) |
|---|
| 67 | return XC3028_COMMUNICATION_ERROR; |
|---|
| 68 | |
|---|
| 69 | //Send configuration register |
|---|
| 70 | ucaDataToSend[0] = 0x00; |
|---|
| 71 | ucaDataToSend[1] = 0x02; |
|---|
| 72 | ucaDataToSend[2] = 0x00; |
|---|
| 73 | ucaDataToSend[3] = 0x00; |
|---|
| 74 | |
|---|
| 75 | |
|---|
| 76 | iRes = IicTransmit(TLSys_TunerDeviceAddress(I2CWRITE),ucaDataToSend, 4); |
|---|
| 77 | if(IIC_COM_SUCCESS != iRes){ |
|---|
| 78 | return iRes; |
|---|
| 79 | } |
|---|
| 80 | |
|---|
| 81 | //send the value for the conf register |
|---|
| 82 | ulVal = ((ulFrequency - 1750)*8) / 125; |
|---|
| 83 | ucaDataToSend[0] = (unsigned char)((ulVal & 0xff000000) >> 24); |
|---|
| 84 | ucaDataToSend[1] = (unsigned char)((ulVal & 0x00ff0000) >> 16); |
|---|
| 85 | ucaDataToSend[2] = (unsigned char)((ulVal & 0x0000ff00) >> 8); |
|---|
| 86 | ucaDataToSend[3] = (unsigned char)(ulVal & 0x000000ff); |
|---|
| 87 | |
|---|
| 88 | iRes = IicTransmit(TLSys_TunerDeviceAddress(I2CWRITE),ucaDataToSend, 4); |
|---|
| 89 | if(IIC_COM_SUCCESS != iRes){ |
|---|
| 90 | return iRes; |
|---|
| 91 | } |
|---|
| 92 | |
|---|
| 93 | //close 2nd IIC channel |
|---|
| 94 | if(!TunerXC3028BeforeSendBytes()) |
|---|
| 95 | return XC3028_COMMUNICATION_ERROR; |
|---|
| 96 | |
|---|
| 97 | return XC3028_SUCCESS; |
|---|
| 98 | } |
|---|
| 99 | |
|---|
| 100 | BOOLEAN TunerXC3028BeforeSendBytes() |
|---|
| 101 | { |
|---|
| 102 | |
|---|
| 103 | if(IIC_COM_SUCCESS != SendHostControl(0, 0)) |
|---|
| 104 | return FALSE; |
|---|
| 105 | else |
|---|
| 106 | return TRUE; |
|---|
| 107 | } |
|---|
| 108 | |
|---|
| 109 | BOOLEAN TunerXC3028AfterSendBytes() |
|---|
| 110 | { |
|---|
| 111 | if(IIC_COM_SUCCESS != SendHostControl(0x80, 0)) |
|---|
| 112 | return FALSE; |
|---|
| 113 | else |
|---|
| 114 | return TRUE; |
|---|
| 115 | } |
|---|
| 116 | |
|---|
| 117 | |
|---|
| 118 | int TunerXC3028LoadFirmware(int iMode) |
|---|
| 119 | { |
|---|
| 120 | int i,iStartIndex, iPacketLenthInBytes,iTotalNumberOfBytes; |
|---|
| 121 | short* psaStartPacketIndexes; |
|---|
| 122 | unsigned char *pucaData,ucSend[3]; |
|---|
| 123 | unsigned int uiError; |
|---|
| 124 | unsigned short usReceiveData = 0,usSendByte = 0x8000; |
|---|
| 125 | |
|---|
| 126 | |
|---|
| 127 | //Set reset to the tuner using the cascade DSP code |
|---|
| 128 | //first check if code is loaded in to the DSP |
|---|
| 129 | SendHostControl( 0, 0); |
|---|
| 130 | |
|---|
| 131 | usReceiveData = ReceiveWordOfData(&uiError); |
|---|
| 132 | if(0 != uiError){ |
|---|
| 133 | return XC3028_COMMUNICATION_ERROR; |
|---|
| 134 | } |
|---|
| 135 | |
|---|
| 136 | switch(usReceiveData & 0xff){ |
|---|
| 137 | case 0x05: |
|---|
| 138 | case 0x06: |
|---|
| 139 | case 0x30: |
|---|
| 140 | case 0x31: |
|---|
| 141 | case 0x32: |
|---|
| 142 | case 0x23: |
|---|
| 143 | case 0x25: |
|---|
| 144 | case 0x2f: |
|---|
| 145 | case 0xff: |
|---|
| 146 | break; |
|---|
| 147 | default: |
|---|
| 148 | return XC3028_DSP_MODE_NOT_DEFINED; |
|---|
| 149 | } |
|---|
| 150 | //send to receive5 bit 15 - reset the XC3028 |
|---|
| 151 | ucSend[1] = (char)(usSendByte >> 8); |
|---|
| 152 | ucSend[2] = (char)(usSendByte); |
|---|
| 153 | |
|---|
| 154 | |
|---|
| 155 | if(IIC_COM_SUCCESS != SendToReceive(5, ucSend, 2)) |
|---|
| 156 | return XC3028_COMMUNICATION_ERROR; |
|---|
| 157 | |
|---|
| 158 | //open 2nd IIC channel |
|---|
| 159 | if(!TunerXC3028BeforeSendBytes()) |
|---|
| 160 | return XC3028_COMMUNICATION_ERROR; |
|---|
| 161 | |
|---|
| 162 | uiError = IicTransmit(TLSys_TunerDeviceAddress(I2CWRITE),XC3028Init0, XC3028_INIT_0_SIZE_IN_BYTES); |
|---|
| 163 | if(IIC_COM_SUCCESS != uiError){ |
|---|
| 164 | return uiError; |
|---|
| 165 | } |
|---|
| 166 | |
|---|
| 167 | |
|---|
| 168 | |
|---|
| 169 | for(i = 0 ; XC3028Init1StartPacketIndexes[i] != -1 ; i++ ){ |
|---|
| 170 | if(XC3028Init1StartPacketIndexes[i+1] != -1) |
|---|
| 171 | iPacketLenthInBytes = XC3028Init1StartPacketIndexes[i+1] - XC3028Init1StartPacketIndexes[i]; |
|---|
| 172 | else |
|---|
| 173 | iPacketLenthInBytes = XC3028_INIT_1_SIZE_IN_BYTES - XC3028Init1StartPacketIndexes[i]; |
|---|
| 174 | |
|---|
| 175 | iStartIndex = XC3028Init1StartPacketIndexes[i]; |
|---|
| 176 | uiError = IicTransmit(TLSys_TunerDeviceAddress(I2CWRITE),&XC3028Init1[iStartIndex], iPacketLenthInBytes); |
|---|
| 177 | if(IIC_COM_SUCCESS != uiError){ |
|---|
| 178 | return uiError; |
|---|
| 179 | } |
|---|
| 180 | |
|---|
| 181 | } |
|---|
| 182 | |
|---|
| 183 | |
|---|
| 184 | |
|---|
| 185 | |
|---|
| 186 | |
|---|
| 187 | if(iMode == 1){ |
|---|
| 188 | pucaData = XC3028MnNtscPal; |
|---|
| 189 | psaStartPacketIndexes = XC3028MnNtscPalStartPacketIndexes; |
|---|
| 190 | iTotalNumberOfBytes = XC3028_MN_NTSC_PAL_SIZE_IN_BYTES; |
|---|
| 191 | } |
|---|
| 192 | else if(iMode == 0){ |
|---|
| 193 | pucaData = XC3028Dtv6Oren1; |
|---|
| 194 | psaStartPacketIndexes = XC3028Dtv6Oren1StartPacketIndexes; |
|---|
| 195 | iTotalNumberOfBytes = XC3028_DTV_6_OREN_1_SIZE_IN_BYTES; |
|---|
| 196 | } |
|---|
| 197 | else |
|---|
| 198 | return XC3028_DSP_MODE_NOT_DEFINED; |
|---|
| 199 | |
|---|
| 200 | for(i = 0 ; psaStartPacketIndexes[i] != -1 ; i++ ){ |
|---|
| 201 | if(psaStartPacketIndexes[i+1] != -1) |
|---|
| 202 | iPacketLenthInBytes = psaStartPacketIndexes[i+1] - psaStartPacketIndexes[i]; |
|---|
| 203 | else{ |
|---|
| 204 | iPacketLenthInBytes = iTotalNumberOfBytes - psaStartPacketIndexes[i]; |
|---|
| 205 | } |
|---|
| 206 | iStartIndex = psaStartPacketIndexes[i]; |
|---|
| 207 | uiError = IicTransmit(TLSys_TunerDeviceAddress(I2CWRITE),&pucaData[iStartIndex], iPacketLenthInBytes); |
|---|
| 208 | if(IIC_COM_SUCCESS != uiError){ |
|---|
| 209 | return uiError; |
|---|
| 210 | } |
|---|
| 211 | |
|---|
| 212 | } |
|---|
| 213 | |
|---|
| 214 | //close 2nd IIC channel |
|---|
| 215 | if(!TunerXC3028AfterSendBytes()) |
|---|
| 216 | return XC3028_COMMUNICATION_ERROR; |
|---|
| 217 | |
|---|
| 218 | return XC3028_SUCCESS; |
|---|
| 219 | } |
|---|
| 220 | |
|---|
| 221 | #endif//#if NIMTN_TYPE==NIMTN_XC3028 |
|---|