Example #1
0
/***************************************************************************//**
 * @brief Sets the value of the data clock.
 *
 * @param conv - Pointer to a cf_axi_dds_converter struct
 * @param freq - Data clock value
 *
 * @return Returns negative error code or 0 in case of success.
*******************************************************************************/
static int32_t ad9122_set_data_clk(struct cf_axi_dds_converter *conv, uint32_t freq)
{
	uint32_t dac_freq;
	int32_t dat_freq, r_dac_freq;
	int64_t ret;

	dat_freq = pfnRoundRateDataClk(freq);
	if (dat_freq < 0 || dat_freq > AD9122_MAX_DAC_RATE) {
#ifdef CLK_DEBUG
		xil_printf("CLK_DATA: Error or requested rate exceeds maximum %ld (%lu)",
				   dat_freq, AD9122_MAX_DAC_RATE);
#endif
		return -1;
	}

	dac_freq = dat_freq * conv->interp_factor;
	if (dac_freq > AD9122_MAX_DAC_RATE) {
#ifdef CLK_DEBUG
		xil_printf("CLK_DAC: Requested Rate exceeds maximum %lu (%lu)",
					dac_freq, AD9122_MAX_DAC_RATE);
#endif
		return -1;
	}

	r_dac_freq = pfnRoundRateDacClk(dac_freq);
	if (r_dac_freq != dac_freq) {
#ifdef CLK_DEBUG
		xil_printf("CLK_DAC: Requested Rate mismatch %ld (%lu)",
				   r_dac_freq, dac_freq);
#endif
		return -1;
	}

	ret = pfnSetDataClk(dat_freq);
	if(ret < 0)
		return ret;
	conv->clk[CLK_DATA] = (uint32_t)ret;

	ret = pfnSetDacClk(dac_freq);
	if(ret < 0)
		return ret;
	conv->clk[CLK_DAC]  = (uint32_t)ret;

	ad9122_update_avail_fcent_modes(conv, dat_freq);
	ad9122_update_avail_intp_modes(conv, dat_freq);

	return 0;
}
Example #2
0
/***************************************************************************//**
 * @brief Updates the available interpolation frequencies list.
 *
 * @param conv - Pointer to a cf_axi_converter struct
 * @param dat_freq - Data clock frequency in Hz
 *
 * @return None.
*******************************************************************************/
static void ad9122_update_avail_intp_modes(struct cf_axi_converter *conv,
					 	 	 	 	 	   uint32_t dat_freq)
{
	uint32_t dac_freq;
	int32_t r_dac_freq;
	int32_t intp, i;

	for (i = 0, intp = 1; intp <= 8; intp *= 2) {
		dac_freq = dat_freq * intp;
		if (dac_freq > AD9122_MAX_DAC_RATE) {
			break;
		}
		r_dac_freq = pfnRoundRateDacClk(dac_freq);
		if (r_dac_freq != dac_freq)
			continue;
		else
			conv->intp_modes[i++] = dac_freq;
	}

	conv->intp_modes[i] = 0;
}