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_TopazMap.h
19  * \brief NFC Ndef Mapping For Mifare UL Card.
20  *
21  * Project: NFC-FRI
22  *
23  * $Date: Mon Dec 13 14:14:14 2010 $
24  * $Author: ing02260 $
25  * $Revision: 1.26 $
26  * $Aliases:  $
27  *
28  */
29 
30 #ifndef PHFRINFC_TOPAZMAP_H
31 #define PHFRINFC_TOPAZMAP_H
32 
33 #include <phFriNfc.h>
34 #ifdef PH_HAL4_ENABLE
35 #include <phHal4Nfc.h>
36 #else
37 #include <phHalNfc.h>
38 #endif
39 #include <phNfcStatus.h>
40 #include <phNfcTypes.h>
41 #include <phFriNfc_NdefMap.h>
42 
43 
44 #define PH_FRINFC_NDEFMAP_TOPAZMAP_FILEREVISION "$Revision: 1.26 $"
45 #define PH_FRINFC_NDEFMAP_TOPAZMAP_FILEALIASES  "$Aliases:  $"
46 
47 #if !defined (ES_HW_VER)
48 
49     #define ES_HW_VER                                       (32U)
50 
51 #endif /* #if !defined (ES_HW_VER) */
52 
53 #if (ES_HW_VER >= 32)
54 
55     /* This macro is used for the new 3.2 chip,as the JEWEL_READ and
56         JEWEL_WRITE for this chip is removed from the firmware. And for the
57         new FW, only JEWEL_RAW shall be used */
58     #define TOPAZ_RAW_SUPPORT
59 
60 #endif /* #if (ES_HW_VER == 32) */
61 
62 #define TOPAZ_UID_LENGTH_FOR_READ_WRITE                     0x04U
63 
64 /*!
65  * \name Topaz - states of the Finite State machine
66  *
67  */
68 /*@{*/
69 #define PH_FRINFC_TOPAZ_STATE_READ                        1   /*!< Read State */
70 #define PH_FRINFC_TOPAZ_STATE_WRITE                       2   /*!< Write is going on*/
71 #define PH_FRINFC_TOPAZ_STATE_CHK_NDEF                    3   /*!< Check Ndef is going on */
72 #define PH_FRINFC_TOPAZ_STATE_READID                      4   /*!< Read Id under progress */
73 #define PH_FRINFC_TOPAZ_STATE_READALL                     5   /*!< Read all under progress */
74 #define PH_FRINFC_TOPAZ_STATE_WRITE_NMN                   6   /*!< Write ndef magic number */
75 #define PH_FRINFC_TOPAZ_STATE_WRITE_L_TLV                 7   /*!< Write length field of TLV */
76 #define PH_FRINFC_TOPAZ_STATE_WR_CC_OR_TLV                8   /*!< Write CC or NDEF TLV */
77 
78 #ifdef FRINFC_READONLY_NDEF
79 
80     #define PH_FRINFC_TOPAZ_STATE_WR_CC_BYTE               9   /*!< READ ONLY state */
81     #define PH_FRINFC_TOPAZ_STATE_RD_LOCK0_BYTE           10  /*!< read Lock byte 0 state */
82     #define PH_FRINFC_TOPAZ_STATE_WR_LOCK0_BYTE           11  /*!< write Lock byte 0 state */
83     #define PH_FRINFC_TOPAZ_STATE_RD_LOCK1_BYTE           12  /*!< read Lock byte 1 state */
84     #define PH_FRINFC_TOPAZ_STATE_WR_LOCK1_BYTE           13  /*!< write Lock byte 1 state */
85 
86 #endif /* #ifdef FRINFC_READONLY_NDEF */
87 /*@}*/
88 
89 /*!
90  * \name Topaz - constants for the capability container
91  *
92  */
93 /*@{*/
94 #define PH_FRINFC_TOPAZ_CC_BYTE0                 0xE1 /*!< Capability container byte 0 = 0xE1 (NMN) */
95 #define PH_FRINFC_TOPAZ_CC_BYTE1                 0x10 /*!< Capability container byte 1 = 0x10 (version number) */
96 #define PH_FRINFC_TOPAZ_CC_BYTE2_MAX             0x0E /*!< Capability container byte 2 = 0x0E (Total free space
97                                                             in the card) */
98 #define PH_FRINFC_TOPAZ_CC_BYTE3_RW              0x00 /*!< Capability container byte 3 = 0x00 for
99                                                                   READ WRITE/INITIALISED card state */
100 #define PH_FRINFC_TOPAZ_CC_BYTE3_RO              0x0F /*!< Capability container byte 3 = 0x0F for
101                                                                   READ only card state */
102 
103 /*@}*/
104 
105 /*!
106  * \name Topaz - constants for Flags
107  *
108  */
109 /*@{*/
110 #define PH_FRINFC_TOPAZ_FLAG0                    0 /*!< Flag value = 0 */
111 #define PH_FRINFC_TOPAZ_FLAG1                    1 /*!< Flag value = 1 */
112 /*@}*/
113 
114 /*!
115  * \name Topaz - constants for left shift
116  *
117  */
118 /*@{*/
119 #define PH_FRINFC_TOPAZ_SHIFT3                   3 /*!< Shift by 3 bits */
120 /*@}*/
121 
122 /*!
123  * \name Topaz - internal state for write
124  *
125  */
126 /*@{*/
127 enum
128 {
129     PH_FRINFC_TOPAZ_WR_CC_BYTE0,                  /*!< CC Byte 0 = 0xE1 ndef magic number */
130     PH_FRINFC_TOPAZ_WR_CC_BYTE1,                  /*!< CC Byte 1 = 0x10 version number */
131     PH_FRINFC_TOPAZ_WR_CC_BYTE2,                  /*!< CC Byte 2 = 0x0C space in the data area */
132     PH_FRINFC_TOPAZ_WR_CC_BYTE3,                  /*!< CC Byte 3 = 0x00 read write access */
133     PH_FRINFC_TOPAZ_WR_T_OF_TLV,                  /*!< CC Byte 3 = 0x00 read write access */
134     PH_FRINFC_TOPAZ_WR_NMN_0,                     /*!< NMN = 0x00 */
135     PH_FRINFC_TOPAZ_WR_NMN_E1,                    /*!< NMN = 0xE1 */
136     PH_FRINFC_TOPAZ_WR_L_TLV_0,                   /*!< L field of TLV = 0 */
137     PH_FRINFC_TOPAZ_WR_L_TLV,                     /*!< To update the L field */
138     PH_FRINFC_TOPAZ_DYNAMIC_INIT_CHK_NDEF,    /*!< Internal state to represent the  parsing of card to locate Ndef TLV*/
139     PH_FRINFC_TOPAZ_DYNAMIC_INIT_FIND_NDEF_TLV
140 
141 
142 };
143 /*@}*/
144 
145 /*!
146  * \name Topaz - TLV related constants
147  *
148  */
149 /*@{*/
150 #define PH_FRINFC_TOPAZ_NULL_T                   0x00 /*!< Null TLV value = 0x00 */
151 #define PH_FRINFC_TOPAZ_LOCK_CTRL_T              0x01 /*!< Lock TLV = 0x01 */
152 #define PH_FRINFC_TOPAZ_MEM_CTRL_T               0x02 /*!< Memory TLV = 0x02 */
153 #define PH_FRINFC_TOPAZ_NDEF_T                   0x03 /*!< NDEF TLV = 0x03 */
154 #define PH_FRINFC_TOPAZ_PROP_T                   0xFD /*!< NDEF TLV = 0xFD */
155 #define PH_FRINFC_TOPAZ_TERM_T                   0xFE /*!< Terminator TLV value = 0xFE */
156 
157 #define PH_FRINFC_TOPAZ_NDEFTLV_L                0x00 /*!< Length value of TLV = 0x00 */
158 #define PH_FRINFC_TOPAZ_NDEFTLV_LFF              0xFF /*!< Length value of TLV = 0xFF */
159 #define PH_FRINFC_TOPAZ_MAX_CARD_SZ              0x60 /*!< Send Length for Read Ndef */
160 /*@}*/
161 
162 
163 /*!
164  * \name Topaz - Standard constants
165  *
166  */
167 /*@{*/
168 #define PH_FRINFC_TOPAZ_WR_A_BYTE                0x02 /*!< Send Length for Write Ndef */
169 #define PH_FRINFC_TOPAZ_SEND_BUF_READ            0x01 /*!< Send Length for Read Ndef */
170 #define PH_FRINFC_TOPAZ_HEADROM0_CHK             0xFF /*!< To check the header rom byte 0 */
171 #define PH_FRINFC_TOPAZ_HEADROM0_VAL             0x11 /*!< Header rom byte 0 value of static card */
172 #define PH_FRINFC_TOPAZ_READALL_RESP             0x7A /*!< Response of the read all command 122 bytes */
173 #define PH_FRINFC_TOPAZ_TOTAL_RWBYTES            0x60 /*!< Total number of raw Bytes that can
174                                                             be read or written to the card 96 bytes */
175 #define PH_FRINFC_TOPAZ_TOTAL_RWBYTES1           0x5A /*!< Total number of bytes that can be read
176                                                             or written 90 bytes */
177 #define PH_FRINFC_TOPAZ_BYTE3_MSB                0xF0 /*!< most significant nibble of byte 3(RWA) shall be
178                                                             0 */
179 #define PH_FRINFC_TOPAZ_LOCKBIT_BYTE114          0x01 /*!< lock bits value of byte 104 */
180 #define PH_FRINFC_TOPAZ_LOCKBIT_BYTE115_1        0x60 /*!< lock bits value of byte 105 */
181 #define PH_FRINFC_TOPAZ_LOCKBIT_BYTE115_2        0xE0 /*!< lock bits value of byte 105 */
182 #define PH_FRINFC_TOPAZ_LOCKBIT_BYTENO_0         114  /*!< lock bits byte number 104 */
183 #define PH_FRINFC_TOPAZ_LOCKBIT_BYTENO_1         115  /*!< lock bits byte number 105 */
184 #define PH_FRINFC_TOPAZ_CC_BYTENO_3              13   /*! Lock status according to CC bytes */
185 #define PH_FRINFC_TOPAZ_CC_READWRITE             0x00     /*! Lock status according to CC bytes */
186 #define PH_FRINFC_TOPAZ_CC_READONLY              0x0F     /*! Lock status according to CC bytes */
187 
188 /**Topaz static commands*/
189 #define PH_FRINFC_TOPAZ_CMD_READID               0x78U
190 #define PH_FRINFC_TOPAZ_CMD_READALL              0x00U
191 #define PH_FRINFC_TOPAZ_CMD_READ                 0x01U
192 #define PH_FRINFC_TOPAZ_CMD_WRITE_1E             0x53U
193 #define PH_FRINFC_TOPAZ_CMD_WRITE_1NE            0x1AU
194 
195 /**Topaz Dynamic commands*/
196 #define PH_FRINFC_TOPAZ_CMD_RSEG                 0x10U
197 #define PH_FRINFC_TOPAZ_CMD_READ8                0x02U
198 #define PH_FRINFC_TOPAZ_CMD_WRITE_E8             0x54U
199 #define PH_FRINFC_TOPAZ_CMD_WRITE_NE8            0x1BU
200 
201 enum
202 {
203     PH_FRINFC_TOPAZ_VAL0,
204     PH_FRINFC_TOPAZ_VAL1,
205     PH_FRINFC_TOPAZ_VAL2,
206     PH_FRINFC_TOPAZ_VAL3,
207     PH_FRINFC_TOPAZ_VAL4,
208     PH_FRINFC_TOPAZ_VAL5,
209     PH_FRINFC_TOPAZ_VAL6,
210     PH_FRINFC_TOPAZ_VAL7,
211     PH_FRINFC_TOPAZ_VAL8,
212     PH_FRINFC_TOPAZ_VAL9,
213     PH_FRINFC_TOPAZ_VAL10,
214     PH_FRINFC_TOPAZ_VAL11,
215     PH_FRINFC_TOPAZ_VAL12,
216     PH_FRINFC_TOPAZ_VAL13,
217     PH_FRINFC_TOPAZ_VAL14,
218     PH_FRINFC_TOPAZ_VAL15,
219     PH_FRINFC_TOPAZ_VAL16,
220     PH_FRINFC_TOPAZ_VAL17,
221     PH_FRINFC_TOPAZ_VAL18
222 };
223 
224 
225 /*@}*/
226 
227 /*!
228  * \brief \copydoc page_reg Resets the component instance to the initial state and lets the component forget about
229  *        the list of registered items. Moreover, the lower device is set.
230  *
231  * \param[in] NdefMap Pointer to a valid or uninitialised instance of \ref phFriNfc_NdefMap_t .
232  *
233  * \note  This function has to be called at the beginning, after creating an instance of
234  *        \ref phFriNfc_NdefMap_t . Use this function to reset the instance and/or switch
235  *        to a different underlying device (different NFC device or device mode, or different
236  *        Remote Device).
237  */
238 void phFriNfc_TopazMap_H_Reset(  phFriNfc_NdefMap_t        *NdefMap);
239 
240 #ifdef FRINFC_READONLY_NDEF
241 
242 /*!
243  * \ingroup grp_fri_smart_card_formatting
244  *
245  * \brief Initiates the conversion of the already NDEF formatted tag to READ ONLY.
246  *
247  * \copydoc page_ovr  The function initiates the conversion of the already NDEF formatted
248  * tag to READ ONLY.After this formation, remote card would be properly Ndef Compliant and READ ONLY.
249  * Depending upon the different card type, this function handles formatting procedure.
250  * This function supports only for the TOPAZ tags.
251  *
252  * \param[in] NdefMap Pointer to a valid instance of the \ref phFriNfc_NdefMap_t structure describing
253  *                    the component context.
254  * \retval  NFCSTATUS_PENDING   The action has been successfully triggered.
255  * \retval  Other values        An error has occurred.
256  *
257  */
258 NFCSTATUS
259 phFriNfc_TopazMap_ConvertToReadOnly (
260     phFriNfc_NdefMap_t          *NdefMap);
261 
262 #endif /* #ifdef FRINFC_READONLY_NDEF */
263 
264 /*!
265  * \brief \copydoc page_ovr Initiates Reading of NDEF information from the Remote Device.
266  *
267  * The function initiates the reading of NDEF information from a Remote Device.
268  * It performs a reset of the state and starts the action (state machine).
269  * A periodic call of the \ref phFriNfc_NdefMap_Process has to be done once the action
270  * has been triggered.
271  *
272  * \param[in] NdefMap Pointer to a valid instance of the \ref phFriNfc_NdefMap_t structure describing
273  *                    the component context.
274  *
275  * \param[in] PacketData  Pointer to a location that receives the NDEF Packet.
276  *
277  * \param[in,out] PacketDataLength Pointer to a variable receiving the length of the NDEF packet.
278  *
279  * \param[in] Offset Indicates whether the read operation shall start from the begining of the
280  *            file/card storage \b or continue from the last offset. The last Offset set is stored
281  *            within a context variable (must not be modified by the integration).
282  *            If the caller sets the value to \ref PH_FRINFC_NDEFMAP_SEEK_CUR, the component shall
283  *            start reading from the last offset set (continue where it has stopped before).
284  *            If set to \ref PH_FRINFC_NDEFMAP_SEEK_BEGIN, the component shall start reading
285  *            from the begining of the card (restarted)
286  *
287  * \retval NFCSTATUS_PENDING                       The action has been successfully triggered.
288  * \retval NFCSTATUS_INVALID_DEVICE_REQUEST        If Previous Operation is Write Ndef and Offset
289  *                                                 is Current then this error is displayed.
290  * \retval NFCSTATUS_EOF_NDEF_CONTAINER_REACHED         No Space in the File to read.
291  * \retval NFCSTATUS_MORE_INFORMATION              There are more bytes to read in the card.
292  * \retval NFCSTATUS_SUCCESS                       Last Byte of the card read.
293  * \retval NFCSTATUS_INVALID_DEVICE                The device has not been opened or has been disconnected
294  *                                                 meanwhile.
295  * \retval NFCSTATUS_CMD_ABORTED                   The caller/driver has aborted the request.
296  * \retval NFCSTATUS_BUFFER_TOO_SMALL              The buffer provided by the caller is too small.
297  * \retval NFCSTATUS_RF_TIMEOUT                    No data has been received within the TIMEOUT period.
298  *
299  */
300 
301 NFCSTATUS phFriNfc_TopazMap_RdNdef( phFriNfc_NdefMap_t  *NdefMap,
302                                     uint8_t             *PacketData,
303                                     uint32_t            *PacketDataLength,
304                                     uint8_t             Offset);
305 
306 
307 
308 /*!
309  * \brief \copydoc page_ovr Initiates Writing of NDEF information to the Remote Device.
310  *
311  * The function initiates the writing of NDEF information to a Remote Device.
312  * It performs a reset of the state and starts the action (state machine).
313  * A periodic call of the \ref phFriNfc_NdefMap_Process has to be done once the action
314  * has been triggered.
315  *
316  * \param[in] NdefMap Pointer to a valid instance of the \ref phFriNfc_NdefMap_t structure describing
317  *                    the component context.
318  *
319  * \param[in] PacketData  Pointer to a location that holds the prepared NDEF Packet.
320  *
321  * \param[in,out] PacketDataLength Variable specifying the length of the prepared NDEF packet.
322  *
323  * \param[in] Offset Indicates whether the write operation shall start from the begining of the
324  *            file/card storage \b or continue from the last offset. The last Offset set is stored
325  *            within a context variable (must not be modified by the integration).
326  *            If the caller sets the value to \ref PH_FRINFC_NDEFMAP_SEEK_CUR, the component shall
327  *            start writing from the last offset set (continue where it has stopped before).
328  *            If set to \ref PH_FRINFC_NDEFMAP_SEEK_BEGIN, the component shall start writing
329  *            from the begining of the card (restarted)
330  *
331  * \retval NFCSTATUS_PENDING                        The action has been successfully triggered.
332  * \retval NFCSTATUS_INVALID_DEVICE_REQUEST         If Previous Operation is Write Ndef and Offset
333  *                                                  is Current then this error is displayed.
334  * \retval NFCSTATUS_EOF_NDEF_CONTAINER_REACHED               Last byte is written to the card after this
335  *                                                  no further writing is possible.
336  * \retval NFCSTATUS_SUCCESS                        Buffer provided by the user is completely written
337  *                                                  into the card.
338  * \retval NFCSTATUS_INVALID_DEVICE                 The device has not been opened or has been disconnected
339  *                                                  meanwhile.
340  * \retval NFCSTATUS_CMD_ABORTED                    The caller/driver has aborted the request.
341  * \retval NFCSTATUS_BUFFER_TOO_SMALL               The buffer provided by the caller is too small.
342  * \retval NFCSTATUS_RF_TIMEOUT                     No data has been received within the TIMEOUT period.
343  *
344  */
345 
346 NFCSTATUS phFriNfc_TopazMap_WrNdef( phFriNfc_NdefMap_t  *NdefMap,
347                                     uint8_t             *PacketData,
348                                     uint32_t            *PacketDataLength,
349                                     uint8_t             Offset);
350 
351 /*!
352  * \brief \copydoc page_ovr Check whether a particulat Remote Device is NDEF compliant.
353  *
354  * The function checks whether the peer device is NDEF compliant.
355  *
356  * \param[in] NdefMap Pointer to a valid instance of the \ref phFriNfc_NdefMap_t structure describing
357  *                    the component context.
358  *
359  * \retval NFCSTATUS_PENDING               The action has been successfully triggered.
360  * \retval NFCSTATUS_INVALID_PARAMETER     At least one parameter of the function is invalid.
361  * \retval NFCSTATUS_INVALID_DEVICE         The device has not been opened or has been disconnected
362  *                                          meanwhile.
363  * \retval NFCSTATUS_CMD_ABORTED            The caller/driver has aborted the request.
364  * \retval NFCSTATUS_BUFFER_TOO_SMALL       The buffer provided by the caller is too small.
365  * \retval NFCSTATUS_RF_TIMEOUT             No data has been received within the TIMEOUT period.
366  *
367  */
368 
369 NFCSTATUS phFriNfc_TopazMap_ChkNdef(    phFriNfc_NdefMap_t  *NdefMap);
370 
371 extern NFCSTATUS phFriNfc_Tpz_H_ChkSpcVer( phFriNfc_NdefMap_t  *NdefMap,
372                                           uint8_t             VersionNo);
373 
374 
375 /*!
376  * \brief \copydoc page_cb Completion Routine, Processing function, needed to avoid long blocking.
377  *
378  * The function call scheme is according to \ref grp_interact. No State reset is performed during operation.
379  *
380  * \copydoc pphFriNfc_Cr_t
381  *
382  * \note The lower (Overlapped HAL) layer must register a pointer to this function as a Completion
383  *       Routine in order to be able to notify the component that an I/O has finished and data are
384  *       ready to be processed.
385  *
386  */
387 
388 void phFriNfc_TopazMap_Process( void        *Context,
389                                 NFCSTATUS   Status);
390 
391 
392 /*!
393  * \name TopazDynamicMap - Following section describes constans, functions, variables used in
394  *       Topaz Dyanmic card mapping. Ex : Topaz-512
395  *
396  */
397 /*@{*/
398 /*!
399  * \brief \copydoc Dynamic Card supported definitions.
400  * \note State Mechine Delcations.
401  */
402 
403 #define PH_FRINFC_TOPAZ_DYNAMIC_STATE_WRITE_COMPLETE            11  /*!< Write Operation Complete */
404 #define PH_FRINFC_TOPAZ_DYNAMIC_STATE_NXP_READ                  12
405 #define PH_FRINFC_TOPAZ_DYNAMIC_STATE_RD_CCBLK                  13
406 #define PH_FRINFC_TOPAZ_DYNAMIC_STATE_INIT_RD_CCBLK             14
407 #define PH_FRINFC_TOPAZ_DYNAMIC_STATE_INIT_WR                   15
408 #define PH_FRINFC_TOPAZ_DYNAMIC_STATE_WRITE_LEN                 16
409 #define PH_FRINFC_TOPAZ_DYNAMIC_STATE_FIND_NDEF_TLV             17
410 #define PH_FRINFC_TOPAZ_DYNAMI_FOUND_RESERV_AREA                18
411 #define PH_FRINFC_TOPAZ_DYNAMIC_NOT_FOUND_RESERV_AREA           19
412 #define PH_FRINFC_TOPAZ_DYNAMIC_PROCESS_CHK_NDEF                20
413 #define PH_FRINFC_TOPAZ_DYNAMIC_FIND_NDEF_TLV                   21
414 #define PH_FRINFC_TOPAZ_DYNAMIC_INIT_RD_NDEF                    22
415 #define PH_FRINFC_TOPAZ_DYNAMIC_STATE_WR_MEM_TLV                23
416 #define PH_FRINFC_TOPAZ_DYNAMIC_STATE_WR_LOCK_TLV               24
417 
418 /*!
419  * \brief \copydoc Dynamic Card : Capability Container bytes.
420  * \note State Mechine Delcations.
421  */
422 
423 #define PH_FRINFC_TOPAZ_DYNAMIC_CC_BYTE2_MMSIZE                 0x3F  /*!< Capability container byte 2 = 0x3F (Total free space
424                                                                         in the card) */
425 #define PH_FRINFC_TOPAZ_DYNAMIC_HEADROM0_VAL                    0x12  /*!< Header rom byte 0 value of dynamic card */
426 
427 #define PH_FRINFC_TOPAZ_DYNAMIC_TOTAL_RWBYTES                   0x1CC /*!< Total number of raw Bytes that can
428                                                                         be read or written to the card 460 bytes
429 																		460 = 512 - 6 bloks * 8(48)( this includes 2 bytes of null byte in 02 block)
430 																		- 4 bytes ( NDEF TLV )*/
431 #define PH_FRINFC_TOPAZ_DYNAMIC_MAX_CARD_SZ                     0x1E0 /*!< Card size */
432 #define PH_FRINFC_TOPAZ_DYNAMIC_MX_ONEBYTE_TLV_SIZE             0xFF  /*!< MAX size supported in one byte length TLV*/
433 #define PH_FRINFC_TOPAZ_DYNAMIC_MAX_DATA_SIZE_TO_WRITE          0xE6  /*!< MAX size supported by HAL if the data size > 255*/
434 
435 #define PH_FRINFC_TOPAZ_DYNAMIC_LOCKBYTE_0                      0x00 /*!< lock bits value of byte 104 */
436 #define PH_FRINFC_TOPAZ_DYNAMIC_LOCKBYTE_1                      0x00 /*!< lock bits value of byte 105 */
437 #define PH_FRINFC_TOPAZ_DYNAMIC_LOCKBYTE_2TO7                   0x00 /*!< lock bits value of byte 105 */
438 
439 #define PH_FRINFC_TOPAZ_DYNAMIC_LOCKBIT_BYTENO_0                112  /*!< lock bits byte number 104:Blk0-7 */
440 #define PH_FRINFC_TOPAZ_DYNAMIC_LOCKBIT_BYTENO_1                113  /*!< lock bits byte number 105:Blk08-F */
441 #define PH_FRINFC_TOPAZ_DYNAMIC_LOCKBIT_BYTENO_2                122  /*!< lock bits byte number 124:Blk10-17 */
442 #define PH_FRINFC_TOPAZ_DYNAMIC_LOCKBIT_BYTENO_3                123  /*!< lock bits byte number 125:Blk18-1F */
443 #define PH_FRINFC_TOPAZ_DYNAMIC_LOCKBIT_BYTENO_4                124  /*!< lock bits byte number 126:Blk20-27*/
444 #define PH_FRINFC_TOPAZ_DYNAMIC_LOCKBIT_BYTENO_5                125  /*!< lock bits byte number 127:Blk28-2F*/
445 #define PH_FRINFC_TOPAZ_DYNAMIC_LOCKBIT_BYTENO_6                126  /*!< lock bits byte number 128:Blk30-37*/
446 #define PH_FRINFC_TOPAZ_DYNAMIC_LOCKBIT_BYTENO_7                127  /*!< lock bits byte number 128:Blk30-37*/
447 #define PH_FRINFC_TOPAZ_DYNAMIC_CC_BYTENO_3                     11   /*! Lock status according to CC bytes */
448 
449 #define PH_FRINFC_TOPAZ_DYNAMIC_SEGMENT0                        0x00  /*!< 00000000 : 0th segment */
450 #define PH_FRINFC_TOPAZ_DYNAMIC_READSEG_RESP                    0x80
451 
452 #define PH_FRINFC_TOPAZ_DYNAMIC_MAX_BYTES_TO_READ_IN_ONEB_LTLV_FSEG             78
453 #define PH_FRINFC_TOPAZ_DYNAMIC_MAX_BYTES_TO_READ_IN_THREEB_LTLV_FSEG           76
454 
455 #define PH_FRINFC_TOPAZ_DYNAMIC_MAX_DATA_SIZE                                   PHHAL_MAX_DATASIZE
456 #define PH_FRINFC_TOPAZ_DYNAMIC_FSEG_BYTE_COUNT                                 104
457 #define PH_FRINFC_TOPAZ_DYNAMIC_SEG_BYTE_COUNT									128
458 #define PH_FRINFC_TOPAZ_DYNAMIC_CC_BLK_SIZE                                     18
459 #define PH_FRINFC_TOPAZ_DYNAMIC_CC_BLK_ADDRESS                                  8
460 #define PH_FRINFC_TOPAZ_DYNAMIC_UID_BLK_ADDRESS                                 0
461 #define PH_FRINFC_TOPAZ_DYNAMIC_LOCK_BYTE_SIZE                                  24
462 #define PH_FRINFC_TOPAZ_DYNAMIC_FSEG_TOT_DATA_BYTES                             120
463 
464 #define PH_FRINFC_TOPAZ_DYNAMIC_DATA_BYTE_COUNT_OF_FSEG_IN_ONEB_LTLV_FSEG       26
465 #define PH_FRINFC_TOPAZ_DYNAMIC_DATA_BYTE_COUNT_OF_FSEG_IN_THREEB_LTLV_FSEG     28
466 
467 
468 enum
469 {
470 
471     NULL_TLV,
472     LOCK_TLV,
473     MEM_TLV,
474     NDEF_TLV,
475     PROP_TLV,
476     TERM_TLV,
477     INVALID_TLV,
478     VALID_TLV,
479     TLV_NOT_FOUND
480 
481 };
482 
483 /*!
484  * \brief \copydoc page_ovr Initiates Reading of NDEF information from the Remote Device.
485  *
486  * The function initiates the reading of NDEF information from a Remote Device.
487  * It performs a reset of the state and starts the action (state machine).
488  * A periodic call of the \ref phFriNfc_NdefMap_Process has to be done once the action
489  * has been triggered.
490  *
491  * \param[in] NdefMap Pointer to a valid instance of the \ref phFriNfc_NdefMap_t structure describing
492  *                    the component context.
493  *
494  * \param[in] PacketData  Pointer to a location that receives the NDEF Packet.
495  *
496  * \param[in,out] PacketDataLength Pointer to a variable receiving the length of the NDEF packet.
497  *
498  * \param[in] Offset Indicates whether the read operation shall start from the begining of the
499  *            file/card storage \b or continue from the last offset. The last Offset set is stored
500  *            within a context variable (must not be modified by the integration).
501  *            If the caller sets the value to \ref PH_FRINFC_NDEFMAP_SEEK_CUR, the component shall
502  *            start reading from the last offset set (continue where it has stopped before).
503  *            If set to \ref PH_FRINFC_NDEFMAP_SEEK_BEGIN, the component shall start reading
504  *            from the begining of the card (restarted)
505  *
506  * \retval NFCSTATUS_PENDING                       The action has been successfully triggered.
507  * \retval NFCSTATUS_INVALID_DEVICE_REQUEST        If Previous Operation is Write Ndef and Offset
508  *                                                 is Current then this error is displayed.
509  * \retval NFCSTATUS_EOF_NDEF_CONTAINER_REACHED         No Space in the File to read.
510  * \retval NFCSTATUS_MORE_INFORMATION              There are more bytes to read in the card.
511  * \retval NFCSTATUS_SUCCESS                       Last Byte of the card read.
512  * \retval NFCSTATUS_INVALID_DEVICE                The device has not been opened or has been disconnected
513  *                                                 meanwhile.
514  * \retval NFCSTATUS_CMD_ABORTED                   The caller/driver has aborted the request.
515  * \retval NFCSTATUS_BUFFER_TOO_SMALL              The buffer provided by the caller is too small.
516  * \retval NFCSTATUS_RF_TIMEOUT                    No data has been received within the TIMEOUT period.
517  *
518  */
519 
520 NFCSTATUS phFriNfc_TopazDynamicMap_RdNdef( phFriNfc_NdefMap_t  *NdefMap,
521                                     uint8_t             *PacketData,
522                                     uint32_t            *PacketDataLength,
523                                     uint8_t             Offset);
524 
525 /*!
526  * \brief \copydoc page_ovr Initiates Writing of NDEF information to the Remote Device.
527  *
528  * The function initiates the writing of NDEF information to a Remote Device.
529  * It performs a reset of the state and starts the action (state machine).
530  * A periodic call of the \ref phFriNfc_NdefMap_Process has to be done once the action
531  * has been triggered.
532  *
533  * \param[in] NdefMap Pointer to a valid instance of the \ref phFriNfc_NdefMap_t structure describing
534  *                    the component context.
535  *
536  * \param[in] PacketData  Pointer to a location that holds the prepared NDEF Packet.
537  *
538  * \param[in,out] PacketDataLength Variable specifying the length of the prepared NDEF packet.
539  *
540  * \param[in] Offset Indicates whether the write operation shall start from the begining of the
541  *            file/card storage \b or continue from the last offset. The last Offset set is stored
542  *            within a context variable (must not be modified by the integration).
543  *            If the caller sets the value to \ref PH_FRINFC_NDEFMAP_SEEK_CUR, the component shall
544  *            start writing from the last offset set (continue where it has stopped before).
545  *            If set to \ref PH_FRINFC_NDEFMAP_SEEK_BEGIN, the component shall start writing
546  *            from the begining of the card (restarted)
547  *
548  * \retval NFCSTATUS_PENDING                        The action has been successfully triggered.
549  * \retval NFCSTATUS_INVALID_DEVICE_REQUEST         If Previous Operation is Write Ndef and Offset
550  *                                                  is Current then this error is displayed.
551  * \retval NFCSTATUS_EOF_NDEF_CONTAINER_REACHED               Last byte is written to the card after this
552  *                                                  no further writing is possible.
553  * \retval NFCSTATUS_SUCCESS                        Buffer provided by the user is completely written
554  *                                                  into the card.
555  * \retval NFCSTATUS_INVALID_DEVICE                 The device has not been opened or has been disconnected
556  *                                                  meanwhile.
557  * \retval NFCSTATUS_CMD_ABORTED                    The caller/driver has aborted the request.
558  * \retval NFCSTATUS_BUFFER_TOO_SMALL               The buffer provided by the caller is too small.
559  * \retval NFCSTATUS_RF_TIMEOUT                     No data has been received within the TIMEOUT period.
560  *
561  */
562 NFCSTATUS phFriNfc_TopazDynamicMap_WrNdef( phFriNfc_NdefMap_t  *NdefMap,
563                                     uint8_t             *PacketData,
564                                     uint32_t            *PacketDataLength,
565                                     uint8_t             Offset);
566 
567 /*!
568  * \brief \copydoc page_ovr Check whether a particulat Remote Device is NDEF compliant.
569  *
570  * The function checks whether the peer device is NDEF compliant.
571  *
572  * \param[in] NdefMap Pointer to a valid instance of the \ref phFriNfc_NdefMap_t structure describing
573  *                    the component context.
574  *
575  * \retval NFCSTATUS_PENDING               The action has been successfully triggered.
576  * \retval NFCSTATUS_INVALID_PARAMETER     At least one parameter of the function is invalid.
577  * \retval NFCSTATUS_INVALID_DEVICE         The device has not been opened or has been disconnected
578  *                                          meanwhile.
579  * \retval NFCSTATUS_CMD_ABORTED            The caller/driver has aborted the request.
580  * \retval NFCSTATUS_BUFFER_TOO_SMALL       The buffer provided by the caller is too small.
581  * \retval NFCSTATUS_RF_TIMEOUT             No data has been received within the TIMEOUT period.
582  *
583  */
584 NFCSTATUS phFriNfc_TopazDynamicMap_ChkNdef(    phFriNfc_NdefMap_t  *NdefMap);
585 
586 /*!
587  * \brief \copydoc page_cb Completion Routine, Processing function, needed to avoid long blocking.
588  *
589  * The function call scheme is according to \ref grp_interact. No State reset is performed during operation.
590  *
591  * \copydoc pphFriNfc_Cr_t
592  *
593  * \note The lower (Overlapped HAL) layer must register a pointer to this function as a Completion
594  *       Routine in order to be able to notify the component that an I/O has finished and data are
595  *       ready to be processed.
596  *
597  */
598 void phFriNfc_TopazDynamicMap_Process( void        *Context,
599                                 NFCSTATUS   Status);
600 
601 #ifdef FRINFC_READONLY_NDEF
602 /*!
603  * \brief \copydoc page_ovr Initiates Writing of NDEF information to the Remote Device.
604  *
605  * The function initiates the writing of NDEF information to a Remote Device.
606  * It performs a reset of the state and starts the action (state machine).
607  * A periodic call of the \ref phFriNfc_NdefMap_Process has to be done once the action
608  * has been triggered.
609  *
610  * \param[in] psNdefMap Pointer to a valid instance of the \ref phFriNfc_NdefMap_t structure describing
611  *                    the component context.
612  *
613  *
614  * \retval NFCSTATUS_PENDING                        The action has been successfully triggered.
615  * \retval NFCSTATUS_INVALID_DEVICE_REQUEST         If Previous Operation is Write Ndef and Offset
616  *                                                  is Current then this error is displayed.
617  * \retval NFCSTATUS_EOF_NDEF_CONTAINER_REACHED               Last byte is written to the card after this
618  *                                                  no further writing is possible.
619  * \retval NFCSTATUS_SUCCESS                        Buffer provided by the user is completely written
620  *                                                  into the card.
621  * \retval NFCSTATUS_INVALID_DEVICE                 The device has not been opened or has been disconnected
622  *                                                  meanwhile.
623  * \retval NFCSTATUS_CMD_ABORTED                    The caller/driver has aborted the request.
624  * \retval NFCSTATUS_BUFFER_TOO_SMALL               The buffer provided by the caller is too small.
625  * \retval NFCSTATUS_RF_TIMEOUT                     No data has been received within the TIMEOUT period.
626  *
627  */
628 NFCSTATUS
629 phFriNfc_TopazDynamicMap_ConvertToReadOnly (
630     phFriNfc_NdefMap_t     *psNdefMap);
631 #endif /* #ifdef FRINFC_READONLY_NDEF */
632 
633 
634 
635 #endif /* PHFRINFC_TOPAZMAP_H */
636 
637