/* * Copyright (C) 2015 The Android Open Source Project * * 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. */ /* * NFC Ndef Mapping For Different Smart Cards. * */ #ifndef PHFRINFC_NDEFMAP_H #define PHFRINFC_NDEFMAP_H /*include files*/ #include #include #include #include /* NDEF Mapping Component * * This component implements the read/write/check NDEF functions for remote * devices. NDEF data, as defined by the NFC Forum NDEF specification are * written to or read from a remote device that can be a smart- or memory card. * Please notice that the NDEF mapping command sequence must * be contiguous (after correct initialization) * */ /* * NDEF Mapping - specifies the different card types * These are the only recognized card types in this version. * */ #define PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD 7 /* Mifare Standard */ #define PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD 8 /* Mifare Standard */ #define PH_FRINFC_NDEFMAP_MIFARE_STD_2K_CARD 11 /*internal Mifare Standard */ #define PH_FRINFC_NDEFMAP_EMPTY_NDEF_MSG \ { 0xD0, 0x00, 0x00 } /* Empty ndef message */ #define PH_FRINFC_NDEFMAP_MFUL_4BYTES_BUF 4 /* To store 4 bytes after write */ /* Enum represents the different card state*/ typedef enum { PH_NDEFMAP_CARD_STATE_INITIALIZED, PH_NDEFMAP_CARD_STATE_READ_ONLY, PH_NDEFMAP_CARD_STATE_READ_WRITE, PH_NDEFMAP_CARD_STATE_INVALID } phNDEF_CARD_STATE; /* * NDEF Mapping - specifies the Compliant Blocks in the Mifare 1k and 4k card * types * */ #define PH_FRINFC_NDEFMAP_MIFARESTD_1KNDEF_COMPBLOCK \ 45 /* Total Ndef Compliant blocks Mifare 1k */ #define PH_FRINFC_NDEFMAP_MIFARESTD_2KNDEF_COMPBLOCK \ 90 /* Total Ndef Compliant blocks Mifare 2k */ #define PH_FRINFC_NDEFMAP_MIFARESTD_4KNDEF_COMPBLOCK \ 210 /* Total Ndef Compliant blocks Mifare 4k */ #define PH_FRINFC_NDEFMAP_MIFARESTD_RDWR_SIZE \ 16 /* Bytes read/write for one read/write operation*/ #define PH_FRINFC_NDEFMAP_MIFARESTD_TOTALNO_BLK \ 40 /* Total number of sectors in Mifare 4k */ #define PH_FRINFC_NDEFMAP_MIFARESTD_ST15_BYTES \ 15 /* To store 15 bytes after reading a block */ /* * Completion Routine Indices * * These are the indices of the completion routine pointers within the component * context. Completion routines belong to upper components. * */ #define PH_FRINFC_NDEFMAP_CR_CHK_NDEF 0 /* */ #define PH_FRINFC_NDEFMAP_CR_RD_NDEF 1 /* */ #define PH_FRINFC_NDEFMAP_CR_WR_NDEF 2 /* */ #define PH_FRINFC_NDEFMAP_CR_ERASE_NDEF 3 /* */ #define PH_FRINFC_NDEFMAP_CR_INVALID_OPE 4 /* */ #define PH_FRINFC_NDEFMAP_CR 5 /* */ /* * File Offset Attributes * * Following values are used to determine the offset value for Read/Write. This * specifies whether the Read/Write operation needs to be restarted/continued * from the last offset set. * */ /* Read/Write operation shall start from the last offset set */ #define PH_FRINFC_NDEFMAP_SEEK_CUR 0 /* */ /* Read/Write operation shall start from the beginning of the file/card */ #define PH_FRINFC_NDEFMAP_SEEK_BEGIN 1 /* */ /* Read operation invalid */ #define PH_FRINFC_NDEFMAP_SEEK_INVALID 0xFF /* */ /* * Buffer Size Definitions * */ /* Minimum size of the TRX buffer required */ #define PH_FRINFC_NDEFMAP_MAX_SEND_RECV_BUF_SIZE 252 /* */ /* The size of s MIFARE block */ #define PH_FRINFC_NDEFMAP_MF_READ_BLOCK_SIZE 16 /* */ typedef struct phFriNfc_MifareStdCont { /* to store bytes that will be used in the next write/read operation, if any */ uint8_t internalBuf[PH_FRINFC_NDEFMAP_MIFARESTD_ST15_BYTES]; /* to Store the length of the internalBuf */ uint16_t internalLength; /* holds the block number which is presently been used */ uint8_t currentBlock; /* the number of Ndef compliant blocks written/read */ uint8_t NdefBlocks; /* Total Number of Ndef compliant Blocks */ uint16_t NoOfNdefCompBlocks; /* used in write ndef, to know that internal byte are accessed */ uint8_t internalBufFlag; /* used in write ndef, to know that last 16 bytes are used to write*/ uint8_t RemainingBufFlag; /* indicates that Read has reached the end of the card */ uint8_t ReadWriteCompleteFlag; /* indicates that Read has reached the end of the card */ uint8_t ReadCompleteFlag; /* indicates that Write is possible or not */ uint8_t WriteFlag; /* indicates that Write is possible or not */ uint8_t ReadFlag; /* indicates that Write is possible or not */ uint8_t RdBeforeWrFlag; /* Authentication Flag indicating that a particular sector is authenticated or * not */ uint8_t AuthDone; /* to store the last Sector ID in Check Ndef */ uint8_t SectorIndex; /* to read the access bits of each sector */ uint8_t ReadAcsBitFlag; /* Flag to check if Acs bit was written in this call */ uint8_t WriteAcsBitFlag; /* Buffer to store 16 bytes */ uint8_t Buffer[PH_FRINFC_NDEFMAP_MIFARESTD_RDWR_SIZE]; /* to store the AIDs of Mifare 1k or 4k */ uint8_t aid[PH_FRINFC_NDEFMAP_MIFARESTD_TOTALNO_BLK]; /* flag to write with offset begin */ uint8_t WrNdefFlag; /* flag to read with offset begin */ uint8_t ReadNdefFlag; /* flag to check with offset begin */ uint8_t ChkNdefFlag; /* To store the remaining size of the Mifare 1k or 4k card */ uint16_t remainingSize; /* To update the remaining size when writing to the Mifare 1k or 4k card */ uint8_t remSizeUpdFlag; /* The flag is to know that there is a different AID apart from NFC forum * sector AID */ uint16_t aidCompleteFlag; /* The flag is to know that there is a a NFC forum sector exists in the card */ uint16_t NFCforumSectFlag; /* The flag is to know that the particular sector is a proprietary NFC forum * sector */ uint16_t ProprforumSectFlag; /* The flag is set after reading the MAD sectors */ uint16_t ChkNdefCompleteFlag; /* Flag to store the current block */ uint8_t TempBlockNo; /* Completion routine index */ uint8_t CRIndex; /* Bytes remaining to write for one write procedure */ uint16_t WrLength; /* Flag to read after write */ uint8_t RdAfterWrFlag; /* Flag to say that poll is required before write ndef (authentication) */ uint8_t PollFlag; /* Flag is to know that this is first time the read has been called. This is required when read is called after write (especially for the card formatted with the 2nd configuration) */ uint8_t FirstReadFlag; /* Flag is to know that this is first time the write has been called. This is required when the card formatted with the 3rd configuration */ uint8_t FirstWriteFlag; /* Indicates the sector trailor id for which the convert to read only is currently in progress*/ uint8_t ReadOnlySectorIndex; /* Indicates the total number of sectors on the card */ uint8_t TotalNoSectors; /* Indicates the block number of the sector trailor on the card */ uint8_t SectorTrailerBlockNo; /* Secret key B to given by the application */ uint8_t UserScrtKeyB[6]; } phFriNfc_MifareStdCont_t; /* * NDEF TLV structure which details the different variables used for TLV. * */ typedef struct phFriNfc_NDEFTLVCont { /* Flag is to know that the TLV Type Found */ uint8_t NdefTLVFoundFlag; /* Sector number of the next/present available TLV */ uint8_t NdefTLVSector; /* Following two variables are used to store the T byte and the Block number in which the T is found in Tag */ /* Byte number of the next/present available TLV */ uint16_t NdefTLVByte; /* Block number of the next/present available TLV */ uint8_t NdefTLVBlock; /* Authentication flag for NDEF TLV Block */ uint8_t NdefTLVAuthFlag; /* if the 16th byte of the last read is type (T) of TLV and next read contains length (L) bytes of TLV. This flag is set when the type (T) of TLV is found in the last read */ uint8_t TcheckedinTLVFlag; /* if the 16th byte of the last read is Length (L) of TLV and next read contains length (L) bytes of TLV. This flag is set when the Length (L) of TLV is found in the last read */ uint8_t LcheckedinTLVFlag; /* This flag is set, if Terminator TLV is already written and next read contains value (V) bytes of TLV. This flag is set when the value (V) of TLV is found in the last read */ uint8_t SetTermTLVFlag; /* To know the number of Length (L) field is present in the next block */ uint8_t NoLbytesinTLV; /* The value of 3 bytes length(L) field in TLV. In 3 bytes length field, 2 bytes are in one block and other 1 byte is in the next block. To store the former block length field value, this variable is used */ uint16_t prevLenByteValue; /* The value of length(L) field in TLV. */ uint16_t BytesRemainLinTLV; /* Actual size to read and write. This will be always equal to the length (L) of TLV as there is only one NDEF TLV . */ uint16_t ActualSize; /* Flag is to write the length (L) field of the TLV */ uint8_t WrLenFlag; /* Flag is to write the length (L) field of the TLV */ uint16_t NULLTLVCount; /* Buffer to store 4 bytes of data which is written to a block */ uint8_t NdefTLVBuffer[PH_FRINFC_NDEFMAP_MFUL_4BYTES_BUF]; /* Buffer to store 4 bytes of data which is written to a next block */ uint8_t NdefTLVBuffer1[PH_FRINFC_NDEFMAP_MFUL_4BYTES_BUF]; } phFriNfc_NDEFTLVCont_t; /* * Lock Control TLV structure which stores the Position, Size and PageCntrl * details. */ typedef struct phFriNfc_LockCntrlTLVCont { /* Specifies the Byte Position of the lock cntrl tlv in the card memory*/ uint16_t ByteAddr; /* Specifies the Size of the lock area in terms of bits/bytes*/ uint16_t Size; /* Specifies the Bytes per Page*/ uint8_t BytesPerPage; /* Specifies the BytesLockedPerLockBit */ uint8_t BytesLockedPerLockBit; /* Specifies the index of Lock cntrl TLV*/ uint8_t LockTlvBuffIdx; /* Store the content of Lock cntrl TLV*/ uint8_t LockTlvBuff[8]; /* Specifies the Block number Lock cntrl TLV*/ uint16_t BlkNum; /* Specifies the Byte Number position of Lock cntrl TLV*/ uint16_t ByteNum; } phFriNfc_LockCntrlTLVCont_t; /* * Memory Control TLV structure which stores the Position, Size and PageCntrl * details of the reserved byte area. */ typedef struct phFriNfc_ResMemCntrlTLVCont { /* Specifies the Byte Position of the lock cntrl tlv in the card memory */ uint16_t ByteAddr; /* Specifies the Size of the lock area in terms of bits/bytes*/ uint16_t Size; /* Store the content of Memory cntrl TLV*/ uint8_t MemCntrlTlvBuff[8]; /* Specifies the Bytes per Page*/ uint8_t BytesPerPage; /* Specifies the index of Mem cntrl TLV*/ uint8_t MemTlvBuffIdx; /* Specifies the Block number Lock cntrl TLV*/ uint16_t BlkNum; /* Specifies the Byte Number position of Lock cntrl TLV*/ uint16_t ByteNum; } phFriNfc_ResMemCntrlTLVCont_t; /* * NFC NDEF Mapping Component Context Structure * * This structure is used to store the current context information of the * instance. * */ typedef struct phFriNfc_NdefMap { /* The state of the operation. */ uint8_t State; /* Completion Routine Context. */ phFriNfc_CplRt_t CompletionRoutine[PH_FRINFC_NDEFMAP_CR]; phNfc_sTransceiveInfo_t* pTransceiveInfo; /*Holds the completion routine informations of the Map Layer*/ phFriNfc_CplRt_t MapCompletionInfo; /* Pointer to the Remote Device Information */ phLibNfc_sRemoteDevInformation_t* psRemoteDevInfo; /*Holds the Command Type(read/write)*/ phNfc_uCmdList_t Cmd; /* Pointer to a temporary buffer. Could be used for read/write purposes */ uint8_t* ApduBuffer; /* Size allocated to the ApduBuffer. */ uint32_t ApduBufferSize; /* Index to the APDU Buffer. Used for internal calculations */ uint16_t ApduBuffIndex; /* Pointer to the user-provided Data Size to be written trough WrNdef * function. */ uint32_t* WrNdefPacketLength; /* Holds the length of the received data. */ uint16_t* SendRecvLength; /*Holds the ack of some initial commands*/ uint8_t* SendRecvBuf; /* Holds the length of the data to be sent. */ uint16_t SendLength; /* Data Byte Count, which gives the offset to the integration.*/ uint16_t* DataCount; /* Holds the previous operation on the card*/ uint8_t PrevOperation; /* Holds the previous read mode*/ uint8_t bPrevReadMode; /* Holds the current read mode*/ uint8_t bCurrReadMode; /* Holds the previous state on the card*/ uint8_t PrevState; /* Stores the type of the smart card. */ uint8_t CardType; /* Stores the card state. */ uint8_t CardState; /* Stores the memory size of the card */ uint16_t CardMemSize; /*to Store the page offset on the mifare ul card*/ uint8_t Offset; /* specifies the desired operation to be performed*/ uint8_t DespOpFlag; /* Used to remember how many bytes were written, to update the dataCount and the BufferIndex */ uint16_t NumOfBytesWritten; /*used to remember number of L byte Remaining to be written */ uint16_t NumOfLReminWrite; /* Pointer Used to remember and return how many bytes were read, to update the PacketDataLength in case of Read operation */ /* Fix for 0000238: [gk] MAP: Number of bytes actually read out is not returned. */ uint32_t* NumOfBytesRead; /* Flag used to tell the process function that WRITE has requested for an internal READ.*/ uint8_t ReadingForWriteOperation; /* Buffer of 5 bytes used for the write operation for the Mifare UL card.*/ uint8_t BufferForWriteOp[5]; /* Temporary Receive Length to update the Receive Length when every time the Overlapped HAL is called. */ uint16_t TempReceiveLength; uint8_t NoOfDevices; /* stores operating mode type of the felica smart tag */ /* phHal_eOpModes_t OpModeType[2]; */ /* stores the type of the TLV found */ uint8_t TLVFoundFlag; /* stores the TLV structure related informations */ phFriNfc_NDEFTLVCont_t TLVStruct; /* stores the Lock Contrl Tlv related informations */ phFriNfc_LockCntrlTLVCont_t LockTlv; /* stores the Mem Contrl Tlv related informations */ phFriNfc_ResMemCntrlTLVCont_t MemTlv; /* Pointer to the Mifare Standard capability Container Structure. */ phFriNfc_MifareStdCont_t StdMifareContainer; } phFriNfc_NdefMap_t; /* * States of the FSM. */ #define PH_FRINFC_NDEFMAP_STATE_RESET_INIT 0 /* Initial state */ #define PH_FRINFC_NDEFMAP_STATE_CR_REGISTERED 1 /* CR has been registered */ #define PH_FRINFC_NDEFMAP_STATE_EOF_CARD 2 /* EOF card reached */ /* Following values specify the previous operation on the card. This value is assigned to the context structure variable: PrevOperation. */ /* Previous operation is check */ #define PH_FRINFC_NDEFMAP_CHECK_OPE 1 /* Previous operation is read */ #define PH_FRINFC_NDEFMAP_READ_OPE 2 /* Previous operation is write */ #define PH_FRINFC_NDEFMAP_WRITE_OPE 3 /* Previous operation is Actual size */ #define PH_FRINFC_NDEFMAP_GET_ACTSIZE_OPE 4 /* This flag is set when there is a need of write operation on the odd positions ex: 35,5 etc. This is used with MfUlOp Flag */ #define PH_FRINFC_MFUL_INTERNAL_READ 3 /* Read/Write control*/ #endif /* PHFRINFC_NDEFMAP_H */