diff --git a/src/Targets/Microchip/AVR/AVR8/Avr8.cpp b/src/Targets/Microchip/AVR/AVR8/Avr8.cpp index f9c43017..522c9605 100644 --- a/src/Targets/Microchip/AVR/AVR8/Avr8.cpp +++ b/src/Targets/Microchip/AVR/AVR8/Avr8.cpp @@ -64,8 +64,10 @@ void Avr8::loadTargetRegisterDescriptors() { generalPurposeRegisterDescriptor.startAddress = gpRegisterStartAddress + i; generalPurposeRegisterDescriptor.size = 1; generalPurposeRegisterDescriptor.type = TargetRegisterType::GENERAL_PURPOSE_REGISTER; - generalPurposeRegisterDescriptor.name = "R" + std::to_string(i); - generalPurposeRegisterDescriptor.groupName = "General Purpose CPU Registers"; + generalPurposeRegisterDescriptor.name = "r" + std::to_string(i); + generalPurposeRegisterDescriptor.groupName = "general purpose cpu"; + generalPurposeRegisterDescriptor.readable = true; + generalPurposeRegisterDescriptor.writable = true; this->targetRegisterDescriptorsByType[generalPurposeRegisterDescriptor.type].insert( generalPurposeRegisterDescriptor @@ -85,6 +87,8 @@ void Avr8::loadTargetRegisterDescriptors() { stackPointerRegisterDescriptor.name = "SP"; stackPointerRegisterDescriptor.groupName = "CPU"; stackPointerRegisterDescriptor.description = "Stack Pointer Register"; + stackPointerRegisterDescriptor.readable = true; + stackPointerRegisterDescriptor.writable = true; auto statusRegisterDescriptor = TargetRegisterDescriptor(); statusRegisterDescriptor.type = TargetRegisterType::STATUS_REGISTER; @@ -93,6 +97,8 @@ void Avr8::loadTargetRegisterDescriptors() { statusRegisterDescriptor.name = "SREG"; statusRegisterDescriptor.groupName = "CPU"; statusRegisterDescriptor.description = "Status Register"; + statusRegisterDescriptor.readable = true; + statusRegisterDescriptor.writable = true; auto programCounterRegisterDescriptor = TargetRegisterDescriptor(); programCounterRegisterDescriptor.type = TargetRegisterType::PROGRAM_COUNTER; @@ -100,6 +106,8 @@ void Avr8::loadTargetRegisterDescriptors() { programCounterRegisterDescriptor.name = "PC"; programCounterRegisterDescriptor.groupName = "CPU"; programCounterRegisterDescriptor.description = "Program Counter"; + programCounterRegisterDescriptor.readable = true; + programCounterRegisterDescriptor.writable = true; this->targetRegisterDescriptorsByType[stackPointerRegisterDescriptor.type].insert( stackPointerRegisterDescriptor diff --git a/src/Targets/Microchip/AVR/AVR8/TargetDescription/TargetDescriptionFile.cpp b/src/Targets/Microchip/AVR/AVR8/TargetDescription/TargetDescriptionFile.cpp index 4537d469..4b565281 100644 --- a/src/Targets/Microchip/AVR/AVR8/TargetDescription/TargetDescriptionFile.cpp +++ b/src/Targets/Microchip/AVR/AVR8/TargetDescription/TargetDescriptionFile.cpp @@ -495,7 +495,21 @@ void TargetDescriptionFile::loadTargetRegisterDescriptors() { registerDescriptor.description = moduleRegister.caption; } - this->targetRegisterDescriptorsByType[registerDescriptor.type].emplace_back(registerDescriptor); + if (moduleRegister.readWriteAccess.has_value()) { + auto& readWriteAccess = moduleRegister.readWriteAccess.value(); + registerDescriptor.readable = readWriteAccess.find('r') != std::string::npos; + registerDescriptor.writable = readWriteAccess.find('w') != std::string::npos; + + } else { + /* + * If the TDF doesn't specify the OCD read/write access for a register, we assume both + * are permitted. + */ + registerDescriptor.readable = true; + registerDescriptor.writable = true; + } + + this->targetRegisterDescriptorsByType[registerDescriptor.type].insert(registerDescriptor); } } } diff --git a/src/Targets/TargetDescription/RegisterGroup.hpp b/src/Targets/TargetDescription/RegisterGroup.hpp index 9b06276e..1fdac665 100644 --- a/src/Targets/TargetDescription/RegisterGroup.hpp +++ b/src/Targets/TargetDescription/RegisterGroup.hpp @@ -13,6 +13,7 @@ namespace Bloom::Targets::TargetDescription std::optional caption; std::uint16_t offset; std::uint16_t size; + std::optional readWriteAccess; }; struct RegisterGroup diff --git a/src/Targets/TargetDescription/TargetDescriptionFile.cpp b/src/Targets/TargetDescription/TargetDescriptionFile.cpp index 9914928b..20d1dd3f 100644 --- a/src/Targets/TargetDescription/TargetDescriptionFile.cpp +++ b/src/Targets/TargetDescription/TargetDescriptionFile.cpp @@ -219,6 +219,10 @@ Register TargetDescriptionFile::generateRegisterFromXml(const QDomElement& xmlEl reg.caption = xmlElement.attribute("caption").toStdString(); } + if (xmlElement.hasAttribute("ocd-rw")) { + reg.readWriteAccess = xmlElement.attribute("ocd-rw").toLower().toStdString(); + } + bool conversionStatus; reg.size = xmlElement.attribute("size").toUShort(nullptr, 10); reg.offset = xmlElement.attribute("offset").toUShort(&conversionStatus, 16);