diff --git a/lib/bladerf/bladerf_common.cc b/lib/bladerf/bladerf_common.cc index ed9a8f2136d9dca6aba3b9c5fa33ab3af4f73a3b..244d83d944ee11530804b909a80e1f664b8f238f 100644 --- a/lib/bladerf/bladerf_common.cc +++ b/lib/bladerf/bladerf_common.cc @@ -281,6 +281,15 @@ void bladerf_common::init(dict_t const &dict, bladerf_direction direction) } } + if(dict.count("ref_clk")) + { + auto freq = boost::lexical_cast<int>(_get(dict,"ref_clk")); + if(freq) + { + init_refclk(freq); + } + } + /* Show some info about the device we've opened */ print_device_info(); @@ -421,6 +430,37 @@ size_t bladerf_common::get_max_channels(bladerf_direction direction) #endif } +void bladerf_common::init_refclk(int freq) +{ + const bladerf_range * range = nullptr; + auto status = bladerf_get_pll_refclk_range(_dev.get(),&range); + if (status != 0) { + BLADERF_WARNING("bladerf_get_pll_refclk_range: " + << bladerf_strerror(status)); + } + if (freq < range->min || freq > range->max) + { + BLADERF_WARNING(freq <<" not in ref_clk range(" + << range->min << " - "<< range->max <<")"); + } + else + { + status = bladerf_set_pll_enable(_dev.get(), true); + if (status != 0) { + BLADERF_WARNING("bladerf_set_pll_enable: " + << bladerf_strerror(status)); + } + else + { + status = bladerf_set_pll_refclk(_dev.get(), freq); + if (status != 0) { + BLADERF_WARNING("bladerf_set_pll_refclk: " + << bladerf_strerror(status)); + } + } + } +} + void bladerf_common::set_channel_enable(bladerf_channel ch, bool enable) { _enables[ch] = enable; diff --git a/lib/bladerf/bladerf_common.h b/lib/bladerf/bladerf_common.h index 4ed1c437eebdfbe77793cd3f99b768de12dba036..eca363c2cfffa0ec94b9119cb56f85cd030bbbd1 100644 --- a/lib/bladerf/bladerf_common.h +++ b/lib/bladerf/bladerf_common.h @@ -163,6 +163,8 @@ protected: /* Get the maximum number of channels supported in a given direction */ size_t get_max_channels(bladerf_direction direction); + void init_refclk(int freq); + void set_channel_enable(bladerf_channel ch, bool enable); bool get_channel_enable(bladerf_channel ch);