#ifndef __SPI_PROTOCOL_H__
#define __SPI_PROTOCOL_H__

#include <stdint.h>
#include "sec_apdu.h"
#include "spi_common.h"

/* LEN of APDU */
#define LEN_EXTEND_APDU 0x7FFF
#define LEN_NORMAL_APDU 0xFF

/* T1 PROTOCOL STATUS */
typedef uint8_t        T1PROT_STATUS;
#define T1PROT_SEND_I_BLOCK_LAST    (0xF1)
#define T1PROT_SEND_I_BLOCK_CHAINED (0xF2)
#define T1PROT_SEND_R_BLOCK         (0xF3)
#define T1PROT_SEND_R_BLOCK_NEXT    (0xF4)
#define T1PROT_SEND_S_WTX_RSP       (0xF5)
#define T1PROT_SEND_S_WTX_RSP_RESEND    (0xF6)
#define T1PROT_SEND_S_RESYNC_REQ    (0xF7)
#define T1PROT_SEND_S_RESYNC_RSP    (0xF8)
#define T1PROT_RECEIVE_I_BLOCK_CHAINED  (0xF9)
#define T1PROT_NOT_SYNCRONIZED      (0xFC)
#define T1PROT_ALL_FINISHED         (0xFD)
#define T1PROT_PCB_INVALID          (0xFE)
#define T1PROT_UNKNOWN_ERROR        (0xFF)

/* I-block PCB */
#define I_OFFSET_SEQ_NUM    6
#define I_OFFSET_MORE_DATA  5

/* R-block PCB */
#define R_OFFSET_SEQ_NUM    4
#define R_ERROR_FREE    (0x80)
#define R_ERROR_LRC     (0x81)
#define R_ERROR_OTHER   (0x82)


/* S-block PCB */
#define S_RESYNCH_REQ       (0xC0)  /* AP -> eSE */
#define S_RESYNCH_RSP       (0xE0)  /* AP <- eSE */ /* no data */
#define S_ABORT_REQ         (0xC2)  /* AP -> eSE */
#define S_ABORT_RSP         (0xE2)  /* AP <- eSE */ /* no data */
#define S_WTX_REQ           (0xC3)  /* AP <- eSE */ /* no data */
#define S_WTX_RSP           (0xE3)  /* AP -> eSE */
#define S_WARM_RESET_REQ    (0xC4)  /* AP -> eSE */
#define S_WARM_RESET_RSP    (0xE4)  /* AP <- eSE */ /* no data */
#define S_SLEEP_ENABLE_REQ  (0xC5)  /* AP -> eSE */
#define S_SLEEP_ENABLE_RSP  (0xE5)  /* AP <- eSE */ /* no data */
#define S_SET_CONF_REQ      (0xC6)  /* AP -> eSE */
#define S_SET_CONF_RSP      (0xE6)  /* AP <- eSE */ /* receive with data */
#define S_RECOVERY_RSP      (0xE7)  /* AP <- eSE */ /* no data */

#define S_RECOVERY_REQ      (0xC7)  /* AP -> eSE */ /* send FFFFFFFF to eSE */

ESESTATUS transceiveIFrame(uint8_t *p_inData, uint32_t len_inData,
						   uint8_t *p_outData, uint32_t *plen_outData );
ESESTATUS transceiveSFrame(uint8_t controlbyte, uint8_t *p_data, uint32_t data_len,
                           uint8_t *p_outData, uint32_t *plen_outData);

ESESTATUS phOTEse_Transceive_apdu( uint8_t *cpdu, int cpduLen, p_secEse_7816_rpdu_t pRsp );
ESESTATUS phOTEse_Transceive(p_secEse_7816_cpdu_t pCmd, p_secEse_7816_rpdu_t pRsp);

int spi_write(const void *buf, size_t count);
int spi_read(void *buf, size_t count);
ESESTATUS phOTEse_Init(void);
ESESTATUS phOTEse_WarmReset(void);

#endif /* __SPI_PROTOCOL_H__ */
