/***************************************************************************//** * @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; }
/***************************************************************************//** * @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; }