- Refactored entire codebase (excluding the Insight component) to accommodate multiple target architectures (no longer specific to AVR) - Deleted 'generate SVD' GDB monitor command - I will eventually move this functionality to the Bloom website - Added unit size property to address spaces - Many other changes which I couldn't be bothered to describe here
104 lines
3.5 KiB
C++
104 lines
3.5 KiB
C++
#pragma once
|
|
|
|
#include <cstdint>
|
|
#include <chrono>
|
|
#include <thread>
|
|
#include <cassert>
|
|
|
|
#include "src/DebugToolDrivers/TargetInterfaces/Microchip/AVR8/AvrIspInterface.hpp"
|
|
#include "src/DebugToolDrivers/Microchip/Protocols/EDBG/EdbgInterface.hpp"
|
|
#include "src/Targets/Microchip/AVR8/TargetDescriptionFile.hpp"
|
|
|
|
namespace DebugToolDrivers::Microchip::Protocols::Edbg::Avr
|
|
{
|
|
/**
|
|
* The EdbgAvrIspInterface implements the AVRISP EDBG/CMSIS-DAP protocol, as an AvrIspInterface.
|
|
*
|
|
* See the "AVR ISP Protocol" section in the DS50002630A document by Microchip, for more information on the
|
|
* protocol.
|
|
*
|
|
* This implementation should work with any Microchip EDBG-based CMSIS-DAP debug tool with ISP support (such as
|
|
* the Atmel-ICE, Power Debugger, the MPLAB SNAP debugger (in "AVR mode"), etc).
|
|
*/
|
|
class EdbgAvrIspInterface: public TargetInterfaces::Microchip::Avr8::AvrIspInterface
|
|
{
|
|
public:
|
|
explicit EdbgAvrIspInterface(
|
|
EdbgInterface* edbgInterface,
|
|
const Targets::Microchip::Avr8::TargetDescriptionFile& targetDescriptionFile
|
|
);
|
|
|
|
/**
|
|
* Initialises the ISP interface by enabling "programming mode" on the debug tool. This will activate the
|
|
* physical (SPI) interface between the debug tool and AVR target.
|
|
*/
|
|
void activate() override;
|
|
|
|
/**
|
|
* Disables "programming mode" on the debug tool, which subsequently deactivates the SPI interface between the
|
|
* debug tool and AVR target.
|
|
*/
|
|
void deactivate() override;
|
|
|
|
/**
|
|
* Obtains the AVR signature from the connected AVR.
|
|
*
|
|
* @return
|
|
*/
|
|
Targets::Microchip::Avr8::TargetSignature getDeviceId() override;
|
|
|
|
/**
|
|
* Reads a particular fuse byte from the AVR target.
|
|
*
|
|
* @param fuseRegisterDescriptor
|
|
* @return
|
|
*/
|
|
Targets::Microchip::Avr8::FuseValue readFuse(
|
|
const Targets::TargetRegisterDescriptor& fuseRegisterDescriptor
|
|
) override;
|
|
|
|
/**
|
|
* Reads the lock bit byte from the AVR target.
|
|
*
|
|
* @return
|
|
*/
|
|
unsigned char readLockBitByte() override;
|
|
|
|
/**
|
|
* Programs a particular fuse on the AVR target.
|
|
*
|
|
* @param fuseRegisterDescriptor
|
|
* @param value
|
|
*/
|
|
void programFuse(
|
|
const Targets::TargetRegisterDescriptor& fuseRegisterDescriptor,
|
|
Targets::Microchip::Avr8::FuseValue value
|
|
) override;
|
|
|
|
private:
|
|
/**
|
|
* The AVRISP protocol is a sub-protocol of the EDBG AVR protocol, which is served via CMSIS-DAP vendor
|
|
* commands.
|
|
*
|
|
* Every EDBG based debug tool that utilises this implementation must provide access to its EDBG interface.
|
|
*/
|
|
EdbgInterface* edbgInterface;
|
|
|
|
Targets::Microchip::Avr8::IspParameters ispParameters;
|
|
|
|
/**
|
|
* The EDBG AVRISP protocol only allows us to read a single signature byte at a time.
|
|
* This function will read a single signature byte. See implementation of EdbgAvrIspInterface::getDeviceId()
|
|
* for more.
|
|
*
|
|
* @param signatureByteAddress
|
|
* @return
|
|
*/
|
|
[[nodiscard]] unsigned char readSignatureByte(std::uint8_t signatureByteAddress);
|
|
|
|
Targets::Microchip::Avr8::FuseType resolveFuseType(
|
|
const Targets::TargetRegisterDescriptor& fuseRegisterDescriptor
|
|
);
|
|
};
|
|
}
|