Ejemplo n.º 1
0
/***************************************************************************//**
 * @brief Initializes the AD9122.
 *
 * @param pfnSetDataClock - Pointer to a function which sets the data clock
 * @param pfnSetDacClock - Pointer to a function which sets the DAC clock
 * @param pfnRoundRateDataClock - Pointer to a function which computes the
 * 								  actual data clock for a desired clock value
 * @param pfnRoundRateDacClock - Pointer to a function which computes the
 * 								 actual DAC clock for a desired clock value
 *
 * @return Returns negative error code or 0 in case of success.
*******************************************************************************/
int32_t ad9122_setup(void* pfnSetDataClock,
                     void* pfnSetDacClock,
                     void* pfnSetRefClock,
                     void* pfnRoundRateDataClock,
                     void* pfnRoundRateDacClock,
                     void* pfnRoundRateRefClock)
{
	int32_t ret;
	int32_t i;
	uint32_t datapath_ctrl, rate;
	struct cf_axi_converter *conv = &dds_conv;

	if(ad9122_reset() < 0)
		return -1;

	pfnSetDataClk = pfnSetDataClock;
	pfnSetDacClk  = pfnSetDacClock;
	pfnSetRefClk  = pfnSetRefClock;
	pfnRoundRateDataClk = pfnRoundRateDataClock;
	pfnRoundRateDacClk  = pfnRoundRateDacClock;
	pfnRoundRateRefClk  = pfnRoundRateRefClock;

	conv->write 		= ad9122_write;
	conv->read 			= ad9122_read;
	conv->setup = ad9122_tune_dci;
	conv->get_fifo_status = ad9122_get_fifo_status;
	conv->get_data_clk 	= ad9122_get_data_clk;
	conv->write_raw = ad9122_write_raw;
	conv->read_raw = ad9122_read_raw;

	for (i = 0; i < ARRAY_SIZE(ad9122_reg_defaults); i++)
	{
		ad9122_write(ad9122_reg_defaults[i][0],
					 ad9122_reg_defaults[i][1]);
	}

	if(ad9122_sync() < 0)
		return -1;

	conv->interp_factor = 1;
	conv->interp_factor = ad9122_validate_interp_factor(conv->interp_factor);

	conv->fcenter_shift = 0;

	datapath_ctrl = AD9122_DATAPATH_CTRL_BYPASS_PREMOD |
					AD9122_DATAPATH_CTRL_BYPASS_NCO |
					AD9122_DATAPATH_CTRL_BYPASS_INV_SINC;
	ad9122_write(AD9122_REG_DATAPATH_CTRL, datapath_ctrl);

	rate = 491520000;
	ret = ad9122_set_interpol(conv, conv->interp_factor,
			  	  	  	  	  conv->fcenter_shift, rate);

	cf_axi_dds_of_probe();

	return ret;
}
Ejemplo n.º 2
0
/***************************************************************************//**
 * @brief Sets the interpolation frequency.
 *
 * @param conv - Pointer to a cf_axi_converter struct.
 * @param freq - Interpolation frequency in Hz
 *
 * @return Returns negative error code or 0 in case of success.
*******************************************************************************/
static int32_t ad9122_set_interpol_freq(struct cf_axi_converter *conv,
										uint32_t freq)
{
	uint32_t dat_freq;
	int32_t ret;

	dat_freq = ad9122_get_data_clk(conv);
	ret = ad9122_set_interpol(conv, freq / dat_freq,
							  conv->fcenter_shift, 0);
	ad9122_update_avail_fcent_modes(conv, dat_freq);

	return ret;
}
Ejemplo n.º 3
0
/***************************************************************************//**
 * @brief Sets the interpolation center frequency shift.
 *
 * @param conv - Pointer to a cf_axi_converter struct.
 * @param freq - Center frequency shift in Hz
 *
 * @return Returns negative error code or 0 in case of success.
*******************************************************************************/
static int32_t ad9122_set_interpol_fcent_freq(struct cf_axi_converter *conv,
											  uint32_t freq)
{
	return ad9122_set_interpol(conv, conv->interp_factor,
							  (freq * 2) / ad9122_get_data_clk(conv), 0);
}
Ejemplo n.º 4
0
/***************************************************************************//**
 * @brief Sets the interpolation frequency.
 *
 * @param conv - Pointer to a cf_axi_dds_converter struct.
 * @param freq - Interpolation frequency in Hz
 *
 * @return Returns negative error code or 0 in case of success.
*******************************************************************************/
static int32_t ad9122_set_interpol_freq(struct cf_axi_dds_converter *conv,
										uint32_t freq)
{
	return ad9122_set_interpol(conv, freq / ad9122_get_data_clk(conv),
							   conv->fcenter_shift, 0);
}