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