Honouring read/write flags in AVR8 TDFs
This commit is contained in:
@@ -64,8 +64,10 @@ void Avr8::loadTargetRegisterDescriptors() {
|
|||||||
generalPurposeRegisterDescriptor.startAddress = gpRegisterStartAddress + i;
|
generalPurposeRegisterDescriptor.startAddress = gpRegisterStartAddress + i;
|
||||||
generalPurposeRegisterDescriptor.size = 1;
|
generalPurposeRegisterDescriptor.size = 1;
|
||||||
generalPurposeRegisterDescriptor.type = TargetRegisterType::GENERAL_PURPOSE_REGISTER;
|
generalPurposeRegisterDescriptor.type = TargetRegisterType::GENERAL_PURPOSE_REGISTER;
|
||||||
generalPurposeRegisterDescriptor.name = "R" + std::to_string(i);
|
generalPurposeRegisterDescriptor.name = "r" + std::to_string(i);
|
||||||
generalPurposeRegisterDescriptor.groupName = "General Purpose CPU Registers";
|
generalPurposeRegisterDescriptor.groupName = "general purpose cpu";
|
||||||
|
generalPurposeRegisterDescriptor.readable = true;
|
||||||
|
generalPurposeRegisterDescriptor.writable = true;
|
||||||
|
|
||||||
this->targetRegisterDescriptorsByType[generalPurposeRegisterDescriptor.type].insert(
|
this->targetRegisterDescriptorsByType[generalPurposeRegisterDescriptor.type].insert(
|
||||||
generalPurposeRegisterDescriptor
|
generalPurposeRegisterDescriptor
|
||||||
@@ -85,6 +87,8 @@ void Avr8::loadTargetRegisterDescriptors() {
|
|||||||
stackPointerRegisterDescriptor.name = "SP";
|
stackPointerRegisterDescriptor.name = "SP";
|
||||||
stackPointerRegisterDescriptor.groupName = "CPU";
|
stackPointerRegisterDescriptor.groupName = "CPU";
|
||||||
stackPointerRegisterDescriptor.description = "Stack Pointer Register";
|
stackPointerRegisterDescriptor.description = "Stack Pointer Register";
|
||||||
|
stackPointerRegisterDescriptor.readable = true;
|
||||||
|
stackPointerRegisterDescriptor.writable = true;
|
||||||
|
|
||||||
auto statusRegisterDescriptor = TargetRegisterDescriptor();
|
auto statusRegisterDescriptor = TargetRegisterDescriptor();
|
||||||
statusRegisterDescriptor.type = TargetRegisterType::STATUS_REGISTER;
|
statusRegisterDescriptor.type = TargetRegisterType::STATUS_REGISTER;
|
||||||
@@ -93,6 +97,8 @@ void Avr8::loadTargetRegisterDescriptors() {
|
|||||||
statusRegisterDescriptor.name = "SREG";
|
statusRegisterDescriptor.name = "SREG";
|
||||||
statusRegisterDescriptor.groupName = "CPU";
|
statusRegisterDescriptor.groupName = "CPU";
|
||||||
statusRegisterDescriptor.description = "Status Register";
|
statusRegisterDescriptor.description = "Status Register";
|
||||||
|
statusRegisterDescriptor.readable = true;
|
||||||
|
statusRegisterDescriptor.writable = true;
|
||||||
|
|
||||||
auto programCounterRegisterDescriptor = TargetRegisterDescriptor();
|
auto programCounterRegisterDescriptor = TargetRegisterDescriptor();
|
||||||
programCounterRegisterDescriptor.type = TargetRegisterType::PROGRAM_COUNTER;
|
programCounterRegisterDescriptor.type = TargetRegisterType::PROGRAM_COUNTER;
|
||||||
@@ -100,6 +106,8 @@ void Avr8::loadTargetRegisterDescriptors() {
|
|||||||
programCounterRegisterDescriptor.name = "PC";
|
programCounterRegisterDescriptor.name = "PC";
|
||||||
programCounterRegisterDescriptor.groupName = "CPU";
|
programCounterRegisterDescriptor.groupName = "CPU";
|
||||||
programCounterRegisterDescriptor.description = "Program Counter";
|
programCounterRegisterDescriptor.description = "Program Counter";
|
||||||
|
programCounterRegisterDescriptor.readable = true;
|
||||||
|
programCounterRegisterDescriptor.writable = true;
|
||||||
|
|
||||||
this->targetRegisterDescriptorsByType[stackPointerRegisterDescriptor.type].insert(
|
this->targetRegisterDescriptorsByType[stackPointerRegisterDescriptor.type].insert(
|
||||||
stackPointerRegisterDescriptor
|
stackPointerRegisterDescriptor
|
||||||
|
|||||||
@@ -495,7 +495,21 @@ void TargetDescriptionFile::loadTargetRegisterDescriptors() {
|
|||||||
registerDescriptor.description = moduleRegister.caption;
|
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::optional<std::string> caption;
|
||||||
std::uint16_t offset;
|
std::uint16_t offset;
|
||||||
std::uint16_t size;
|
std::uint16_t size;
|
||||||
|
std::optional<std::string> readWriteAccess;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct RegisterGroup
|
struct RegisterGroup
|
||||||
|
|||||||
@@ -219,6 +219,10 @@ Register TargetDescriptionFile::generateRegisterFromXml(const QDomElement& xmlEl
|
|||||||
reg.caption = xmlElement.attribute("caption").toStdString();
|
reg.caption = xmlElement.attribute("caption").toStdString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (xmlElement.hasAttribute("ocd-rw")) {
|
||||||
|
reg.readWriteAccess = xmlElement.attribute("ocd-rw").toLower().toStdString();
|
||||||
|
}
|
||||||
|
|
||||||
bool conversionStatus;
|
bool conversionStatus;
|
||||||
reg.size = xmlElement.attribute("size").toUShort(nullptr, 10);
|
reg.size = xmlElement.attribute("size").toUShort(nullptr, 10);
|
||||||
reg.offset = xmlElement.attribute("offset").toUShort(&conversionStatus, 16);
|
reg.offset = xmlElement.attribute("offset").toUShort(&conversionStatus, 16);
|
||||||
|
|||||||
Reference in New Issue
Block a user