diff options
Diffstat (limited to 'api/demodulatorextend.c')
-rw-r--r-- | api/demodulatorextend.c | 750 |
1 files changed, 750 insertions, 0 deletions
diff --git a/api/demodulatorextend.c b/api/demodulatorextend.c new file mode 100644 index 0000000..980949f --- /dev/null +++ b/api/demodulatorextend.c @@ -0,0 +1,750 @@ +#include "demodulatorextend.h" +//#include "i2cimpl.h" //for Linux +#include "usb2impl.h" +//#include "spiimpl.h" +//#include "sdioimpl.h" +//#include "i2uimpl.h" +#include "cmd.h" +//#include "i2u.h" +//#include "af9035u2iimpl.h" + +#include "Afa_AF9007.h" +#include "Afa_PEACOCK.h" +#include "Freescale_MC44CD02.h" +#include "Integrant_ITD3020.h" +#include "Maxlinear_MXL5005.h" +#include "Microtune_MT2260B0.h" +#include "Microtune_MT2266.h" +#include "Panasonic_ENV77H11D5.h" +#include "Philips_TD1316AFIHP.h" +#include "Philips_TDA18291HN.h" +#include "Xceive_XC3028L.h" +#include "Infineon_TUA9001.h" +#include "Fitipower_FC0011.h" +#include "Infineon_TUA6039.h" +#include "Philips_TDA18271.h" +#include "Philips_FQD1218ME_MK5.h" +#include "Xceive_XC4000.h" +#include "Philips_TDA18271_C2.h" +#include "Infineon_TUA8010.h" +#include "FCI_FC2580.h" +#include "Fitipower_FC0012.h" +#include "Philips_TDA18271_C2_Askey.h" +#include "Elonics_E4000.h" + +static PidInfo pidInfo; +BusDescription busDesc[] = +{ + /** 0: NULL bus */ + { + NULL, + NULL, + NULL, + NULL, + }, + /** 1: I2C bus */ + { +/* I2c_getDriver, + I2c_writeControlBus, + I2c_readControlBus, + NULL, +*/ }, + /** 2: USB bus */ + { + Usb2_getDriver, + Usb2_writeControlBus, + Usb2_readControlBus, + Usb2_readDataBus, + }, + /** 3: SPI bus */ + { +/* Spi_getDriver, + Spi_writeControlBus, + Spi_readControlBus, + Spi_readDataBus, +*/ }, + /** 4: SDIO bus */ + { +/* Sdio_getDriver, + Sdio_writeControlBus, + Sdio_readControlBus, + Sdio_readDataBus, +*/ }, + /** 5: USB11 bus */ + { + Usb2_getDriver, + Usb2_writeControlBus, + Usb2_readControlBus, + Usb2_readDataBus, + }, + /** 6: I2M bus - I2C for old mail box */ + { +/* I2u_getDriver, + I2u_writeControlBus, + I2u_readControlBus, + NULL, +*/ }, + /** 7: I2U bus - 9015 USB for old mail box */ + { +/* I2u_getDriver, + I2u_writeControlBus, + I2u_readControlBus, + NULL, +*/ }, + /** 8: I2U2 bus - 9015 USB for new mail box */ + { +/* I2u_getDriver, + I2u_writeControlBus, + I2u_readControlBus, + NULL, +*/ }, + /** 9: 9035U2I bus - 9035 USB to I2C */ + { +/* Af9035u2i_getDriver, + Af9035u2i_writeControlBus, + Af9035u2i_readControlBus, + NULL, +*/ }, +}; + +CmdDescription cmdDesc[] = +{ + /** NULL Bus */ + { + 0, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + }, + /** 1:I2C Bus */ + { + 255, + &busDesc[1], + Cmd_writeRegisters, + Cmd_writeTunerRegisters, + Cmd_writeEepromValues, + Cmd_readRegisters, + Cmd_readTunerRegisters, + Cmd_readEepromValues, + NULL, + Cmd_loadFirmware, + Cmd_reboot, + Cmd_sendCommand, + Cmd_receiveData + }, + /** 2:USB Bus */ + { + 63, + &busDesc[2], + Cmd_writeRegisters, + Cmd_writeTunerRegisters, + Cmd_writeEepromValues, + Cmd_readRegisters, + Cmd_readTunerRegisters, + Cmd_readEepromValues, + NULL, + Cmd_loadFirmware, + Cmd_reboot, + Cmd_sendCommand, + Cmd_receiveData + }, + /** 3:SPI Bus */ + { + 255, + &busDesc[3], + Cmd_writeRegisters, + Cmd_writeTunerRegisters, + Cmd_writeEepromValues, + Cmd_readRegisters, + Cmd_readTunerRegisters, + Cmd_readEepromValues, + NULL, + Cmd_loadFirmware, + Cmd_reboot, + Cmd_sendCommand, + Cmd_receiveData + }, + /** 4:SDIO Bus */ + { + 255, + &busDesc[4], + Cmd_writeRegisters, + Cmd_writeTunerRegisters, + Cmd_writeEepromValues, + Cmd_readRegisters, + Cmd_readTunerRegisters, + Cmd_readEepromValues, + NULL, + Cmd_loadFirmware, + Cmd_reboot, + Cmd_sendCommand, + Cmd_receiveData + }, + /** 5:USB11 Bus */ + { + 63, + &busDesc[5], + Cmd_writeRegisters, + Cmd_writeTunerRegisters, + Cmd_writeEepromValues, + Cmd_readRegisters, + Cmd_readTunerRegisters, + Cmd_readEepromValues, + NULL, + Cmd_loadFirmware, + Cmd_reboot, + Cmd_sendCommand, + Cmd_receiveData + }, + /** 6:I2C for old mailbox */ + { +/* 16, + &busDesc[6], + I2u_writeRegisters, + I2u_writeTunerRegisters, + NULL, + I2u_readRegisters, + I2u_readTunerRegisters, + NULL, + I2u_modifyRegister, + NULL, + NULL, + NULL, + NULL +*/ }, + /** 7:USB for old mailbox */ + { +/* 16, + &busDesc[7], + I2u_writeRegisters, + I2u_writeTunerRegisters, + NULL, + I2u_readRegisters, + I2u_readTunerRegisters, + NULL, + I2u_modifyRegister, + NULL, + NULL, + NULL, + NULL +*/ }, + /** 8:USB for new mailbox */ + { +/* 55, + &busDesc[8], + Cmd_writeRegisters, + Cmd_writeTunerRegisters, + Cmd_writeEepromValues, + Cmd_readRegisters, + Cmd_readTunerRegisters, + Cmd_readEepromValues, + NULL, + Cmd_loadFirmware, + Cmd_reboot, + Cmd_sendCommand, + Cmd_receiveData +*/ }, + /** 9:9035 USB to I2C Bus */ + { +/* 54, + &busDesc[9], + Cmd_writeRegisters, + Cmd_writeTunerRegisters, + Cmd_writeEepromValues, + Cmd_readRegisters, + Cmd_readTunerRegisters, + Cmd_readEepromValues, + NULL, + Cmd_loadFirmware, + Cmd_reboot, + Cmd_sendCommand, + Cmd_receiveData +*/ }, +}; + +Dword Demodulator_setBusTuner ( + IN Demodulator* demodulator, + IN Word busId, + IN Word tunerId +) { + Dword error = Error_NO_ERROR; + + Ganymede* ganymede; + + ganymede = (Ganymede*) demodulator; + + ganymede->cmdDescription = &cmdDesc[busId]; + ganymede->busId = busId; + +/* if (busId == Bus_I2U2) { + I2u_setChipAddress (demodulator, 0x38); + } +*/ + switch (tunerId) + { + case Tuner_Afatech_AF9007: + ganymede->tunerDescription = &tuner_AF9007; + break; + case Tuner_Panasonic_ENV77H11D5: + ganymede->tunerDescription = &tuner_ENV77H11D5; + break; + case Tuner_Philip_TD1316AFIHP: + ganymede->tunerDescription = &tuner_TD1316AFIHP; + break; + case Tuner_Maxlinear_MXL5005: + ganymede->tunerDescription = &tuner_MXL5005; + break; + case Tuner_Freescale_MC44CD02: + ganymede->tunerDescription = &tuner_MC44CD02; + break; + case Tuner_Microtune_MT2260B0: + ganymede->tunerDescription = &tuner_MT2260B0; + break; + case Tuner_Philips_TDA18291HN: + ganymede->tunerDescription = &tuner_TDA18291HN; + break; + case Tuner_Microtune_MT2266: + ganymede->tunerDescription = &tuner_MT2266; + MT2266_supportTA4029CTC ((Demodulator*) &ganymede, 0); + break; + case Tuner_Integrant_ITD3020: + ganymede->tunerDescription = &tuner_ITD3020; + break; + case Tuner_Afatech_PEACOCK: + ganymede->tunerDescription = &tuner_PEACOCK; + break; + case Tuner_Xceive_XC3028L: + ganymede->tunerDescription = &tuner_XC3028L; + break; + case Tuner_Infineon_TUA9001: + ganymede->tunerDescription = &tuner_TUA9001; + break; + case Tuner_Fitipower_FC0011: + ganymede->tunerDescription = &tuner_FC0011; + break; + case Tuner_Infineon_TUA6039: + ganymede->tunerDescription = &tuner_TUA6039; + break; + case Tuner_Philips_TDA18271: + ganymede->tunerDescription = &tuner_TDA18271; + break; + case Tuner_Philips_FQD1218ME_MK5: + ganymede->tunerDescription = &tuner_FQD1218ME_MK5; + break; + case Tuner_Xceive_XC4000: + ganymede->tunerDescription = &tuner_XC4000; + break; + case Tuner_Philips_TDA18271_C2: + ganymede->tunerDescription = &tuner_TDA18271_C2; + break; + case Tuner_Infineon_TUA8010: + ganymede->tunerDescription = &tuner_TUA8010; + break; + case Tuner_FCI_FC2580: + ganymede->tunerDescription = &tuner_FC2580; + break; + case Tuner_Microtune_MT2266_TA4029CTC: + ganymede->tunerDescription = &tuner_MT2266; + MT2266_supportTA4029CTC ((Demodulator*) &ganymede, 1); + break; + case Tuner_Fitipower_FC0012: + ganymede->tunerDescription = &tuner_FC0012; + break; + case Tuner_Philips_TDA18271_C2_Askey: + ganymede->tunerDescription = &tuner_TDA18271_C2_Askey; + break; + case Tuner_Elonics_E4000: + ganymede->tunerDescription = &tuner_E4000; + break; + default: + error = Error_INVALID_TUNER_TYPE; + goto exit; + break; + } + + if (ganymede->tunerDescription->tunerScript == NULL) { + ganymede->tunerDescription->tunerScript = NULL; + ganymede->tunerDescription->tunerScriptSets = NULL; + } + + +exit: + return(error); +} +Dword Demodulator_getChannelStatistic ( + IN Demodulator* demodulator, + IN Byte chip, + OUT ChannelStatistic* channelStatistic +) { + Dword error = Error_NO_ERROR; + +#if User_USE_DRIVER + DWORD number; + BOOL result; + GetChannelStatisticRequest request; + Ganymede* ganymede; + + ganymede = (Ganymede*) demodulator; + + if (ganymede->driver != NULL) { + request.chip = chip; + request.channelStatistic = channelStatistic; + result = DeviceIoControl ( + ganymede->driver, + IOCTL_AFA_DEMOD_GETCHANNELSTATISTIC, + &request, + sizeof (request), + NULL, + 0, + &number, + NULL + ); + error = request.error; + } else { + error = Error_DRIVER_INVALID; + } +#else + Dword postErrCnt; + Dword postBitCnt; + Word rsdAbortCnt; + Ganymede* ganymede; + + + ganymede = (Ganymede*) demodulator; + + + /** Get BER if couter is ready, error = Error_RSD_COUNTER_NOT_READY if counter is not ready */ + if (ganymede->architecture == Architecture_PIP) { + error = Standard_getPostVitBer (demodulator, chip, &postErrCnt, &postBitCnt, &rsdAbortCnt); + if (error == Error_NO_ERROR) { + ganymede->channelStatistic[chip].postVitErrorCount = postErrCnt; + ganymede->channelStatistic[chip].postVitBitCount = postBitCnt; + ganymede->channelStatistic[chip].abortCount = rsdAbortCnt; + } + } else { + error = Standard_getPostVitBer (demodulator, 0, &postErrCnt, &postBitCnt, &rsdAbortCnt); + if (error == Error_NO_ERROR) { + ganymede->channelStatistic[chip].postVitErrorCount = postErrCnt; + ganymede->channelStatistic[chip].postVitBitCount = postBitCnt; + ganymede->channelStatistic[chip].abortCount = rsdAbortCnt; + } + } + + *channelStatistic = ganymede->channelStatistic[chip]; + +#endif + + return (error); +} +Dword Demodulator_addPid ( + IN Demodulator* demodulator, + IN Byte chip, + IN Pid pid +) { + Dword error = Error_NO_ERROR; + +#if User_USE_DRIVER + DWORD number; + BOOL result; + AddPidRequest request; + Ganymede* ganymede; + + ganymede = (Ganymede*) demodulator; + + if (ganymede->driver != NULL) { + request.chip = chip; + request.pid = pid; + result = DeviceIoControl ( + ganymede->driver, + IOCTL_AFA_DEMOD_ADDPID, + &request, + sizeof (request), + NULL, + 0, + &number, + NULL + ); + error = request.error; + } else { + error = Error_DRIVER_INVALID; + } +#else + Byte writeBuffer[2]; + Byte i, j; + Bool found; + Ganymede* ganymede; + + ganymede = (Ganymede*) demodulator; + + if (pidInfo.pidinit == False) { + for (i = 0; i < ganymede->chipNumber; i++) { + for (j = 0; j < 32; j++) { + pidInfo.pidtable[i].pid[j] = 0xFFFF; + } + } + pidInfo.pidinit = True; + } + + /** Enable pid filter */ + if (pidInfo.pidcount == 0) { + error = Standard_writeRegisterBits (demodulator, chip, Processor_OFDM, p_mp2if_pid_en, mp2if_pid_en_pos, mp2if_pid_en_len, 1); + if (error) goto exit; + } else { + found = False; + for (i = 0; i < 32; i++) { + if (pidInfo.pidtable[chip].pid[i] == pid.value) { + found = True; + break; + } + } + if (found == True) + goto exit; + } + + for (i = 0; i < 32; i++) { + if (pidInfo.pidtable[chip].pid[i] == 0xFFFF) + break; + } + if (i == 32) { + error = Error_PID_FILTER_FULL; + goto exit; + } + + writeBuffer[0] = (Byte) pid.value; + writeBuffer[1] = (Byte) (pid.value >> 8); + + error = Standard_writeRegisters (demodulator, chip, Processor_OFDM, p_mp2if_pid_dat_l, 2, writeBuffer); + if (error) goto exit; + + error = Standard_writeRegisterBits (demodulator, chip, Processor_OFDM, p_mp2if_pid_index_en, mp2if_pid_index_en_pos, mp2if_pid_index_en_len, 1); + if (error) goto exit; + + error = Standard_writeRegister (demodulator, chip, Processor_OFDM, p_mp2if_pid_index, i); + if (error) goto exit; + + pidInfo.pidtable[chip].pid[i] = pid.value; + pidInfo.pidcount++; + +exit : +#endif + + return (error); +} + + +Dword Demodulator_addPidAt ( + IN Demodulator* demodulator, + IN Byte chip, + IN Byte index, + IN Pid pid +) { + return (Demodulator_addPidToFilter (demodulator, chip, index, pid)); +} + + +Dword Demodulator_removePid ( + IN Demodulator* demodulator, + IN Byte chip, + IN Pid pid +) { + Dword error = Error_NO_ERROR; + +#if User_USE_DRIVER + DWORD number; + BOOL result; + RemovePidRequest request; + Ganymede* ganymede; + + ganymede = (Ganymede*) demodulator; + + if (ganymede->driver != NULL) { + request.chip = chip; + request.pid = pid; + result = DeviceIoControl ( + ganymede->driver, + IOCTL_AFA_DEMOD_REMOVEPID, + &request, + sizeof (request), + NULL, + 0, + &number, + NULL + ); + error = request.error; + } else { + error = Error_DRIVER_INVALID; + } +#else + Byte i; + Bool found; + Interrupts interrupts; + Ganymede* ganymede; + + ganymede = (Ganymede*) demodulator; + + found = False; + for (i = 0; i < 32; i++) { + if (pidInfo.pidtable[chip].pid[i] == pid.value) { + found = True; + break; + } + } + if (found == False) + goto exit; + + error = Standard_writeRegisterBits (demodulator, chip, Processor_OFDM, p_mp2if_pid_index_en, mp2if_pid_index_en_pos, mp2if_pid_index_en_len, 0); + if (error) goto exit; + + error = Standard_writeRegister (demodulator, chip, Processor_OFDM, p_mp2if_pid_index, i); + if (error) goto exit; + + pidInfo.pidtable[chip].pid[i] = 0xFFFF; + + /** Disable pid filter */ + if (pidInfo.pidcount == 1) { + error = Standard_writeRegisterBits (demodulator, chip, Processor_OFDM, p_mp2if_pid_en, mp2if_pid_en_pos, mp2if_pid_en_len, 0); + + error = Standard_getInterrupts (demodulator, &interrupts); + if (error) goto exit; + if (interrupts & Interrupt_DVBT) { + error = Standard_clearInterrupt (demodulator, Interrupt_DVBT); + if (error) goto exit; + } + } + + pidInfo.pidcount--; + +exit : +#endif + + return (error); +} + + +Dword Demodulator_removePidAt ( + IN Demodulator* demodulator, + IN Byte chip, + IN Byte index, + IN Pid pid +) { + Dword error = Error_NO_ERROR; + +#if User_USE_DRIVER + DWORD number; + BOOL result; + RemovePidAtRequest request; + Ganymede* ganymede; + + ganymede = (Ganymede*) demodulator; + + if (ganymede->driver != NULL) { + request.chip = chip; + request.index = index; + request.pid = pid; + result = DeviceIoControl ( + ganymede->driver, + IOCTL_AFA_DEMOD_REMOVEPIDAT, + &request, + sizeof (request), + NULL, + 0, + &number, + NULL + ); + error = request.error; + } else { + error = Error_DRIVER_INVALID; + } +#else + Ganymede* ganymede; + + ganymede = (Ganymede*) demodulator; + + error = Standard_writeRegisterBits (demodulator, chip, Processor_OFDM, p_mp2if_pid_index_en, mp2if_pid_index_en_pos, mp2if_pid_index_en_len, 0); + if (error) goto exit; + + error = Standard_writeRegister (demodulator, chip, Processor_OFDM, p_mp2if_pid_index, index); + if (error) goto exit; +exit : +#endif + + return (error); +} + + +Dword Demodulator_resetPid ( + IN Demodulator* demodulator, + IN Byte chip +) { + Dword error = Error_NO_ERROR; + +#if User_USE_DRIVER +#else + Byte i; + Ganymede* ganymede; + + ganymede = (Ganymede*) demodulator; + + for (i = 0; i < 32; i++) { + pidInfo.pidtable[chip].pid[i] = 0xFFFF; + } + error = Standard_writeRegisterBits (demodulator, chip, Processor_OFDM, p_mp2if_pid_rst, mp2if_pid_rst_pos, mp2if_pid_rst_len, 1); + if (error) goto exit; + + pidInfo.pidcount = 0; + +exit : +#endif + + return (error); +} + + +#if UNDER_CE +#else +extern long ActiveSync; +#endif + +Dword Demodulator_controlActiveSync ( + IN Demodulator* demodulator, + IN Byte control +) { +#if UNDER_CE +//#else //for Linux + if (control == 0) + ActiveSync = 0; + else + ActiveSync = 1; +#endif + + return (Error_NO_ERROR); +} + + +Dword Demodulator_setStatisticRange ( + IN Demodulator* demodulator, + IN Byte chip, + IN Byte superFrameCount, + IN Word packetUnit +) { + return (Demodulator_setViterbiRange (demodulator, chip, superFrameCount, packetUnit)); +} + + +Dword Demodulator_getStatisticRange ( + IN Demodulator* demodulator, + IN Byte chip, + IN Byte* superFrameCount, + IN Word* packetUnit +) { + return (Demodulator_getViterbiRange (demodulator, chip, superFrameCount, packetUnit)); +} |