55 lines
1.9 KiB
C++
55 lines
1.9 KiB
C++
#ifndef LINKPROTOCOL_H
|
|
#define LINKPROTOCOL_H
|
|
|
|
#include <stdint.h>
|
|
#include "intelhex.h"
|
|
|
|
class CdcCmd;
|
|
class MemoryBase;
|
|
/**
|
|
* @class LinkProtocol
|
|
* @brief Protokol po CDC.
|
|
*
|
|
* Vychází z formátu IntelHex. komunikaci začíná PC, modul odpovídá. První co musí PC (vždy na začátku konunikace !) poslat
|
|
* je paket ElaRecord (4), který určuje počáteční adresu - podle ní modul vybere potřebný ovladač paměti. Formy komunikace :
|
|
* -# Mazání obsahu flash. Probíhá po jednotlivých blocích.
|
|
* - PC -> MODUL : ersRecord (v poli offset číslo bloku relativně k počátku typu paměti)
|
|
* - MODUL -> PC : ackRecord (v poli offset číslo bloku relativně k počátku typu paměti)
|
|
* -# Zápis dat do paměti.
|
|
* - PC -> MODUL : dataRecord (max. 32 bytů)
|
|
* - MODUL -> PC : ackRecord nebo nakRecord pokud je cosi špatně
|
|
* -# Čtení dat z paměti.
|
|
* - PC -> MODUL : reqRecord (v poli offset odkud chci číst)
|
|
* - MODUL -> PC : dataRecord - pokud má nulovou délku, další data nejsou. Posílána je délka 32 bytů.
|
|
* -# Spuštění uživatelského programu.
|
|
* - PC -> MODUL : slaRecord
|
|
* - bez odpovědi - je to jen pro uživatelské testy a může to špatně skončit. Vlastně je to přidáno
|
|
* jen proto, že to jde.
|
|
* */
|
|
class LinkProtocol {
|
|
static constexpr unsigned strbuflen = 0x80u;
|
|
public:
|
|
explicit LinkProtocol(CdcCmd & g, MemoryBase & b) noexcept;
|
|
void ParseLine (const char * line);
|
|
protected:
|
|
void AcquireDataRecord ();
|
|
void AcquireElaRecord ();
|
|
void AcquireSlaRecord ();
|
|
void AcquireEofRecord ();
|
|
void AcquireReqRecord ();
|
|
void AcquireErsRecord ();
|
|
|
|
void SendAck (bool ok=true);
|
|
private:
|
|
CdcCmd & cdccmd;
|
|
IntelHex ihx;
|
|
MemoryBase & driver;
|
|
|
|
uint32_t begin_addr;
|
|
uint32_t start_addr;
|
|
uint32_t lenght;
|
|
|
|
char strbuf [strbuflen];
|
|
};
|
|
|
|
#endif // LINKPROTOCOL_H
|