/******************************************************************************
*
* Copyright (C) 2009-2014 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;
/* 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_ */