Created EdbgAvr8Session struct and moved EDBG target info to it
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user