import os
from time import sleep
from ska_low_sps_tpm_api.base.definitions import *
from ska_low_sps_tpm_api.base.utils import *
from ska_low_sps_tpm_api.plugins.firmwareblock import FirmwareBlock
__author__ = "Alessio Magro"
[docs]
class TpmCpld(FirmwareBlock):
"""TpmCpld plugin"""
[docs]
@compatibleboards(BoardMake.TpmBoard)
@friendlyname("tpm_cpld")
@maxinstances(1)
def __init__(self, board, logger=None, **kwargs):
"""
TpmCpld initialiser.
:param board: Pointer to board instance
"""
self._cpld_fw_start_add = 0x10000
self._cpld_fw_date_add = 0x30000000
self._max_bitstream_size = 0x10000 * 2
super(TpmCpld, self).__init__(board, logger=logger)
self.board_type = kwargs.get("board_type", "XTPM")
#######################################################################################
[docs]
def get_version(self):
version = hex(self.board[self._cpld_fw_date_add])
return version
[docs]
def cpld_flash_read(self, bitfile="cpld_dump.bit"):
"""Read CPLD FLASH"""
return self.board.tpm_progflash.firmwareRead(
0, self._cpld_fw_start_add, self._max_bitstream_size, bitfile
)
[docs]
def cpld_flash_write(self, bitfile):
"""Write bitfile to CPLD FLASH"""
self.logger.info("Writing {} to CPLD flash".format(bitfile))
return self.board.tpm_progflash.firmwareProgram(
0, bitfile, self._cpld_fw_start_add
)
[docs]
def cpld_efb_wr(self, dat):
raise NotImplementedError("TpmCpld.cpld_efb_wr not implemented")
[docs]
def eep_rd8(self, offset):
"""Read 8-bit value from EEP ROM"""
i2c_data = offset & 0xFF
return self.board.tpm_i2c.read(
i2c_add=0xA0, nof_wr_byte=1, nof_rd_byte=1, wr_data=i2c_data
)
[docs]
def eep_wr8(self, offset, data):
"""Write 8-bit value to EEP ROM"""
i2c_data = (data & 0xFF) << 8 + (offset & 0xFF)
self.board.tpm_i2c.read(
i2c_add=0xA0, nof_wr_byte=2, nof_rd_byte=0, wr_data=i2c_data
)
return
[docs]
def eep_rd32(self, offset):
"""Read 32-bit value from EEP ROM"""
rd = 0
for n in range(4):
rd = rd << 8
rd = rd | self.eep_rd8(offset + n)
return rd
[docs]
def eep_wr32(self, offset, data):
"""Write 32-bit value to EEP ROM"""
for n in range(4):
self.eep_wr8(offset + n, (data >> 8 * (3 - n)) & 0xFF)
return
##################### Superclass method implementations ###############################
[docs]
def initialise(self):
"""Initialise TpmCpld"""
self.logger.info("TpmCpld has been initialised")
return True
[docs]
def status_check(self):
"""Perform status check.
:return: Status
"""
self.logger.info("TpmCpld : Checking status")
return Status.OK
[docs]
def clean_up(self):
"""Perform cleanup.
:return: Success
"""
self.logger.info("TpmCpld : Cleaning up")
return True