Retrieving AVR8 target registers and including them in the TargetDescriptor
This commit is contained in:
@@ -17,6 +17,7 @@ using Bloom::Targets::TargetDescription::MemorySegment;
|
||||
using Bloom::Targets::TargetDescription::MemorySegmentType;
|
||||
using Bloom::Targets::TargetDescription::Register;
|
||||
using Bloom::Targets::TargetVariant;
|
||||
using Bloom::Targets::TargetRegisterDescriptor;
|
||||
|
||||
TargetDescriptionFile::TargetDescriptionFile(
|
||||
const TargetSignature& targetSignature,
|
||||
@@ -93,6 +94,7 @@ void TargetDescriptionFile::init(const QDomDocument& xml) {
|
||||
this->loadDebugPhysicalInterfaces();
|
||||
this->loadPadDescriptors();
|
||||
this->loadTargetVariants();
|
||||
this->loadTargetRegisterDescriptors();
|
||||
}
|
||||
|
||||
QJsonObject TargetDescriptionFile::getTargetDescriptionMapping() {
|
||||
@@ -460,6 +462,34 @@ void TargetDescriptionFile::loadTargetVariants() {
|
||||
}
|
||||
}
|
||||
|
||||
void TargetDescriptionFile::loadTargetRegisterDescriptors() {
|
||||
auto& modulesByName = this->modulesMappedByName;
|
||||
auto& peripheralModulesByName = this->peripheralModulesMappedByName;
|
||||
|
||||
for (const auto& [moduleName, module] : modulesByName) {
|
||||
auto moduleRegisterAddressOffset = this->getRegisterAddressOffsetByModuleName(moduleName);
|
||||
for (const auto& [registerGroupName, registerGroup] : module.registerGroupsMappedByName) {
|
||||
for (const auto& [moduleRegisterName, moduleRegister] : registerGroup.registersMappedByName) {
|
||||
if (moduleRegister.size < 1) {
|
||||
continue;
|
||||
}
|
||||
|
||||
auto registerDescriptor = TargetRegisterDescriptor();
|
||||
registerDescriptor.type = TargetRegisterType::OTHER;
|
||||
registerDescriptor.name = moduleRegisterName;
|
||||
registerDescriptor.groupName = registerGroupName;
|
||||
registerDescriptor.size = moduleRegister.size;
|
||||
registerDescriptor.startAddress = moduleRegister.offset + moduleRegisterAddressOffset;
|
||||
|
||||
if (moduleRegister.caption.has_value() && !moduleRegister.caption->empty()) {
|
||||
registerDescriptor.description = moduleRegister.caption;
|
||||
}
|
||||
|
||||
this->targetRegisterDescriptorsByType[registerDescriptor.type].emplace_back(registerDescriptor);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
std::optional<MemorySegment> TargetDescriptionFile::getFlashMemorySegment() const {
|
||||
auto& addressMapping = this->addressSpacesMappedById;
|
||||
@@ -1068,3 +1098,36 @@ void TargetDescriptionFile::loadUpdiTargetParameters(TargetParameters& targetPar
|
||||
targetParameters.lockbitsSegmentStartAddress = lockbitsMemorySegment->startAddress;
|
||||
}
|
||||
}
|
||||
|
||||
std::uint32_t TargetDescriptionFile::getRegisterAddressOffsetByModuleName(const std::string& moduleName) const {
|
||||
if (this->peripheralModulesMappedByName.contains(moduleName)) {
|
||||
auto& peripheralModule = this->peripheralModulesMappedByName.at(moduleName);
|
||||
|
||||
if (peripheralModule.instancesMappedByName.contains(moduleName)) {
|
||||
auto& moduleInstance = peripheralModule.instancesMappedByName.at(moduleName);
|
||||
|
||||
if (moduleInstance.registerGroupsMappedByName.contains(moduleName)) {
|
||||
auto& registerGroup = moduleInstance.registerGroupsMappedByName.at(moduleName);
|
||||
|
||||
if (!registerGroup.moduleName.has_value() || registerGroup.moduleName.value() == moduleName) {
|
||||
return registerGroup.offset.value_or(0);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* If we get here, that means we couldn't find the right register group by module name. This will happen
|
||||
* if the register group name doesn't match the module name attribute ("name-in-module") against the
|
||||
* register group node, in the TDF.
|
||||
*
|
||||
* As a final attempt, we'll brute force search all register groups in the module instance.
|
||||
*/
|
||||
for (const auto& [registerGroupName, registerGroup] : moduleInstance.registerGroupsMappedByName) {
|
||||
if (registerGroup.moduleName.has_value() && registerGroup.moduleName.value() == moduleName) {
|
||||
return registerGroup.offset.value_or(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user