Replaced messy AVR8 target config approach with new Avr8TargetConfig object
This commit is contained in:
@@ -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");
|
||||
|
||||
@@ -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.
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user