Created EdbgAvr8Session struct and moved EDBG target info to it

This commit is contained in:
Nav
2024-03-28 21:10:08 +00:00
parent 266cc8f196
commit b9d537e924
7 changed files with 315 additions and 278 deletions

View File

@@ -0,0 +1,99 @@
#include "EdbgAvr8Session.hpp"
#include "src/Services/StringService.hpp"
#include "src/Exceptions/Exception.hpp"
namespace DebugToolDrivers::Microchip::Protocols::Edbg::Avr
{
EdbgAvr8Session::EdbgAvr8Session(
const Targets::Microchip::Avr::Avr8Bit::TargetDescriptionFile& targetDescriptionFile,
const Targets::Microchip::Avr::Avr8Bit::Avr8TargetConfig& targetConfig
)
: targetDescriptionFile(targetDescriptionFile)
, targetConfig(targetConfig)
, programAddressSpace(this->targetDescriptionFile.getProgramAddressSpace())
, ramAddressSpace(this->targetDescriptionFile.getRamAddressSpace())
, eepromAddressSpace(this->targetDescriptionFile.getEepromAddressSpace())
, ioAddressSpace(this->targetDescriptionFile.getIoAddressSpace())
, signatureAddressSpace(this->targetDescriptionFile.getSignatureAddressSpace())
, programMemorySegment(this->targetDescriptionFile.getProgramMemorySegment())
, ramMemorySegment(this->targetDescriptionFile.getRamMemorySegment())
, eepromMemorySegment(this->targetDescriptionFile.getEepromMemorySegment())
, ioMemorySegment(this->targetDescriptionFile.getIoMemorySegment())
, signatureMemorySegment(this->targetDescriptionFile.getSignatureMemorySegment())
, programAppSection(this->programMemorySegment.tryGetSection("app_section"))
, programBootSection(this->programMemorySegment.tryGetSection("boot_section"))
{
using Services::StringService;
const auto ocdDataRegisterProperty = this->targetDescriptionFile.tryGetProperty("ocd", "ocd_datareg");
if (ocdDataRegisterProperty.has_value()) {
this->ocdDataRegister = StringService::toUint8(ocdDataRegisterProperty->get().value);
}
const auto resolvedConfigVariant = EdbgAvr8Session::tryResolveConfigVariant(
this->targetDescriptionFile.getAvrFamily(),
this->targetConfig.physicalInterface
);
if (!resolvedConfigVariant.has_value()) {
throw Exceptions::Exception(
"Failed to resolve EDBG config variant from the selected physical interface and the AVR target family"
" - please review the selected physical interface"
);
}
this->configVariant = *resolvedConfigVariant;
}
std::optional<Avr8ConfigVariant> EdbgAvr8Session::tryResolveConfigVariant(
Targets::Microchip::Avr::Avr8Bit::Family avrFamily,
Targets::TargetPhysicalInterface physicalInterface
) {
using Targets::Microchip::Avr::Avr8Bit::Family;
using Targets::TargetPhysicalInterface;
if (avrFamily == Family::MEGA || avrFamily == Family::TINY) {
switch (physicalInterface) {
case TargetPhysicalInterface::JTAG: {
return Avr8ConfigVariant::MEGAJTAG;
}
case TargetPhysicalInterface::DEBUG_WIRE: {
return Avr8ConfigVariant::DEBUG_WIRE;
}
case TargetPhysicalInterface::UPDI: {
return Avr8ConfigVariant::UPDI;
}
default: {
break;
}
}
}
if (avrFamily == Family::XMEGA) {
switch (physicalInterface) {
case TargetPhysicalInterface::JTAG:
case TargetPhysicalInterface::PDI: {
return Avr8ConfigVariant::XMEGA;
}
default: {
break;
}
}
}
if (avrFamily == Family::DA || avrFamily == Family::DB || avrFamily == Family::DD || avrFamily == Family::EA) {
switch (physicalInterface) {
case TargetPhysicalInterface::UPDI: {
return Avr8ConfigVariant::UPDI;
}
default: {
break;
}
}
}
return std::nullopt;
}
}