Replaced messy AVR8 target config approach with new Avr8TargetConfig object

This commit is contained in:
Nav
2022-03-19 13:27:36 +00:00
parent 19d45ed1b0
commit a3b9bb8ca2
5 changed files with 43 additions and 118 deletions

View File

@@ -28,27 +28,13 @@ namespace Bloom::Targets::Microchip::Avr::Avr8Bit
void Avr8::preActivationConfigure(const TargetConfig& targetConfig) {
Target::preActivationConfigure(targetConfig);
auto physicalInterface = targetConfig.jsonObject.find("physicalInterface")->toString().toLower().toStdString();
auto availablePhysicalInterfaces = Avr8::getPhysicalInterfacesByName();
if (physicalInterface.empty() || !availablePhysicalInterfaces.contains(physicalInterface)) {
throw InvalidConfig("Invalid or missing physical interface config parameter for AVR8 target.");
}
const auto selectedPhysicalInterface = availablePhysicalInterfaces.at(physicalInterface);
if (selectedPhysicalInterface == PhysicalInterface::DEBUG_WIRE) {
Logger::warning("AVR8 debugWire interface selected - the DWEN fuse will need to be enabled");
}
this->physicalInterface = selectedPhysicalInterface;
this->avr8DebugInterface->setPhysicalInterface(this->physicalInterface.value());
this->targetConfig = Avr8TargetConfig(targetConfig);
if (this->family.has_value()) {
this->avr8DebugInterface->setFamily(this->family.value());
} else {
if (this->physicalInterface == PhysicalInterface::JTAG) {
if (this->targetConfig->physicalInterface == PhysicalInterface::JTAG) {
throw InvalidConfig(
"The JTAG physical interface cannot be used with an ambiguous target name"
" - please specify the exact name of the target in your configuration file. "
@@ -56,7 +42,7 @@ namespace Bloom::Targets::Microchip::Avr::Avr8Bit
);
}
if (this->physicalInterface == PhysicalInterface::UPDI) {
if (this->targetConfig->physicalInterface == PhysicalInterface::UPDI) {
throw InvalidConfig(
"The UPDI physical interface cannot be used with an ambiguous target name"
" - please specify the exact name of the target in your configuration file. "
@@ -65,29 +51,17 @@ namespace Bloom::Targets::Microchip::Avr::Avr8Bit
}
}
if (targetConfig.jsonObject.contains("updateDwenFuseBit")) {
this->updateDwenFuseBit = targetConfig.jsonObject.value(
"updateDwenFuseBit"
).toBool();
if (this->updateDwenFuseBit
&& this->avrIspInterface == nullptr
&& this->physicalInterface == PhysicalInterface::DEBUG_WIRE
) {
Logger::warning(
"The connected debug tool (or associated driver) does not provide any ISP interface. "
"Bloom will be unable to update the DWEN fuse bit in the event of a debugWire activation failure."
);
}
if (
this->targetConfig->updateDwenFuseBit && this->avrIspInterface == nullptr
&& this->targetConfig->physicalInterface == PhysicalInterface::DEBUG_WIRE
) {
Logger::warning(
"The connected debug tool (or associated driver) does not provide any ISP interface. "
"Bloom will be unable to update the DWEN fuse bit in the event of a debugWire activation failure."
);
}
if (targetConfig.jsonObject.contains("cycleTargetPowerPostDwenUpdate")) {
this->cycleTargetPowerPostDwenUpdate = targetConfig.jsonObject.value(
"cycleTargetPowerPostDwenUpdate"
).toBool();
}
this->avr8DebugInterface->configure(targetConfig);
this->avr8DebugInterface->configure(this->targetConfig.value());
if (this->avrIspInterface != nullptr) {
this->avrIspInterface->configure(targetConfig);
@@ -144,7 +118,7 @@ namespace Bloom::Targets::Microchip::Avr::Avr8Bit
this->avr8DebugInterface->activate();
} catch (const Exceptions::DebugWirePhysicalInterfaceError& debugWireException) {
if (!this->updateDwenFuseBit) {
if (!this->targetConfig->updateDwenFuseBit) {
throw TargetOperationFailure(
"Failed to activate debugWire physical interface - check target connection and DWEN fuse "
"bit. Bloom can manage the DWEN fuse bit automatically. For instructions on enabling this "
@@ -160,7 +134,10 @@ namespace Bloom::Targets::Microchip::Avr::Avr8Bit
this->writeDwenFuseBit(true);
// If the debug tool provides a TargetPowerManagementInterface, attempt to cycle the target power
if (this->targetPowerManagementInterface != nullptr && this->cycleTargetPowerPostDwenUpdate) {
if (
this->targetPowerManagementInterface != nullptr
&& this->targetConfig->cycleTargetPowerPostDwenUpdate
) {
Logger::info("Cycling target power");
Logger::debug("Disabling target power");

View File

@@ -17,7 +17,7 @@
#include "TargetDescription/TargetDescriptionFile.hpp"
#include "src/ProjectConfig.hpp"
#include "Avr8TargetConfig.hpp"
namespace Bloom::Targets::Microchip::Avr::Avr8Bit
{
@@ -127,9 +127,10 @@ namespace Bloom::Targets::Microchip::Avr::Avr8Bit
DebugToolDrivers::TargetInterfaces::Microchip::Avr::Avr8::Avr8DebugInterface* avr8DebugInterface = nullptr;
DebugToolDrivers::TargetInterfaces::Microchip::Avr::AvrIspInterface* avrIspInterface = nullptr;
std::optional<Avr8TargetConfig> targetConfig;
std::string name;
std::optional<Family> family;
std::optional<PhysicalInterface> physicalInterface;
std::optional<TargetDescription::TargetDescriptionFile> targetDescriptionFile;
std::optional<TargetParameters> targetParameters;
@@ -138,25 +139,6 @@ namespace Bloom::Targets::Microchip::Avr::Avr8Bit
std::map<TargetRegisterType, TargetRegisterDescriptors> targetRegisterDescriptorsByType;
std::map<TargetMemoryType, TargetMemoryDescriptor> targetMemoryDescriptorsByType;
bool updateDwenFuseBit = false;
bool cycleTargetPowerPostDwenUpdate = true;
/**
* Users are required to set their desired physical interface in their Bloom configuration. This would take
* the form of a string, so we map the available options to the appropriate enums.
*/
static inline auto getPhysicalInterfacesByName() {
using Targets::Microchip::Avr::Avr8Bit::PhysicalInterface;
return std::map<std::string, PhysicalInterface>({
{"debugwire", PhysicalInterface::DEBUG_WIRE},
{"debug-wire", PhysicalInterface::DEBUG_WIRE},
{"pdi", PhysicalInterface::PDI},
{"jtag", PhysicalInterface::JTAG},
{"updi", PhysicalInterface::UPDI},
});
};
/**
* Resolves the appropriate TDF for the AVR8 target and populates this->targetDescriptionFile.
*/