Made the EDBG CMSIS-DAP command delay optional for all debug tools, and disabled it by default.

The command delay was really choking Bloom's EDBG driver, causing a very noticeable drag on Bloom's performance. It's much faster with the command delay disabled.
There was a good reason for why I introduced this some time ago. Without it, some EDBG debug tools were misbehaving - I remember that for certain. But now, I cannot seem to reproduce these issues. Very odd.
If the issues do reappear, I may have to enable the command delay by default, again, for some debug tools.
For now, if any users experience issues, I'll just suggest they manually enable the command delay via their project config.
Also, I'm not going to document this new config option, as I would prefer the user to approach me if they experience issues as a result of this, so that I'll know if it needs revisiting.
This commit is contained in:
Nav
2024-10-27 00:25:42 +01:00
parent 4160d4259a
commit 623743995b
25 changed files with 136 additions and 43 deletions

View File

@@ -32,6 +32,7 @@ target_sources(
# Microchip EDBG debug tools # Microchip EDBG debug tools
${CMAKE_CURRENT_SOURCE_DIR}/Microchip/EdbgDevice.cpp ${CMAKE_CURRENT_SOURCE_DIR}/Microchip/EdbgDevice.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Microchip/EdbgToolConfig.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Microchip/AtmelICE/AtmelIce.cpp ${CMAKE_CURRENT_SOURCE_DIR}/Microchip/AtmelICE/AtmelIce.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Microchip/PowerDebugger/PowerDebugger.cpp ${CMAKE_CURRENT_SOURCE_DIR}/Microchip/PowerDebugger/PowerDebugger.cpp
${CMAKE_CURRENT_SOURCE_DIR}/Microchip/MplabSnap/MplabSnap.cpp ${CMAKE_CURRENT_SOURCE_DIR}/Microchip/MplabSnap/MplabSnap.cpp

View File

@@ -2,8 +2,9 @@
namespace DebugToolDrivers::Microchip namespace DebugToolDrivers::Microchip
{ {
AtmelIce::AtmelIce() AtmelIce::AtmelIce(const DebugToolConfig& debugToolConfig)
: EdbgDevice( : EdbgDevice(
debugToolConfig,
AtmelIce::USB_VENDOR_ID, AtmelIce::USB_VENDOR_ID,
AtmelIce::USB_PRODUCT_ID, AtmelIce::USB_PRODUCT_ID,
AtmelIce::CMSIS_HID_INTERFACE_NUMBER, AtmelIce::CMSIS_HID_INTERFACE_NUMBER,

View File

@@ -22,7 +22,7 @@ namespace DebugToolDrivers::Microchip
static const inline std::uint8_t USB_CONFIGURATION_INDEX = 0; static const inline std::uint8_t USB_CONFIGURATION_INDEX = 0;
static const inline std::uint8_t CMSIS_HID_INTERFACE_NUMBER = 0; static const inline std::uint8_t CMSIS_HID_INTERFACE_NUMBER = 0;
AtmelIce(); AtmelIce(const DebugToolConfig& debugToolConfig);
std::string getName() override { std::string getName() override {
return "Atmel-ICE"; return "Atmel-ICE";

View File

@@ -2,8 +2,9 @@
namespace DebugToolDrivers::Microchip namespace DebugToolDrivers::Microchip
{ {
CuriosityNano::CuriosityNano() CuriosityNano::CuriosityNano(const DebugToolConfig& debugToolConfig)
: EdbgDevice( : EdbgDevice(
debugToolConfig,
CuriosityNano::USB_VENDOR_ID, CuriosityNano::USB_VENDOR_ID,
CuriosityNano::USB_PRODUCT_ID, CuriosityNano::USB_PRODUCT_ID,
CuriosityNano::CMSIS_HID_INTERFACE_NUMBER, CuriosityNano::CMSIS_HID_INTERFACE_NUMBER,

View File

@@ -21,7 +21,7 @@ namespace DebugToolDrivers::Microchip
static const inline std::uint16_t USB_PRODUCT_ID = 0x2175; static const inline std::uint16_t USB_PRODUCT_ID = 0x2175;
static const inline std::uint8_t CMSIS_HID_INTERFACE_NUMBER = 0; static const inline std::uint8_t CMSIS_HID_INTERFACE_NUMBER = 0;
CuriosityNano(); CuriosityNano(const DebugToolConfig& debugToolConfig);
std::string getName() override { std::string getName() override {
return "Curiosity Nano"; return "Curiosity Nano";

View File

@@ -1,8 +1,10 @@
#include "EdbgDevice.hpp" #include "EdbgDevice.hpp"
#include "src/DebugToolDrivers/USB/HID/HidInterface.hpp" #include "src/DebugToolDrivers/USB/HID/HidInterface.hpp"
#include "src/DebugToolDrivers/Protocols/CMSIS-DAP/CmsisDapInterface.hpp"
#include "src/DebugToolDrivers/Microchip/Protocols/EDBG/AVR/CommandFrames/AvrCommandFrames.hpp" #include "src/DebugToolDrivers/Microchip/Protocols/EDBG/AVR/CommandFrames/AvrCommandFrames.hpp"
#include "src/Exceptions/InvalidConfig.hpp"
#include "src/TargetController/Exceptions/DeviceFailure.hpp" #include "src/TargetController/Exceptions/DeviceFailure.hpp"
#include "src/TargetController/Exceptions/DeviceInitializationFailure.hpp" #include "src/TargetController/Exceptions/DeviceInitializationFailure.hpp"
@@ -14,6 +16,7 @@ namespace DebugToolDrivers::Microchip
using Exceptions::DeviceInitializationFailure; using Exceptions::DeviceInitializationFailure;
EdbgDevice::EdbgDevice( EdbgDevice::EdbgDevice(
const DebugToolConfig& debugToolConfig,
std::uint16_t vendorId, std::uint16_t vendorId,
std::uint16_t productId, std::uint16_t productId,
std::uint8_t cmsisHidInterfaceNumber, std::uint8_t cmsisHidInterfaceNumber,
@@ -21,12 +24,14 @@ namespace DebugToolDrivers::Microchip
std::optional<std::uint8_t> configurationIndex std::optional<std::uint8_t> configurationIndex
) )
: UsbDevice(vendorId, productId) : UsbDevice(vendorId, productId)
, toolConfig(EdbgToolConfig{debugToolConfig})
, cmsisHidInterfaceNumber(cmsisHidInterfaceNumber) , cmsisHidInterfaceNumber(cmsisHidInterfaceNumber)
, supportsTargetPowerManagement(supportsTargetPowerManagement) , supportsTargetPowerManagement(supportsTargetPowerManagement)
, configurationIndex(configurationIndex) , configurationIndex(configurationIndex)
{} {}
void EdbgDevice::init() { void EdbgDevice::init() {
using ::DebugToolDrivers::Protocols::CmsisDap::CmsisDapInterface;
using Microchip::Protocols::Edbg::EdbgInterface; using Microchip::Protocols::Edbg::EdbgInterface;
using Microchip::Protocols::Edbg::EdbgTargetPowerManagementInterface; using Microchip::Protocols::Edbg::EdbgTargetPowerManagementInterface;
@@ -52,12 +57,29 @@ namespace DebugToolDrivers::Microchip
this->edbgInterface = std::make_unique<EdbgInterface>(std::move(cmsisHidInterface)); this->edbgInterface = std::make_unique<EdbgInterface>(std::move(cmsisHidInterface));
/* /*
* The EDBG/CMSIS-DAP interface doesn't operate properly when sending commands too quickly. * Sometimes, some EDBG tools misbehave when we send commands too quickly, even though we wait for a response
* for each command we send...
* *
* Because of this, we have to enforce a minimum time gap between commands. See comment * Because of this, we make available the option to enforce a minimum time gap between commands. This prevents
* in CmsisDapInterface class declaration for more info. * the tool from misbehaving, but effectively chokes the EDBG driver, causing a drag on Bloom's performance.
*
* The command delay is disabled by default for all EDBG tools, but the user can enable it via their project
* config.
*/ */
this->edbgInterface->setMinimumCommandTimeGap(std::chrono::milliseconds{35}); if (this->toolConfig.cmsisCommandDelay.has_value()) {
const auto& cmsisCommandDelay = *(this->toolConfig.cmsisCommandDelay);
if (cmsisCommandDelay > CmsisDapInterface::CMSIS_COMMAND_DELAY_MAX) {
throw Exceptions::InvalidConfig{
"CMSIS command delay value (" + std::to_string(cmsisCommandDelay.count())
+ " ms) is too high. Maximum value: " + std::to_string(
CmsisDapInterface::CMSIS_COMMAND_DELAY_MAX.count()
) + " ms"
};
}
this->edbgInterface->setCommandDelay(cmsisCommandDelay);
}
// We don't need to claim the CMSISDAP interface here as the HIDAPI will have already done so. // We don't need to claim the CMSISDAP interface here as the HIDAPI will have already done so.
if (!this->sessionStarted) { if (!this->sessionStarted) {

View File

@@ -7,6 +7,9 @@
#include "src/DebugToolDrivers/DebugTool.hpp" #include "src/DebugToolDrivers/DebugTool.hpp"
#include "src/DebugToolDrivers/USB/UsbDevice.hpp" #include "src/DebugToolDrivers/USB/UsbDevice.hpp"
#include "EdbgToolConfig.hpp"
#include "src/ProjectConfig.hpp"
#include "Protocols/EDBG/EdbgInterface.hpp" #include "Protocols/EDBG/EdbgInterface.hpp"
#include "Protocols/EDBG/AVR/EdbgAvr8Interface.hpp" #include "Protocols/EDBG/AVR/EdbgAvr8Interface.hpp"
#include "Protocols/EDBG/AVR/EdbgAvrIspInterface.hpp" #include "Protocols/EDBG/AVR/EdbgAvrIspInterface.hpp"
@@ -30,6 +33,7 @@ namespace DebugToolDrivers::Microchip
{ {
public: public:
EdbgDevice( EdbgDevice(
const DebugToolConfig& debugToolConfig,
std::uint16_t vendorId, std::uint16_t vendorId,
std::uint16_t productId, std::uint16_t productId,
std::uint8_t cmsisHidInterfaceNumber, std::uint8_t cmsisHidInterfaceNumber,
@@ -85,6 +89,7 @@ namespace DebugToolDrivers::Microchip
void endSession(); void endSession();
protected: protected:
EdbgToolConfig toolConfig;
bool initialised = false; bool initialised = false;
/** /**

View File

@@ -0,0 +1,30 @@
#include "EdbgToolConfig.hpp"
#include "src/Helpers/YamlUtilities.hpp"
#include "src/Logger/Logger.hpp"
namespace DebugToolDrivers::Microchip
{
EdbgToolConfig::EdbgToolConfig(const DebugToolConfig& toolConfig)
: DebugToolConfig(toolConfig)
{
const auto& toolNode = toolConfig.toolNode;
const auto edbgDriverNode = toolNode["edbgDriver"];
if (edbgDriverNode) {
if (edbgDriverNode["cmsisCommandDelay"]) {
if (YamlUtilities::isCastable<std::uint16_t>(edbgDriverNode["cmsisCommandDelay"])) {
this->cmsisCommandDelay = std::chrono::milliseconds{
edbgDriverNode["cmsisCommandDelay"].as<std::uint16_t>()
};
} else {
Logger::error(
"Invalid EDBG driver config parameter ('cmsisCommandDelay') provided - must be a 16-bit "
"unsigned integer. The parameter will be ignored."
);
}
}
}
}
}

View File

@@ -0,0 +1,21 @@
#pragma once
#include <optional>
#include <chrono>
#include <yaml-cpp/yaml.h>
#include "src/ProjectConfig.hpp"
namespace DebugToolDrivers::Microchip
{
/**
* Extending the generic DebugToolConfig struct to accommodate EDBG configuration parameters.
*/
struct EdbgToolConfig: public DebugToolConfig
{
public:
std::optional<std::chrono::milliseconds> cmsisCommandDelay = std::nullopt;
explicit EdbgToolConfig(const DebugToolConfig& toolConfig);
};
}

View File

@@ -2,8 +2,9 @@
namespace DebugToolDrivers::Microchip namespace DebugToolDrivers::Microchip
{ {
JtagIce3::JtagIce3() JtagIce3::JtagIce3(const DebugToolConfig& debugToolConfig)
: EdbgDevice( : EdbgDevice(
debugToolConfig,
JtagIce3::USB_VENDOR_ID, JtagIce3::USB_VENDOR_ID,
JtagIce3::USB_PRODUCT_ID, JtagIce3::USB_PRODUCT_ID,
JtagIce3::CMSIS_HID_INTERFACE_NUMBER, JtagIce3::CMSIS_HID_INTERFACE_NUMBER,

View File

@@ -22,7 +22,7 @@ namespace DebugToolDrivers::Microchip
static const inline std::uint8_t USB_CONFIGURATION_INDEX = 0; static const inline std::uint8_t USB_CONFIGURATION_INDEX = 0;
static const inline std::uint8_t CMSIS_HID_INTERFACE_NUMBER = 0; static const inline std::uint8_t CMSIS_HID_INTERFACE_NUMBER = 0;
JtagIce3(); JtagIce3(const DebugToolConfig& debugToolConfig);
std::string getName() override { std::string getName() override {
return "JTAGICE3"; return "JTAGICE3";

View File

@@ -5,8 +5,9 @@
namespace DebugToolDrivers::Microchip namespace DebugToolDrivers::Microchip
{ {
MplabPickit4::MplabPickit4() MplabPickit4::MplabPickit4(const DebugToolConfig& debugToolConfig)
: EdbgDevice( : EdbgDevice(
debugToolConfig,
MplabPickit4::USB_VENDOR_ID, MplabPickit4::USB_VENDOR_ID,
MplabPickit4::USB_PRODUCT_ID, MplabPickit4::USB_PRODUCT_ID,
MplabPickit4::CMSIS_HID_INTERFACE_NUMBER MplabPickit4::CMSIS_HID_INTERFACE_NUMBER

View File

@@ -29,7 +29,7 @@ namespace DebugToolDrivers::Microchip
static const inline std::uint16_t NON_EDBG_USB_VENDOR_ID = 0x04d8; static const inline std::uint16_t NON_EDBG_USB_VENDOR_ID = 0x04d8;
static const inline std::uint16_t NON_EDBG_USB_PRODUCT_ID = 0x9012; static const inline std::uint16_t NON_EDBG_USB_PRODUCT_ID = 0x9012;
MplabPickit4(); MplabPickit4(const DebugToolConfig& debugToolConfig);
std::string getName() override { std::string getName() override {
return "MPLAB PICkit 4"; return "MPLAB PICkit 4";

View File

@@ -5,8 +5,9 @@
namespace DebugToolDrivers::Microchip namespace DebugToolDrivers::Microchip
{ {
MplabSnap::MplabSnap() MplabSnap::MplabSnap(const DebugToolConfig& debugToolConfig)
: EdbgDevice( : EdbgDevice(
debugToolConfig,
MplabSnap::USB_VENDOR_ID, MplabSnap::USB_VENDOR_ID,
MplabSnap::USB_PRODUCT_ID, MplabSnap::USB_PRODUCT_ID,
MplabSnap::CMSIS_HID_INTERFACE_NUMBER MplabSnap::CMSIS_HID_INTERFACE_NUMBER

View File

@@ -32,7 +32,7 @@ namespace DebugToolDrivers::Microchip
static const inline std::uint16_t NON_EDBG_USB_PRODUCT_ID = 0x9018; static const inline std::uint16_t NON_EDBG_USB_PRODUCT_ID = 0x9018;
static const inline std::uint16_t NON_EDBG_USB_PRODUCT_ID_ALTERNATIVE = 0x9017; static const inline std::uint16_t NON_EDBG_USB_PRODUCT_ID_ALTERNATIVE = 0x9017;
MplabSnap(); MplabSnap(const DebugToolConfig& debugToolConfig);
std::string getName() override { std::string getName() override {
return "MPLAB Snap"; return "MPLAB Snap";

View File

@@ -2,8 +2,9 @@
namespace DebugToolDrivers::Microchip namespace DebugToolDrivers::Microchip
{ {
PowerDebugger::PowerDebugger() PowerDebugger::PowerDebugger(const DebugToolConfig& debugToolConfig)
: EdbgDevice( : EdbgDevice(
debugToolConfig,
PowerDebugger::USB_VENDOR_ID, PowerDebugger::USB_VENDOR_ID,
PowerDebugger::USB_PRODUCT_ID, PowerDebugger::USB_PRODUCT_ID,
PowerDebugger::CMSIS_HID_INTERFACE_NUMBER, PowerDebugger::CMSIS_HID_INTERFACE_NUMBER,

View File

@@ -22,7 +22,7 @@ namespace DebugToolDrivers::Microchip
static const inline std::uint8_t USB_CONFIGURATION_INDEX = 0; static const inline std::uint8_t USB_CONFIGURATION_INDEX = 0;
static const inline std::uint8_t CMSIS_HID_INTERFACE_NUMBER = 0; static const inline std::uint8_t CMSIS_HID_INTERFACE_NUMBER = 0;
PowerDebugger(); PowerDebugger(const DebugToolConfig& debugToolConfig);
std::string getName() override { std::string getName() override {
return "Power Debugger"; return "Power Debugger";

View File

@@ -2,8 +2,9 @@
namespace DebugToolDrivers::Microchip namespace DebugToolDrivers::Microchip
{ {
XplainedMini::XplainedMini() XplainedMini::XplainedMini(const DebugToolConfig& debugToolConfig)
: EdbgDevice( : EdbgDevice(
debugToolConfig,
XplainedMini::USB_VENDOR_ID, XplainedMini::USB_VENDOR_ID,
XplainedMini::USB_PRODUCT_ID, XplainedMini::USB_PRODUCT_ID,
XplainedMini::CMSIS_HID_INTERFACE_NUMBER, XplainedMini::CMSIS_HID_INTERFACE_NUMBER,

View File

@@ -21,7 +21,7 @@ namespace DebugToolDrivers::Microchip
static const inline std::uint16_t USB_PRODUCT_ID = 0x2145; static const inline std::uint16_t USB_PRODUCT_ID = 0x2145;
static const inline std::uint8_t CMSIS_HID_INTERFACE_NUMBER = 0; static const inline std::uint8_t CMSIS_HID_INTERFACE_NUMBER = 0;
XplainedMini(); XplainedMini(const DebugToolConfig& debugToolConfig);
std::string getName() override { std::string getName() override {
return "Xplained Mini"; return "Xplained Mini";

View File

@@ -2,8 +2,9 @@
namespace DebugToolDrivers::Microchip namespace DebugToolDrivers::Microchip
{ {
XplainedNano::XplainedNano() XplainedNano::XplainedNano(const DebugToolConfig& debugToolConfig)
: EdbgDevice( : EdbgDevice(
debugToolConfig,
XplainedNano::USB_VENDOR_ID, XplainedNano::USB_VENDOR_ID,
XplainedNano::USB_PRODUCT_ID, XplainedNano::USB_PRODUCT_ID,
XplainedNano::CMSIS_HID_INTERFACE_NUMBER, XplainedNano::CMSIS_HID_INTERFACE_NUMBER,

View File

@@ -21,7 +21,7 @@ namespace DebugToolDrivers::Microchip
static const inline std::uint16_t USB_PRODUCT_ID = 0x2145; static const inline std::uint16_t USB_PRODUCT_ID = 0x2145;
static const inline std::uint8_t CMSIS_HID_INTERFACE_NUMBER = 0; static const inline std::uint8_t CMSIS_HID_INTERFACE_NUMBER = 0;
XplainedNano(); XplainedNano(const DebugToolConfig& debugToolConfig);
std::string getName() override { std::string getName() override {
return "Xplained Nano"; return "Xplained Nano";

View File

@@ -2,8 +2,9 @@
namespace DebugToolDrivers::Microchip namespace DebugToolDrivers::Microchip
{ {
XplainedPro::XplainedPro() XplainedPro::XplainedPro(const DebugToolConfig& debugToolConfig)
: EdbgDevice( : EdbgDevice(
debugToolConfig,
XplainedPro::USB_VENDOR_ID, XplainedPro::USB_VENDOR_ID,
XplainedPro::USB_PRODUCT_ID, XplainedPro::USB_PRODUCT_ID,
XplainedPro::CMSIS_HID_INTERFACE_NUMBER, XplainedPro::CMSIS_HID_INTERFACE_NUMBER,

View File

@@ -21,7 +21,7 @@ namespace DebugToolDrivers::Microchip
static const inline std::uint16_t USB_PRODUCT_ID = 0x2111; static const inline std::uint16_t USB_PRODUCT_ID = 0x2111;
static const inline std::uint8_t CMSIS_HID_INTERFACE_NUMBER = 0; static const inline std::uint8_t CMSIS_HID_INTERFACE_NUMBER = 0;
XplainedPro(); XplainedPro(const DebugToolConfig& debugToolConfig);
std::string getName() override { std::string getName() override {
return "Xplained Pro"; return "Xplained Pro";

View File

@@ -21,6 +21,8 @@ namespace DebugToolDrivers::Protocols::CmsisDap
class CmsisDapInterface class CmsisDapInterface
{ {
public: public:
static constexpr auto CMSIS_COMMAND_DELAY_MAX = std::chrono::milliseconds{200};
explicit CmsisDapInterface(Usb::HidInterface&& usbHidInterface); explicit CmsisDapInterface(Usb::HidInterface&& usbHidInterface);
virtual ~CmsisDapInterface() = default; virtual ~CmsisDapInterface() = default;
@@ -38,8 +40,8 @@ namespace DebugToolDrivers::Protocols::CmsisDap
return this->usbHidInterface.inputReportSize; return this->usbHidInterface.inputReportSize;
} }
void setMinimumCommandTimeGap(std::chrono::milliseconds commandTimeGap) { void setCommandDelay(std::chrono::milliseconds commandDelay) {
this->commandDelay = commandTimeGap; this->commandDelay = commandDelay;
} }
/** /**

View File

@@ -315,66 +315,69 @@ namespace TargetController
std::string, std::string,
std::function<std::unique_ptr<DebugTool>()> std::function<std::unique_ptr<DebugTool>()>
> TargetControllerComponent::getSupportedDebugTools() { > TargetControllerComponent::getSupportedDebugTools() {
using namespace DebugToolDrivers::Microchip;
using namespace DebugToolDrivers::Wch;
// The debug tool names in this mapping should always be lower-case. // The debug tool names in this mapping should always be lower-case.
return std::map<std::string, std::function<std::unique_ptr<DebugTool>()>> { return std::map<std::string, std::function<std::unique_ptr<DebugTool>()>> {
{ {
"atmel-ice", "atmel-ice",
[] { [this] {
return std::make_unique<DebugToolDrivers::Microchip::AtmelIce>(); return std::make_unique<AtmelIce>(this->environmentConfig.debugToolConfig);
} }
}, },
{ {
"power-debugger", "power-debugger",
[] { [this] {
return std::make_unique<DebugToolDrivers::Microchip::PowerDebugger>(); return std::make_unique<PowerDebugger>(this->environmentConfig.debugToolConfig);
} }
}, },
{ {
"snap", "snap",
[] { [this] {
return std::make_unique<DebugToolDrivers::Microchip::MplabSnap>(); return std::make_unique<MplabSnap>(this->environmentConfig.debugToolConfig);
} }
}, },
{ {
"pickit-4", "pickit-4",
[] { [this] {
return std::make_unique<DebugToolDrivers::Microchip::MplabPickit4>(); return std::make_unique<MplabPickit4>(this->environmentConfig.debugToolConfig);
} }
}, },
{ {
"xplained-pro", "xplained-pro",
[] { [this] {
return std::make_unique<DebugToolDrivers::Microchip::XplainedPro>(); return std::make_unique<XplainedPro>(this->environmentConfig.debugToolConfig);
} }
}, },
{ {
"xplained-mini", "xplained-mini",
[] { [this] {
return std::make_unique<DebugToolDrivers::Microchip::XplainedMini>(); return std::make_unique<XplainedMini>(this->environmentConfig.debugToolConfig);
} }
}, },
{ {
"xplained-nano", "xplained-nano",
[] { [this] {
return std::make_unique<DebugToolDrivers::Microchip::XplainedNano>(); return std::make_unique<XplainedNano>(this->environmentConfig.debugToolConfig);
} }
}, },
{ {
"curiosity-nano", "curiosity-nano",
[] { [this] {
return std::make_unique<DebugToolDrivers::Microchip::CuriosityNano>(); return std::make_unique<CuriosityNano>(this->environmentConfig.debugToolConfig);
} }
}, },
{ {
"jtagice3", "jtagice3",
[] { [this] {
return std::make_unique<DebugToolDrivers::Microchip::JtagIce3>(); return std::make_unique<JtagIce3>(this->environmentConfig.debugToolConfig);
} }
}, },
{ {
"wch-link-e", "wch-link-e",
[this] { [this] {
return std::make_unique<DebugToolDrivers::Wch::WchLinkE>(this->environmentConfig.debugToolConfig); return std::make_unique<WchLinkE>(this->environmentConfig.debugToolConfig);
} }
}, },
}; };