#ifndef REMOTE_H
#define REMOTE_H
#include <inttypes.h>
#include "general.h"
#define REMOTE_HL_VERSION 3
#define REMOTE_ERROR_UNRECOGNISED 1
#define REMOTE_ERROR_WRONGLEN 2
#define REMOTE_ERROR_FAULT 3
#define REMOTE_ERROR_EXCEPTION 4
#define REMOTE_SOM '!'
#define REMOTE_EOM '#'
#define REMOTE_RESP '&'
#define REMOTE_RESP_OK 'K'
#define REMOTE_RESP_PARERR 'P'
#define REMOTE_RESP_ERR 'E'
#define REMOTE_RESP_NOTSUP 'N'
#define REMOTE_UINT8 '%', '0', '2', 'x'
#define REMOTE_UINT16 '%', '0', '4', 'x'
#define REMOTE_UINT24 '%', '0', '6', 'x'
#define REMOTE_UINT32 '%', '0', '8', 'x'
#define REMOTE_GEN_PACKET 'G'
#define REMOTE_START 'A'
#define REMOTE_TDITDO_TMS 'D'
#define REMOTE_TDITDO_NOTMS 'd'
#define REMOTE_CYCLE 'c'
#define REMOTE_IN_PAR 'I'
#define REMOTE_TARGET_CLK_OE 'E'
#define REMOTE_FREQ_SET 'F'
#define REMOTE_FREQ_GET 'f'
#define REMOTE_IN 'i'
#define REMOTE_NEXT 'N'
#define REMOTE_OUT_PAR 'O'
#define REMOTE_OUT 'o'
#define REMOTE_PWR_SET 'P'
#define REMOTE_PWR_GET 'p'
#define REMOTE_RESET 'R'
#define REMOTE_INIT 'S'
#define REMOTE_TMS 'T'
#define REMOTE_VOLTAGE 'V'
#define REMOTE_NRST_SET 'Z'
#define REMOTE_NRST_GET 'z'
#define REMOTE_ADD_JTAG_DEV 'J'
#define REMOTE_START_STR \
(char[]) \
{ \
'+', REMOTE_EOM, REMOTE_SOM, REMOTE_GEN_PACKET, REMOTE_START, REMOTE_EOM, 0 \
}
#define REMOTE_VOLTAGE_STR \
(char[]) \
{ \
REMOTE_SOM, REMOTE_GEN_PACKET, REMOTE_VOLTAGE, REMOTE_EOM, 0 \
}
#define REMOTE_NRST_SET_STR \
(char[]) \
{ \
REMOTE_SOM, REMOTE_GEN_PACKET, REMOTE_NRST_SET, '%', 'c', REMOTE_EOM, 0 \
}
#define REMOTE_NRST_GET_STR \
(char[]) \
{ \
REMOTE_SOM, REMOTE_GEN_PACKET, REMOTE_NRST_GET, REMOTE_EOM, 0 \
}
#define REMOTE_FREQ_SET_STR \
(char[]) \
{ \
REMOTE_SOM, REMOTE_GEN_PACKET, REMOTE_FREQ_SET, '%', '0', '8', 'x', REMOTE_EOM, 0 \
}
#define REMOTE_FREQ_GET_STR \
(char[]) \
{ \
REMOTE_SOM, REMOTE_GEN_PACKET, REMOTE_FREQ_GET, REMOTE_EOM, 0 \
}
#define REMOTE_PWR_SET_STR \
(char[]) \
{ \
REMOTE_SOM, REMOTE_GEN_PACKET, REMOTE_PWR_SET, '%', 'c', REMOTE_EOM, 0 \
}
#define REMOTE_PWR_GET_STR \
(char[]) \
{ \
REMOTE_SOM, REMOTE_GEN_PACKET, REMOTE_PWR_GET, REMOTE_EOM, 0 \
}
#define REMOTE_TARGET_CLK_OE_STR \
(char[]) \
{ \
REMOTE_SOM, REMOTE_GEN_PACKET, REMOTE_TARGET_CLK_OE, '%', 'c', REMOTE_EOM, 0 \
}
#define REMOTE_SWDP_PACKET 'S'
#define REMOTE_SWDP_INIT_STR \
(char[]) \
{ \
REMOTE_SOM, REMOTE_SWDP_PACKET, REMOTE_INIT, REMOTE_EOM, 0 \
}
#define REMOTE_SWDP_IN_PAR_STR \
(char[]) \
{ \
REMOTE_SOM, REMOTE_SWDP_PACKET, REMOTE_IN_PAR, '%', '0', '2', 'x', REMOTE_EOM, 0 \
}
#define REMOTE_SWDP_IN_STR \
(char[]) \
{ \
REMOTE_SOM, REMOTE_SWDP_PACKET, REMOTE_IN, '%', '0', '2', 'x', REMOTE_EOM, 0 \
}
#define REMOTE_SWDP_OUT_STR \
(char[]) \
{ \
REMOTE_SOM, REMOTE_SWDP_PACKET, REMOTE_OUT, '%', '0', '2', 'x', '%', 'x', REMOTE_EOM, 0 \
}
#define REMOTE_SWDP_OUT_PAR_STR \
(char[]) \
{ \
REMOTE_SOM, REMOTE_SWDP_PACKET, REMOTE_OUT_PAR, '%', '0', '2', 'x', '%', 'x', REMOTE_EOM, 0 \
}
#define REMOTE_JTAG_PACKET 'J'
#define REMOTE_JTAG_INIT_STR \
(char[]) \
{ \
'+', REMOTE_EOM, REMOTE_SOM, REMOTE_JTAG_PACKET, REMOTE_INIT, REMOTE_EOM, 0 \
}
#define REMOTE_JTAG_RESET_STR \
(char[]) \
{ \
'+', REMOTE_EOM, REMOTE_SOM, REMOTE_JTAG_PACKET, REMOTE_RESET, REMOTE_EOM, 0 \
}
#define REMOTE_JTAG_TMS_STR \
(char[]) \
{ \
REMOTE_SOM, REMOTE_JTAG_PACKET, REMOTE_TMS, '%', '0', '2', 'x', '%', 'x', REMOTE_EOM, 0 \
}
#define REMOTE_JTAG_TDIDO_STR \
(char[]) \
{ \
REMOTE_SOM, REMOTE_JTAG_PACKET, '%', 'c', '%', '0', '2', 'x', '%', 'l', 'x', REMOTE_EOM, 0 \
}
#define REMOTE_JTAG_CYCLE_STR \
(char[]) \
{ \
REMOTE_SOM, REMOTE_JTAG_PACKET, REMOTE_CYCLE, '%', 'u', '%', 'u', '%', '0', '8', 'x', REMOTE_EOM, 0 \
}
#define REMOTE_JTAG_NEXT \
(char[]) \
{ \
REMOTE_SOM, REMOTE_JTAG_PACKET, REMOTE_NEXT, '%', 'u', '%', 'u', REMOTE_EOM, 0 \
}
#define REMOTE_HL_PACKET 'H'
#define REMOTE_HL_CHECK 'C'
#define REMOTE_HL_CHECK_STR \
(char[]) \
{ \
REMOTE_SOM, REMOTE_HL_PACKET, REMOTE_HL_CHECK, REMOTE_EOM, 0 \
}
#define REMOTE_JTAG_ADD_DEV_STR \
(char[]) \
{ \
REMOTE_SOM, REMOTE_HL_PACKET, REMOTE_ADD_JTAG_DEV, REMOTE_UINT8, \
REMOTE_UINT8, \
REMOTE_UINT8, \
REMOTE_UINT8, \
REMOTE_UINT8, \
REMOTE_UINT8, \
REMOTE_UINT32, \
REMOTE_EOM, 0 \
}
#define REMOTE_ADIv5_PACKET 'A'
#define REMOTE_DP_READ 'd'
#define REMOTE_AP_READ 'a'
#define REMOTE_AP_WRITE 'A'
#define REMOTE_ADIv5_RAW_ACCESS 'R'
#define REMOTE_MEM_READ 'm'
#define REMOTE_MEM_WRITE 'M'
#define REMOTE_ADIv5_DEV_INDEX REMOTE_UINT8
#define REMOTE_ADIv5_AP_SEL REMOTE_UINT8
#define REMOTE_ADIv5_ADDR16 REMOTE_UINT16
#define REMOTE_ADIv5_ADDR32 REMOTE_UINT32
#define REMOTE_ADIv5_DATA REMOTE_UINT32
#define REMOTE_ADIv5_CSW REMOTE_UINT32
#define REMOTE_ADIv5_ALIGNMENT REMOTE_UINT8
#define REMOTE_ADIv5_COUNT REMOTE_UINT32
#define REMOTE_DP_READ_STR \
(char[]) \
{ \
REMOTE_SOM, REMOTE_ADIv5_PACKET, REMOTE_DP_READ, REMOTE_ADIv5_DEV_INDEX, 'f', 'f', REMOTE_ADIv5_ADDR16, \
REMOTE_EOM, 0 \
}
#define REMOTE_AP_READ_STR \
(char[]) \
{ \
REMOTE_SOM, REMOTE_ADIv5_PACKET, REMOTE_AP_READ, REMOTE_ADIv5_DEV_INDEX, REMOTE_ADIv5_AP_SEL, \
REMOTE_ADIv5_ADDR16, REMOTE_EOM, 0 \
}
#define REMOTE_AP_WRITE_STR \
(char[]) \
{ \
REMOTE_SOM, REMOTE_ADIv5_PACKET, REMOTE_AP_WRITE, REMOTE_ADIv5_DEV_INDEX, REMOTE_ADIv5_AP_SEL, \
REMOTE_ADIv5_ADDR16, REMOTE_ADIv5_DATA, REMOTE_EOM, 0 \
}
#define REMOTE_ADIv5_RAW_ACCESS_STR \
(char[]) \
{ \
REMOTE_SOM, REMOTE_ADIv5_PACKET, REMOTE_ADIv5_RAW_ACCESS, REMOTE_ADIv5_DEV_INDEX, REMOTE_ADIv5_AP_SEL, \
REMOTE_ADIv5_ADDR16, REMOTE_ADIv5_DATA, REMOTE_EOM, 0 \
}
#define REMOTE_ADIv5_MEM_READ_STR \
(char[]) \
{ \
REMOTE_SOM, REMOTE_ADIv5_PACKET, REMOTE_MEM_READ, REMOTE_ADIv5_DEV_INDEX, REMOTE_ADIv5_AP_SEL, \
REMOTE_ADIv5_CSW, REMOTE_ADIv5_ADDR32, REMOTE_ADIv5_COUNT, REMOTE_EOM, 0 \
}
#define REMOTE_ADIv5_MEM_READ_LENGTH 32U
#define REMOTE_ADIv5_MEM_WRITE_STR \
(char[]) \
{ \
REMOTE_SOM, REMOTE_ADIv5_PACKET, REMOTE_MEM_WRITE, REMOTE_ADIv5_DEV_INDEX, REMOTE_ADIv5_AP_SEL, \
REMOTE_ADIv5_CSW, REMOTE_ADIv5_ALIGNMENT, REMOTE_ADIv5_ADDR32, REMOTE_ADIv5_COUNT, 0 \
}
#define REMOTE_ADIv5_MEM_WRITE_LENGTH 34U
#define REMOTE_SPI_PACKET 's'
#define REMOTE_SPI_BEGIN 'B'
#define REMOTE_SPI_END 'E'
#define REMOTE_SPI_CHIP_SELECT 'C'
#define REMOTE_SPI_TRANSFER 'X'
#define REMOTE_SPI_READ 'r'
#define REMOTE_SPI_WRTIE 'w'
#define REMOTE_SPI_CHIP_ID 'I'
#define REMOTE_SPI_RUN_COMMAND 'c'
#define REMOTE_SPI_BEGIN_STR \
(char[]) \
{ \
'+', REMOTE_EOM, REMOTE_SOM, REMOTE_SPI_PACKET, REMOTE_SPI_BEGIN, REMOTE_UINT8, REMOTE_EOM, 0 \
}
#define REMOTE_SPI_END_STR \
(char[]) \
{ \
REMOTE_SOM, REMOTE_SPI_PACKET, REMOTE_SPI_END, REMOTE_UINT8, REMOTE_EOM, 0 \
}
#define REMOTE_SPI_CHIP_SELECT_STR \
(char[]) \
{ \
REMOTE_SOM, REMOTE_SPI_PACKET, REMOTE_SPI_CHIP_SELECT, REMOTE_UINT8, REMOTE_EOM, 0 \
}
#define REMOTE_SPI_TRANSFER_STR \
(char[]) \
{ \
REMOTE_SOM, REMOTE_SPI_PACKET, REMOTE_SPI_TRANSFER, REMOTE_UINT8, REMOTE_UINT8, REMOTE_EOM, 0, \
}
#define REMOTE_SPI_READ_STR \
(char[]) \
{ \
REMOTE_SOM, REMOTE_SPI_PACKET, REMOTE_SPI_READ, REMOTE_UINT8, REMOTE_UINT8, REMOTE_UINT16, REMOTE_UINT24, \
REMOTE_UINT16, REMOTE_EOM, 0, \
}
#define REMOTE_SPI_WRITE_STR \
(char[]) \
{ \
REMOTE_SOM, REMOTE_SPI_PACKET, REMOTE_SPI_WRITE, REMOTE_UINT8, REMOTE_UINT8, REMOTE_UINT16, REMOTE_UINT24, \
REMOTE_UINT16, 0, \
}
#define REMOTE_SPI_CHIP_ID_STR \
(char[]) \
{ \
REMOTE_SOM, REMOTE_SPI_PACKET, REMOTE_SPI_CHIP_ID, REMOTE_UINT8, REMOTE_UINT8, REMOTE_EOM, 0 \
}
#define REMOTE_SPI_RUN_COMMAND_STR \
(char[]) \
{ \
REMOTE_SOM, REMOTE_SPI_PACKET, REMOTE_SPI_RUN_COMMAND, REMOTE_UINT8, REMOTE_UINT8, REMOTE_UINT16, \
REMOTE_UINT24, REMOTE_EOM, 0 \
}
uint64_t remote_hex_string_to_num(uint32_t limit, const char *str);
void remote_packet_process(unsigned int i, char *packet);
#endif