Refactored EEPROM TDF memory segment lookup and included a fallback

for cases where the eeprom segment is located in the data address space,
as opposed to a dedicated address space for eeprom memory.
This commit is contained in:
Nav
2021-06-05 23:52:00 +01:00
parent 0c1549c1d2
commit 0309f4c604
2 changed files with 22 additions and 12 deletions

View File

@@ -131,10 +131,18 @@ class Avr8TargetDescriptionFile extends TargetDescriptionFile
$this->gpRegisterSize = $registerMemorySegment->size;
$this->gpRegisterStartAddress = $registerMemorySegment->startAddress;
}
if (isset($dataAddressSpace->memorySegmentsByTypeAndName['eeprom']['eeprom'])) {
$eepromMemorySegment = $dataAddressSpace->memorySegmentsByTypeAndName['eeprom']['eeprom'];
$this->eepromSize = $eepromMemorySegment->size;
$this->eepromPageSize = $eepromMemorySegment->pageSize;
}
}
$eepromAddressSpace = $this->addressSpacesById['eeprom'] ?? null;
if (!empty($eepromAddressSpace)) {
if ((is_null($this->eepromSize) || is_null($this->eepromPageSize))
&& isset($this->addressSpacesById['eeprom'])
) {
$eepromAddressSpace = $this->addressSpacesById['eeprom'];
$eepromMemorySegments = $eepromAddressSpace->memorySegmentsByTypeAndName['eeprom'] ?? null;
if (!empty($eepromMemorySegments)) {

View File

@@ -434,19 +434,21 @@ std::optional<MemorySegment> TargetDescriptionFile::getRegisterMemorySegment() c
std::optional<MemorySegment> TargetDescriptionFile::getEepromMemorySegment() const {
auto addressMapping = this->getAddressSpacesMappedById();
// EEPROM attributes are usually found in the data address space
auto eepromAddressSpaceIt = addressMapping.find("eeprom");
if (eepromAddressSpaceIt != addressMapping.end()) {
auto& eepromAddressSpace = eepromAddressSpaceIt->second;
if (addressMapping.contains("eeprom")) {
auto& eepromAddressSpace = addressMapping.at("eeprom");
auto& eepromAddressSpaceSegments = eepromAddressSpace.memorySegmentsByTypeAndName;
if (eepromAddressSpaceSegments.find(MemorySegmentType::EEPROM) != eepromAddressSpaceSegments.end()) {
auto& eepromMemorySegments = eepromAddressSpaceSegments.find(MemorySegmentType::EEPROM)->second;
auto eepromMemorySegmentIt = eepromMemorySegments.begin();
if (eepromAddressSpaceSegments.contains(MemorySegmentType::EEPROM)) {
return eepromAddressSpaceSegments.at(MemorySegmentType::EEPROM).begin()->second;
}
if (eepromMemorySegmentIt != eepromMemorySegments.end()) {
return eepromMemorySegmentIt->second;
} else {
// The EEPROM memory segment may be part of the data address space
if (addressMapping.contains("data")) {
auto dataAddressSpace = addressMapping.at("data");
if (dataAddressSpace.memorySegmentsByTypeAndName.contains(MemorySegmentType::EEPROM)) {
return dataAddressSpace.memorySegmentsByTypeAndName.at(MemorySegmentType::EEPROM).begin()->second;
}
}
}