blob: 0432ab5eb8797bdf3c301df5e80dc574cc9b133a [file] [log] [blame]
Nick Pelly5d9927b2010-09-23 12:47:58 -07001/*
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_Desfire.h
19 * \brief NFC Ndef Mapping For Desfire Smart Card.
20 *
21 * Project: NFC-FRI
22 *
Jan Brands794aa722010-11-30 23:23:23 +010023 * $Date: Tue Jul 27 08:58:21 2010 $
24 * $Author: ing02260 $
25 * $Revision: 1.5 $
26 * $Aliases: $
Nick Pelly5d9927b2010-09-23 12:47:58 -070027 *
28 */
29
30#ifndef PHFRINFC_DESFIREMAP_H
31#define PHFRINFC_DESFIREMAP_H
32
33#include <phFriNfc.h>
Jan Brands794aa722010-11-30 23:23:23 +010034#ifdef PH_HAL4_ENABLE
Nick Pelly5d9927b2010-09-23 12:47:58 -070035#include <phHal4Nfc.h>
Jan Brands794aa722010-11-30 23:23:23 +010036#else
37#include <phHalNfc.h>
Nick Pelly5d9927b2010-09-23 12:47:58 -070038#endif
39#include <phNfcTypes.h>
40#include <phNfcStatus.h>
41#include <phFriNfc_NdefMap.h>
42
43
44
45/*!
46 * \name Desfire - Standard constants
47 *
48 */
49/*@{*/
50#define PH_FRINFC_NDEFMAP_DESF_READ_OP 2 /*!< Desfire Operation Flag is Read */
51#define PH_FRINFC_NDEFMAP_DESF_WRITE_OP 3 /*!< Desfire Operation Flag is Write */
52#define PH_FRINFC_NDEFMAP_DESF_NDEF_CHK_OP 4 /*!< Desfire Operation Flag is Check Ndef */
53#define PH_FRINFC_NDEFMAP_DESF_GET_LEN_OP 5
54#define PH_FRINFC_NDEFMAP_DESF_SET_LEN_OP 6
Jan Brands794aa722010-11-30 23:23:23 +010055#define PH_FRINFC_NDEFMAP_DESF_RESP_OFFSET 2 /*!< Two Status Flag at the end of the
Nick Pelly5d9927b2010-09-23 12:47:58 -070056 Receive buffer*/
57#define PH_FRINFC_NDEFMAP_DESF_CAPDU_SMARTTAG_PKT_SIZE 12 /*!< Send Length for Smart Tag function*/
58#define PH_FRINFC_NDEFMAP_DESF_CAPDU_SELECT_FILE_PKT_SIZE 7 /*!< Send Length for Select File function */
59#define PH_FRINFC_NDEFMAP_DESF_CAPDU_READ_BIN_PKT_SIZE 5 /*!< Send Length for Reading a Packet */
60
61/*!
62 * \name NDEF Mapping - states of the Finite State machine
63 *
64 */
65/*@{*/
Jan Brands794aa722010-11-30 23:23:23 +010066#ifdef DESFIRE_EV1
67 #define PH_FRINFC_NDEFMAP_DESF_STATE_SELECT_SMART_TAG_EV1 4 /*!< Selection of Smart Tag is going on for Desfire EV1 */
68#endif /* #ifdef DESFIRE_EV1 */
Nick Pelly5d9927b2010-09-23 12:47:58 -070069#define PH_FRINFC_NDEFMAP_DESF_STATE_SELECT_SMART_TAG 5 /*!< Selection of Smart Tag is going on */
Jan Brands794aa722010-11-30 23:23:23 +010070#define PH_FRINFC_NDEFMAP_DESF_STATE_SELECT_FILE 6 /*!< Selecting a file to read/write */
Nick Pelly5d9927b2010-09-23 12:47:58 -070071#define PH_FRINFC_NDEFMAP_DESF_STATE_READ_CAP_CONT 7 /*!< Reading a capability container */
72#define PH_FRINFC_NDEFMAP_DESF_STATE_READ_BIN 8 /*!< Reading from the card */
73#define PH_FRINFC_NDEFMAP_DESF_STATE_UPDATE_BIN_BEGIN 60 /*!< Writing to the card */
74#define PH_FRINFC_NDEFMAP_DESF_STATE_UPDATE_BIN_END 61 /*!< Writing to the card */
75
76#define PH_FRINFC_NDEFMAP_DESF_STATE_CHK_NDEF 10 /*!< Check Ndef is in progress */
77#define PH_FRINFC_NDEFMAP_DESF_TLV_INDEX 7 /*!< Specifies the index of TLV Structure */
78#define PH_FRINFC_NDEFMAP_DESF_NDEF_CNTRL_TLV 0x04 /*!< Specifies the NDEF File Cntrl TLV */
79#define PH_FRINFC_NDEFMAP_DESF_PROP_CNTRL_TLV 0x05 /*!< Specifies the Propreitary File Cntrl TLV */
80
81/* Following Constants are used to navigate the Capability Container(CC)*/
82
83/*!< Following two indexes represents the CCLEN in CC*/
Jan Brands794aa722010-11-30 23:23:23 +010084#define PH_FRINFC_NDEFMAP_DESF_CCLEN_BYTE_FIRST_INDEX 0
85#define PH_FRINFC_NDEFMAP_DESF_CCLEN_BYTE_SECOND_INDEX 1
Nick Pelly5d9927b2010-09-23 12:47:58 -070086
87/*!< Specifies the index of the Mapping Version in CC */
Jan Brands794aa722010-11-30 23:23:23 +010088#define PH_FRINFC_NDEFMAP_DESF_VER_INDEX 2
Nick Pelly5d9927b2010-09-23 12:47:58 -070089
90/*!< Following two indexes represents the MLe bytes in CC*/
Jan Brands794aa722010-11-30 23:23:23 +010091#define PH_FRINFC_NDEFMAP_DESF_MLE_BYTE_FIRST_INDEX 3
92#define PH_FRINFC_NDEFMAP_DESF_MLE_BYTE_SECOND_INDEX 4
Nick Pelly5d9927b2010-09-23 12:47:58 -070093
94/*!< Following two indexes represents the MLc bytes in CC*/
Jan Brands794aa722010-11-30 23:23:23 +010095#define PH_FRINFC_NDEFMAP_DESF_MLC_BYTE_FIRST_INDEX 5
96#define PH_FRINFC_NDEFMAP_DESF_MLC_BYTE_SECOND_INDEX 6
Nick Pelly5d9927b2010-09-23 12:47:58 -070097
98/*!< Specifies the index of the TLV in CC */
Jan Brands794aa722010-11-30 23:23:23 +010099#define PH_FRINFC_NDEFMAP_DESF_TLV_INDEX 7
Nick Pelly5d9927b2010-09-23 12:47:58 -0700100
101/*!< Specifies the index of the TLV length in CC */
Jan Brands794aa722010-11-30 23:23:23 +0100102#define PH_FRINFC_NDEFMAP_DESF_TLV_LEN_INDEX 8
Nick Pelly5d9927b2010-09-23 12:47:58 -0700103
104/*!< Following two indexes represents the NDEF file identifier in CC*/
Jan Brands794aa722010-11-30 23:23:23 +0100105#define PH_FRINFC_NDEFMAP_DESF_NDEF_FILEID_BYTE_FIRST_INDEX 9
106#define PH_FRINFC_NDEFMAP_DESF_NDEF_FILEID_BYTE_SECOND_INDEX 10
Nick Pelly5d9927b2010-09-23 12:47:58 -0700107
108/*!< Following two indexes represents the NDEF file size in CC */
Jan Brands794aa722010-11-30 23:23:23 +0100109#define PH_FRINFC_NDEFMAP_DESF_NDEF_FILESZ_BYTE_FIRST_INDEX 11
110#define PH_FRINFC_NDEFMAP_DESF_NDEF_FILESZ_BYTE_SECOND_INDEX 12
Nick Pelly5d9927b2010-09-23 12:47:58 -0700111
112/*!< Specifies the index of the NDEF file READ access byte in CC */
Jan Brands794aa722010-11-30 23:23:23 +0100113#define PH_FRINFC_NDEFMAP_DESF_NDEF_FILERD_ACCESS_INDEX 13
Nick Pelly5d9927b2010-09-23 12:47:58 -0700114
115/*!< Specifies the index of the NDEF file WRITE access byte in CC */
Jan Brands794aa722010-11-30 23:23:23 +0100116#define PH_FRINFC_NDEFMAP_DESF_NDEF_FILEWR_ACCESS_INDEX 14
Nick Pelly5d9927b2010-09-23 12:47:58 -0700117
118
119/* Macros to find Maximum NDEF File Size*/
120#define PH_NFCFRI_NDEFMAP_DESF_NDEF_FILE_SIZE (NdefMap->DesfireCapContainer.NdefFileSize - 2)
121/* Specifies the size of the NLEN Bytes*/
Jan Brands794aa722010-11-30 23:23:23 +0100122#define PH_FRINFC_NDEFMAP_DESF_NLEN_SIZE_IN_BYTES 2
Nick Pelly5d9927b2010-09-23 12:47:58 -0700123
124
125/* Following constants are used with buffer index's*/
126#define PH_FRINFC_NDEFMAP_DESF_SW1_INDEX 0
127#define PH_FRINFC_NDEFMAP_DESF_SW2_INDEX 1
128
129
130/* Following constants are used for SW1 SW2 status codes*/
Jan Brands794aa722010-11-30 23:23:23 +0100131#define PH_FRINFC_NDEFMAP_DESF_RAPDU_SW1_BYTE 0x90
132#define PH_FRINFC_NDEFMAP_DESF_RAPDU_SW2_BYTE 0x00
Nick Pelly5d9927b2010-09-23 12:47:58 -0700133
134
135/* Following constatnts for shift bytes*/
136#define PH_FRINFC_NDEFMAP_DESF_SHL8 8
137
138
139#define PH_FRINFC_DESF_GET_VER_CMD 0x60
140#define PH_FRINFC_DESF_NATIVE_CLASS_BYTE 0x90
141#define PH_FRINFC_DESF_NATIVE_OFFSET_P1 0x00
Jan Brands794aa722010-11-30 23:23:23 +0100142#define PH_FRINFC_DESF_NATIVE_OFFSET_P2 0x00
Nick Pelly5d9927b2010-09-23 12:47:58 -0700143#define PH_FRINFC_DESF_NATIVE_GETVER_RESP 0xAF
144/*!
145* \name NDEF Mapping - states of the Finite State machine
146*
147*/
148/*@{*/
149
150typedef enum
151{
152 PH_FRINFC_DESF_STATE_GET_UID,
153 PH_FRINFC_DESF_STATE_GET_SW_VERSION,
154 PH_FRINFC_DESF_STATE_GET_HW_VERSION
155
156}phFriNfc_eMapDesfireState;
157
158typedef enum
159{
Jan Brands794aa722010-11-30 23:23:23 +0100160 PH_FRINFC_DESF_IDX_0,
Nick Pelly5d9927b2010-09-23 12:47:58 -0700161 PH_FRINFC_DESF_IDX_1,
162 PH_FRINFC_DESF_IDX_2,
163 PH_FRINFC_DESF_IDX_3,
164 PH_FRINFC_DESF_IDX_4,
165 PH_FRINFC_DESF_IDX_5
166
167}phFriNfc_eMapDesfireId;
168
169#define PH_FRINFC_DESF_ISO_NATIVE_WRAPPER() \
170 do \
171{\
172 NdefMap->SendRecvBuf[PH_FRINFC_DESF_IDX_0] = PH_FRINFC_DESF_NATIVE_CLASS_BYTE;\
173 NdefMap->SendRecvBuf[PH_FRINFC_DESF_IDX_2] = PH_FRINFC_DESF_NATIVE_OFFSET_P1;\
174 NdefMap->SendRecvBuf[PH_FRINFC_DESF_IDX_3] = PH_FRINFC_DESF_NATIVE_OFFSET_P2;\
175 switch(NdefMap->State)\
176{\
177 case PH_FRINFC_DESF_STATE_GET_HW_VERSION :\
178 case PH_FRINFC_DESF_STATE_GET_SW_VERSION :\
179 case PH_FRINFC_DESF_STATE_GET_UID :\
180 if ( NdefMap->State == PH_FRINFC_DESF_STATE_GET_HW_VERSION )\
181{\
182 NdefMap->SendRecvBuf[PH_FRINFC_DESF_IDX_1] = PH_FRINFC_DESF_GET_VER_CMD;\
183}\
184 else\
185{\
186 NdefMap->SendRecvBuf[PH_FRINFC_DESF_IDX_1] = 0xAF;\
187}\
188 NdefMap->SendRecvBuf[PH_FRINFC_DESF_IDX_4] = 0x00;\
189 NdefMap->SendLength = PH_FRINFC_DESF_IDX_5;\
190 break;\
191 default :\
192 break;\
193}\
194} while(0)\
195
196
197
198
199
200/*!
201 * \brief \copydoc page_ovr Initiates Reading of NDEF information from the Remote Device.
202 *
203 * The function initiates the reading of NDEF information from a Remote Device.
204 * It performs a reset of the state and starts the action (state machine).
205 * A periodic call of the \ref phFriNfc_NdefMap_Process has to be done once the action
206 * has been triggered.
207 *
208 * \param[in] NdefMap Pointer to a valid instance of the \ref phFriNfc_NdefMap_t structure describing
209 * the component context.
210 *
211 * \param[in] PacketData Pointer to a location that receives the NDEF Packet.
212 *
213 * \param[in,out] PacketDataLength Pointer to a variable receiving the length of the NDEF packet.
214 *
215 * \param[in] Offset Indicates whether the read operation shall start from the begining of the
216 * file/card storage \b or continue from the last offset. The last Offset set is stored
217 * within a context variable (must not be modified by the integration).
218 * If the caller sets the value to \ref PH_FRINFC_NDEFMAP_SEEK_CUR, the component shall
219 * start reading from the last offset set (continue where it has stopped before).
220 * If set to \ref PH_FRINFC_NDEFMAP_SEEK_BEGIN, the component shall start reading
Jan Brands794aa722010-11-30 23:23:23 +0100221 * from the begining of the card (restarted)
Nick Pelly5d9927b2010-09-23 12:47:58 -0700222 *
223 * \retval NFCSTATUS_PENDING The action has been successfully triggered.
224 * \retval NFCSTATUS_INVALID_DEVICE_REQUEST If Previous Operation is Write Ndef and Offset
225 * is Current then this error is displayed.
226 * \retval NFCSTATUS_EOF_NDEF_CONTAINER_REACHED No Space in the File to read.
227 * \retval NFCSTATUS_MORE_INFORMATION There are more bytes to read in the card.
228 * \retval NFCSTATUS_SUCCESS Last Byte of the card read.
229 * \retval NFCSTATUS_INVALID_DEVICE The device has not been opened or has been disconnected
230 * meanwhile.
231 * \retval NFCSTATUS_CMD_ABORTED The caller/driver has aborted the request.
232 * \retval NFCSTATUS_BUFFER_TOO_SMALL The buffer provided by the caller is too small.
233 * \retval NFCSTATUS_RF_TIMEOUT No data has been received within the TIMEOUT period.
234 *
235 */
236
237NFCSTATUS phFriNfc_Desfire_RdNdef( phFriNfc_NdefMap_t *NdefMap,
238 uint8_t *PacketData,
239 uint32_t *PacketDataLength,
240 uint8_t Offset);
241
242/*!
243 * \brief \copydoc page_ovr Initiates Writing of NDEF information to the Remote Device.
244 *
245 * The function initiates the writing of NDEF information to a Remote Device.
246 * It performs a reset of the state and starts the action (state machine).
247 * A periodic call of the \ref phFriNfc_NdefMap_Process has to be done once the action
248 * has been triggered.
249 *
250 * \param[in] NdefMap Pointer to a valid instance of the \ref phFriNfc_NdefMap_t structure describing
251 * the component context.
252 *
253 * \param[in] PacketData Pointer to a location that holds the prepared NDEF Packet.
254 *
255 * \param[in,out] PacketDataLength Variable specifying the length of the prepared NDEF packet.
256 *
257 * \param[in] Offset Indicates whether the write operation shall start from the begining of the
258 * file/card storage \b or continue from the last offset. The last Offset set is stored
259 * within a context variable (must not be modified by the integration).
260 * If the caller sets the value to \ref PH_FRINFC_NDEFMAP_SEEK_CUR, the component shall
261 * start writing from the last offset set (continue where it has stopped before).
262 * If set to \ref PH_FRINFC_NDEFMAP_SEEK_BEGIN, the component shall start writing
Jan Brands794aa722010-11-30 23:23:23 +0100263 * from the begining of the card (restarted)
Nick Pelly5d9927b2010-09-23 12:47:58 -0700264 *
265 * \retval NFCSTATUS_PENDING The action has been successfully triggered.
266 * \retval NFCSTATUS_INVALID_DEVICE_REQUEST If Previous Operation is Write Ndef and Offset
267 * is Current then this error is displayed.
268 * \retval NFCSTATUS_EOF_NDEF_CONTAINER_REACHED Last byte is written to the card after this
269 * no further writing is possible.
270 * \retval NFCSTATUS_SUCCESS Buffer provided by the user is completely written
271 * into the card.
272 * \retval NFCSTATUS_INVALID_DEVICE The device has not been opened or has been disconnected
273 * meanwhile.
274 * \retval NFCSTATUS_CMD_ABORTED The caller/driver has aborted the request.
275 * \retval NFCSTATUS_BUFFER_TOO_SMALL The buffer provided by the caller is too small.
276 * \retval NFCSTATUS_RF_TIMEOUT No data has been received within the TIMEOUT period.
277 *
278 */
279
280NFCSTATUS phFriNfc_Desfire_WrNdef( phFriNfc_NdefMap_t *NdefMap,
281 uint8_t *PacketData,
282 uint32_t *PacketDataLength,
283 uint8_t Offset);
284
285/*!
286 * \brief \copydoc page_ovr Check whether a particulat Remote Device is NDEF compliant.
287 *
288 * The function checks whether the peer device is NDEF compliant.
289 *
290 * \param[in] NdefMap Pointer to a valid instance of the \ref phFriNfc_NdefMap_t structure describing
291 * the component context.
292 *
293 * \retval NFCSTATUS_PENDING The action has been successfully triggered.
294 * \retval NFCSTATUS_INVALID_PARAMETER At least one parameter of the function is invalid.
295 * \retval NFCSTATUS_INVALID_DEVICE The device has not been opened or has been disconnected
296 * meanwhile.
297 * \retval NFCSTATUS_CMD_ABORTED The caller/driver has aborted the request.
298 * \retval NFCSTATUS_BUFFER_TOO_SMALL The buffer provided by the caller is too small.
299 * \retval NFCSTATUS_RF_TIMEOUT No data has been received within the TIMEOUT period.
300 *
301 */
302
303NFCSTATUS phFriNfc_Desfire_ChkNdef( phFriNfc_NdefMap_t *NdefMap);
304
305/*!
306 * \brief \copydoc page_cb Completion Routine, Processing function, needed to avoid long blocking.
307 *
308 * The function call scheme is according to \ref grp_interact. No State reset is performed during operation.
309 *
310 * \copydoc pphFriNfc_Cr_t
311 *
312 * \note The lower (Overlapped HAL) layer must register a pointer to this function as a Completion
313 * Routine in order to be able to notify the component that an I/O has finished and data are
314 * ready to be processed.
315 *
316 */
Jan Brands794aa722010-11-30 23:23:23 +0100317
Nick Pelly5d9927b2010-09-23 12:47:58 -0700318void phFriNfc_Desfire_Process( void *Context,
319 NFCSTATUS Status);
320
321
322#endif /* PHFRINFC_DESFIREMAP_H */
323