#pragma once #include #include #include "src/DebugToolDrivers/TargetInterfaces/Microchip/AVR/AVR8/Avr8Interface.hpp" #include "src/Targets/Microchip/AVR/Target.hpp" #include "src/Targets/TargetRegister.hpp" #include "src/DebugToolDrivers/DebugTool.hpp" #include "src/ApplicationConfig.hpp" #include "src/Exceptions/Exception.hpp" #include "TargetParameters.hpp" #include "Family.hpp" #include "PadDescriptor.hpp" // Part Description #include "PartDescription/PartDescriptionFile.hpp" namespace Bloom::Targets::Microchip::Avr::Avr8Bit { using namespace Exceptions; using namespace PartDescription; using PartDescription::PartDescriptionFile; using DebugToolDrivers::TargetInterfaces::Microchip::Avr::Avr8::Avr8Interface; using Targets::TargetRegisterMap; class Avr8: public Target { protected: Avr8Interface* avr8Interface; std::string name = ""; std::optional family; std::optional partDescription; std::optional targetParameters; std::map padDescriptorsByName; std::map targetVariantsById; virtual TargetParameters& getTargetParameters(); virtual void loadPadDescriptors(); virtual void loadTargetVariants(); public: explicit Avr8() = default; Avr8(const std::string& name): name(name) {}; [[nodiscard]] std::string getName() const override { return this->name; } /** * Checks if DebugTool is compatible with AVR8 targets. * * @param debugTool * @return */ bool isDebugToolSupported(DebugTool* debugTool) override { return debugTool->getAvr8Interface() != nullptr; } void setDebugTool(DebugTool* debugTool) override { this->avr8Interface = debugTool->getAvr8Interface(); }; void preActivationConfigure(const TargetConfig& targetConfig) override; void postActivationConfigure() override; virtual void postPromotionConfigure() override; void activate() override; void deactivate() override; TargetSignature getId() override; void run() override; void stop() override; void step() override; void reset() override; void setBreakpoint(std::uint32_t address) override; void removeBreakpoint(std::uint32_t address) override; void clearAllBreakpoints() override; /** * AVR8 targets are promotable. See promote() method for more. * * @return */ bool supportsPromotion() override { return true; } virtual std::vector generateVariantsFromPartDescription(); virtual TargetDescriptor getDescriptor() override; virtual std::unique_ptr promote() override; virtual TargetRegisters readGeneralPurposeRegisters(std::set registerIds) override; virtual void writeRegisters(const TargetRegisters& registers) override; virtual TargetRegisters readRegisters(const TargetRegisterDescriptors& descriptors) override; virtual TargetMemoryBuffer readMemory(TargetMemoryType memoryType, std::uint32_t startAddress, std::uint32_t bytes) override; virtual void writeMemory(TargetMemoryType memoryType, std::uint32_t startAddress, const TargetMemoryBuffer& buffer) override; virtual TargetState getState() override; virtual std::uint32_t getProgramCounter() override; virtual TargetRegister getProgramCounterRegister() override; virtual TargetRegister getStackPointerRegister() override; virtual TargetRegister getStatusRegister() override; virtual void setProgramCounter(std::uint32_t programCounter) override; virtual std::map getPinStates(int variantId) override; virtual void setPinState( int variantId, const TargetPinDescriptor& pinDescriptor, const TargetPinState& state ) override; virtual bool memoryAddressRangeClashesWithIoPortRegisters( TargetMemoryType memoryType, std::uint32_t startAddress, std::uint32_t endAddress ) override; }; }