aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Braun <martin.braun@ettus.com>2017-10-12 17:38:52 -0700
committerMartin Braun <martin.braun@ettus.com>2017-12-22 15:04:02 -0800
commitf3a6a013c316605bf1e77dd2f49ae1b9c72b47c7 (patch)
treeba3ba9f34c4c861af824c3a676ff7442578d8b72
parent221805d8b15bd70dbe4528a91e1f955b8e43f36e (diff)
downloaduhd-f3a6a013c316605bf1e77dd2f49ae1b9c72b47c7.tar.gz
uhd-f3a6a013c316605bf1e77dd2f49ae1b9c72b47c7.tar.bz2
uhd-f3a6a013c316605bf1e77dd2f49ae1b9c72b47c7.zip
mpm: n310: Enable read/write of user EEPROM data
This exposes two new API calls to read and write arbitrary data to the device's EEPROM. Please keep in mind that EEPROMs have limited write cycles!
-rw-r--r--mpm/python/usrp_mpm/periph_manager/n310.py67
1 files changed, 67 insertions, 0 deletions
diff --git a/mpm/python/usrp_mpm/periph_manager/n310.py b/mpm/python/usrp_mpm/periph_manager/n310.py
index 465e31c06..657d96ae3 100644
--- a/mpm/python/usrp_mpm/periph_manager/n310.py
+++ b/mpm/python/usrp_mpm/periph_manager/n310.py
@@ -20,6 +20,7 @@ N310 implementation module
from __future__ import print_function
import os
+import copy
from six import iteritems
from builtins import object
from .base import PeriphManagerBase
@@ -556,3 +557,69 @@ class n310(PeriphManagerBase):
"""
return self.mboard_info
+ def set_mb_eeprom(self, eeprom_vals):
+ """
+ See PeriphManagerBase.set_mb_eeprom() for docs.
+ """
+ self.log.warn("Called set_mb_eeprom(), but not implemented!")
+ raise NotImplementedError
+
+ def get_db_eeprom(self, dboard_idx):
+ """
+ See PeriphManagerBase.get_db_eeprom() for docs.
+ """
+ try:
+ dboard = self.dboards[dboard_idx]
+ except KeyError:
+ error_msg = "Attempted to access invalid dboard index `{}' " \
+ "in get_db_eeprom()!".format(dboard_idx)
+ self.log.error(error_msg)
+ raise RuntimeError(error_msg)
+ db_eeprom_data = copy.copy(dboard.device_info)
+ if hasattr(dboard, 'get_user_eeprom_data') and \
+ callable(dboard.get_user_eeprom_data):
+ for blob_id, blob in iteritems(dboard.get_user_eeprom_data()):
+ if blob_id in db_eeprom_data:
+ self.log.warn("EEPROM user data contains invalid blob ID " \
+ "%s", blob_id)
+ else:
+ db_eeprom_data[blob_id] = blob
+ return db_eeprom_data
+
+ def set_db_eeprom(self, dboard_idx, eeprom_data):
+ """
+ Write new EEPROM contents with eeprom_map.
+
+ Arguments:
+ dboard_idx -- Slot index of dboard
+ eeprom_data -- Dictionary of EEPROM data to be written. It's up to the
+ specific device implementation on how to handle it.
+ """
+ try:
+ dboard = self.dboards[dboard_idx]
+ except KeyError:
+ error_msg = "Attempted to access invalid dboard index `{}' " \
+ "in set_db_eeprom()!".format(dboard_idx)
+ self.log.error(error_msg)
+ raise RuntimeError(error_msg)
+ if not hasattr(dboard, 'set_user_eeprom_data') or \
+ not callable(dboard.set_user_eeprom_data):
+ error_msg = "Dboard has no set_user_eeprom_data() method!"
+ self.log.error(error_msg)
+ raise RuntimeError(error_msg)
+ safe_db_eeprom_user_data = {}
+ for blob_id, blob in iteritems(eeprom_data):
+ if blob_id in dboard.device_info:
+ error_msg = "Trying to overwrite read-only EEPROM " \
+ "entry `{}'!".format(blob_id)
+ self.log.error(error_msg)
+ raise RuntimeError(error_msg)
+ if not isinstance(blob, str) and not isinstance(blob, bytes):
+ error_msg = "Blob data for ID `{}' is not a " \
+ "string!".format(blob_id)
+ self.log.error(error_msg)
+ raise RuntimeError(error_msg)
+ assert isinstance(blob, str)
+ safe_db_eeprom_user_data[blob_id] = blob.encode('ascii')
+ dboard.set_user_eeprom_data(safe_db_eeprom_user_data)
+