| /* |
| * 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 <phNfcTypes.h> |
| #include <phNfcStatus.h> |
| #include <phFriNfc.h> |
| #include <phNfcTypes_Mapping.h> |
| |
| /* 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 */ |