Added failure code enum for EDBG AVR8 Generic Protocol

This commit is contained in:
Nav
2022-03-02 00:54:16 +00:00
parent 52533e2878
commit 0f7ab7b814

View File

@@ -5,9 +5,61 @@
namespace Bloom::Exceptions namespace Bloom::Exceptions
{ {
enum class Avr8CommandFailureCode: std::uint8_t
{
DEBUGWIRE_PHYSICAL_ERROR = 0x10,
JTAGM_FAILED_TO_INITIALISE = 0x11,
UNKNOWN_JTAG_ERROR = 0x12,
JTAG_LOW_LEVEL_ERROR = 0x13,
UNSUPPORTED_JTAGM_VERSION = 0x14,
JTAG_MASTER_TIMED_OUT = 0x15,
JTAG_BIT_BANGER_TIMED_OUT = 0x16,
PARITY_ERROR_IN_RECEIVED_DATA = 0x17,
MISSING_EMPTY_BYTE = 0x18,
PDI_PHYSICAL_TIMED_OUT = 0x19,
PHYSICAL_LEVEL_COLLISION = 0x1A,
PDI_ENABLE_FAILED = 0x1B,
TARGET_NOT_FOUND = 0x20,
BAUD_INCREASE_FAILURE = 0x21,
TARGET_POWER_NOT_DETECTED = 0x22,
MUST_RUN_ATTACH_COMMAND_FIRST = 0x23,
DEVICES_EXCEED_31 = 0x24,
CONFIGURED_DEVICE_BITS_DO_NOT_ADD_UP_TO_DETECTED_BITS = 0x25,
PHYSICAL_NOT_ACTIVATED = 0x31,
ILLEGAL_RUN_OR_STOPPED_STATE = 0x32,
INVALID_CONFIG_FOR_ACTIVATE_PHYSICAL = 0x33,
NOT_A_VALID_MEMTYPE = 0x34,
TOO_MANY_OR_TOO_FEW_BYTES = 0x35,
ASKED_FOR_A_BAD_ADDRESS = 0x36,
ASKED_FOR_BADLY_ALIGNED_DATA = 0x37,
ADDRESS_NOT_WITHIN_LEGAL_RANGE = 0x38,
ILLEGAL_VALUE_GIVEN = 0x39,
ILLEGAL_TARGET_ID = 0x3A,
CLOCK_VALUE_OUT_OF_RANGE = 0x3B,
TIMEOUT_OCCURRED = 0x3C,
READ_AN_ILLEGAL_OCD_STATUS = 0x3D,
NVM_FAILED_TO_BE_ENABLED = 0x40,
NVM_FAILED_TO_BE_DISABLED = 0x41,
ILLEGAL_CONTROL_OR_STATUS_BITS = 0x42,
CRC_MISMATCH = 0x43,
FAILED_TO_ENABLE_OCD = 0x44,
DEVICE_NOT_UNDER_CONTROL = 0x50,
ERROR_WHEN_READING_PC = 0x60,
ERROR_WHEN_READING_REGISTER = 0x61,
ERROR_WHILE_READING = 0x70,
ERROR_WHILE_WRITING = 0x71,
TIMEOUT_WHILE_READING = 0x72,
INVALID_BREAKPOINT_CONFIGURATION = 0x80,
NOT_ENOUGH_AVAILABLE_RESOURCES = 0x81,
FEATURE_NOT_AVAILABLE = 0x90,
UNKNOWN_COMMAND = 0x91,
UNKNOWN_ERROR = 0xFF,
};
class Avr8CommandFailure: public TargetOperationFailure class Avr8CommandFailure: public TargetOperationFailure
{ {
public: public:
std::optional<Avr8CommandFailureCode> code;
explicit Avr8CommandFailure(const std::string& message): TargetOperationFailure(message) { explicit Avr8CommandFailure(const std::string& message): TargetOperationFailure(message) {
this->message = message; this->message = message;
} }
@@ -23,60 +75,63 @@ namespace Bloom::Exceptions
this->message = message; this->message = message;
auto responsePayload = responseFrame.getPayload(); auto responsePayload = responseFrame.getPayload();
if (responsePayload.size() == 3 && this->failureCodeToDescription.contains(responsePayload[2])) { if (responsePayload.size() == 3
this->message += " - Failure reason: " + this->failureCodeToDescription.find(responsePayload[2])->second; && this->failureCodeToDescription.contains(static_cast<Avr8CommandFailureCode>(responsePayload[2]))
) {
this->code = static_cast<Avr8CommandFailureCode>(responsePayload[2]);
this->message += " - Failure reason: " + this->failureCodeToDescription.at(*(this->code));
} }
} }
private: private:
static inline auto failureCodeToDescription = std::map<unsigned char, std::string>({ static inline auto failureCodeToDescription = std::map<Avr8CommandFailureCode, std::string>({
{0x10, "debugWIRE physical error"}, {Avr8CommandFailureCode::DEBUGWIRE_PHYSICAL_ERROR, "debugWIRE physical error"},
{0x11, "JTAGM failed to initialise"}, {Avr8CommandFailureCode::JTAGM_FAILED_TO_INITIALISE, "JTAGM failed to initialise"},
{0x12, "JTAGM did something strange"}, {Avr8CommandFailureCode::UNKNOWN_JTAG_ERROR, "JTAGM did something strange"},
{0x13, "JTAG low level error"}, {Avr8CommandFailureCode::JTAG_LOW_LEVEL_ERROR, "JTAG low level error"},
{0x14, "Unsupported version of JTAGM"}, {Avr8CommandFailureCode::UNSUPPORTED_JTAGM_VERSION, "Unsupported version of JTAGM"},
{0x15, "JTAG master timed out"}, {Avr8CommandFailureCode::JTAG_MASTER_TIMED_OUT, "JTAG master timed out"},
{0x16, "JTAG bit banger timed out"}, {Avr8CommandFailureCode::JTAG_BIT_BANGER_TIMED_OUT, "JTAG bit banger timed out"},
{0x17, "Parity error in received data"}, {Avr8CommandFailureCode::PARITY_ERROR_IN_RECEIVED_DATA, "Parity error in received data"},
{0x18, "Did not receive EMPTY byte"}, {Avr8CommandFailureCode::MISSING_EMPTY_BYTE, "Did not receive EMPTY byte"},
{0x19, "PDI physical timed out"}, {Avr8CommandFailureCode::PDI_PHYSICAL_TIMED_OUT, "PDI physical timed out"},
{0x1A, "Collision on physical level"}, {Avr8CommandFailureCode::PHYSICAL_LEVEL_COLLISION, "Collision on physical level"},
{0x1B, "PDI enable failed"}, {Avr8CommandFailureCode::PDI_ENABLE_FAILED, "PDI enable failed"},
{0x20, "Target not found"}, {Avr8CommandFailureCode::TARGET_NOT_FOUND, "Target not found"},
{0x21, "Failure when increasing baud"}, {Avr8CommandFailureCode::BAUD_INCREASE_FAILURE, "Failure when increasing baud"},
{0x22, "Target power not detected"}, {Avr8CommandFailureCode::TARGET_POWER_NOT_DETECTED, "Target power not detected"},
{0x23, "Must run attach command first"}, {Avr8CommandFailureCode::MUST_RUN_ATTACH_COMMAND_FIRST, "Must run attach command first"},
{0x24, "Devices > 31"}, {Avr8CommandFailureCode::DEVICES_EXCEED_31, "Devices > 31"},
{0x25, "Configured device bits do not add up to detected bits"}, {Avr8CommandFailureCode::CONFIGURED_DEVICE_BITS_DO_NOT_ADD_UP_TO_DETECTED_BITS, "Configured device bits do not add up to detected bits"},
{0x31, "Physical not activated"}, {Avr8CommandFailureCode::PHYSICAL_NOT_ACTIVATED, "Physical not activated"},
{0x32, "Illegal run / stopped state"}, {Avr8CommandFailureCode::ILLEGAL_RUN_OR_STOPPED_STATE, "Illegal run / stopped state"},
{0x33, "Invalid config for activate physical"}, {Avr8CommandFailureCode::INVALID_CONFIG_FOR_ACTIVATE_PHYSICAL, "Invalid config for activate physical"},
{0x34, "Not a valid memtype"}, {Avr8CommandFailureCode::NOT_A_VALID_MEMTYPE, "Not a valid memtype"},
{0x35, "Too many or too few bytes"}, {Avr8CommandFailureCode::TOO_MANY_OR_TOO_FEW_BYTES, "Too many or too few bytes"},
{0x36, "Asked for a bad address"}, {Avr8CommandFailureCode::ASKED_FOR_A_BAD_ADDRESS, "Asked for a bad address"},
{0x37, "Asked for badly aligned data"}, {Avr8CommandFailureCode::ASKED_FOR_BADLY_ALIGNED_DATA, "Asked for badly aligned data"},
{0x38, "Address not within legal range"}, {Avr8CommandFailureCode::ADDRESS_NOT_WITHIN_LEGAL_RANGE, "Address not within legal range"},
{0x39, "Illegal value given"}, {Avr8CommandFailureCode::ILLEGAL_VALUE_GIVEN, "Illegal value given"},
{0x3A, "Illegal target ID"}, {Avr8CommandFailureCode::ILLEGAL_TARGET_ID, "Illegal target ID"},
{0x3B, "Clock value out of range"}, {Avr8CommandFailureCode::CLOCK_VALUE_OUT_OF_RANGE, "Clock value out of range"},
{0x3C, "A timeout occurred"}, {Avr8CommandFailureCode::TIMEOUT_OCCURRED, "A timeout occurred"},
{0x3D, "Read an illegal OCD status"}, {Avr8CommandFailureCode::READ_AN_ILLEGAL_OCD_STATUS, "Read an illegal OCD status"},
{0x40, "NVM failed to be enabled"}, {Avr8CommandFailureCode::NVM_FAILED_TO_BE_ENABLED, "NVM failed to be enabled"},
{0x41, "NVM failed to be disabled"}, {Avr8CommandFailureCode::NVM_FAILED_TO_BE_DISABLED, "NVM failed to be disabled"},
{0x42, "Illegal control/status bits"}, {Avr8CommandFailureCode::ILLEGAL_CONTROL_OR_STATUS_BITS, "Illegal control/status bits"},
{0x43, "CRC mismatch"}, {Avr8CommandFailureCode::CRC_MISMATCH, "CRC mismatch"},
{0x44, "Failed to enable OCD"}, {Avr8CommandFailureCode::FAILED_TO_ENABLE_OCD, "Failed to enable OCD"},
{0x50, "Device not under control"}, {Avr8CommandFailureCode::DEVICE_NOT_UNDER_CONTROL, "Device not under control"},
{0x60, "Error when reading PC"}, {Avr8CommandFailureCode::ERROR_WHEN_READING_PC, "Error when reading PC"},
{0x61, "Error when reading register"}, {Avr8CommandFailureCode::ERROR_WHEN_READING_REGISTER, "Error when reading register"},
{0x70, "Error while reading"}, {Avr8CommandFailureCode::ERROR_WHILE_READING, "Error while reading"},
{0x71, "Error while writing"}, {Avr8CommandFailureCode::ERROR_WHILE_WRITING, "Error while writing"},
{0x72, "Timeout while reading"}, {Avr8CommandFailureCode::TIMEOUT_WHILE_READING, "Timeout while reading"},
{0x80, "Invalid breakpoint configuration"}, {Avr8CommandFailureCode::INVALID_BREAKPOINT_CONFIGURATION, "Invalid breakpoint configuration"},
{0x81, "Not enough available resources"}, {Avr8CommandFailureCode::NOT_ENOUGH_AVAILABLE_RESOURCES, "Not enough available resources"},
{0x90, "Feature not available"}, {Avr8CommandFailureCode::FEATURE_NOT_AVAILABLE, "Feature not available"},
{0x91, "Command has not been implemented"}, {Avr8CommandFailureCode::UNKNOWN_COMMAND, "Command has not been implemented"},
{0xFF, "Unknown error reported by EDBG device"}, {Avr8CommandFailureCode::UNKNOWN_ERROR, "Unknown error reported by EDBG device"},
}); });
}; };
} }