#include "af903x.h" #include "firmware.h" #define FW_VER 0x08060000 int dvb_usb_af903x_debug; module_param_named(debug,dvb_usb_af903x_debug, int, 0644); MODULE_PARM_DESC(debug, "set debugging level.(info=1,deb_fw=2,deb_fwdata=4,deb_data=8)" DVB_USB_DEBUG_STATUS); struct usb_device *udevs; PDEVICE_CONTEXT PDC; static DEFINE_MUTEX(mymutex); //************** DRV_ *************// static DWORD DRV_IrTblDownload(IN void * handle) { DWORD dwError = Error_NO_ERROR; PDEVICE_CONTEXT pdc = (PDEVICE_CONTEXT)handle; struct file *filp; unsigned char b_buf[512] ; int fileSize; mm_segment_t oldfs; deb_data("- Enter %s Function -\n",__FUNCTION__); oldfs=get_fs(); set_fs(KERNEL_DS); filp=filp_open("/lib/firmware/af35irtbl.bin", O_RDWR,0644); if ( IS_ERR(filp) ) { printk(" LoadIrTable : Can't open file\n");goto exit;} if ( (filp->f_op) == NULL ) { printk(" LoadIrTable : File Operation Method Error!!\n");goto exit;} deb_data("/lib/firmware/af35irtbl.bin - fw loaded"); filp->f_pos=0x00; fileSize = filp->f_op->read(filp,b_buf,sizeof(b_buf),&filp->f_pos); //for(i=0; iDemodulator, (Word)fileSize, b_buf); if (dwError) {printk("Demodulator_loadIrTable fail"); goto exit;} filp_close(filp, NULL); set_fs(oldfs); return (dwError); exit: printk("LoadIrTable fail!\n"); return (dwError); } static DWORD DRV_GetEEPROMConfig2( void * handle, BYTE ucSlaveDemod) { DWORD dwError = Error_NO_ERROR; tWORD shift = 0; PDEVICE_CONTEXT pdc = (PDEVICE_CONTEXT)handle; BYTE btmp = 0; deb_data("- Enter %s Function -",__FUNCTION__); if(ucSlaveDemod) shift = EEPROM_SHIFT; dwError = Demodulator_readRegisters((Demodulator*) &pdc->Demodulator, 0, Processor_LINK, EEPROM_TUNERID+shift, 1, &btmp); if (dwError) goto exit; deb_data("EEPROM_TUNERID%d = 0x%02X\n", ucSlaveDemod, btmp); PTI.TunerId = btmp; exit: return(dwError); } static DWORD DRV_SetFreqBw( void* handle, BYTE ucSlaveDemod, DWORD dwFreq, WORD ucBw ) { DWORD dwError = Error_NO_ERROR; PDEVICE_CONTEXT pdc = (PDEVICE_CONTEXT)handle; Bool bLock = true; deb_data("- Enter %s Function -\n ",__FUNCTION__); deb_data(" ucSlaveDemod = %d, Freq= %d, BW=%d\n", (int) ucSlaveDemod, (int) dwFreq, (int) ucBw); if (pdc->fc[ucSlaveDemod].bEnPID) { Demodulator_resetPid((Demodulator*) &pdc->Demodulator, ucSlaveDemod); //Disable PID filter Demodulator_writeRegisterBits ((Demodulator*) &pdc->Demodulator, ucSlaveDemod, Processor_OFDM, p_mp2if_pid_en, mp2if_pid_en_pos, mp2if_pid_en_len, 0); pdc->fc[ucSlaveDemod].bEnPID = 0; } PTI.bSettingFreq = true; //before acquireChannel, it is ture; otherwise, it is false if(dwFreq) { pdc->fc[ucSlaveDemod].ulDesiredFrequency = dwFreq; } else { dwFreq = pdc->fc[ucSlaveDemod].ulDesiredFrequency; } if(ucBw) { pdc->fc[ucSlaveDemod].ucDesiredBandWidth = ucBw*1000; } else { ucBw = pdc->fc[ucSlaveDemod].ucDesiredBandWidth; } deb_data(" Real Freq= %d, BW=%d\n", (int) pdc->fc[ucSlaveDemod].ulDesiredFrequency, (int) pdc->fc[ucSlaveDemod].ucDesiredBandWidth); if(!PTI.bTunerInited){ deb_data(" Skip SetFreq - Tuner is still off!\n"); goto exit; } PTI.bTunerOK = false; if (pdc->fc[ucSlaveDemod].ulDesiredFrequency!=0 && pdc->fc[ucSlaveDemod].ucDesiredBandWidth!=0) { deb_data(" AcquireChannel : Real Freq= %d, BW=%d\n",(int) pdc->fc[ucSlaveDemod].ulDesiredFrequency,(int) pdc->fc[ucSlaveDemod].ucDesiredBandWidth); dwError = Demodulator_acquireChannel ((Demodulator*) &pdc->Demodulator, ucSlaveDemod, pdc->fc[ucSlaveDemod].ucDesiredBandWidth, pdc->fc[ucSlaveDemod].ulDesiredFrequency); //PTI.bSettingFreq = false; if (dwError) { printk(" Demod_acquireChannel fail! 0x%08x\n", (int) dwError); goto exit; } else //when success acquireChannel, record currentFreq/currentBW. { pdc->fc[ucSlaveDemod].ulCurrentFrequency = pdc->fc[ucSlaveDemod].ulDesiredFrequency; pdc->fc[ucSlaveDemod].ucCurrentBandWidth = pdc->fc[ucSlaveDemod].ucDesiredBandWidth; } } if(pdc->StreamType == StreamType_DVBT_DATAGRAM) { PDC->fc[ucSlaveDemod].OvrFlwChk = 5; } if (pdc->fc[ucSlaveDemod].ulDesiredFrequency!=0 && pdc->fc[ucSlaveDemod].ucDesiredBandWidth!=0) { // patch for Demodulator_isLocked mdelay(700); dwError= Demodulator_isLocked((Demodulator*) &pdc->Demodulator, ucSlaveDemod, &bLock); if(dwError) deb_data(" Demodulator_isLocked is failed!\n"); else { deb_data(" The signal is %s Lock\n", bLock?"":"not"); //patch for mce channel change lag if(bLock) { mdelay(500); } } } PTI.bTunerOK = true; exit: PTI.bSettingFreq = false; return(dwError); } DWORD DRV_ResetPID( IN void* handle, IN BYTE chip){ DWORD dwError = Error_NO_ERROR; PDEVICE_CONTEXT pdc = (PDEVICE_CONTEXT)handle; deb_data("- Enter %s Function -\n ",__FUNCTION__); //Clear pidTable dwError = Demodulator_resetPid ((Demodulator*) &pdc->Demodulator, chip); return(dwError); } DWORD DRV_AddPID( IN void* handle, IN BYTE ucSlaveDemod, IN Byte index, IN Pid pid ) { DWORD dwError = Error_NO_ERROR; PDEVICE_CONTEXT pdc = (PDEVICE_CONTEXT)handle; deb_data("- Enter %s Function - , index:%d, pid:%x \n",__FUNCTION__, index, pid.value); dwError = Demodulator_addPidToFilter ((Demodulator*) &pdc->Demodulator, ucSlaveDemod,index, pid); return(dwError); } DWORD DRV_RemovePID( IN void* handle, IN BYTE ucSlaveDemod, IN Byte index, IN Pid pid ) { DWORD dwError = Error_NO_ERROR; PDEVICE_CONTEXT pdc = (PDEVICE_CONTEXT)handle; deb_data("- Enter %s Function - , index:%d, pid:%x \n",__FUNCTION__, index, pid.value); dwError = Demodulator_removePidAt ((Demodulator*) &pdc->Demodulator, ucSlaveDemod,index, pid); return(dwError); } DWORD DRV_PIDOnOff( IN void * handle, IN BYTE ucSlaveDemod, IN bool bOn ) { DWORD dwError = Error_NO_ERROR; PDEVICE_CONTEXT pdc = (PDEVICE_CONTEXT)handle; deb_data("- Enter %s Function -onoff:%d\n ",__FUNCTION__, bOn); if (bOn) dwError = Demodulator_controlPidFilter ((Demodulator*) &pdc->Demodulator, ucSlaveDemod, 1); else dwError = Demodulator_controlPidFilter ((Demodulator*) &pdc->Demodulator, ucSlaveDemod, 0); return(dwError); } static DWORD DRV_isLocked( void* handle, BYTE ucSlaveDemod, Bool* bLock ) { DWORD dwError = Error_NO_ERROR; PDEVICE_CONTEXT pdc = (PDEVICE_CONTEXT)handle; *bLock = true; deb_data("- Enter %s Function -\n ",__FUNCTION__); dwError= Demodulator_isLocked((Demodulator*) &pdc->Demodulator, ucSlaveDemod, bLock); if(dwError) deb_data(" Demodulator_isLocked is failed!\n"); else deb_data(" The chip=%d signal is %s Lock\n", ucSlaveDemod, *bLock?"":"not"); return(dwError); } static DWORD DRV_getSignalStrength( void* handle, BYTE ucSlaveDemod, BYTE* strength ) { DWORD dwError = Error_NO_ERROR; PDEVICE_CONTEXT pdc = (PDEVICE_CONTEXT)handle; deb_data("- Enter %s Function -\n ",__FUNCTION__); dwError= Demodulator_getSignalStrength((Demodulator*) &pdc->Demodulator, ucSlaveDemod, strength); if(dwError) deb_data(" Demodulator_getSignalStrength is failed!\n"); else deb_data(" The signal strength is %d \n", *strength); return(dwError); } static DWORD DRV_getSignalStrengthDbm( void* handle, BYTE ucSlaveDemod, Long* strengthDbm ) { DWORD dwError = Error_NO_ERROR; PDEVICE_CONTEXT pdc = (PDEVICE_CONTEXT)handle; deb_data("- Enter %s Function -\n ",__FUNCTION__); dwError= Demodulator_getSignalStrengthDbm((Demodulator*) &pdc->Demodulator, ucSlaveDemod, 1, 1, strengthDbm); if(dwError) deb_data(" Demodulator_getSignalStrengthDbm is failed!\n"); else deb_data(" The signal strengthDbm is %d \n", ( int ) *strengthDbm); return(dwError); } static DWORD DRV_getChannelStatistic( void* handle, BYTE ucSlaveDemod, ChannelStatistic* channelStatistic ) { DWORD dwError = Error_NO_ERROR; PDEVICE_CONTEXT pdc = (PDEVICE_CONTEXT)handle; deb_data("- Enter %s Function -\n ",__FUNCTION__); dwError= Demodulator_getChannelStatistic((Demodulator*) &pdc->Demodulator, ucSlaveDemod, channelStatistic); if(dwError) deb_data(" Demodulator_getChannelStatistic is failed!\n"); return(dwError); } static DWORD DRV_getChannelModulation( void* handle, BYTE ucSlaveDemod, ChannelModulation* channelModulation ) { DWORD dwError = Error_NO_ERROR; PDEVICE_CONTEXT pdc = (PDEVICE_CONTEXT)handle; deb_data("- Enter %s Function -\n ",__FUNCTION__); dwError= Standard_getChannelModulation((Demodulator*) &pdc->Demodulator, ucSlaveDemod, channelModulation); if(dwError) deb_data(" Demodulator_getChannelStatistic is failed!\n"); return(dwError); } static DWORD DRV_getSNRValue( void* handle, DWORD* snr_value ) { DWORD dwError = Error_NO_ERROR; PDEVICE_CONTEXT pdc = (PDEVICE_CONTEXT)handle; BYTE snr_reg_23_16, snr_reg_15_8, snr_reg_7_0; deb_data("- Enter %s Function -\n ",__FUNCTION__); dwError = Demodulator_readRegister((Demodulator*) &pdc->Demodulator, 0,Processor_OFDM, 0x2e,(unsigned char *) &snr_reg_23_16); if(dwError) deb_data(" Demodulator_getSNR snr_reg_23_16 is failed!\n"); dwError = Demodulator_readRegister((Demodulator*) &pdc->Demodulator, 0,Processor_OFDM, 0x2d,(unsigned char *) &snr_reg_15_8); if(dwError) deb_data(" Demodulator_getSNR snr_reg_15_8 is failed!\n"); dwError = Demodulator_readRegister((Demodulator*) &pdc->Demodulator, 0,Processor_OFDM, 0x2c,(unsigned char *) &snr_reg_7_0); if(dwError) deb_data(" Demodulator_getSNR snr_reg_7_0 is failed!\n"); *snr_value = (snr_reg_23_16&0xff)*256*256+(snr_reg_15_8&0xff)*256+(snr_reg_7_0&0xff); return(dwError); } static DWORD DRV_getFirmwareVersionFromFile( Processor processor, DWORD* version ) { DWORD OFDM_VER1 = DVB_OFDM_VERSION1; DWORD OFDM_VER2 = DVB_OFDM_VERSION2; DWORD OFDM_VER3 = DVB_OFDM_VERSION3; DWORD OFDM_VER4 = DVB_OFDM_VERSION4; DWORD LINK_VER1 = DVB_LL_VERSION1; DWORD LINK_VER2 = DVB_LL_VERSION2; DWORD LINK_VER3 = DVB_LL_VERSION3; DWORD LINK_VER4 = DVB_LL_VERSION4; if(processor == Processor_OFDM) { *version = (DWORD)( (OFDM_VER1 << 24) + (OFDM_VER2 << 16) + (OFDM_VER3 << 8) + OFDM_VER4); } else { //LINK *version = (DWORD)( (LINK_VER1 << 24) + (LINK_VER2 << 16) + (LINK_VER3 << 8) + LINK_VER4); } return *version; } static DWORD DRV_Initialize( void * handle ) { DWORD error = Error_NO_ERROR; PDEVICE_CONTEXT pdc = (PDEVICE_CONTEXT)handle; DWORD fileVersion, cmdVersion = 0; deb_data("- Enter %s Function -\n",__FUNCTION__); if(pdc->Demodulator.booted) //from Standard_setBusTuner() > Standard_getFirmwareVersion() { //use "#define version" to get fw version (from firmware.h title) error = DRV_getFirmwareVersionFromFile(Processor_OFDM, &fileVersion); //use "Command_QUERYINFO" to get fw version error = Demodulator_getFirmwareVersion((Demodulator*) &pdc->Demodulator, Processor_OFDM, &cmdVersion); if(error) deb_data("DRV_Initialize : Demodulator_getFirmwareVersion : error = 0x%08x\n",(int) error); if(cmdVersion != fileVersion) { deb_data("Reboot: Outside Fw = 0x%X, Inside Fw = 0x%X", (int) fileVersion, (int) cmdVersion); error = Demodulator_reboot((Demodulator*) &pdc->Demodulator); pdc->bBootCode = true; if(error) { deb_data("Demodulator_reboot : error = 0x%08x\n",(int) error); return error; } else { return Error_NOT_READY; } } else { printk(" Fw version is the same!\n"); error = Error_NO_ERROR; } }//pdc->Demodulator.booted ReInit: //Patch for NIM fail or disappear, Maggie error = Demodulator_initialize ((Demodulator*) &pdc->Demodulator, pdc->Demodulator.chipNumber , 8000, pdc->StreamType, pdc->architecture); if (error) { printk("Device initialize fail : 0x%08x\n", (int) error); if( ((error&Error_FIRMWARE_STATUS) && (error&0x10)) && (pdc->Demodulator.chipNumber>1) ) { pdc->Demodulator.cmdDescription->sendCommand ((Demodulator*) &pdc->Demodulator, Command_FW_DOWNLOAD_END, 0, Processor_LINK, 0, NULL, 0, NULL); printk(" Retry to download FW with Single TS\n"); pdc->Demodulator.chipNumber = 1; pdc->bDualTs = false; error = Demodulator_writeRegister ((Demodulator*) &pdc->Demodulator, 0, Processor_LINK, 0x417F, 0); goto ReInit; } } else { printk(" Device initialize Ok!!\n"); } Demodulator_getFirmwareVersion ((Demodulator*) &pdc->Demodulator, Processor_OFDM, &cmdVersion); deb_data(" FwVer OFDM = 0x%X, ", (int) cmdVersion); Demodulator_getFirmwareVersion ((Demodulator*) &pdc->Demodulator, Processor_LINK, &cmdVersion); deb_data("FwVer LINK = 0x%X\n", (int) cmdVersion); return error; } static DWORD DRV_InitDevInfo( void * handle, BYTE ucSlaveDemod ) { DWORD dwError = Error_NO_ERROR; PDC->fc[ucSlaveDemod].ulCurrentFrequency = 0; PDC->fc[ucSlaveDemod].ucCurrentBandWidth = 0; PDC->fc[ucSlaveDemod].ulDesiredFrequency = 0; PDC->fc[ucSlaveDemod].ucDesiredBandWidth = 8000; //For PID Filter Setting //PDC->fc[ucSlaveDemod].ulcPIDs = 0; PDC->fc[ucSlaveDemod].bEnPID = false; PDC->fc[ucSlaveDemod].bApOn = false; PDC->fc[ucSlaveDemod].bResetTs = false; PTI.bTunerOK = false; PTI.bSettingFreq = false; return dwError; } static DWORD DRV_GetEEPROMConfig( void * handle) { DWORD dwError = Error_NO_ERROR; PDEVICE_CONTEXT pdc = (PDEVICE_CONTEXT)handle; BYTE ucSlaveDemod = 0; BYTE btmp = 0; int cnt; deb_data("- Enter %s Function -",__FUNCTION__); //bIrTblDownload option dwError = Demodulator_readRegisters((Demodulator*) &pdc->Demodulator, 0, Processor_LINK, EEPROM_IRMODE, 1, &btmp); if (dwError) return(dwError); PDC->bIrTblDownload = btmp ? true:false; printk( "EEPROM_IRMODE = 0x%02X, ", btmp); printk("bIrTblDownload %s\n", PDC->bIrTblDownload?"ON":"OFF"); PDC->bDualTs = false; PDC->architecture = Architecture_DCA; PDC->Demodulator.chipNumber = 1; PDC->bDCAPIP = false; //bDualTs option dwError = Demodulator_readRegisters((Demodulator*) &pdc->Demodulator, 0, Processor_LINK,EEPROM_TSMODE, 1, &btmp); if (dwError) return(dwError); printk("EEPROM_TSMODE = 0x%02X", btmp); if (btmp == 0) printk("TSMode = TS1 mode\n"); else if (btmp == 1) { printk("TSMode = DCA+PIP mode\n"); PDC->architecture = Architecture_DCA; PDC->Demodulator.chipNumber = 2; PDC->bDualTs = true; //PDC->bDCAPIP = true; } else if (btmp == 3) { deb_data("TSMode = PIP mode\n"); PDC->architecture = Architecture_PIP; PDC->Demodulator.chipNumber = 2; PDC->bDualTs = true; } else { deb_data("TSMode = DCA mode\n"); PDC->architecture = Architecture_DCA; PDC->Demodulator.chipNumber = 2; } if(PDC->bDualTs) { cnt = 2; } else { cnt = 1; } for(ucSlaveDemod; ucSlaveDemod < cnt; ucSlaveDemod++) { deb_data("ucSlaveDemod: %d \n",cnt); dwError = DRV_GetEEPROMConfig2(pdc, ucSlaveDemod); if (dwError) return(dwError); dwError = DRV_InitDevInfo(pdc, ucSlaveDemod); if (dwError) return(dwError); } return(dwError); } static DWORD DRV_SetBusTuner( void * handle, Word busId, Word tunerId ) { DWORD dwError = Error_NO_ERROR; DWORD version = 0; PDEVICE_CONTEXT pdc = (PDEVICE_CONTEXT)handle; deb_data("- Enter %s Function -",__FUNCTION__); deb_data("busId = 0x%x, tunerId =0x%x\n", busId, tunerId); if ((pdc->UsbMode==0x0110) && (busId==Bus_USB)) { busId=Bus_USB11; } dwError = Demodulator_setBusTuner ((Demodulator*) &pdc->Demodulator, busId, tunerId); if (dwError) {deb_data("Demodulator_setBusTuner error\n");return dwError;} dwError = Demodulator_getFirmwareVersion ((Demodulator*) &pdc->Demodulator, Processor_LINK, &version); if (version != 0) { pdc->Demodulator.booted = True; } else { pdc->Demodulator.booted = False; } if (dwError) {deb_data("Demodulator_getFirmwareVersion error\n");} return(dwError); } static DWORD DRV_TunerPowerCtrl( void * handle, BYTE ucSlaveDemod, Bool bPowerOn ) { DWORD dwError = Error_NO_ERROR; PDEVICE_CONTEXT pdc = (PDEVICE_CONTEXT)handle; deb_data("- Enter %s Function -",__FUNCTION__); deb_data("chip = %d\n", ucSlaveDemod); /* init gpioH7 */ dwError = Demodulator_writeRegisterBits((Demodulator*) &pdc->Demodulator, 0, Processor_LINK, p_reg_top_gpioh7_en, reg_top_gpioh7_en_pos, reg_top_gpioh7_en_len, 1); dwError = Demodulator_writeRegisterBits((Demodulator*) &pdc->Demodulator, 0, Processor_LINK, p_reg_top_gpioh7_on, reg_top_gpioh7_on_pos, reg_top_gpioh7_on_len, 1); if(bPowerOn) PTI.bTunerInited = true; else PTI.bTunerInited = false; if(bPowerOn) //tuner on { dwError = Demodulator_writeRegisterBits((Demodulator*) &pdc->Demodulator, 0, Processor_LINK, p_reg_top_gpioh7_o, reg_top_gpioh7_o_pos, reg_top_gpioh7_o_len, 1); if( pdc->bTunerPowerOff == (Bool) true) { dwError = Demodulator_initialize ((Demodulator*) &pdc->Demodulator, pdc->Demodulator.chipNumber , pdc->Demodulator.bandwidth[0], pdc->StreamType, pdc->architecture); pdc->bTunerPowerOff = false; } } else //tuner off { if(pdc->architecture == Architecture_PIP) { if(pdc->fc[0].tunerinfo.bTunerInited == (Bool) false && pdc->fc[1].tunerinfo.bTunerInited == (Bool) false) { if(pdc->bTunerPowerOff == (Bool) false) { dwError = Demodulator_finalize((Demodulator*) &pdc->Demodulator); pdc->bTunerPowerOff = true; } dwError = Demodulator_writeRegisterBits((Demodulator*) &pdc->Demodulator, 0, Processor_LINK, p_reg_top_gpioh7_o, reg_top_gpioh7_o_pos, reg_top_gpioh7_o_len, 0); } } else { if(pdc->bTunerPowerOff == (Bool) false) { dwError = Demodulator_finalize((Demodulator*) &pdc->Demodulator); pdc->bTunerPowerOff = true; } dwError = Demodulator_writeRegisterBits((Demodulator*) &pdc->Demodulator, 0, Processor_LINK, p_reg_top_gpioh7_o, reg_top_gpioh7_o_pos, reg_top_gpioh7_o_len, 0); } } return(dwError); } static DWORD DRV_ApCtrl ( void * handle, Byte ucSlaveDemod, Bool bOn ) { DWORD dwError = Error_NO_ERROR; PDEVICE_CONTEXT pdc = (PDEVICE_CONTEXT)handle; deb_data("- Enter %s Function -\n",__FUNCTION__); deb_data(" ucSlaveDemod = %d, bOn = %s \n", ucSlaveDemod, bOn?"ON":"OFF"); //deb_data("enter DRV_ApCtrl: Demod[%d].GraphBuilt = %d", ucSlaveDemod, pdc->fc[ucSlaveDemod].GraphBuilt); dwError = DRV_TunerPowerCtrl(pdc, ucSlaveDemod, bOn); if(dwError) { deb_data(" DRV_TunerPowerCtrl Fail: 0x%08x\n", (int) dwError); return(dwError);} dwError = Demodulator_controlPowerSaving((Demodulator*) &pdc->Demodulator, ucSlaveDemod, bOn); if(dwError) { deb_data(" DRV_ApCtrl: Demodulator_controlPowerSaving error = 0x%08x\n", (int) dwError); return(dwError);} return(dwError); } static DWORD DRV_TunerWakeup( void * handle ) { DWORD dwError = Error_NO_ERROR; PDEVICE_CONTEXT pdc = (PDEVICE_CONTEXT) handle; deb_data("- Enter %s Function -\n",__FUNCTION__); //tuner power on dwError = Demodulator_writeRegisterBits((Demodulator*) &pdc->Demodulator, 0, Processor_LINK, p_reg_top_gpioh7_o, reg_top_gpioh7_o_pos, reg_top_gpioh7_o_len, 1); if(dwError) deb_data(" DRV_TunerWakeup Fail: 0x%08x\n", (int) dwError); return(dwError); } static DWORD DRV_Reboot( void * handle ) { DWORD dwError = Error_NO_ERROR; PDEVICE_CONTEXT pdc = (PDEVICE_CONTEXT) handle; deb_data("- Enter %s Function -\n",__FUNCTION__); dwError = Demodulator_reboot((Demodulator*) &pdc->Demodulator); return(dwError); } static DWORD DRV_USBSetup( void* handle ) { DWORD dwError = Error_NO_ERROR; PDEVICE_CONTEXT pdc = (PDEVICE_CONTEXT) handle; int i; deb_data("- Enter %s Function -\n",__FUNCTION__); if (pdc->Demodulator.chipNumber == 2) { //timing for (i=0; i<2; i++) { dwError = Demodulator_writeRegisterBits ((Demodulator*) &pdc->Demodulator,i, Processor_OFDM, p_reg_dca_fpga_latch, reg_dca_fpga_latch_pos, reg_dca_fpga_latch_len, 0x66); if(dwError) return (dwError); dwError = Demodulator_writeRegisterBits ((Demodulator*) &pdc->Demodulator, i, Processor_OFDM, p_reg_dca_platch, reg_dca_platch_pos, reg_dca_platch_len, 1); if(dwError) return (dwError); } } return(dwError); } static DWORD DRV_NIMSuspend( void * handle, bool bSuspend ) { DWORD dwError = Error_NO_ERROR; PDEVICE_CONTEXT pdc = (PDEVICE_CONTEXT) handle; deb_data("- Enter DRV_NIMSuspend : bSuspend = %s\n", bSuspend ? "ON":"OFF"); if(bSuspend) //sleep { dwError = Demodulator_writeRegisterBits((Demodulator*) &pdc->Demodulator, 0, Processor_LINK, p_reg_top_gpioh5_o, reg_top_gpioh5_o_pos, reg_top_gpioh5_o_len, 1); if(dwError) return (dwError); } else //resume { dwError = Demodulator_writeRegisterBits((Demodulator*) &pdc->Demodulator, 0, Processor_LINK, p_reg_top_gpioh5_o, reg_top_gpioh5_o_pos, reg_top_gpioh5_o_len, 0); if(dwError) return (dwError); } return(dwError); } static DWORD DRV_InitNIMSuspendRegs( void * handle ) { DWORD dwError = Error_NO_ERROR; PDEVICE_CONTEXT pdc = (PDEVICE_CONTEXT) handle; deb_data("- Enter %s Function -\n",__FUNCTION__); dwError = Demodulator_writeRegisterBits((Demodulator*) &pdc->Demodulator, 0, Processor_LINK, p_reg_top_gpioh5_en, reg_top_gpioh5_en_pos, reg_top_gpioh5_en_len, 1); dwError = Demodulator_writeRegisterBits((Demodulator*) &pdc->Demodulator, 0, Processor_LINK, p_reg_top_gpioh5_on, reg_top_gpioh5_on_pos, reg_top_gpioh5_on_len, 1); dwError = Demodulator_writeRegisterBits((Demodulator*) &pdc->Demodulator, 0, Processor_LINK, p_reg_top_gpioh5_o, reg_top_gpioh5_o_pos, reg_top_gpioh5_o_len, 0); dwError = Demodulator_writeRegisterBits((Demodulator*) &pdc->Demodulator, 1, Processor_LINK, p_reg_top_pwrdw, reg_top_pwrdw_pos, reg_top_pwrdw_len, 1); dwError = Demodulator_writeRegisterBits((Demodulator*) &pdc->Demodulator, 1, Processor_LINK, p_reg_top_pwrdw_hwen, reg_top_pwrdw_hwen_pos, reg_top_pwrdw_hwen_len, 1); return(dwError); } static DWORD DRV_NIMReset( void * handle ) { DWORD dwError = Error_NO_ERROR; PDEVICE_CONTEXT pdc = (PDEVICE_CONTEXT)handle; deb_data("- Enter %s Function -\n",__FUNCTION__); //Set AF0350 GPIOH1 to 0 to reset AF0351 dwError = Demodulator_writeRegisterBits((Demodulator*) &pdc->Demodulator, 0, Processor_LINK, p_reg_top_gpioh1_en, reg_top_gpioh1_en_pos, reg_top_gpioh1_en_len, 1); dwError = Demodulator_writeRegisterBits((Demodulator*) &pdc->Demodulator, 0, Processor_LINK, p_reg_top_gpioh1_on, reg_top_gpioh1_on_pos, reg_top_gpioh1_on_len, 1); dwError = Demodulator_writeRegisterBits((Demodulator*) &pdc->Demodulator, 0, Processor_LINK, p_reg_top_gpioh1_o, reg_top_gpioh1_o_pos, reg_top_gpioh1_o_len, 0); mdelay(50); dwError = Demodulator_writeRegisterBits((Demodulator*) &pdc->Demodulator, 0, Processor_LINK, p_reg_top_gpioh1_o, reg_top_gpioh1_o_pos, reg_top_gpioh1_o_len, 1); return(dwError); } //************** DL_ *************// static DWORD DL_NIMReset( void * handle ) { DWORD dwError = Error_NO_ERROR; mutex_lock(&mymutex); dwError = DRV_NIMReset(handle); mutex_unlock(&mymutex); return (dwError); } static DWORD DL_USBSetup( void * handle ) { DWORD dwError = Error_NO_ERROR; mutex_lock(&mymutex); dwError = DRV_USBSetup(handle); mutex_unlock(&mymutex); return (dwError); } static DWORD DL_NIMSuspend( void * handle, bool bSuspend ) { DWORD dwError = Error_NO_ERROR; mutex_lock(&mymutex); dwError = DRV_NIMSuspend(handle, bSuspend); mutex_unlock(&mymutex); return (dwError); } static DWORD DL_InitNIMSuspendRegs( void * handle ) { DWORD dwError = Error_NO_ERROR; mutex_lock(&mymutex); dwError = DRV_InitNIMSuspendRegs(handle); mutex_unlock(&mymutex); return (dwError); } static DWORD DL_Initialize( void * handle ) { DWORD dwError = Error_NO_ERROR; mutex_lock(&mymutex); dwError = DRV_Initialize(handle); mutex_unlock(&mymutex); return (dwError); } static DWORD DL_SetBusTuner( void * handle, Word busId, Word tunerId ) { DWORD dwError = Error_NO_ERROR; mutex_lock(&mymutex); dwError = DRV_SetBusTuner(handle, busId, tunerId); mutex_unlock(&mymutex); return (dwError); } static DWORD DL_GetEEPROMConfig( void * handle ) { DWORD dwError = Error_NO_ERROR; mutex_lock(&mymutex); dwError = DRV_GetEEPROMConfig(handle); mutex_unlock(&mymutex); return(dwError); } static DWORD DL_TunerWakeup( void * handle ) { DWORD dwError = Error_NO_ERROR; mutex_lock(&mymutex); dwError = DRV_TunerWakeup(handle); mutex_unlock(&mymutex); return(dwError); } static DWORD DL_IrTblDownload( void * handle ) { DWORD dwError = Error_NO_ERROR; mutex_lock(&mymutex); dwError = DRV_IrTblDownload(handle); mutex_unlock(&mymutex); return(dwError); } DWORD DL_TunerPowerCtrl(u8 bPowerOn) { DWORD dwError = Error_NO_ERROR; BYTE ucSlaveDemod=0; mutex_lock(&mymutex); deb_data("enter DL_TunerPowerCtrl: bOn = %s\n", bPowerOn?"ON":"OFF"); for (ucSlaveDemod=0; ucSlaveDemodDemodulator.chipNumber; ucSlaveDemod++) { dwError = DRV_TunerPowerCtrl(PDC, ucSlaveDemod, bPowerOn); if(dwError) deb_data(" DRV_TunerPowerCtrl Fail: 0x%08x\n", (int) dwError); } mutex_unlock(&mymutex); return (dwError); } //EXPORT_SYMBOL(DL_TunerPowerCtrl); DWORD DL_ResetPID( IN BYTE chip ) { DWORD dwError = Error_NO_ERROR; mutex_lock(&mymutex); dwError = DRV_ResetPID(PDC, chip); mutex_unlock(&mymutex); return(dwError); } DWORD DL_AddPID( IN BYTE ucSlaveDemod, IN Byte index, IN Pid pid ) { DWORD dwError = Error_NO_ERROR; mutex_lock(&mymutex); dwError = DRV_AddPID(PDC, ucSlaveDemod,index, pid); mutex_unlock(&mymutex); return(dwError); } DWORD DL_RemovePID( IN BYTE ucSlaveDemod, IN Byte index, IN Pid pid ) { DWORD dwError = Error_NO_ERROR; mutex_lock(&mymutex); dwError = DRV_RemovePID(PDC, ucSlaveDemod,index, pid); mutex_unlock(&mymutex); return(dwError); } DWORD DL_PIDOnOff( IN BYTE ucSlaveDemod, IN bool bOn ) { DWORD dwError = Error_NO_ERROR; mutex_lock(&mymutex); dwError = DRV_PIDOnOff(PDC, ucSlaveDemod, bOn); mutex_unlock(&mymutex); return(dwError); } DWORD DL_ApCtrl ( BYTE ucSlaveDemod, Bool bOn ) { DWORD dwError = Error_NO_ERROR; BYTE i=0; mutex_lock(&mymutex); deb_data("- Enter %s Function -",__FUNCTION__); deb_data(" chip = %d bOn = %s\n", ucSlaveDemod, bOn?"ON":"OFF"); if(PDC->architecture != Architecture_PIP) { if ( PDC->Demodulator.chipNumber == 2 && bOn) dwError = DL_NIMSuspend(PDC, false); for (i=0; iDemodulator.chipNumber; i++) { if (bOn) dwError = DRV_ApCtrl (PDC, i, bOn); else if (PDC->bTunerPowerOff != (Bool) true) dwError = DRV_ApCtrl (PDC, i, bOn); if(!bOn) { PDC->fc[i].ulDesiredFrequency = 0; PDC->fc[i].ucDesiredBandWidth = 0; } } if(PDC->Demodulator.chipNumber == 2 && !bOn) dwError = DL_NIMSuspend(PDC, true); } else { if (bOn) { PDC->fc[ucSlaveDemod].GraphBuilt = 1; if (PDC->fc[0].GraphBuilt == 0 || PDC->fc[1].GraphBuilt == 0) dwError = DL_NIMSuspend(PDC, false); dwError = DRV_ApCtrl (PDC, ucSlaveDemod, bOn); } else { PDC->fc[ucSlaveDemod].GraphBuilt = 0; if (PDC->bTunerPowerOff != (Bool) true) dwError = DRV_ApCtrl (PDC, ucSlaveDemod, bOn); if (PDC->fc[0].GraphBuilt == 0 && PDC->fc[1].GraphBuilt == 0 && PDC->bTunerPowerOff == (Bool) true) dwError = DL_NIMSuspend(PDC, true); } } mutex_unlock(&mymutex); return(dwError); } //EXPORT_SYMBOL(DL_ApCtrl); DWORD DL_Tuner_SetFreqBw(BYTE ucSlaveDemod, u32 dwFreq,u8 ucBw) { DWORD dwError = Error_NO_ERROR; mutex_lock(&mymutex); deb_data("- Enter %s Function -\n",__FUNCTION__); if (PDC->fc[ucSlaveDemod].ulDesiredFrequency!=dwFreq || PDC->fc[ucSlaveDemod].ucDesiredBandWidth!=ucBw*1000) dwError = DRV_SetFreqBw(PDC, ucSlaveDemod, dwFreq, ucBw); mutex_unlock(&mymutex); return(dwError); } //EXPORT_SYMBOL(DL_Tuner_SetFreq); DWORD DL_isLocked(BYTE ucSlaveDemod, Bool *bLock ) { DWORD dwError = Error_NO_ERROR; mutex_lock(&mymutex); deb_data("- Enter %s Function -\n",__FUNCTION__); dwError = DRV_isLocked(PDC, ucSlaveDemod, bLock); mutex_unlock(&mymutex); return(dwError); } DWORD DL_getSignalStrength(BYTE ucSlaveDemod, BYTE* strength) { DWORD dwError = Error_NO_ERROR; mutex_lock(&mymutex); deb_data("- Enter %s Function -\n",__FUNCTION__); dwError = DRV_getSignalStrength(PDC, ucSlaveDemod, strength); deb_data(" The signal strength is %d \n", *strength); mutex_unlock(&mymutex); return(dwError); } DWORD DL_getSignalStrengthDbm(BYTE ucSlaveDemod, Long* strengthDbm) { DWORD dwError = Error_NO_ERROR; mutex_lock(&mymutex); deb_data("- Enter %s Function -\n",__FUNCTION__); dwError = DRV_getSignalStrengthDbm(PDC, ucSlaveDemod, strengthDbm); mutex_unlock(&mymutex); return(dwError); } DWORD DL_getChannelStatistic(BYTE ucSlaveDemod, ChannelStatistic* channelStatistic) { DWORD dwError = Error_NO_ERROR; mutex_lock(&mymutex); deb_data("- Enter %s Function -\n",__FUNCTION__); dwError = DRV_getChannelStatistic(PDC, ucSlaveDemod, channelStatistic); mutex_unlock(&mymutex); return(dwError); } DWORD DL_getChannelModulation(BYTE ucSlaveDemod, ChannelModulation* channelModulation) { DWORD dwError = Error_NO_ERROR; mutex_lock(&mymutex); deb_data("- Enter %s Function -\n",__FUNCTION__); dwError = DRV_getChannelModulation(PDC, ucSlaveDemod, channelModulation); mutex_unlock(&mymutex); return(dwError); } DWORD DL_getSNR(BYTE ucSlaveDemod, Constellation* constellation, BYTE* snr) { DWORD dwError = Error_NO_ERROR; ChannelModulation channelModulation; DWORD snr_value; mutex_lock(&mymutex); deb_data("- Enter %s Function -\n",__FUNCTION__); dwError = DRV_getChannelModulation(PDC, ucSlaveDemod, &channelModulation); if (dwError) return(dwError); dwError = DRV_getSNRValue(PDC, &snr_value); if (dwError) return(dwError); *constellation = channelModulation.constellation; if(channelModulation.constellation == 0) //Constellation_QPSK { if(snr_value < 0xB4771) *snr = 0; else if(snr_value < 0xC1AED) *snr = 1; else if(snr_value < 0xD0D27) *snr = 2; else if(snr_value < 0xE4D19) *snr = 3; else if(snr_value < 0xE5DA8) *snr = 4; else if(snr_value < 0x107097) *snr = 5; else if(snr_value < 0x116975) *snr = 6; else if(snr_value < 0x1252D9) *snr = 7; else if(snr_value < 0x131FA4) *snr = 8; else if(snr_value < 0x13D5E1) *snr = 9; else if(snr_value < 0x148E53) *snr = 10; else if(snr_value < 0x15358B) *snr = 11; else if(snr_value < 0x15DD29) *snr = 12; else if(snr_value < 0x168112) *snr = 13; else if(snr_value < 0x170B61) *snr = 14; else if(snr_value < 0x17A532) *snr = 15; else if(snr_value < 0x180F94) *snr = 16; else if(snr_value < 0x186ED2) *snr = 17; else if(snr_value < 0x18B271) *snr = 18; else if(snr_value < 0x18E118) *snr = 19; else if(snr_value < 0x18FF4B) *snr = 20; else if(snr_value < 0x190AF1) *snr = 21; else if(snr_value < 0x191451) *snr = 22; else *snr = 23; } else if ( channelModulation.constellation == 1) //Constellation_16QAM { if(snr_value < 0x4F0D5) *snr = 0; else if(snr_value < 0x5387A) *snr = 1; else if(snr_value < 0x573A4) *snr = 2; else if(snr_value < 0x5A99E) *snr = 3; else if(snr_value < 0x5CC80) *snr = 4; else if(snr_value < 0x5EB62) *snr = 5; else if(snr_value < 0x5FECF) *snr = 6; else if(snr_value < 0x60B80) *snr = 7; else if(snr_value < 0x62501) *snr = 8; else if(snr_value < 0x64865) *snr = 9; else if(snr_value < 0x69604) *snr = 10; else if(snr_value < 0x6F356) *snr = 11; else if(snr_value < 0x7706A) *snr = 12; else if(snr_value < 0x804D3) *snr = 13; else if(snr_value < 0x89D1A) *snr = 14; else if(snr_value < 0x93E3D) *snr = 15; else if(snr_value < 0x9E35D) *snr = 16; else if(snr_value < 0xA7C3C) *snr = 17; else if(snr_value < 0xAFAF8) *snr = 18; else if(snr_value < 0xB719D) *snr = 19; else if(snr_value < 0xBDA6A) *snr = 20; else if(snr_value < 0xC0C75) *snr = 21; else if(snr_value < 0xC3F7D) *snr = 22; else if(snr_value < 0xC5E62) *snr = 23; else if(snr_value < 0xC6C31) *snr = 24; else if(snr_value < 0xC7925) *snr = 25; else *snr = 26; } else if ( channelModulation.constellation == 2) //Constellation_64QAM { if(snr_value < 0x256D0) *snr = 0; else if(snr_value < 0x27A65) *snr = 1; else if(snr_value < 0x29873) *snr = 2; else if(snr_value < 0x2B7FE) *snr = 3; else if(snr_value < 0x2CF1E) *snr = 4; else if(snr_value < 0x2E234) *snr = 5; else if(snr_value < 0x2F409) *snr = 6; else if(snr_value < 0x30046) *snr = 7; else if(snr_value < 0x30844) *snr = 8; else if(snr_value < 0x30A02) *snr = 9; else if(snr_value < 0x30CDE) *snr = 10; else if(snr_value < 0x31031) *snr = 11; else if(snr_value < 0x3144C) *snr = 12; else if(snr_value < 0x315DD) *snr = 13; else if(snr_value < 0x31920) *snr = 14; else if(snr_value < 0x322D0) *snr = 15; else if(snr_value < 0x339FC) *snr = 16; else if(snr_value < 0x364A1) *snr = 17; else if(snr_value < 0x38BCC) *snr = 18; else if(snr_value < 0x3C7D3) *snr = 19; else if(snr_value < 0x408CC) *snr = 20; else if(snr_value < 0x43BED) *snr = 21; else if(snr_value < 0x48061) *snr = 22; else if(snr_value < 0x4BE95) *snr = 23; else if(snr_value < 0x4FA7D) *snr = 24; else if(snr_value < 0x52405) *snr = 25; else if(snr_value < 0x5570D) *snr = 26; else if(snr_value < 0x59FEB) *snr = 27; else if(snr_value < 0x5BF38) *snr = 28; else *snr = 29; } else deb_data(" Get constellation is failed!\n"); mutex_unlock(&mymutex); return(dwError); } DWORD DL_ReSetInterval(void) { DWORD dwError = Error_NO_ERROR; mutex_lock(&mymutex); mutex_unlock(&mymutex); return(dwError); } //EXPORT_SYMBOL(DL_ReSetInterval); DWORD DL_Reboot(void) { DWORD dwError = Error_NO_ERROR; mutex_lock(&mymutex); deb_data("- Enter %s Function -\n",__FUNCTION__); dwError = DRV_Reboot(PDC); mutex_unlock(&mymutex); return(dwError); } DWORD DL_CheckTunerInited(BYTE ucSlaveDemod, Bool *bOn ) { DWORD dwError = Error_NO_ERROR; mutex_lock(&mymutex); deb_data("- Enter %s Function -\n",__FUNCTION__); *bOn = PTI.bTunerInited; mutex_unlock(&mymutex); return(dwError); } DWORD Device_init(struct usb_device *udev,PDEVICE_CONTEXT PDCs, Bool bBoot) { int errcount=0; DWORD error = Error_NO_ERROR; BYTE filterIdx=0; udevs=udev; PDC=PDCs; deb_data("- Enter %s Function -\n",__FUNCTION__); // define in Af903x.h #ifdef QuantaMID deb_data(" === AfaDTV on Quanta ===\n"); #endif #ifdef EEEPC deb_data(" === AfaDTV on EEEPC ===\n"); #endif #ifdef DRIVER_RELEASE_VERSION printk(" DRIVER_RELEASE_VERSION : %s\n", DRIVER_RELEASE_VERSION); #else deb_data(" DRIVER_RELEASE_VERSION : v0.0-0\n"); #endif #ifdef FW_RELEASE_VERSION deb_data(" FW_RELEASE_VERSION : %s\n", FW_RELEASE_VERSION); #else deb_data(" FW_RELEASE_VERSION : v0_0_0_0\n"); #endif #ifdef Version_NUMBER deb_data(" API_RELEASE_VERSION : %X.%X.%X\n", Version_NUMBER, Version_DATE, Version_BUILD); #else deb_data(" API_RELEASE_VERSION :000.00000000.0\n"); #endif // deb_data(" FW_RELEASE_VERSION : %s\n", FW_RELEASE_VERSION); // deb_data(" API_RELEASE_VERSION : %X.%X.%X\n", Version_NUMBER, Version_DATE, Version_BUILD); //************* Set Device init Info *************// PDC->bEnterSuspend = false; PDC->bSurpriseRemoval = false; PDC->bDevNotResp = false; PDC->bSelectiveSuspend = false; PDC->bTunerPowerOff = false; if (bBoot) { PDC->bSupportSelSuspend = false; PDC->Demodulator.userData = (Handle)PDC; PDC->Demodulator.chipNumber = 1; PDC->architecture=Architecture_DCA; PDC->Demodulator.frequency[0] = 834000; PDC->Demodulator.bandwidth[0] = 8000; PDC->bIrTblDownload = false; PDC->fc[0].tunerinfo.TunerId = 0; PDC->fc[1].tunerinfo.TunerId = 0; PDC->bDualTs=false; PDC->FilterCnt = 0; PDC->StreamType = StreamType_DVBT_DATAGRAM; PDC->UsbCtrlTimeOut = 1; } else { PDC->UsbCtrlTimeOut = 5; }//bBoot #ifdef AFA_USB_DEVICE if (bBoot) { //************* Set USB Info *************// PDC->MaxPacketSize = 0x0200; //default USB2.0 PDC->UsbMode = (PDC->MaxPacketSize == 0x200)?0x0200:0x0110; deb_data("USB mode= 0x%x\n", PDC->UsbMode); PDC->TsPacketCount = (PDC->UsbMode == 0x200)?TS_PACKET_COUNT_HI:TS_PACKET_COUNT_FU; PDC->TsFrames = (PDC->UsbMode == 0x200)?TS_FRAMES_HI:TS_FRAMES_FU; PDC->TsFrameSize = TS_PACKET_SIZE*PDC->TsPacketCount; PDC->TsFrameSizeDw = PDC->TsFrameSize/4; } PDC->bEP12Error = false; PDC->bEP45Error = false; PDC->ForceWrite = false; PDC->ulActiveFilter = 0; #else PDC->bSupportSuspend = false; #endif//AFA_USB_DEVICE #ifdef AFA_USB_DEVICE if(bBoot) { //patch for eeepc error = DL_SetBusTuner (PDC, Bus_USB, Tuner_FCI_FC2580); PDC->UsbCtrlTimeOut = 5; error = DL_SetBusTuner (PDC, Bus_USB, Tuner_FCI_FC2580); if (error) { deb_data("First DL_SetBusTuner fail : 0x%08x\n", (int) error ); errcount++; goto Exit; } error =DL_GetEEPROMConfig(PDC); if (error) { deb_data("DL_GetEEPROMConfig fail : 0x%08x\n", (int) error); errcount++; goto Exit; } }//bBoot error = DL_SetBusTuner(PDC, Bus_USB, Tuner_FCI_FC2580); if (error) { deb_data("DL_SetBusTuner fail!\n"); errcount++; goto Exit; } if (PDC->Demodulator.chipNumber == 2 && !PDC->Demodulator.booted) //plug/cold-boot/S4 { error = DL_NIMReset(PDC); } else if(PDC->Demodulator.chipNumber == 2 && PDC->Demodulator.booted) //warm-boot/(S1) { error = DL_NIMSuspend(PDC, false); error = DL_TunerWakeup(PDC); //actually for mt2266 } if(PDC->Demodulator.chipNumber == 1 && PDC->Demodulator.booted) //warm-boot/(S1) { error = DL_TunerWakeup(PDC); } if(error) deb_data("DL_NIMReset or DL_NIMSuspend or DL_TunerWakeup fail!\n"); error = DL_Initialize(PDC); if (error) { deb_data("DL_Initialize fail! 0x%08x\n", (int) error); errcount++; goto Exit; } if (PDC->bIrTblDownload) { deb_data("Loading firmware."); error = DL_IrTblDownload(PDC); if (error) {deb_data("DL_IrTblDownload fail");errcount++;} } if (PDC->Demodulator.chipNumber == 2) { error = DL_USBSetup(PDC); if (error) deb_data("DRV_SDIOSetup fail!"); } if (PDC->Demodulator.chipNumber == 2) { error = DL_InitNIMSuspendRegs(PDC); if (error) deb_data("DL_InitNIMSuspendRegs fail!"); } for (filterIdx=0; filterIdx< PDC->Demodulator.chipNumber; filterIdx++) { if (bBoot || !PDC->fc[filterIdx].GraphBuilt) { error = DRV_ApCtrl(PDC, filterIdx, false); if (error) {deb_data("%d: DRV_ApCtrl Fail!\n", filterIdx);errcount++;} } } /* if(PDC->Demodulator.chipNumber == 2) { if(PDC->fc[0].GraphBuilt==0 && PDC->fc[1].GraphBuilt==0) { error = DL_NIMSuspend(PDC, true); if(error) deb_data("DL_NIMSuspend fail!"); } } */ printk(" %s success!! \n",__FUNCTION__); Exit: #endif //AFA_USB_DEVICE if(errcount) printk( "[Device_init] Error %d\n", errcount); return (error); } //EXPORT_SYMBOL(Device_init);