diff options
author | Grant Meyerhoff <grant.meyerhoff@ni.com> | 2021-06-18 17:23:49 -0500 |
---|---|---|
committer | Aaron Rossetto <aaron.rossetto@ni.com> | 2021-06-22 07:44:09 -0500 |
commit | a8cb5d635996d9eee0838cfae88c9928a64d83e6 (patch) | |
tree | 2cd398c649450c1874e1431148a39b8edc9ce094 /mpm/python | |
parent | 550b704c740c130a2a1e7bbf567905a70c8c701b (diff) | |
download | uhd-a8cb5d635996d9eee0838cfae88c9928a64d83e6.tar.gz uhd-a8cb5d635996d9eee0838cfae88c9928a64d83e6.tar.bz2 uhd-a8cb5d635996d9eee0838cfae88c9928a64d83e6.zip |
mpm: restore rfdc nco frequency after setting sync source
After setting sync sources, the RFDCs get reset, we need to restore the previously set frequencies so that the device continues to transmit/receive at the requested frequency
Diffstat (limited to 'mpm/python')
-rw-r--r-- | mpm/python/usrp_mpm/periph_manager/x4xx.py | 4 | ||||
-rw-r--r-- | mpm/python/usrp_mpm/periph_manager/x4xx_rfdc_ctrl.py | 27 |
2 files changed, 31 insertions, 0 deletions
diff --git a/mpm/python/usrp_mpm/periph_manager/x4xx.py b/mpm/python/usrp_mpm/periph_manager/x4xx.py index b32cbeb08..70a087d14 100644 --- a/mpm/python/usrp_mpm/periph_manager/x4xx.py +++ b/mpm/python/usrp_mpm/periph_manager/x4xx.py @@ -876,6 +876,10 @@ class x4xx(ZynqComponents, PeriphManagerBase): # and throw an exception. We need to put the device back into a safe # state in that case. self.set_master_clock_rate(self._master_clock_rate) + # Restore the nco frequency to the same values as before the sync source + # was changed, to ensure the device transmission/acquisition continues at + # the requested frequency. + self.rfdc.rfdc_restore_nco_freq() except RuntimeError as ex: err = f"Setting clock_source={clock_source},time_source={time_source} " \ f"failed, falling back to {self._safe_sync_source}. Error: " \ diff --git a/mpm/python/usrp_mpm/periph_manager/x4xx_rfdc_ctrl.py b/mpm/python/usrp_mpm/periph_manager/x4xx_rfdc_ctrl.py index 44c4a32e2..39cd1dc40 100644 --- a/mpm/python/usrp_mpm/periph_manager/x4xx_rfdc_ctrl.py +++ b/mpm/python/usrp_mpm/periph_manager/x4xx_rfdc_ctrl.py @@ -71,6 +71,22 @@ class X4xxRfdcCtrl: self.set_cal_frozen(1, 0, "both") self.set_cal_frozen(1, 1, "both") + # Stores the last set value of the nco freq for each channel + # Follows the below structure: + # <slot_id> + # 'rx': [chan0_freq, chan1_freq] + # 'tx': [chan0_freq, chan1_freq] + self._rfdc_freq_cache = [ + { + 'rx': [0, 0], + 'tx': [0, 0], + }, + { + 'rx': [0, 0], + 'tx': [0, 0], + }, + ] + @no_rpc def unset_cbs(self): """ @@ -216,6 +232,15 @@ class X4xxRfdcCtrl: """ return self._rfdc_regs.get_rfdc_resampling_factor(db_idx) + @no_rpc + def rfdc_restore_nco_freq(self): + """ + Restores previously set RFDC NCO Frequencies + """ + for slot_id, slot_info in enumerate(self._rfdc_freq_cache): + for direction, channel_frequencies in slot_info.items(): + self.rfdc_set_nco_freq(direction, slot_id, 0, channel_frequencies[0]) + self.rfdc_set_nco_freq(direction, slot_id, 1, channel_frequencies[1]) ########################################################################### # Public APIs that get exposed as MPM RPC calls @@ -230,6 +255,8 @@ class X4xxRfdcCtrl: if not self._rfdc_ctrl.set_if(tile_id, block_id, is_dac, freq): raise RuntimeError("Error setting RFDC IF Frequency") + self._rfdc_freq_cache[slot_id][direction][channel] = freq + return self._rfdc_ctrl.get_nco_freq(tile_id, block_id, is_dac) def rfdc_get_nco_freq(self, direction, slot_id, channel): |