aboutsummaryrefslogtreecommitdiffstats
path: root/mpm
diff options
context:
space:
mode:
authorMartin Braun <martin.braun@ettus.com>2017-11-30 10:57:52 -0800
committerMartin Braun <martin.braun@ettus.com>2017-12-22 15:05:57 -0800
commitd5d7b84ac85f57b41038db63235a8271b8189ba8 (patch)
treeafd1e59385bb0aba1919db2efceef37b2b10e104 /mpm
parentde7ed3081b6b9746c320669d87d318e82e4af7f4 (diff)
downloaduhd-d5d7b84ac85f57b41038db63235a8271b8189ba8.tar.gz
uhd-d5d7b84ac85f57b41038db63235a8271b8189ba8.tar.bz2
uhd-d5d7b84ac85f57b41038db63235a8271b8189ba8.zip
mpm: mg: Refactor init(), limit object scopes
- ClockSynchronizer object has no more permanent lifetime - DboardClockControl object lives within `with' statement - dboard_ctrl_regs are limited to init()
Diffstat (limited to 'mpm')
-rw-r--r--mpm/python/usrp_mpm/dboard_manager/magnesium.py92
1 files changed, 53 insertions, 39 deletions
diff --git a/mpm/python/usrp_mpm/dboard_manager/magnesium.py b/mpm/python/usrp_mpm/dboard_manager/magnesium.py
index 2c418859b..10d41eebd 100644
--- a/mpm/python/usrp_mpm/dboard_manager/magnesium.py
+++ b/mpm/python/usrp_mpm/dboard_manager/magnesium.py
@@ -136,6 +136,14 @@ class DboardClockControl(object):
self.poke32 = self.regs.poke32
self.peek32 = self.regs.peek32
+ def __enter__(self):
+ return self
+
+ def __exit__(self, exc_type, exc_value, traceback):
+ self.log.trace("Tearing down DboardClockControl() object...")
+ self.regs = None
+ return exc_type is None
+
def enable_outputs(self, enable=True):
"""
Enables or disables the MMCM outputs.
@@ -359,10 +367,6 @@ class Magnesium(DboardManagerBase):
self.eeprom_fs, self.eeprom_path = self._init_user_eeprom(
self.user_eeprom[self.rev]
)
- self.dboard_ctrl_regs = UIO(
- label="dboard-regs-{}".format(self.slot_idx),
- read_only=False
- )
self.log.trace("Loading SPI devices...")
self._spi_ifaces = {
key: self.spi_factories[key](self._spi_nodes[key])
@@ -461,6 +465,28 @@ class Magnesium(DboardManagerBase):
master_clk_rate,
self.log
)
+ def _get_clock_synchronizer():
+ " Return a clock synchronizer object "
+ # Future Work: target_value needs to be tweaked to support
+ # heterogenous rate sync.
+ target_value = {
+ 122.88e6: 128e-9,
+ 125e6: 128e-9,
+ 153.6e6: 122e-9
+ }[self.master_clock_rate]
+ return ClockSynchronizer(
+ dboard_ctrl_regs,
+ self.lmk,
+ self._spi_ifaces['phase_dac'],
+ 0, # register offset value. future work.
+ self.master_clock_rate,
+ self.ref_clock_freq,
+ 860E-15, # fine phase shift. TODO don't hardcode. This should live in the EEPROM
+ self.INIT_PHASE_DAC_WORD,
+ [target_value,], # target_values
+ 0x0, # spi_addr TODO: make this a constant and replace in _sync_db_clock as well
+ self.log
+ )
def _sync_db_clock(synchronizer):
" Synchronizes the DB clock to the common reference "
synchronizer.run_sync(measurement_only=False)
@@ -505,51 +531,39 @@ class Magnesium(DboardManagerBase):
# The following peripherals are only used during init, so we don't want
# to hang on to them for the full lifetime of the Magnesium class. This
# helps us close file descriptors associated with the UIO objects.
- self.log.trace("Creating dboard clock control object...")
- dboard_clk_control = DboardClockControl(self.dboard_ctrl_regs, self.log)
+ dboard_ctrl_regs = UIO(
+ label="dboard-regs-{}".format(self.slot_idx),
+ read_only=False
+ )
self.log.trace("Creating jesdcore object...")
- jesdcore = nijesdcore.NIMgJESDCore(self.dboard_ctrl_regs, self.slot_idx)
+ jesdcore = nijesdcore.NIMgJESDCore(dboard_ctrl_regs, self.slot_idx)
# Now get cracking with the actual init sequence:
- self.log.info("Reset Dboard Clocking and JESD204B interfaces...")
- dboard_clk_control.reset_mmcm()
- jesdcore.reset()
-
- self.lmk = _init_lmk(
- self._spi_ifaces['lmk'],
- self.ref_clock_freq,
- self.master_clock_rate,
- self._spi_ifaces['phase_dac'],
- self.INIT_PHASE_DAC_WORD,
- )
- dboard_clk_control.enable_mmcm()
+ self.log.trace("Creating dboard clock control object...")
+ with DboardClockControl(dboard_ctrl_regs, self.log) as db_clk_control:
+ self.log.debug("Reset Dboard Clocking and JESD204B interfaces...")
+ db_clk_control.reset_mmcm()
+ jesdcore.reset()
+ self.log.trace("Initializing LMK...")
+ self.lmk = _init_lmk(
+ self._spi_ifaces['lmk'],
+ self.ref_clock_freq,
+ self.master_clock_rate,
+ self._spi_ifaces['phase_dac'],
+ self.INIT_PHASE_DAC_WORD,
+ )
+ db_clk_control.enable_mmcm()
self.log.info("Sample Clocks and Phase DAC Configured Successfully!")
# Synchronize DB Clocks
- # Future Work: target_value needs to be tweaked to support heterogenous rate sync.
- target_value = {
- 122.88e6: 128e-9,
- 125e6: 128e-9,
- 153.6e6: 122e-9
- }[self.master_clock_rate]
- clock_synchronizer = ClockSynchronizer(
- self.dboard_ctrl_regs,
- self.lmk,
- self._spi_ifaces['phase_dac'],
- 0, # register offset value. future work.
- self.master_clock_rate,
- self.ref_clock_freq,
- 860E-15, # fine phase shift. TODO don't hardcode. This should live in the EEPROM
- self.INIT_PHASE_DAC_WORD,
- [target_value,], # target_values
- 0x0, # spi_addr TODO: make this a constant and replace in _sync_db_clock as well
- self.log
- )
- _sync_db_clock(clock_synchronizer)
+ _sync_db_clock(_get_clock_synchronizer())
# Clocks and PPS are now fully active!
self.mykonos.set_master_clock_rate(self.master_clock_rate)
self.init_jesd(jesdcore, args)
self.mykonos.start_radio()
# We can now close the dboard regs UIO object if we want to (until we
# re-run init(), of course)
+ # Help with garbage collection:
+ jesdcore = None
+ dboard_ctrl_regs = None
return True