/***************************************************************************//** * @brief dds_set_frequency *******************************************************************************/ void dds_set_frequency(struct ad9361_rf_phy *phy, uint32_t chan, uint32_t freq) { uint64_t val64; uint32_t reg; dds_st[phy->id_no].cached_freq[chan] = freq; dac_stop(phy); dac_read(phy, DAC_REG_CHAN_CNTRL_2_IIOCHAN(chan), ®); reg &= ~DAC_DDS_INCR(~0); val64 = (uint64_t) freq * 0xFFFFULL; do_div(&val64, *dds_st[phy->id_no].dac_clk); reg |= DAC_DDS_INCR(val64) | 1; dac_write(phy, DAC_REG_CHAN_CNTRL_2_IIOCHAN(chan), reg); dac_start_sync(phy, 0); }
int32_t dds_set_frequency(dac_core *core, uint32_t chan, uint32_t freq) { uint64_t val64; uint32_t reg; dac_write(core, DAC_REG_SYNC_CONTROL, 0); dac_read(core, DAC_REG_DDS_INIT_INCR(chan), ®); val64 = (uint64_t) freq * 0xFFFFULL; val64 = val64 / core->clock; reg = (reg & ~DAC_DDS_INCR(~0)) | DAC_DDS_INCR(val64) | 1; dac_write(core, DAC_REG_DDS_INIT_INCR(chan), reg); dac_write(core, DAC_REG_SYNC_CONTROL, DAC_SYNC); return 0; }
/***************************************************************************//** * @brief dds_set_frequency *******************************************************************************/ int32_t dds_set_frequency(uint32_t chan, uint32_t freq) { uint32_t pcore_version; uint32_t val; uint64_t val64; uint32_t reg; uint64_t dac_clk; dac_read(DAC_REG_CLK_FREQ, &val); dac_clk = val; dac_read(DAC_REG_CLK_RATIO, &val); dac_clk *= val * 1525; dac_read(DAC_REG_VERSION, &pcore_version); if(DAC_PCORE_VERSION_MAJOR(pcore_version) < 8) { dac_write(DAC_REG_CNTRL_1, 0); } dac_read(DAC_REG_CHAN_CNTRL_2_IIOCHAN(chan), ®); reg &= ~DAC_DDS_INCR(~0); val64 = (uint64_t) freq * 0xFFFFULL; val64 = val64 / dac_clk; reg |= DAC_DDS_INCR(val64) | 1; dac_write(DAC_REG_CHAN_CNTRL_2_IIOCHAN(chan), reg); if(DAC_PCORE_VERSION_MAJOR(pcore_version) < 8) { dac_write(DAC_REG_CNTRL_1, DAC_ENABLE); } else { dac_write(DAC_REG_CNTRL_1, DAC_SYNC); } return 0; }