/******************************************************************************
 *
 *  Copyright (C) 2009-2012 Broadcom Corporation
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at:
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 *
 ******************************************************************************/

/******************************************************************************
 *
 *  This file contains the Near Field Communication (NFC) Card Emulation
 *  mode related internal function / definitions.
 *
 ******************************************************************************/

#ifndef CE_INT_H_
#define CE_INT_H_

#include "ce_api.h"

#if (CE_TEST_INCLUDED == FALSE)
#define CE_MIN_SUP_PROTO    NCI_PROTOCOL_FELICA
#define CE_MAX_SUP_PROTO    NCI_PROTOCOL_ISO4
#else
#define CE_MIN_SUP_PROTO    NCI_PROTOCOL_TYPE1
#define CE_MAX_SUP_PROTO    NCI_PROTOCOL_MIFARE
#endif

#define CE_MAX_BYTE_PER_PAGE    7   /* 2^8=256. CB use UINT8 for BytesPerPage, so max is 7 */

/* CE Type 3 Tag structures */

/* Type 3 Tag NDEF card-emulation */
typedef struct {
    BOOLEAN         initialized;
    UINT8           version;        /* Ver: peer version */
    UINT8           nbr;            /* NBr: number of blocks that can be read using one Check command */
    UINT8           nbw;            /* Nbw: number of blocks that can be written using one Update command */
    UINT16          nmaxb;          /* Nmaxb: maximum number of blocks available for NDEF data */
    UINT8           writef;         /* WriteFlag: 00h if writing data finished; 0Fh if writing data in progress */
    UINT8           rwflag;         /* RWFlag: 00h NDEF is read-only; 01h if read/write available */
    UINT32          ln;
    UINT8           *p_buf;         /* Current contents for READs */

    /* Scratch NDEF buffer (for update NDEF commands) */
    UINT8           scratch_writef;
    UINT32          scratch_ln;
    UINT8           *p_scratch_buf; /* Scratch buffer for WRITE/readback */
} tCE_T3T_NDEF_INFO;

/* Type 3 Tag current command processing */
typedef struct {
    UINT16          service_code_list[T3T_MSG_SERVICE_LIST_MAX];
    UINT8           *p_block_list_start;
    UINT8           *p_block_data_start;
    UINT8           num_services;
    UINT8           num_blocks;
} tCE_T3T_CUR_CMD;

/* Type 3 Tag control blcok */
typedef struct
{
    UINT8               state;
    UINT16              system_code;
    UINT8               local_nfcid2[NCI_RF_F_UID_LEN];
    UINT8               local_pmm[NCI_T3T_PMM_LEN];
    tCE_T3T_NDEF_INFO   ndef_info;
    tCE_T3T_CUR_CMD     cur_cmd;
} tCE_T3T_MEM;

/* CE Type 4 Tag control blocks */
typedef struct
{
    UINT8               aid_len;
    UINT8               aid[NFC_MAX_AID_LEN];
    tCE_CBACK          *p_cback;
} tCE_T4T_REG_AID;      /* registered AID table */

typedef struct
{
    TIMER_LIST_ENT      timer;              /* timeout for update file              */
    UINT8               cc_file[T4T_FC_TLV_OFFSET_IN_CC + T4T_FILE_CONTROL_TLV_SIZE];
    UINT8              *p_ndef_msg;         /* storage of NDEF message              */
    UINT16              nlen;               /* current size of NDEF message         */
    UINT16              max_file_size;      /* size of storage + 2 bytes for NLEN   */
    UINT8              *p_scratch_buf;      /* temp storage of NDEF message for update */

#define CE_T4T_STATUS_T4T_APP_SELECTED      0x01    /* T4T CE App is selected       */
#define CE_T4T_STATUS_REG_AID_SELECTED      0x02    /* Registered AID is selected   */
#define CE_T4T_STATUS_CC_FILE_SELECTED      0x04    /* CC file is selected          */
#define CE_T4T_STATUS_NDEF_SELECTED         0x08    /* NDEF file is selected        */
#define CE_T4T_STATUS_NDEF_FILE_READ_ONLY   0x10    /* NDEF is read-only            */
#define CE_T4T_STATUS_NDEF_FILE_UPDATING    0x20    /* NDEF is updating             */
#define CE_T4T_STATUS_WILDCARD_AID_SELECTED 0x40    /* Wildcard AID selected        */

    UINT8               status;

    tCE_CBACK          *p_wildcard_aid_cback;               /* registered wildcard AID callback */
    tCE_T4T_REG_AID     reg_aid[CE_T4T_MAX_REG_AID];        /* registered AID table             */
    UINT8               selected_aid_idx;
} tCE_T4T_MEM;

#define CE_T4T_WILDCARD_AID_HANDLE  (CE_T4T_MAX_REG_AID)    /* reserved handle for wildcard aid */

/* CE memory control blocks */
typedef struct
{
    tCE_T3T_MEM         t3t;
    tCE_T4T_MEM         t4t;
} tCE_MEM;

/* CE control blocks */
typedef struct
{
    tCE_MEM             mem;
    tCE_CBACK           *p_cback;
    UINT8               *p_ndef;     /* the memory starting from NDEF */
    UINT16              ndef_max;    /* max size of p_ndef */
    UINT16              ndef_cur;    /* current size of p_ndef */
    tNFC_RF_TECH        tech;
    UINT8               trace_level;

} tCE_CB;

/*
** CE Type 4 Tag Definition
*/

/* Max data size using a single ReadBinary. 2 bytes are for status bytes */
#define CE_T4T_MAX_LE           (NFC_CE_POOL_BUF_SIZE - BT_HDR_SIZE - NCI_MSG_OFFSET_SIZE - NCI_DATA_HDR_SIZE - T4T_RSP_STATUS_WORDS_SIZE)

/* Max data size using a single UpdateBinary. 6 bytes are for CLA, INS, P1, P2, Lc */
#define CE_T4T_MAX_LC           (NFC_CE_POOL_BUF_SIZE - BT_HDR_SIZE - NCI_DATA_HDR_SIZE - T4T_CMD_MAX_HDR_SIZE)

/*****************************************************************************
**  EXTERNAL FUNCTION DECLARATIONS
*****************************************************************************/
#ifdef __cplusplus
extern "C" {
#endif

/* Global NFC data */
#if NFC_DYNAMIC_MEMORY == FALSE
NFC_API extern tCE_CB  ce_cb;
#else
NFC_API extern tCE_CB *ce_cb_ptr;
#define ce_cb (*ce_cb_ptr)
#endif

extern void ce_init (void);

/* ce_t3t internal functions */
void ce_t3t_init (void);
tNFC_STATUS ce_select_t3t (UINT16 system_code, UINT8 nfcid2[NCI_RF_F_UID_LEN]);

/* ce_t4t internal functions */
extern tNFC_STATUS ce_select_t4t (void);
extern void ce_t4t_process_timeout (TIMER_LIST_ENT *p_tle);

#ifdef __cplusplus
}
#endif

#endif /* CE_INT_H_ */
