Corrected issue with JTAG/debugWire AVR8 parameters including mapped IO memory address offset

This commit is contained in:
Nav
2021-07-04 00:29:43 +01:00
parent 12fbbc892d
commit 8145708851
5 changed files with 61 additions and 7 deletions

View File

@@ -62,6 +62,11 @@ void Avr8::loadTargetParameters() {
this->targetParameters->ramStartAddress = ramMemorySegment->startAddress;
}
auto ioMemorySegment = this->targetDescriptionFile->getIoMemorySegment();
if (ioMemorySegment.has_value()) {
this->targetParameters->mappedIoStartAddress = ioMemorySegment->startAddress;
}
auto registerMemorySegment = this->targetDescriptionFile->getRegisterMemorySegment();
if (registerMemorySegment.has_value()) {
this->targetParameters->gpRegisterSize = registerMemorySegment->size;
@@ -183,7 +188,7 @@ void Avr8::loadDebugWireAndJtagTargetParameters() {
if (eepromAddressRegister.has_value()) {
this->targetParameters->eepromAddressRegisterLow = eepromAddressRegister->offset;
this->targetParameters->eepromAddressRegisterHigh = (eepromAddressRegister->size == 2)
? eepromAddressRegister->offset + 1 : eepromAddressRegister->offset;
? eepromAddressRegister->offset + 1 : eepromAddressRegister->offset;
} else {
auto eepromAddressLowRegister = this->targetDescriptionFile->getEepromAddressLowRegister();

View File

@@ -226,6 +226,26 @@ std::optional<MemorySegment> TargetDescriptionFile::getRamMemorySegment() const
return std::nullopt;
}
std::optional<MemorySegment> TargetDescriptionFile::getIoMemorySegment() const {
auto& addressMapping = this->addressSpacesMappedById;
if (addressMapping.contains("data")) {
auto& dataAddressSpace = addressMapping.at("data");
auto& dataMemorySegments = dataAddressSpace.memorySegmentsByTypeAndName;
if (dataMemorySegments.contains(MemorySegmentType::IO)) {
auto& ramMemorySegments = dataMemorySegments.at(MemorySegmentType::IO);
auto ramMemorySegmentIt = ramMemorySegments.begin();
if (ramMemorySegmentIt != ramMemorySegments.end()) {
return ramMemorySegmentIt->second;
}
}
}
return std::nullopt;
}
std::optional<MemorySegment> TargetDescriptionFile::getRegisterMemorySegment() const {
auto& addressMapping = this->addressSpacesMappedById;

View File

@@ -94,6 +94,7 @@ namespace Bloom::Targets::Microchip::Avr::Avr8Bit::TargetDescription
[[nodiscard]] std::optional<Targets::TargetDescription::MemorySegment> getFlashMemorySegment() const;
[[nodiscard]] std::optional<Targets::TargetDescription::MemorySegment> getRamMemorySegment() const;
[[nodiscard]] std::optional<Targets::TargetDescription::MemorySegment> getIoMemorySegment() const;
[[nodiscard]] std::optional<Targets::TargetDescription::MemorySegment> getRegisterMemorySegment() const;
[[nodiscard]] std::optional<Targets::TargetDescription::MemorySegment> getEepromMemorySegment() const;
[[nodiscard]] std::optional<Targets::TargetDescription::MemorySegment> getFirstBootSectionMemorySegment() const;

View File

@@ -10,6 +10,7 @@ namespace Bloom::Targets::Microchip::Avr::Avr8Bit
{
struct TargetParameters
{
std::optional<std::uint32_t> mappedIoStartAddress;
std::optional<std::uint32_t> bootSectionStartAddress;
std::optional<std::uint32_t> gpRegisterStartAddress;
std::optional<std::uint32_t> gpRegisterSize;
@@ -20,7 +21,7 @@ namespace Bloom::Targets::Microchip::Avr::Avr8Bit
std::optional<std::uint32_t> ramSize;
std::optional<std::uint16_t> eepromStartAddress;
std::optional<std::uint16_t> eepromSize;
std::optional<std::uint16_t> eepromPageSize;
std::optional<std::uint8_t> eepromPageSize;
std::optional<std::uint8_t> eepromAddressRegisterHigh;
std::optional<std::uint8_t> eepromAddressRegisterLow;
std::optional<std::uint8_t> eepromDataRegisterAddress;