1 /* 2 * Copyright (C) 2010 NXP Semiconductors 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 /* 18 * \file phFriNfc_MifareULMap.h 19 * \brief NFC Ndef Mapping For Mifare UL Card. 20 * 21 * Project: NFC-FRI 22 * 23 * $Date: Fri Aug 7 13:06:49 2009 $ 24 * $Author: ing07336 $ 25 * $Revision: 1.9 $ 26 * $Aliases: NFC_FRI1.1_WK934_PREP_1,NFC_FRI1.1_WK934_R31_1,NFC_FRI1.1_WK941_PREP1,NFC_FRI1.1_WK941_PREP2,NFC_FRI1.1_WK941_1,NFC_FRI1.1_WK943_R32_1,NFC_FRI1.1_WK949_PREP1,NFC_FRI1.1_WK943_R32_10,NFC_FRI1.1_WK943_R32_13,NFC_FRI1.1_WK943_R32_14,NFC_FRI1.1_WK1007_R33_1,NFC_FRI1.1_WK1007_R33_4,NFC_FRI1.1_WK1017_PREP1,NFC_FRI1.1_WK1017_R34_1,NFC_FRI1.1_WK1017_R34_2,NFC_FRI1.1_WK1023_R35_1 $ 27 * 28 */ 29 30 #ifndef PHFRINFC_MIFAREULMAP_H 31 #define PHFRINFC_MIFAREULMAP_H 32 33 #include <phFriNfc.h> 34 #if !defined PH_HAL4_ENABLE 35 #include <phHal4Nfc.h> 36 #endif 37 #include <phNfcStatus.h> 38 #include <phNfcTypes.h> 39 #include <phFriNfc_NdefMap.h> 40 41 #define PH_FRINFC_NDEFMAP_MIFAREMAP_FILEREVISION "$Revision: 1.9 $" 42 #define PH_FRINFC_NDEFMAP_MIFAREMAP_FILEALIASES "$Aliases: NFC_FRI1.1_WK934_PREP_1,NFC_FRI1.1_WK934_R31_1,NFC_FRI1.1_WK941_PREP1,NFC_FRI1.1_WK941_PREP2,NFC_FRI1.1_WK941_1,NFC_FRI1.1_WK943_R32_1,NFC_FRI1.1_WK949_PREP1,NFC_FRI1.1_WK943_R32_10,NFC_FRI1.1_WK943_R32_13,NFC_FRI1.1_WK943_R32_14,NFC_FRI1.1_WK1007_R33_1,NFC_FRI1.1_WK1007_R33_4,NFC_FRI1.1_WK1017_PREP1,NFC_FRI1.1_WK1017_R34_1,NFC_FRI1.1_WK1017_R34_2,NFC_FRI1.1_WK1023_R35_1 $" 43 44 45 /*! 46 * \name Mifare UL - states of the Finite State machine 47 * 48 */ 49 /*@{*/ 50 #define PH_FRINFC_NDEFMAP_MFUL_STATE_READ 1 /*!< Read State */ 51 #define PH_FRINFC_NDEFMAP_MFUL_STATE_WRITE 2 /*!< Write is going on*/ 52 #define PH_FRINFC_NDEFMAP_MFUL_STATE_CHK_NDEF_COMP 3 /*!< Check Ndef is going on */ 53 #define PH_FRINFC_NDEFMAP_MFUL_STATE_FND_NDEF_COMP 4 /*!< to find the NDEF TLV */ 54 #define PH_FRINFC_NDEFMAP_MFUL_STATE_TERM_TLV 5 /*!< to write the terminator TLV */ 55 #define PH_FRINFC_NDEFMAP_MFUL_STATE_WR_LEN_TLV 6 /*!< Write L value of TLV */ 56 #define PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_CHK_1 7 /*!< to send sector select command 1 */ 57 #define PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_CHK_2 8 /*!< to send sector select command 2 */ 58 #define PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_RESET_1 9 /*!< to send sector select command 1 for resetting sector 0 */ 59 #define PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_RESET_2 10 /*!< to send sector select command 2 for resetting sector 0 */ 60 #define PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_READ_1 11 /*!< to send sector select command 1 for resetting sector 0 */ 61 #define PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_READ_2 12 /*!< to send sector select command 2 for resetting sector 0 */ 62 #define PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_WRITE_1 13 /*!< to send sector select command 1 for resetting sector 0 */ 63 #define PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_WRITE_2 14 /*!< to send sector select command 2 for resetting sector 0 */ 64 #define PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_RW_1 15 /*!< to send sector select command 1 for resetting sector 0 */ 65 #define PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_RW_2 16 /*!< to send sector select command 2 for resetting sector 0 */ 66 #define PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_WRITE_INIT_1 17 /*!< to send sector select command 1 for resetting sector 0 */ 67 #define PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_WRITE_INIT_2 18 /*!< to send sector select command 2 for resetting sector 0 */ 68 69 70 /*@}*/ 71 72 /*! 73 * \name Mifare - constants for the capability container 74 * 75 */ 76 /*@{*/ 77 #define PH_FRINFC_NDEFMAP_MFUL_CC_BYTE0 0xE1 /*!< Capability container byte 0 = 0xE1 */ 78 #define PH_FRINFC_NDEFMAP_MFUL_CC_BYTE1 0x10 /*!< Capability container byte 1 = 0x10 */ 79 #define PH_FRINFC_NDEFMAP_MFUL_CC_BYTE2 0x06 /*!< Capability container byte 2 = 0x06 */ 80 #define PH_FRINFC_NDEFMAP_MFUL_CC_BYTE3_RW 0x00 /*!< Capability container byte 3 = 0x00 for 81 READ WRITE/INITIALISED card state*/ 82 #define PH_FRINFC_NDEFMAP_MFUL_CC_BYTE3_RO 0x0F /*!< Capability container byte 3 = 0x0F for 83 READ only card state*/ 84 /*@}*/ 85 86 /*! 87 * \name Mifare - constants for Flags 88 * 89 */ 90 /*@{*/ 91 #define PH_FRINFC_NDEFMAP_MFUL_FLAG0 0 /*!< Flag value = 0 */ 92 #define PH_FRINFC_NDEFMAP_MFUL_FLAG1 1 /*!< Flag value = 1 */ 93 /*@}*/ 94 95 /*! 96 * \name Mifare - constants for left shift 97 * 98 */ 99 /*@{*/ 100 #define PH_FRINFC_NDEFMAP_MFUL_SHIFT8 8 /*!< Flag value = 0 */ 101 /*@}*/ 102 103 /*! 104 * \name Mifare - TLV related constants 105 * 106 */ 107 /*@{*/ 108 #define PH_FRINFC_NDEFMAP_MFUL_NDEFTLV_T 0x03 /*!< Type value of TLV = 0x03 */ 109 #define PH_FRINFC_NDEFMAP_MFUL_NDEFTLV_L 0x00 /*!< Length value of TLV = 0x00 */ 110 #define PH_FRINFC_NDEFMAP_MFUL_NDEFTLV_LFF 0xFF /*!< Length value of TLV = 0xFF */ 111 #define PH_FRINFC_NDEFMAP_MFUL_TERMTLV 0xFE /*!< Terminator TLV value = 0xFE */ 112 #define PH_FRINFC_NDEFMAP_MFUL_NULLTLV 0x00 /*!< Null TLV value = 0x00 */ 113 #define PH_FRINFC_NDEFMAP_MFUL_LOCK_CTRL_TLV 0x01 /*!< Lock Control TLV value = 0x01 */ 114 #define PH_FRINFC_NDEFMAP_MFUL_MEM_CTRL_TLV 0x02 /*!< Memory Control TVL value = 0x02 */ 115 #define PH_FRINFC_NDEFMAP_MFUL_PROPRIETRY_TLV 0xFD /*!< Proprietry TVL value = 0xFD */ 116 117 118 /*@}*/ 119 120 121 /*! 122 * \name Mifare - Standard constants 123 * 124 */ 125 /*@{*/ 126 #define PH_FRINFC_NDEFMAP_MFUL_WR_A_BLK 0x05 /*!< Send Length for Write Ndef */ 127 #define PH_FRINFC_NDEFMAP_MFUL_MAX_SEND_BUF_TO_READ 0x01 /*!< Send Length for Read Ndef */ 128 #define PH_FRINFC_NDEFMAP_MFUL_CHECK_RESP 0x04 /*!< Value of the Sense Response for Mifare UL */ 129 #define PH_FRINFC_NDEFMAP_MFUL_OTP_OFFSET 3 /*!< To initialise the Offset */ 130 #define PH_FRINFC_NDEFMAP_MFUL_MUL8 8 /*!< Multiply by 8 */ 131 #define PH_FRINFC_NDEFMAP_MFUL_VAL0 0 /*!< Value 0 */ 132 #define PH_FRINFC_NDEFMAP_MFUL_VAL1 1 /*!< Value 1 */ 133 #define PH_FRINFC_NDEFMAP_MFUL_VAL2 2 /*!< Value 2 */ 134 #define PH_FRINFC_NDEFMAP_MFUL_VAL3 3 /*!< Value 3 */ 135 #define PH_FRINFC_NDEFMAP_MFUL_VAL4 4 /*!< Value 4 */ 136 #define PH_FRINFC_NDEFMAP_MFUL_VAL5 5 /*!< Value 5 */ 137 #define PH_FRINFC_NDEFMAP_MFUL_VAL64 64 /*!< Value 64 */ 138 #define PH_FRINFC_NDEFMAP_MFUL_BYTE0 0x00 /*!< Byte number 0 */ 139 #define PH_FRINFC_NDEFMAP_MFUL_BYTE1 0x01 /*!< Byte number 1 */ 140 #define PH_FRINFC_NDEFMAP_MFUL_BYTE2 0x02 /*!< Byte number 2 */ 141 #define PH_FRINFC_NDEFMAP_MFUL_BYTE3 0x03 /*!< Byte number 3 */ 142 #define PH_FRINFC_NDEFMAP_MFUL_BYTE4 0x04 /*!< Byte number 4 */ 143 #define PH_FRINFC_NDEFMAP_MFUL_BLOCK0 0x00 /*!< Block number 0 */ 144 #define PH_FRINFC_NDEFMAP_MFUL_BLOCK1 0x01 /*!< Block number 1 */ 145 #define PH_FRINFC_NDEFMAP_MFUL_BLOCK2 0x02 /*!< Block number 2 */ 146 #define PH_FRINFC_NDEFMAP_MFUL_BLOCK3 0x03 /*!< Block number 3 */ 147 #define PH_FRINFC_NDEFMAP_MFUL_BLOCK4 0x04 /*!< Block number 4 */ 148 #define PH_FRINFC_NDEFMAP_MFUL_BLOCK5 0x05 /*!< Block number 5 */ 149 150 #define PH_FRINFC_NDEFMAP_MFUL_RDBYTES_16 0x10 /*!< Read Bytes 16 */ 151 #define PH_FRINFC_NDEFMAP_STMFUL_MAX_CARD_SZ 48 /*!< For static maximum memory size is 48 bytes */ 152 #define PH_FRINFC_NDEFMAP_MFUL_WR_BUF_STR 0x04 /*!< To store the block of data written to the card */ 153 /*@}*/ 154 155 /*! 156 * \brief \copydoc page_reg Resets the component instance to the initial state and lets the component forget about 157 * the list of registered items. Moreover, the lower device is set. 158 * 159 * \param[in] NdefMap Pointer to a valid or uninitialised instance of \ref phFriNfc_NdefMap_t . 160 * 161 * \note This function has to be called at the beginning, after creating an instance of 162 * \ref phFriNfc_NdefMap_t . Use this function to reset the instance and/or switch 163 * to a different underlying device (different NFC device or device mode, or different 164 * Remote Device). 165 */ 166 NFCSTATUS phFriNfc_MifareUL_H_Reset( phFriNfc_NdefMap_t *NdefMap); 167 168 /*! 169 * \brief \copydoc page_ovr Initiates Reading of NDEF information from the Remote Device. 170 * 171 * The function initiates the reading of NDEF information from a Remote Device. 172 * It performs a reset of the state and starts the action (state machine). 173 * A periodic call of the \ref phFriNfc_NdefMap_Process has to be done once the action 174 * has been triggered. 175 * 176 * \param[in] NdefMap Pointer to a valid instance of the \ref phFriNfc_NdefMap_t structure describing 177 * the component context. 178 * 179 * \param[in] PacketData Pointer to a location that receives the NDEF Packet. 180 * 181 * \param[in,out] PacketDataLength Pointer to a variable receiving the length of the NDEF packet. 182 * 183 * \param[in] Offset Indicates whether the read operation shall start from the begining of the 184 * file/card storage \b or continue from the last offset. The last Offset set is stored 185 * within a context variable (must not be modified by the integration). 186 * If the caller sets the value to \ref PH_FRINFC_NDEFMAP_SEEK_CUR, the component shall 187 * start reading from the last offset set (continue where it has stopped before). 188 * If set to \ref PH_FRINFC_NDEFMAP_SEEK_BEGIN, the component shall start reading 189 * from the begining of the card (restarted) 190 * 191 * \retval NFCSTATUS_PENDING The action has been successfully triggered. 192 * \retval NFCSTATUS_INVALID_DEVICE_REQUEST If Previous Operation is Write Ndef and Offset 193 * is Current then this error is displayed. 194 * \retval NFCSTATUS_EOF_NDEF_CONTAINER_REACHED No Space in the File to read. 195 * \retval NFCSTATUS_MORE_INFORMATION There are more bytes to read in the card. 196 * \retval NFCSTATUS_SUCCESS Last Byte of the card read. 197 * \retval NFCSTATUS_INVALID_DEVICE The device has not been opened or has been disconnected 198 * meanwhile. 199 * \retval NFCSTATUS_CMD_ABORTED The caller/driver has aborted the request. 200 * \retval NFCSTATUS_BUFFER_TOO_SMALL The buffer provided by the caller is too small. 201 * \retval NFCSTATUS_RF_TIMEOUT No data has been received within the TIMEOUT period. 202 * 203 */ 204 205 NFCSTATUS phFriNfc_MifareUL_RdNdef( phFriNfc_NdefMap_t *NdefMap, 206 uint8_t *PacketData, 207 uint32_t *PacketDataLength, 208 uint8_t Offset); 209 210 /*! 211 * \brief \copydoc page_ovr Initiates Writing of NDEF information to the Remote Device. 212 * 213 * The function initiates the writing of NDEF information to a Remote Device. 214 * It performs a reset of the state and starts the action (state machine). 215 * A periodic call of the \ref phFriNfc_NdefMap_Process has to be done once the action 216 * has been triggered. 217 * 218 * \param[in] NdefMap Pointer to a valid instance of the \ref phFriNfc_NdefMap_t structure describing 219 * the component context. 220 * 221 * \param[in] PacketData Pointer to a location that holds the prepared NDEF Packet. 222 * 223 * \param[in,out] PacketDataLength Variable specifying the length of the prepared NDEF packet. 224 * 225 * \param[in] Offset Indicates whether the write operation shall start from the begining of the 226 * file/card storage \b or continue from the last offset. The last Offset set is stored 227 * within a context variable (must not be modified by the integration). 228 * If the caller sets the value to \ref PH_FRINFC_NDEFMAP_SEEK_CUR, the component shall 229 * start writing from the last offset set (continue where it has stopped before). 230 * If set to \ref PH_FRINFC_NDEFMAP_SEEK_BEGIN, the component shall start writing 231 * from the begining of the card (restarted) 232 * 233 * \retval NFCSTATUS_PENDING The action has been successfully triggered. 234 * \retval NFCSTATUS_INVALID_DEVICE_REQUEST If Previous Operation is Write Ndef and Offset 235 * is Current then this error is displayed. 236 * \retval NFCSTATUS_EOF_NDEF_CONTAINER_REACHED Last byte is written to the card after this 237 * no further writing is possible. 238 * \retval NFCSTATUS_SUCCESS Buffer provided by the user is completely written 239 * into the card. 240 * \retval NFCSTATUS_INVALID_DEVICE The device has not been opened or has been disconnected 241 * meanwhile. 242 * \retval NFCSTATUS_CMD_ABORTED The caller/driver has aborted the request. 243 * \retval NFCSTATUS_BUFFER_TOO_SMALL The buffer provided by the caller is too small. 244 * \retval NFCSTATUS_RF_TIMEOUT No data has been received within the TIMEOUT period. 245 * 246 */ 247 248 NFCSTATUS phFriNfc_MifareUL_WrNdef( phFriNfc_NdefMap_t *NdefMap, 249 uint8_t *PacketData, 250 uint32_t *PacketDataLength, 251 uint8_t Offset); 252 253 /*! 254 * \brief \copydoc page_ovr Check whether a particulat Remote Device is NDEF compliant. 255 * 256 * The function checks whether the peer device is NDEF compliant. 257 * 258 * \param[in] NdefMap Pointer to a valid instance of the \ref phFriNfc_NdefMap_t structure describing 259 * the component context. 260 * 261 * \retval NFCSTATUS_PENDING The action has been successfully triggered. 262 * \retval NFCSTATUS_INVALID_PARAMETER At least one parameter of the function is invalid. 263 * \retval NFCSTATUS_INVALID_DEVICE The device has not been opened or has been disconnected 264 * meanwhile. 265 * \retval NFCSTATUS_CMD_ABORTED The caller/driver has aborted the request. 266 * \retval NFCSTATUS_BUFFER_TOO_SMALL The buffer provided by the caller is too small. 267 * \retval NFCSTATUS_RF_TIMEOUT No data has been received within the TIMEOUT period. 268 * 269 */ 270 271 NFCSTATUS phFriNfc_MifareUL_ChkNdef( phFriNfc_NdefMap_t *NdefMap); 272 273 /*! 274 * \brief \copydoc page_cb Completion Routine, Processing function, needed to avoid long blocking. 275 * 276 * The function call scheme is according to \ref grp_interact. No State reset is performed during operation. 277 * 278 * \copydoc pphFriNfc_Cr_t 279 * 280 * \note The lower (Overlapped HAL) layer must register a pointer to this function as a Completion 281 * Routine in order to be able to notify the component that an I/O has finished and data are 282 * ready to be processed. 283 * 284 */ 285 286 void phFriNfc_MifareUL_Process( void *Context, 287 NFCSTATUS Status); 288 289 290 #endif /* PHFRINFC_MIFAREULMAP_H */ 291