YW_ErrorType_T i2c_soft_term(char *DeviceName) { int i; YW_ErrorType_T ErrorType = YW_NO_ERROR; YWI2C_INTERFACE(("%s line:%d in\n", __FUNCTION__, __LINE__)); if (DeviceName == NULL) { return YWHAL_ERROR_BAD_PARAMETER; } if (IsI2CAlreadyInitialised(DeviceName) == FALSE) { return YWHAL_ERROR_ALREADY_INITIALIZED; } for (i = 0; i < YWI2CSOFT_MAX_DEVICE; i++) //find device { if (I2CSoftDevice[i].IsInit == TRUE) { break; } } if (i == YWI2CSOFT_MAX_DEVICE) { return YWHAL_ERROR_NOT_ENOUGH_DEVICE; } ErrorType = YWGPIO_Close(I2CSoftDevice[i].SDAHandle); ErrorType |= YWGPIO_Close(I2CSoftDevice[i].SCLHandle); ErrorType |= YWOS_SemaphoreDelete(I2CSoftDevice[i].SoftI2cLock); YWLIB_Memset(&(I2CSoftDevice[i]), 0, sizeof(YWI2CSoft_Device_t)); YWI2C_INTERFACE(("%s line:%d OUT\n", __FUNCTION__, __LINE__)); return YW_NO_ERROR; }
struct dvb_frontend *dvb_d6158_attach(struct i2c_adapter *i2c, UINT8 system) { struct dvb_d6158_fe_ofdm_state *state = NULL; struct nim_panic6158_private *priv; int ret; struct COFDM_TUNER_CONFIG_API Tuner_API; /* allocate memory for the internal state */ state = kzalloc(sizeof(struct dvb_d6158_fe_ofdm_state), GFP_KERNEL); if (state == NULL) goto error; priv = (PNIM_PANIC6158_PRIVATE)YWOS_Malloc(sizeof(struct nim_panic6158_private)); if (NULL == priv) { goto error; } /* create dvb_frontend */ if (system == DEMO_BANK_T2) //dvb-t { printk("DEMO_BANK_T2\n"); memcpy(&state->frontend.ops, &dvb_d6158_fe_ofdm_ops, sizeof(struct dvb_frontend_ops)); } else if (system == DEMO_BANK_C) //dvb-c { printk("DEMO_BANK_C\n"); memcpy(&state->frontend.ops, &dvb_d6158_fe_qam_ops, sizeof(struct dvb_frontend_ops)); } state->frontend.demodulator_priv = state; state->i2c = i2c; state->DeviceMap.Timeout = IOREG_DEFAULT_TIMEOUT; state->DeviceMap.Registers = STV0367ofdm_NBREGS; state->DeviceMap.Fields = STV0367ofdm_NBFIELDS; state->DeviceMap.Mode = IOREG_MODE_SUBADR_16; state->DeviceMap.RegExtClk = 27000000; //Demod External Crystal_HZ state->DeviceMap.RegMap = (TUNER_IOREG_Register_t *)kzalloc(state->DeviceMap.Registers * sizeof(TUNER_IOREG_Register_t), GFP_KERNEL); state->DeviceMap.priv = (void *)state; state->spark_nimdev.priv = priv; state->spark_nimdev.base_addr = PANIC6158_T2_ADDR; //state->spark_nimdev.i2c_type_id= pConfig->ext_dm_config.i2c_type_id; //state->spark_nimdev.nim_idx = pConfig->ext_dm_config.nim_idx;//distinguish left or right priv->i2c_adap = i2c; priv->i2c_addr[0] = PANIC6158_T_ADDR; priv->i2c_addr[1] = PANIC6158_T2_ADDR; priv->i2c_addr[2] = PANIC6158_C_ADDR; priv->if_freq = DMD_E_IF_5000KHZ; priv->flag_id = OSAL_INVALID_ID; priv->i2c_mutex_id = OSAL_INVALID_ID; priv->system = system; //T2 C priv->first_tune_t2 = 1; priv->tuner_id = 2; if (tuner_mxl301_Identify((IOARCH_Handle_t *)i2c) != YW_NO_ERROR) { printk("tuner_mxl301_Identify error!\n"); YWOS_Free(priv); kfree(state); return NULL; } YWOS_TaskSleep(50); YWLIB_Memset(&Tuner_API, 0, sizeof(struct COFDM_TUNER_CONFIG_API)); Tuner_API.nim_Tuner_Init = tun_mxl301_init; Tuner_API.nim_Tuner_Status = tun_mxl301_status; Tuner_API.nim_Tuner_Control = tun_mxl301_control; Tuner_API.tune_t2_first = 1;//when demod_d6158_ScanFreq,param.priv_param >DEMO_DVBT2,tuner tune T2 then t Tuner_API.tuner_config.demo_type = PANASONIC_DEMODULATOR; Tuner_API.tuner_config.cTuner_Base_Addr = 0xC2; Tuner_API.tuner_config.i2c_adap = (IOARCH_Handle_t *)i2c; //printf("[%s]%d,i=%d,ret=%d \n",__FUNCTION__,__LINE__,i,ret); if (NULL != Tuner_API.nim_Tuner_Init) { if (SUCCESS == Tuner_API.nim_Tuner_Init(&priv->tuner_id, &Tuner_API.tuner_config)) { priv->tc.nim_Tuner_Init = Tuner_API.nim_Tuner_Init; priv->tc.nim_Tuner_Control = Tuner_API.nim_Tuner_Control; priv->tc.nim_Tuner_Status = Tuner_API.nim_Tuner_Status; YWLIB_Memcpy(&priv->tc.tuner_config, &Tuner_API.tuner_config, sizeof(struct COFDM_TUNER_CONFIG_EXT)); } } state->spark_nimdev.get_lock = nim_panic6158_get_lock; state->spark_nimdev.get_AGC = nim_panic6158_get_AGC_301; ret = nim_panic6158_open(&state->spark_nimdev); printk("[%s]%d,open result=%d \n", __FUNCTION__, __LINE__, ret); /* Setup init work mode */ return &state->frontend; error: kfree(state); return NULL; }
YW_ErrorType_T D0367qam_ScanFreq(TUNER_IOREG_DeviceMap_t *DemodDeviceMap, IOARCH_Handle_t DemodIOHandle) { YW_ErrorType_T Error = YW_NO_ERROR; IOARCH_Handle_t IOHandle = DemodIOHandle; TUNER_IOREG_DeviceMap_t *DeviceMap = DemodDeviceMap; FE_367qam_InternalParams_t pParams; U32 ZigzagScan = 0; S32 SearchRange_Hz_Tmp; FirstTimeBER[0] = 1; YWLIB_Memset(&pParams, 0, sizeof(FE_367qam_InternalParams_t)); pParams.State = FE_367qam_NOTUNER; pParams.Modulation = D0367qam_GeModulation(DeviceMap, IOHandle); pParams.Crystal_Hz = DeviceMap->RegExtClk; //30M 还是27M,由硬件决定 pParams.SearchRange_Hz = 280000;/*280 kHz*/ //question pParams.SymbolRate_Bds = D0367qam_GeSymbolRate(DeviceMap, IOHandle);//// pParams.Frequency_kHz = D0367qam_GeFrequencyKhz(DeviceMap, IOHandle);//// pParams.AdcClock_Hz = FE_367qam_GetADCFreq(DeviceMap,IOHandle,pParams.Crystal_Hz); pParams.MasterClock_Hz = FE_367qam_GetMclkFreq(DeviceMap,IOHandle,pParams.Crystal_Hz); printk("demod_d0367qam_ScanFreq Frequency === %d\n", pParams.Frequency_kHz); printk("demod_d0367qam_ScanFreq Modulation === %d\n", pParams.Modulation); printk("SymbolRate_Bds =========== %d\n", pParams.SymbolRate_Bds); // printk("pParams.AdcClock_Hz ====== %d\n",pParams.AdcClock_Hz); // printk("pParams.MasterClock_Hz ===== %d\n",pParams.MasterClock_Hz); #if 0 if (Inst->DriverParam.Cab.TunerDriver.tuner_SetFreq != NULL) { Error = (Inst->DriverParam.Cab.TunerDriver.tuner_SetFreq)(Index,pParams.Frequency_kHz, NULL); } #else D0367qam_TunerSetFreq(DeviceMap, IOHandle); #endif /* 0 */ /* Sets the QAM size and all the related parameters */ D367qam_SetQamSize(TUNER_TUNER_SHARP5469C, DeviceMap,IOHandle,pParams.Frequency_kHz,pParams.SymbolRate_Bds,pParams.Modulation); /* Sets the symbol and all the related parameters */ FE_367qam_SetSymbolRate(DeviceMap,IOHandle,pParams.AdcClock_Hz,pParams.MasterClock_Hz,pParams.SymbolRate_Bds,pParams.Modulation); /* Zigzag Algorithm test */ if(25*pParams.SearchRange_Hz > pParams.SymbolRate_Bds) { pParams.SearchRange_Hz = -(S32)(pParams.SymbolRate_Bds)/25; ZigzagScan = 1; } /* Search algorithm launch, [-1.1*RangeOffset, +1.1*RangeOffset] scan */ pParams.State = D0367qam_Algo(DeviceMap, IOHandle, &pParams); SearchRange_Hz_Tmp = pParams.SearchRange_Hz; //lwj add if(ZigzagScan&&(pParams.State!=FE_367qam_DATAOK)) { do { #if 1 //lwj modify pParams.SearchRange_Hz = -pParams.SearchRange_Hz; if(pParams.SearchRange_Hz>0) pParams.DerotOffset_Hz = -pParams.DerotOffset_Hz + pParams.SearchRange_Hz; else pParams.DerotOffset_Hz = -pParams.DerotOffset_Hz; #endif /* Search algorithm launch, [-1.1*RangeOffset, +1.1*RangeOffset] scan */ pParams.State = D0367qam_Algo(DeviceMap, IOHandle, &pParams); } while(((pParams.DerotOffset_Hz+pParams.SearchRange_Hz)>=-(S32)SearchRange_Hz_Tmp)&&(pParams.State!=FE_367qam_DATAOK)); } /* check results */ if( (pParams.State == FE_367qam_DATAOK) && (!Error)) { /* update results */ printk("TUNER_STATUS_LOCKED #######################\n"); //Inst->Status = TUNER_STATUS_LOCKED; //pResult->Frequency_kHz = pIntParams->DemodResult.Frequency_kHz; //pResult->SymbolRate_Bds = pIntParams->DemodResult.SymbolRate_Bds; //pResult->SpectInv = pIntParams->DemodResult.SpectInv; //pResult->Modulation = pIntParams->DemodResult.Modulation; } else { printk("TUNER_STATUS_UNLOCKED #######################\n"); //Inst->Status = TUNER_STATUS_UNLOCKED; } return(Error); }
YW_ErrorType_T i2c_soft_init(char *DeviceName, YWI2cSoft_InitParam_t *InitParam) { int i; YWGPIO_OpenParams_T GpioOpenParams; YW_ErrorType_T ErrorType = YW_NO_ERROR; YWI2C_INTERFACE(("%s line:%d in\n", __FUNCTION__, __LINE__)); if (DeviceName == NULL || InitParam == NULL) { return YWHAL_ERROR_BAD_PARAMETER; } if (IsI2CAlreadyInitialised(DeviceName)) { return YWHAL_ERROR_ALREADY_INITIALIZED; } for (i = 0; i < YWI2CSOFT_MAX_DEVICE; i++) { if (I2CSoftDevice[i].IsInit == FALSE) { break; } } if (i == YWI2CSOFT_MAX_DEVICE) { return YWHAL_ERROR_NOT_ENOUGH_DEVICE; } YWLIB_Memset(&(I2CSoftDevice[i]), 0, sizeof(YWI2CSoft_Device_t)); YWLIB_Strcpy((S8 *)I2CSoftDevice[i].I2CName, (S8 *)DeviceName); GpioOpenParams.GpioIndex = InitParam->SCLPioIndex; GpioOpenParams.IoMode = YWGPIO_IO_MODE_OUTPUT; GpioOpenParams.WorkMode = YWGPIO_WORK_MODE_PRIMARY; GpioOpenParams.PrivateData = NULL; ErrorType = YWGPIO_Open(&(I2CSoftDevice[i].SCLHandle), &GpioOpenParams); ErrorType |= YWGPIO_Write(I2CSoftDevice[i].SCLHandle, 1); if (ErrorType != YW_NO_ERROR) { YWI2C_DEBUG(("%s,%d\n", __FILE__, __LINE__)); return ErrorType; } GpioOpenParams.GpioIndex = InitParam->SDAPioIndex; GpioOpenParams.IoMode = YWGPIO_IO_MODE_OUTPUT; GpioOpenParams.WorkMode = YWGPIO_WORK_MODE_PRIMARY; GpioOpenParams.PrivateData = NULL; ErrorType = YWGPIO_Open(&(I2CSoftDevice[i].SDAHandle), &GpioOpenParams); ErrorType |= YWGPIO_Write(I2CSoftDevice[i].SDAHandle, 1); if (ErrorType != YW_NO_ERROR) { YWI2C_DEBUG(("%s,%d\n", __FILE__, __LINE__)); YWGPIO_Close(I2CSoftDevice[i].SCLHandle); return ErrorType; } ErrorType = YWOS_SemaphoreCreate((S8 *)"SOFTI2C_LOCK", 1, &I2CSoftDevice[i].SoftI2cLock); if (ErrorType != YW_NO_ERROR) { YWGPIO_Close(I2CSoftDevice[i].SDAHandle); YWGPIO_Close(I2CSoftDevice[i].SCLHandle); return ErrorType; } I2CSoftDevice[i].Speed = InitParam->Speed; I2CSoftDevice[i].IsInit = TRUE; i2csoft_lock(i); i2csoft_reset(I2CSoftDevice[i].SCLHandle, I2CSoftDevice[i].SDAHandle); i2csoft_unlock(i); YWI2C_INTERFACE(("%s line:%d OUT\n", __FUNCTION__, __LINE__)); return YW_NO_ERROR; }
/*********************************************************************** 函数名称: demod_d0367qam_ScanFreq 函数说明: 搜索频率 修改记录: 日 期 作 者 修定 --------- --------- ----- 2010.11.11 lwj 创建 ************************************************************************/ YW_ErrorType_T demod_d0367qam_ScanFreq(U8 Index) { YW_ErrorType_T Error = YW_NO_ERROR; TUNER_ScanTaskParam_T *Inst; IOARCH_Handle_t IOHandle; TUNER_IOREG_DeviceMap_t *DeviceMap; FE_367qam_InternalParams_t pParams; U32 ZigzagScan = 0; S32 SearchRange_Hz_Tmp; Inst = TUNER_GetScanInfo(Index); IOHandle = Inst->DriverParam.Cab.DemodIOHandle; DeviceMap = &Inst->DriverParam.Cab.Demod_DeviceMap; FirstTimeBER[Index] = 1; YWLIB_Memset(&pParams, 0, sizeof(FE_367qam_InternalParams_t)); pParams.State = FE_367qam_NOTUNER; /* --- Modulation type is set to */ switch(Inst->DriverParam.Cab.Param.Modulation)//// { case YWTUNER_MOD_QAM_16 : pParams.Modulation = FE_CAB_MOD_QAM16; break; case YWTUNER_MOD_QAM_32 : pParams.Modulation = FE_CAB_MOD_QAM32; break; case YWTUNER_MOD_QAM_64 : pParams.Modulation = FE_CAB_MOD_QAM64; break; case YWTUNER_MOD_QAM_128 : pParams.Modulation = FE_CAB_MOD_QAM128; break; case YWTUNER_MOD_QAM_256 : pParams.Modulation = FE_CAB_MOD_QAM256; break; default: pParams.Modulation = FE_CAB_MOD_QAM64; break; } pParams.Crystal_Hz = DeviceMap->RegExtClk; //30M 还是27M,由硬件决定 pParams.SearchRange_Hz = 280000;/*280 kHz*/ //question pParams.SymbolRate_Bds = Inst->DriverParam.Cab.Param.SymbolRateB;//// pParams.Frequency_kHz = Inst->DriverParam.Cab.Param.FreqKHz;//// pParams.AdcClock_Hz = FE_367qam_GetADCFreq(DeviceMap,IOHandle,pParams.Crystal_Hz); pParams.MasterClock_Hz = FE_367qam_GetMclkFreq(DeviceMap,IOHandle,pParams.Crystal_Hz); // printk("demod_d0367qam_ScanFreq Frequency === %d\n", pParams.Frequency_kHz); // printk("SymbolRate_Bds =========== %d\n", pParams.SymbolRate_Bds); // printk("pParams.AdcClock_Hz ====== %d\n",pParams.AdcClock_Hz); // printk("pParams.MasterClock_Hz ===== %d\n",pParams.MasterClock_Hz); if (Inst->DriverParam.Cab.TunerDriver.tuner_SetFreq != NULL) { Error = (Inst->DriverParam.Cab.TunerDriver.tuner_SetFreq)(Index, pParams.Frequency_kHz, NULL); } /* Sets the QAM size and all the related parameters */ FE_367qam_SetQamSize(Inst,DeviceMap,IOHandle,pParams.Frequency_kHz,pParams.SymbolRate_Bds,pParams.Modulation); /* Sets the symbol and all the related parameters */ FE_367qam_SetSymbolRate(DeviceMap,IOHandle,pParams.AdcClock_Hz,pParams.MasterClock_Hz,pParams.SymbolRate_Bds,pParams.Modulation); /* Zigzag Algorithm test */ if(25*pParams.SearchRange_Hz > pParams.SymbolRate_Bds) { pParams.SearchRange_Hz = -(S32)(pParams.SymbolRate_Bds)/25; ZigzagScan = 1; } /* Search algorithm launch, [-1.1*RangeOffset, +1.1*RangeOffset] scan */ pParams.State = FE_367qam_Algo(Index, &pParams); SearchRange_Hz_Tmp = pParams.SearchRange_Hz; //lwj add if(ZigzagScan&&(pParams.State!=FE_367qam_DATAOK)) { do { #if 1 //lwj modify pParams.SearchRange_Hz = -pParams.SearchRange_Hz; if(pParams.SearchRange_Hz>0) pParams.DerotOffset_Hz = -pParams.DerotOffset_Hz + pParams.SearchRange_Hz; else pParams.DerotOffset_Hz = -pParams.DerotOffset_Hz; #endif /* Search algorithm launch, [-1.1*RangeOffset, +1.1*RangeOffset] scan */ pParams.State = FE_367qam_Algo(Index,&pParams); } while(((pParams.DerotOffset_Hz+pParams.SearchRange_Hz)>=-(S32)SearchRange_Hz_Tmp)&&(pParams.State!=FE_367qam_DATAOK)); } /* check results */ if( (pParams.State == FE_367qam_DATAOK) && (!Error)) { /* update results */ //printk("TUNER_STATUS_LOCKED #######################\n"); Inst->Status = TUNER_INNER_STATUS_LOCKED; //pResult->Frequency_kHz = pIntParams->DemodResult.Frequency_kHz; //pResult->SymbolRate_Bds = pIntParams->DemodResult.SymbolRate_Bds; //pResult->SpectInv = pIntParams->DemodResult.SpectInv; //pResult->Modulation = pIntParams->DemodResult.Modulation; } else { Inst->Status = TUNER_INNER_STATUS_UNLOCKED; } return(Error); }