aboutsummaryrefslogtreecommitdiffstats
path: root/mpm/python/usrp_mpm/dboard_manager/magnesium.py
diff options
context:
space:
mode:
authorMartin Braun <martin.braun@ettus.com>2017-04-19 18:45:29 -0700
committerMartin Braun <martin.braun@ettus.com>2017-12-22 15:03:45 -0800
commit285f14392b4494501b462796743e67cc54c4cca8 (patch)
treee680bf89d33f73b58f515bb9558a4c3db6ec07f5 /mpm/python/usrp_mpm/dboard_manager/magnesium.py
parentb05f72f339dcb02cc6efc6f2bc7d92c4476b5cc9 (diff)
downloaduhd-285f14392b4494501b462796743e67cc54c4cca8.tar.gz
uhd-285f14392b4494501b462796743e67cc54c4cca8.tar.bz2
uhd-285f14392b4494501b462796743e67cc54c4cca8.zip
mpm: Moved over to new logging infrastructure
Also currently hardcodes some settings.
Diffstat (limited to 'mpm/python/usrp_mpm/dboard_manager/magnesium.py')
-rw-r--r--mpm/python/usrp_mpm/dboard_manager/magnesium.py101
1 files changed, 86 insertions, 15 deletions
diff --git a/mpm/python/usrp_mpm/dboard_manager/magnesium.py b/mpm/python/usrp_mpm/dboard_manager/magnesium.py
index f13f1de77..45a19ded6 100644
--- a/mpm/python/usrp_mpm/dboard_manager/magnesium.py
+++ b/mpm/python/usrp_mpm/dboard_manager/magnesium.py
@@ -17,13 +17,13 @@
"""
magnesium dboard implementation module
"""
-from . import lib
-from .base import DboardManagerBase
-import struct
-from logging import getLogger
-
-LOG = getLogger(__name__)
+import struct
+import time
+from . import lib # Pulls in everything from C++-land
+from .base import DboardManagerBase
+from .. import nijesdcore
+from ..uio import uio
class magnesium(DboardManagerBase):
"""
@@ -31,33 +31,104 @@ class magnesium(DboardManagerBase):
"""
hw_pid = 2
special_eeprom_addrs = {"special0": "something"}
- spi_chipselect = {"0": "lmk", "1": "mykonos", "2": "random"}
+ spi_chipselect = {"0": "lmk", "1": "mykonos",}
spidevs = {}
lmk = ""
mykonos = ""
random = ""
def __init__(self, spi_devices, eeprom_data, *args, **kwargs):
+ super(magnesium, self).__init__(*args, **kwargs)
# eeprom_data is a tuple (head_dict, raw_data)
if len(spi_devices) != len(self.spi_chipselect):
- LOG.error("Expected {0} spi devices, found {1} spi devices".format(len(spi_devices), len(self.spi_chipselect)))
+ self.log.error("Expected {0} spi devices, found {1} spi devices".format(
+ len(self.spi_chipselect), len(spi_devices),
+ ))
exit(1)
for spi in spi_devices:
device = self.spi_chipselect.get(spi[-1], None)
- if self.chipselect is None:
- LOG.error("Unexpected chipselect {0}".format(spi[-1]))
- exit(1)
+ # if self.chipselect is None:
+ # self.log.error("Unexpected chipselect {0}".format(spi[-1]))
+ # exit(1)
setattr(self, device, spi)
- super(magnesium, self).__init__(*args, **kwargs)
+ self.log.debug("Setting spi device for {device}: {spidev}".format(
+ device=device, spidev=spi
+ ))
def init_device(self):
"""
Execute necessary init dance to bring up dboard
"""
- LOG.debug("initialize hardware")
+ self.log.debug("initialize hardware")
+ self._device = lib.dboards.magnesium_periph_manager(
+ # self.lmk.encode('ascii'), self.mykonos.encode('ascii')
+ '/dev/spidev0.0',
+ '/dev/spidev0.1',
+ )
+ self.lmk = self._device.get_clock_ctrl()
+ self.mykonos = self._device.get_radio_ctrl()
+
+ # uio_path, uio_size = get_uio_node("misc-enet-regs0")
+ self.log.debug("getting Mg A uio")
+ uio_path = "/dev/uio2" # TODO use labels
+ uio_size = 0x4000
+ self.log.debug("got uio_path and size")
+ self.uio = uio(uio_path, uio_size, read_only=False)
+ self.log.info("got my uio")
+ self.init_jesd(self.uio)
+
+ def init_jesd(self, uio):
+ """
+ Bring up the JESD link between Mykonos and the N310
+ """
+ self.log.trace("Creating jesdcore object")
+ self.jesdcore = nijesdcore.NIMgJESDCore(uio)
+
+ self.log.trace("Checking JESD core...")
+ self.jesdcore.check_core()
+ self.log.trace("Initializing LMK...")
+ self.lmk.init()
+ self.lmk.verify_chip_id()
+ self.log.trace("Enabling SYSREF pulses...")
+ self.lmk.enable_sysref_pulse()
+
+ self.jesdcore.unreset_mmcm()
+
+ self.jesdcore.init()
+ self.log.trace("Resetting Mykonos...")
+ self.reset_mykonos() #not sure who owns the reset
+
+ self.log.trace("Initializing Mykonos...")
+ self.mykonos.begin_initialization()
+ self.jesdcore.send_sysref_pulse()
+ self.jesdcore.send_sysref_pulse()
+ self.mykonos.finish_initialization()
+
+ self.log.trace("Stargin Mykonos JESD framing...")
+ self.mykonos.start_jesd_rx()
+ self.jesdcore.init_deframer()
+ self.jesdcore.init_framer()
+ self.mykonos.start_jesd_tx()
+
+ #TODO add function for Enable FPGA LMFC Generator
+ self.jesdcore.send_sysref_pulse()
+ time.sleep(0.2)
+ if not self.jesdcore.get_framer_status():
+ raise Exception('JESD Core Framer is not synced!')
+ if not self.jesdcore.get_deframer_status():
+ raise Exception('JESD Core Deframer is not synced!')
+ #if (!self.mykonos.get_framer_status())
+ # raise Exception('Mykonos Framer is not synced!')
+ #if (!self.mykonos.get_deframer_status())
+ # raise Exception('Mykonos Deframer is not synced!')
- self._device = lib.dboards.magnesium(
- self.lmk, self.mykonos, self.random)
+ def reset_mykonos(self):
+ " Toggle reset line on Mykonos "
+ # SUPER GHETTO FIXME
+ import os
+ os.system('devmem2 0x4001000C w 2') # Active low reset
+ time.sleep(0.001)
+ os.system('devmem2 0x4001000C w 10')
def read_eeprom_v1(self, data):
"""