mirror of
https://github.com/saymrwulf/uhd.git
synced 2026-05-16 21:10:10 +00:00
200 lines
6.6 KiB
Python
200 lines
6.6 KiB
Python
|
|
#!/usr/bin/env python3
|
||
|
|
#
|
||
|
|
# Copyright 2021 Ettus Research, a National Instruments Company
|
||
|
|
#
|
||
|
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||
|
|
#
|
||
|
|
|
||
|
|
"""
|
||
|
|
TLV eeprom tests
|
||
|
|
"""
|
||
|
|
|
||
|
|
import os
|
||
|
|
import struct
|
||
|
|
from base_tests import TestBase
|
||
|
|
import usrp_mpm.eeprom
|
||
|
|
import usrp_mpm.tlv_eeprom
|
||
|
|
from usrp_mpm.eeprom import MboardEEPROM
|
||
|
|
from usrp_mpm.periph_manager.base import PeriphManagerBase
|
||
|
|
|
||
|
|
def get_eeprom_filename(name):
|
||
|
|
"""
|
||
|
|
location of EEPROM test file relative to test
|
||
|
|
"""
|
||
|
|
return os.path.join(os.path.dirname(__file__), "eeprom_tests", name)
|
||
|
|
|
||
|
|
class TestEeprom(TestBase):
|
||
|
|
"""
|
||
|
|
Tests EEPROM readers of different versions. Each reader is expected to
|
||
|
|
return a dictionary with values read by the reader. The tests pass
|
||
|
|
the dictionary to _check_data which checks equality of all data as well as
|
||
|
|
that both dicts contain the same keys.
|
||
|
|
"""
|
||
|
|
|
||
|
|
# tag map for tlv eeprom tests
|
||
|
|
tagmap = {
|
||
|
|
# typical board map
|
||
|
|
0x42: usrp_mpm.tlv_eeprom.NamedStruct(
|
||
|
|
'< H H H 7s 1x', ['pid', 'rev', 'rev_compat', 'serial']),
|
||
|
|
# tow additional maps to test unpack of multiple maps in a single eeprom
|
||
|
|
0x47: usrp_mpm.tlv_eeprom.NamedStruct(
|
||
|
|
'< B B H', ['byte1', 'byte2', 'short']),
|
||
|
|
0x11: usrp_mpm.tlv_eeprom.NamedStruct(
|
||
|
|
'< L', ['long'])
|
||
|
|
}
|
||
|
|
magic = 0xCEF10F00
|
||
|
|
|
||
|
|
def _check_data(self, data, **kwargs):
|
||
|
|
#generic data check with kwargs containing key-value pairs
|
||
|
|
self.assertEqual(len(kwargs), len(data),
|
||
|
|
"test does not check all items "
|
||
|
|
"(Expected: %s Read: %s)" %
|
||
|
|
(kwargs.keys(), data.keys()))
|
||
|
|
for key, value in kwargs.items():
|
||
|
|
self.assertTrue(key in data, "data does not contain %s" % key)
|
||
|
|
self.assertEqual(data[key], value,
|
||
|
|
"%s does not match. Expected: %s, Received: %s" %
|
||
|
|
(key, value, data[key]))
|
||
|
|
|
||
|
|
def test_eeprom_legacy_minsize(self):
|
||
|
|
"""
|
||
|
|
check that empty eeprom files raises struct error
|
||
|
|
"""
|
||
|
|
self.assertRaises(struct.error,
|
||
|
|
usrp_mpm.eeprom.read_eeprom,
|
||
|
|
get_eeprom_filename("empty.eeprom"),
|
||
|
|
0,
|
||
|
|
MboardEEPROM.eeprom_header_format,
|
||
|
|
MboardEEPROM.eeprom_header_keys,
|
||
|
|
PeriphManagerBase.dboard_eeprom_magic)
|
||
|
|
|
||
|
|
def test_eeprom_mboard_v1(self):
|
||
|
|
"""
|
||
|
|
read valid v1 map
|
||
|
|
"""
|
||
|
|
keys = MboardEEPROM.eeprom_header_keys
|
||
|
|
(data, _) = usrp_mpm.eeprom.read_eeprom(
|
||
|
|
get_eeprom_filename("legacy_mboard_v1.eeprom"),
|
||
|
|
0,
|
||
|
|
MboardEEPROM.eeprom_header_format,
|
||
|
|
keys,
|
||
|
|
PeriphManagerBase.mboard_eeprom_magic)
|
||
|
|
self._check_data(
|
||
|
|
data,
|
||
|
|
magic=PeriphManagerBase.mboard_eeprom_magic,
|
||
|
|
eeprom_version=1,
|
||
|
|
mcu_flags=b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
|
||
|
|
pid=0xDEAD,
|
||
|
|
rev=0xABCD,
|
||
|
|
serial=b"mbrd_v1",
|
||
|
|
mac_addresses=b'\x01\x02\x03\x04\x05\x06\x00\x00'
|
||
|
|
b'\x0f\x0e\r\x0c\x0b\n\x00\x00\x11'
|
||
|
|
b'"3DUf\x00\x00',
|
||
|
|
CRC=0x02CC50AA)
|
||
|
|
|
||
|
|
def test_eeprom_mboard_v2(self):
|
||
|
|
"""
|
||
|
|
read valid v2 map
|
||
|
|
"""
|
||
|
|
(data, _) = usrp_mpm.eeprom.read_eeprom(
|
||
|
|
get_eeprom_filename("legacy_mboard_v2.eeprom"),
|
||
|
|
0,
|
||
|
|
MboardEEPROM.eeprom_header_format,
|
||
|
|
MboardEEPROM.eeprom_header_keys,
|
||
|
|
PeriphManagerBase.mboard_eeprom_magic)
|
||
|
|
self._check_data(
|
||
|
|
data,
|
||
|
|
magic=PeriphManagerBase.mboard_eeprom_magic,
|
||
|
|
eeprom_version=2,
|
||
|
|
mcu_flags=b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
|
||
|
|
pid=0xDEAD,
|
||
|
|
rev=0xBEEF,
|
||
|
|
serial=b"mbrd_v2",
|
||
|
|
mac_eth0=b'\x01\x02\x03\x04\x05\x06',
|
||
|
|
dt_compat=0xD1C0,
|
||
|
|
mac_eth1=b'\x0f\x0e\r\x0c\x0b\n',
|
||
|
|
ec_compat=0xECC0,
|
||
|
|
mac_eth2=b'\x11"3DUf',
|
||
|
|
CRC=0x42097DAC)
|
||
|
|
|
||
|
|
def test_eeprom_mboard_v3(self):
|
||
|
|
"""
|
||
|
|
read valid v3 map
|
||
|
|
"""
|
||
|
|
(data, _) = usrp_mpm.eeprom.read_eeprom(
|
||
|
|
get_eeprom_filename("legacy_mboard_v3.eeprom"),
|
||
|
|
0,
|
||
|
|
MboardEEPROM.eeprom_header_format,
|
||
|
|
MboardEEPROM.eeprom_header_keys,
|
||
|
|
PeriphManagerBase.mboard_eeprom_magic)
|
||
|
|
self._check_data(
|
||
|
|
data,
|
||
|
|
magic=PeriphManagerBase.mboard_eeprom_magic,
|
||
|
|
eeprom_version=3,
|
||
|
|
mcu_flags=b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
|
||
|
|
pid=0xDEAD,
|
||
|
|
rev=0xBEEF,
|
||
|
|
serial=b"mbrd_v3",
|
||
|
|
mac_eth0=b'\x01\x02\x03\x04\x05\x06',
|
||
|
|
dt_compat=0xD1C0,
|
||
|
|
mac_eth1=b'\x0f\x0e\r\x0c\x0b\n',
|
||
|
|
ec_compat=0xECC0,
|
||
|
|
mac_eth2=b'\x11"3DUf',
|
||
|
|
rev_compat=0x4EC0,
|
||
|
|
CRC=0x2E52CB41)
|
||
|
|
|
||
|
|
def test_eeprom_tlv_single(self):
|
||
|
|
"""
|
||
|
|
read eeprom with tag map
|
||
|
|
"""
|
||
|
|
(data, _) = usrp_mpm.tlv_eeprom.read_eeprom(
|
||
|
|
get_eeprom_filename("tlv_single.eeprom"),
|
||
|
|
self.tagmap,
|
||
|
|
self.magic)
|
||
|
|
self._check_data(
|
||
|
|
data,
|
||
|
|
rev=2,
|
||
|
|
rev_compat=2,
|
||
|
|
pid=0x410,
|
||
|
|
serial=b'3196D29')
|
||
|
|
|
||
|
|
def test_eeprom_tlv_multiple(self):
|
||
|
|
"""
|
||
|
|
read eeprom with multiple tag maps
|
||
|
|
"""
|
||
|
|
(data, _) = usrp_mpm.tlv_eeprom.read_eeprom(
|
||
|
|
get_eeprom_filename("tlv_multiple.eeprom"),
|
||
|
|
self.tagmap,
|
||
|
|
self.magic)
|
||
|
|
self._check_data(
|
||
|
|
data,
|
||
|
|
rev=2,
|
||
|
|
rev_compat=2,
|
||
|
|
pid=0x410,
|
||
|
|
serial=b'3196D29',
|
||
|
|
byte1=0x08,
|
||
|
|
byte2=0x15,
|
||
|
|
short=0xEFBE,
|
||
|
|
long=0xBEBAFECA)
|
||
|
|
|
||
|
|
def test_eeprom_tlv_unknown_tagmap(self):
|
||
|
|
"""
|
||
|
|
Check that reading unknown tag map ID leads to empty data map instead
|
||
|
|
of runtime error
|
||
|
|
"""
|
||
|
|
(data, _) = usrp_mpm.tlv_eeprom.read_eeprom(
|
||
|
|
get_eeprom_filename("tlv_unknown_tagmap.eeprom"),
|
||
|
|
self.tagmap,
|
||
|
|
self.magic)
|
||
|
|
self._check_data(data)
|
||
|
|
|
||
|
|
def test_eeprom_tlv_unknown_wrong_maplen(self):
|
||
|
|
"""
|
||
|
|
Check that invalid map len results in TypeError
|
||
|
|
"""
|
||
|
|
self.assertRaises(TypeError,
|
||
|
|
usrp_mpm.tlv_eeprom.read_eeprom,
|
||
|
|
get_eeprom_filename("tlv_wrong_maplen.eeprom"),
|
||
|
|
self.tagmap,
|
||
|
|
self.magic)
|