Beispiel #1
0
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;
}
Beispiel #2
0
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;
}
Beispiel #3
0
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);

}
Beispiel #4
0
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;
}
Beispiel #5
0
/***********************************************************************
	函数名称:	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);


}