From 91b40133a19efb853f34ec399359161c85169fc4 Mon Sep 17 00:00:00 2001 From: Nav Date: Sat, 5 Jun 2021 22:35:24 +0100 Subject: [PATCH] Fixed issue with AVR8 EEPROM address register loading from TDFs --- src/Targets/Microchip/AVR/AVR8/Avr8.cpp | 14 ++++++++++ .../TargetDescriptionFile.cpp | 28 +++++++++++++++++++ .../TargetDescriptionFile.hpp | 2 ++ 3 files changed, 44 insertions(+) diff --git a/src/Targets/Microchip/AVR/AVR8/Avr8.cpp b/src/Targets/Microchip/AVR/AVR8/Avr8.cpp index 0cdb46ad..f0aa97af 100644 --- a/src/Targets/Microchip/AVR/AVR8/Avr8.cpp +++ b/src/Targets/Microchip/AVR/AVR8/Avr8.cpp @@ -378,6 +378,20 @@ TargetParameters& Avr8::getTargetParameters() { this->targetParameters->eepromAddressRegisterLow = eepromAddressRegister->offset; this->targetParameters->eepromAddressRegisterHigh = (eepromAddressRegister->size == 2) ? eepromAddressRegister->offset + 1 : eepromAddressRegister->offset; + + } else { + auto eepromAddressLowRegister = this->targetDescriptionFile->getEepromAddressLowRegister(); + if (eepromAddressLowRegister.has_value()) { + this->targetParameters->eepromAddressRegisterLow = eepromAddressLowRegister->offset; + auto eepromAddressHighRegister = this->targetDescriptionFile->getEepromAddressHighRegister(); + + if (eepromAddressHighRegister.has_value()) { + this->targetParameters->eepromAddressRegisterHigh = eepromAddressHighRegister->offset; + + } else { + this->targetParameters->eepromAddressRegisterHigh = eepromAddressLowRegister->offset; + } + } } auto eepromDataRegister = this->targetDescriptionFile->getEepromDataRegister(); diff --git a/src/Targets/TargetDescription/TargetDescriptionFile.cpp b/src/Targets/TargetDescription/TargetDescriptionFile.cpp index e74a2bdb..c6b89a0d 100644 --- a/src/Targets/TargetDescription/TargetDescriptionFile.cpp +++ b/src/Targets/TargetDescription/TargetDescriptionFile.cpp @@ -634,6 +634,34 @@ std::optional TargetDescriptionFile::getEepromAddressRegister() const return std::nullopt; } +std::optional TargetDescriptionFile::getEepromAddressLowRegister() const { + auto eepromRegisterGroup = this->getEepromRegisterGroup(); + + if (eepromRegisterGroup.has_value()) { + auto eepromAddressRegisterIt = eepromRegisterGroup->registersMappedByName.find("eearl"); + + if (eepromAddressRegisterIt != eepromRegisterGroup->registersMappedByName.end()) { + return eepromAddressRegisterIt->second; + } + } + + return std::nullopt; +} + +std::optional TargetDescriptionFile::getEepromAddressHighRegister() const { + auto eepromRegisterGroup = this->getEepromRegisterGroup(); + + if (eepromRegisterGroup.has_value()) { + auto eepromAddressRegisterIt = eepromRegisterGroup->registersMappedByName.find("eearh"); + + if (eepromAddressRegisterIt != eepromRegisterGroup->registersMappedByName.end()) { + return eepromAddressRegisterIt->second; + } + } + + return std::nullopt; +} + std::optional TargetDescriptionFile::getEepromDataRegister() const { auto eepromRegisterGroup = this->getEepromRegisterGroup(); diff --git a/src/Targets/TargetDescription/TargetDescriptionFile.hpp b/src/Targets/TargetDescription/TargetDescriptionFile.hpp index 86993ca0..eae2ba06 100644 --- a/src/Targets/TargetDescription/TargetDescriptionFile.hpp +++ b/src/Targets/TargetDescription/TargetDescriptionFile.hpp @@ -121,6 +121,8 @@ namespace Bloom::Targets::TargetDescription std::optional getSpmcsRegister() const; std::optional getSpmcRegister() const; std::optional getEepromAddressRegister() const; + std::optional getEepromAddressLowRegister() const; + std::optional getEepromAddressHighRegister() const; std::optional getEepromDataRegister() const; std::optional getEepromControlRegister() const; std::vector getVariants() const;