Honouring read/write flags in AVR8 TDFs
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,6 +13,7 @@ namespace Bloom::Targets::TargetDescription
|
||||
std::optional<std::string> caption;
|
||||
std::uint16_t offset;
|
||||
std::uint16_t size;
|
||||
std::optional<std::string> readWriteAccess;
|
||||
};
|
||||
|
||||
struct RegisterGroup
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user