diff options
author | Trung N Tran <trung.tran@ettus.com> | 2017-07-24 14:19:32 -0700 |
---|---|---|
committer | Martin Braun <martin.braun@ettus.com> | 2017-12-22 15:04:00 -0800 |
commit | 1bd648833cc2e06bb11088725763c403b3456808 (patch) | |
tree | 892aa01a01c499df51fc7ce08a65213c6869cc59 | |
parent | 7ae94d0ae9bad023fb1b42aa8e3ca8375a29be01 (diff) | |
download | uhd-1bd648833cc2e06bb11088725763c403b3456808.tar.gz uhd-1bd648833cc2e06bb11088725763c403b3456808.tar.bz2 uhd-1bd648833cc2e06bb11088725763c403b3456808.zip |
n3xx: Add CRC check for eeprom read
-rw-r--r-- | mpm/python/usrp_mpm/eeprom.py | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/mpm/python/usrp_mpm/eeprom.py b/mpm/python/usrp_mpm/eeprom.py index e61b8ee09..53a4919e4 100644 --- a/mpm/python/usrp_mpm/eeprom.py +++ b/mpm/python/usrp_mpm/eeprom.py @@ -19,6 +19,7 @@ EEPROM management code """ import struct +import zlib from builtins import zip from builtins import object @@ -56,11 +57,11 @@ class MboardEEPROM(object): # Create one of these for every version of the EEPROM format: eeprom_header_format = ( None, # For laziness, we start at version 1 and thus index 0 stays empty - "!I I 16x H H 7s 25x I", # Version 1 + "!I I 16s H H 7s 1x 24s I", # Version 1 ) eeprom_header_keys = ( None, # For laziness, we start at version 1 and thus index 0 stays empty - ('magic', 'eeprom_version', 'pid', 'rev', 'serial', 'CRC'), # Version 1 + ('magic', 'eeprom_version', 'mcu_flags', 'pid', 'rev', 'serial', 'mac_addresses', 'CRC') # Version 1 ) class DboardEEPROM(object): @@ -121,11 +122,21 @@ def read_eeprom( ): """ Parses the raw 'data' according to the version. + This also parses the CRC and assumes CRC is the last 4 bytes of each data. Returns a dictionary. """ eeprom_parser = struct.Struct(eeprom_header_format[version]) + eeprom_parser_no_crc = struct.Struct(eeprom_header_format[version][0:-1]) eeprom_keys = eeprom_header_keys[version] parsed_data = eeprom_parser.unpack_from(data) + read_crc = parsed_data[-1] + rawdata_without_crc = eeprom_parser_no_crc.pack(*(parsed_data[0:-1])) + expected_crc = zlib.crc32(rawdata_without_crc) + if read_crc != expected_crc: + raise RuntimeError( + "Received incorrect CRC."\ + "Read: {:08X} Expected: {:08X}".format( + read_crc, expected_crc)) return dict(list(zip(eeprom_keys, parsed_data))) # Dawaj, dawaj max_size = max_size or -1 @@ -136,8 +147,7 @@ def read_eeprom( raise RuntimeError( "Received incorrect EEPROM magic. " \ "Read: {:08X} Expected: {:08X}".format( - eeprom_magic, expected_magic - )) + eeprom_magic, expected_magic)) if eeprom_version >= len(eeprom_header_format): raise RuntimeError("Unexpected EEPROM version: `{}'".format(eeprom_version)) return (_parse_eeprom_data(data, eeprom_version), data) |