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 /**
19  * \file phHal4Nfc.h
20  * \brief HAL Function Prototypes
21  *  The HAL4.0 API provides the user to have a interface for PN544(PN54x)/PN65N
22  *  NFC device.The API is a non-blocking API, asynchronous API. This means that
23  *  when ever an API function call results in waiting for a response from the
24  *  NFC device, the API function will return immediately with status 'PENDING'
25  *  and the actual result will be returned through specific callback functions
26  *  on receiving the response from the NFC device
27  *
28  * \note This is the representative header file of the HAL 4.0. The release
29  *       TAG or label is representing the release TAG (alias) of the entire
30  *       library.A mechanism (see documentation \ref hal_release_label near
31  *       the include guards of this file) is used to propagate the alias to
32  *       the main documentation page.
33  *
34  * Project: NFC-FRI-1.1 / HAL4.0
35  *
36  * $Date: Mon Jun 14 11:36:12 2010 $
37  * $Author: ing07385 $
38  * $Revision: 1.171 $
39  * $Aliases: NFC_FRI1.1_WK1023_R35_2,NFC_FRI1.1_WK1023_R35_1 $
40  *
41  */
42 
43 /** page hal_release_label HAL 4.0 Release Label
44  *  SDK_HAL_4.0 v 0.1 Draft
45  *  \note This is the TAG (label, alias) of the HAL. If the string is empty,the
46  *        current documentation has not been generated from an official release.
47  */
48 /*@{*/
49 #ifndef PHHAL4NFC_H
50 #define PHHAL4NFC_H
51 /*@}*/
52 
53 
54 /**
55  *  \name HAL4
56  *
57  * File: \ref phHal4Nfc.h
58  *\def  hal
59  */
60 
61 /*@{*/
62 #define PH_HAL4NFC_FILEREVISION "$Revision: 1.171 $" /**< \ingroup grp_file_attributes */
63 #define PH_HAL4NFC_FILEALIASES  "$Aliases: NFC_FRI1.1_WK1023_R35_2,NFC_FRI1.1_WK1023_R35_1 $"     /**< \ingroup grp_file_attributes */
64 /*@}*/
65 
66 /* -----------------Include files ---------------------------------------*/
67 #include <phNfcStatus.h>
68 #include <phNfcCompId.h>
69 #include <phNfcHalTypes.h>
70 #include <phNfcInterface.h>
71 #include <phNfcIoctlCode.h>
72 #include <phNfcConfig.h>
73 #include <phDbgTrace.h>
74 #ifdef ANDROID
75 #include <string.h>
76 #endif
77 
78 /*************************** Includes *******************************/
79 /** \defgroup grp_mw_external_hal_funcs NFC HAL4.0
80 *
81 *
82 *
83 */
84 /* ---------------- Macros ----------------------------------------------*/
85 
86 /** HAL Implementation Version Macros : Updated for every feature release of
87     HAL functionality */
88 #define PH_HAL4NFC_VERSION                              8
89 #define PH_HAL4NFC_REVISION                            21
90 #define PH_HAL4NFC_PATCH                                1
91 #define PH_HAL4NFC_BUILD                                0
92 
93 /** HAL Interface Version Macros : Updated for every external release of
94     HAL Interface */
95 #define PH_HAL4NFC_INTERFACE_VERSION                    0
96 #define PH_HAL4NFC_INTERFACE_REVISION                   6
97 #define PH_HAL4NFC_INTERFACE_PATCH                      0
98 #define PH_HAL4NFC_INTERAFECE_BUILD                     0
99 
100 /**Maximum length of receive buffer maintained by HAL*/
101 #define PH_HAL4NFC_MAX_RECEIVE_BUFFER                4096U
102 
103 /**Send length used for Transceive*/
104 #define PH_HAL4NFC_MAX_SEND_LEN                      PHHAL_MAX_DATASIZE
105 
106 /* -----------------Structures and Enumerations -------------------------*/
107 
108 /**
109  * \ingroup grp_mw_external_hal_funcs
110  *
111  * Structure containing information about discovered remote device, like
112  * the number of remote devices found, device specific information
113  * like type of device (eg: ISO14443-4A/4B, NFCIP1 target etc) and
114  * the type sepcific information (eg: UID, SAK etc). This structure is
115  * returned as part of the disocvery notification. For more info refer
116  * \ref phHal4Nfc_ConfigureDiscovery,
117  * \ref phHal4Nfc_RegisterNotification,
118  * \ref pphHal4Nfc_Notification_t,
119  * phHal4Nfc_NotificationInfo_t
120  *
121  *
122  */
123 typedef struct phHal4Nfc_DiscoveryInfo
124 {
125     uint32_t NumberOfDevices;/**< Number of devices found */
126     phHal_sRemoteDevInformation_t **ppRemoteDevInfo;/**< Pointer to Remote
127                                                          device info list*/
128 }phHal4Nfc_DiscoveryInfo_t;
129 
130 /**
131  * \ingroup grp_mw_external_hal_funcs
132  *
133  *  This is a union returned as part of the \ref pphHal4Nfc_Notification_t
134  *  callback. It contains either discovery information or other event
135  *  information for which the client has registered using the
136  *  \ref phHal4Nfc_RegisterNotification.
137  */
138 typedef union
139 {
140     phHal4Nfc_DiscoveryInfo_t *psDiscoveryInfo;
141     phHal_sEventInfo_t        *psEventInfo;
142 }phHal4Nfc_NotificationInfo_t;
143 
144 
145 
146 /**
147 * \ingroup grp_mw_external_hal_funcs
148 *
149 * Prototype for Generic callback type provided by upper layer. This is used
150 * to return the success or failure status an asynchronous API function which
151 * does not have any other additional information to be returned. Refer
152 * specific function for applicable status codes.
153 */
154 typedef void (*pphHal4Nfc_GenCallback_t)(
155                                         void  *context,
156                                         NFCSTATUS status
157                                         );
158 
159 /**
160 * \ingroup grp_mw_external_hal_funcs
161 *
162 * Disconnect callback type provided by upper layer to called on completion
163 * of disconnect call \ref phHal4Nfc_Disconnect.
164 *
165 */
166 typedef void (*pphHal4Nfc_DiscntCallback_t)(
167                         void  *context,
168                         phHal_sRemoteDevInformation_t *psDisconnectDevInfo,
169                         NFCSTATUS status
170                         );
171 
172 /**
173 * \ingroup grp_mw_external_hal_funcs
174 *
175 * Notification callback type used by HAL to provide a Discovery or
176 * Event notification to the upper layer.
177 *
178 */
179 typedef void (*pphHal4Nfc_Notification_t) (
180                                         void                         *context,
181                                         phHal_eNotificationType_t     type,
182                                         phHal4Nfc_NotificationInfo_t  info,
183                                         NFCSTATUS                    status
184                                         );
185 
186 
187 /**
188 * \ingroup grp_mw_external_hal_funcs
189 *
190 * Callback type used to provide a Connect Success or Failure indication to
191 * the upper layer as a result of \ref phHal4Nfc_Connect call used to connect
192 * to discovered remote device.
193 *
194 */
195 typedef void (*pphHal4Nfc_ConnectCallback_t)(
196                         void  *context,
197                         phHal_sRemoteDevInformation_t *psRemoteDevInfo,
198                         NFCSTATUS status
199                         );
200 
201 /**
202 * \ingroup grp_mw_external_hal_funcs
203 *
204 * This callback type is used to provide received data and it's size to the
205 * upper layer in \ref phNfc_sData_t format ,when the upper layer has performed
206 * a Transceive operation on a tag or when the Device acts as an Initiator in a
207 * P2P transaction.
208 *
209 *
210 */
211 typedef void (*pphHal4Nfc_TransceiveCallback_t) (
212                                 void *context,
213                                 phHal_sRemoteDevInformation_t *ConnectedDevice,
214                                 phNfc_sData_t  *pRecvdata,
215                                 NFCSTATUS status
216                                 );
217 
218 /**
219 * \ingroup grp_mw_external_hal_funcs
220 *
221 * This callback type is used to provide received data and it's size to the
222 * upper layer in  \ref phNfc_sData_t structure, when the upper layer when the
223 * Device acts as a Target in a P2P transaction.
224 *
225 *
226 */
227 typedef void (*pphHal4Nfc_ReceiveCallback_t) (
228                                     void                *context,
229                                     phNfc_sData_t       *pDataInfo,
230                                     NFCSTATUS            status
231                                     );
232 
233 /**
234 * \ingroup grp_mw_external_hal_funcs
235 *
236 * Callback type to inform success or failure of the Ioctl calls
237 * made by upper layer. It may optionally contain response data
238 * depending on the Ioctl command issued.
239 *
240 */
241 typedef void (*pphHal4Nfc_IoctlCallback_t) (void          *context,
242                                             phNfc_sData_t *pOutData,
243                                             NFCSTATUS      status );
244 
245 /**
246 * \ingroup grp_mw_external_hal_funcs
247 *\if hal
248 *   \sa \ref pphHal4Nfc_GenCallback_t
249 * \endif
250 *
251 */
252 
253 /** Same as general callback type, used to inform the completion of
254 * \ref phHal4Nfc_Send call done by when in NFCIP1 Target mode
255 */
256 typedef pphHal4Nfc_GenCallback_t pphHal4Nfc_SendCallback_t;
257 
258 /**
259 * \ingroup grp_mw_external_hal_funcs
260 *
261 * Enum type to distinguish between normal init and test mode init
262 * to be done as part of phHal4Nfc_Open
263 * In test mode init only minimal initialization of the NFC Device
264 * sufficient to run the self test is performed.
265 *
266 * \note Note: No functional features can be accessed when
267 * phHal4Nfc_Open is called with TestModeOn
268 * \ref phHal4Nfc_Open
269 *
270 */
271 typedef enum{
272     eInitDefault = 0x00,     /**<Complete initialization for normal
273                                  firmware operation*/
274     eInitTestModeOn,         /**<Limited Initialization used for running self
275                                 tests */
276     eInitCustom              /**<Reserved for Future Use */
277 } phHal4Nfc_InitType_t;
278 
279 /**
280 * \ingroup grp_mw_external_hal_funcs
281 *
282 * Type to select the type of notification registration
283 * for Tags, P2P and SecureElement and Host Card Emulation events
284 *
285 * \if hal
286 * \ref phHal4Nfc_RegisterNotification,phHal4Nfc_UnregisterNotification
287 * \endif
288 *
289 */
290 typedef enum{
291     eRegisterDefault = 0x00,    /**<For All other generic notifications
292                                      like Host Wakeup Notification */
293     eRegisterTagDiscovery,      /**<For Tag Discovery notification*/
294     eRegisterP2PDiscovery,      /**<For P2P Discovery notification*/
295     eRegisterSecureElement,    /**<For Secure Element notification*/
296     eRegisterHostCardEmulation /**<For notification related to Virtual
297                                     Card Emulation from host */
298 } phHal4Nfc_RegisterType_t;
299 
300 /**
301 * \ingroup grp_mw_external_hal_funcs
302 *
303 * Specifies the Remote Reader type,either initiator or ISO A/B or Felica
304 *
305 */
306 typedef struct phHal4Nfc_TransactInfo{
307     phHal_eRFDevType_t               remotePCDType;
308 }phHal4Nfc_TransactInfo_t;
309 
310 /*preliminary definitions end*/
311 
312 /* -----------------Exported Functions----------------------------------*/
313 /**
314  *  \if hal
315  *   \ingroup grp_hal_common
316  *  \else
317  *   \ingroup grp_mw_external_hal_funcs
318  *  \endif
319  *
320  *  This function initializes and establishes a link to the NFC Device. This is
321  *  a asynchronous call as it requires a series of setup calls with the NFC
322  *  device. The open is complete when the status response callback <em>
323  *   pOpenCallback </em> is called. It uses a Hardware Reference
324  *  \ref phHal_sHwReference, allocated by the upper layer and the p_board_driver
325  *  member initialized with the dal_instance (handle to the communication driver)
326  *  and other members initialized to zero or NULL.
327  *
328  * \note
329  *  - The device is in initialized state after the command has completed
330  *    successfully.
331  *
332  *
333  * \param[in,out] psHwReference Hardware Reference, pre-initialized by upper
334  *                layer. Members of this structure are made valid if
335  *                this function is successful. \n
336  *
337  * \param[in]     InitType Initialization type, used to differentiate between
338  *                test mode limited initialization and normal init.
339  *
340  * \param[in]     pOpenCallback The open callback function called by the HAL
341  *                when open (initialization) sequence is completed or if there
342  *                is an error in initialization. \n
343  *
344  * \param[in]     pContext Upper layer context which will be included in the
345  *                call back when request is completed. \n
346  *
347  * \retval NFCSTATUS_PENDING                 Open sequence has been successfully
348  *                                           started and result will be conveyed
349  *                                           via the pOpenCallback function.
350  * \retval NFCSTATUS_ALREADY_INITIALISED     Device initialization already in
351  *                                           progress.
352  * \retval NFCSTATUS_INVALID_PARAMETER       The parameter could not be properly
353  *                                           interpreted (structure uninitialized?).
354  * \retval NFCSTATUS_INSUFFICIENT_RESOURCES  Insufficient resources for
355  *                                           completing the request.
356  * \retval Others                            Errors related to the lower layers.
357  *
358  * \if hal
359  *  \sa \ref phHal4Nfc_Close,
360  * \endif
361  */
362 extern NFCSTATUS phHal4Nfc_Open(
363                                 phHal_sHwReference_t     *psHwReference,
364                                 phHal4Nfc_InitType_t      InitType,
365                                 pphHal4Nfc_GenCallback_t  pOpenCallback,
366                                 void                     *pContext
367                                 );
368 
369 
370 
371 /**
372  *  \if hal
373  *   \ingroup grp_hal_common
374  *  \else
375  *   \ingroup grp_mw_external_hal_funcs
376  *  \endif
377  *
378  *  Retrieves the capabilities of the device represented by the Hardware
379  *  Reference parameter.The HW, FW versions,model-id and other capability
380  *  information are located inside the pDevCapabilities parameter.
381  *
382  *  \param[in]  psHwReference     Hardware Reference, pre-initialized
383  *                                by upper layer. \n
384  *  \param[out] psDevCapabilities Pointer to the device capabilities structure
385  *                                where all relevant capabilities of the
386  *                                peripheral are stored. \n
387  *  \param[in]  pContext          Upper layer context which will be included in
388  *                                the call back when request is completed. \n
389  *
390  *  \retval NFCSTATUS_SUCCESS            Success and the psDevCapabilities is
391  *                                       updated with info.
392  *  \retval NFCSTATUS_INVALID_PARAMETER  One or more of the supplied parameters
393  *                                       could not be properly interpreted.
394  *  \retval NFCSTATUS_NOT_INITIALISED    Hal is not yet initialized.
395  *  \retval Others                       Errors related to the lower layers.
396  *
397  */
398 extern NFCSTATUS phHal4Nfc_GetDeviceCapabilities(
399                             phHal_sHwReference_t          *psHwReference,
400                             phHal_sDeviceCapabilities_t   *psDevCapabilities,
401                             void                          *pContext
402                             );
403 
404 
405 /**
406 *  \if hal
407 *   \ingroup grp_hal_common
408 *  \else
409 *   \ingroup grp_mw_external_hal_funcs
410 *  \endif
411 *
412 *  This function is used to Configure discovery wheel (and start if
413 *  required) based on the discovery configuration passed.
414 *  This includes enabling/disabling of the Reader phases (A, B, F),
415 *  NFCIP1 Initiator Speed and duration of the Emulation phase.
416 *  Additional optional parameters for each of the features i.e. Reader,
417 *  Emulation and Peer2Peer can be set using the
418 * \ref phHal4Nfc_ConfigParameters function
419 *
420 *  \param[in] psHwReference         Hardware Reference, pre-initialized by
421 *                                   upper layer. \n
422 *
423 *  \param[in] discoveryMode         Discovery Mode allows to choose between:
424 *                                   discovery configuration and start, stop
425 *                                   discovery and start discovery (with last
426 *                                   set configuration).
427 *                                   \ref phHal_eDiscoveryConfigMode_t
428 *   \note Note: Presently only NFC_DISCOVERY_CONFIG is supported, other values
429 *               are for future use. When in Reader/Initiator mode it mandatory
430 *               to call phHal4Nfc_Connect before any transaction can be performed
431 *               with the discovered device.
432 *
433 *  \param[in] discoveryCfg          Discovery configuration parameters.
434 *                                   Reader A/Reader B, Felica 212, Felica 424,
435 *                                   NFCIP1 Speed, Emulation Enable and Duration.
436 *
437 *
438 *  \param[in] pConfigCallback       This callback has to be called once Hal
439 *                                   completes the Configuration.
440 *
441 *  \param[in] pContext              Upper layer context to be returned in the
442 *                                   callback.
443 *
444 *  \retval NFCSTATUS_INVALID_PARAMETER         Wrong Parameter values.
445 *
446 *  \retval NFCSTATUS_NOT_INITIALISED           Hal is not initialized.
447 *
448 *  \retval NFCSTATUS_BUSY                      Cannot Configure Hal in
449 *                                              Current state.
450 *
451 *  \retval NFCSTATUS_INSUFFICIENT_RESOURCES    System Resources insufficient.
452 *
453 *  \retval NFCSTATUS_PENDING                   Configuration request accepted
454 *                                              and Configuration is in progress.
455 *
456 *  \retval NFCSTATUS_INVALID_PARAMETER         One or more of the supplied
457 *                                              parameters could not be properly
458 *                                              interpreted.
459 *  \retval Others                              Errors related to the lower layers
460 *
461 *   \note Note: When in Reader/Initiator mode it mandatory
462 *               to call phHal4Nfc_Connect before any transaction can be performed
463 *               with the discovered device. Even if the HAL client is not
464 *               interested in using any of the discovered phHal4Nfc_Connect and
465 *               phHal4Nfc_Disconnect should be called to restart the Discovery
466 *               wheel
467 *
468 *  \ref phHal4Nfc_Connect, phHal4Nfc_Disconnect
469 *
470 */
471 extern NFCSTATUS phHal4Nfc_ConfigureDiscovery(
472                         phHal_sHwReference_t          *psHwReference,
473                         phHal_eDiscoveryConfigMode_t   discoveryMode,
474                         phHal_sADD_Cfg_t               *discoveryCfg,
475                         pphHal4Nfc_GenCallback_t       pConfigCallback,
476                         void                           *pContext
477                         );
478 /**
479 *  \if hal
480 *   \ingroup grp_hal_common
481 *  \else
482 *   \ingroup grp_mw_external_hal_funcs
483 *  \endif
484 *
485 *  This function is used to set parameters of various features of the Hal,
486 *  based on the CfgType parameter. Presently following configuration
487 *  types are supported :-
488 *  \n 1. NFC_RF_READER_CONFIG (optional)-> Configure parameters for Reader A
489 *     or Reader B based on the configuration passed
490 *  \n 2. NFC_P2P_CONFIG (optional)-> Congfigure P2P parameters like
491 *     'General bytes', 'PSL Request' etc.
492 *  \n 3. NFC_EMULATION_CONFIG -> Enable and configure the emulation mode
493 *     parameters for either NFC Target, SmartMX, UICC and
494 *  \n   Card Emulation from Host (A, B, F)
495 *  All the configuration modes can be called independent of each other. The
496 *  setting will typically take effect for the next cycle of the relevant
497 *  phase of discovery. For optional configuration internal defaults will be
498 *  used in case the configuration is not set.
499 *  \note Card emulation from Host and Card Emulation from UICC are mutually
500 *  exclusive modes, i.e: only one can be enabled at a time. Using
501 *  this function to enable one of the emulation modes implicitly disables the
502 *  the other. eg. Setting Type A (or Type B) Emulation from Host disables
503 *  card emulation from UICC and vice versa.
504 *
505 *  \param[in] psHwReference         Hardware Reference, pre-initialized by
506 *                                   upper layer. \n
507 *
508 *  \param[in] eCfgType              Configuration type which can take one of the
509 *                                   enum values of \ref phHal_eConfigType_t. Each
510 *                                   config type is associated with its corresponding
511 *                                   information which is passed using the uCfg structure.
512 *
513 *
514 *  \param[in] uCfg                  Union containing configuration information,
515 *                                   which will be interpreted based on eCfgType
516 *                                   parameter.
517 *
518 *
519 *  \param[in] pConfigCallback       This callback has to be called once Hal
520 *                                   completes the Configuration.
521 *
522 *  \param[in] pContext              Upper layer context to be returned in the
523 *                                   callback.
524 *
525 *  \retval NFCSTATUS_INVALID_PARAMETER         Wrong Parameter values.
526 *
527 *  \retval NFCSTATUS_NOT_INITIALISED           Hal is not initialized.
528 *
529 *  \retval NFCSTATUS_BUSY                      Cannot Configure Hal in
530 *                                              Current state.
531 *
532 *  \retval NFCSTATUS_INSUFFICIENT_RESOURCES    System Resources insufficient.
533 *
534 *  \retval NFCSTATUS_PENDING                   Configuration request accepted
535 *                                              and Configuration is in progress.
536 *
537 *  \retval NFCSTATUS_INVALID_PARAMETER         One or more of the supplied
538 *                                              parameters could not be properly
539 *                                              interpreted.
540 *  \retval Others                              Errors related to the lower layers
541 */
542 
543 extern NFCSTATUS phHal4Nfc_ConfigParameters(
544                         phHal_sHwReference_t     *psHwReference,
545                         phHal_eConfigType_t       eCfgType,
546                         phHal_uConfig_t          *uCfg,
547                         pphHal4Nfc_GenCallback_t  pConfigCallback,
548                         void                     *pContext
549                         );
550 
551 /**
552  *  \if hal
553  *   \ingroup grp_hal_nfci
554  *  \else
555  *   \ingroup grp_mw_external_hal_funcs
556  *  \endif
557  *
558  *  This function is called to connect to a one (out of many if multiple
559  *  devices are discovered) already discovered Remote Device notified
560  *  through register notification. The  Remote Device Information structure is
561  *  already pre-initialized with data (e.g. from Discovery Notificaiton
562  *  Callback) A new session is started after the connect function returns
563  *  successfully. The session ends with a successful disconnect
564  *  (see  \ref phHal4Nfc_Disconnect).
565  *
566  *  \param[in]     psHwReference        Hardware Reference, pre-initialized by
567  *                                      upper layer. \n
568  *
569  *  \param[in,out] psRemoteDevInfo      Points to the Remote Device Information
570  *                                      structure. The members of it can be
571  *                                      re-used from a previous session.
572  *
573  *  \param[in]     pNotifyConnectCb     Upper layer callback to be called for
574  *                                      notifying Connect Success/Failure
575  *
576  *  \param[in]     pContext             Upper layer context to be returned in
577  *                                      pNotifyConnectCb.
578  *
579  *  \retval NFCSTATUS_PENDING                  Request initiated, result will
580  *                                             be informed through the callback.
581  *  \retval NFCSTATUS_INVALID_PARAMETER        One or more of the supplied
582  *                                             parameters could not be
583  *                                             properly interpreted.
584  *  \retval NFCSTATUS_FAILED                   More than one phHal4Nfc_Connect
585  *                                             is not allowed during a session
586  *                                             on the same remote device. The
587  *                                             session has to be closed before
588  *                                             (see\ref phHal4Nfc_Disconnect).
589  *  \retval NFCSTATUS_NOT_INITIALIZED          Hal is not initialized.
590  *  \retval NFCSTATUS_FEATURE_NOT_SUPPORTED    Reactivation is not supported for
591  *                                             NfcIp target and Jewel/Topaz
592  *                                             remote device types.
593  *  \retval NFCSTATUS_INVALID_REMOTE_DEVICE    The Remote Device Identifier is
594  *                                             not valid.
595  *  \retval Others                             Errors related to the lower layers.
596  *
597  *  \if hal
598  *   \sa \ref phHal4Nfc_Disconnect
599  *  \endif
600  */
601 extern NFCSTATUS phHal4Nfc_Connect(
602                             phHal_sHwReference_t          *psHwReference,
603                             phHal_sRemoteDevInformation_t *psRemoteDevInfo,
604                             pphHal4Nfc_ConnectCallback_t   pNotifyConnectCb,
605                             void                          *pContext
606                             );
607 
608 
609 /**
610  *  \if hal
611  *   \ingroup grp_hal_nfci
612  *  \else
613  *   \ingroup grp_mw_external_hal_funcs
614  *  \endif
615  *
616  *  The phHal4Nfc_Transceive function allows to send data to and receive data
617  *  from the Remote Device selected by the caller.It is also used by the
618  *  NFCIP1 Initiator while performing a transaction with the NFCIP1 target.
619  *  The caller has to provide the Remote Device Information structure and the
620  *  command in order to communicate with the selected remote device.For P2P
621  *  transactions the command type will not be used.
622  *
623  *
624  *  \note the RecvData should be valid until the pTrcvCallback has been called.
625  *
626  *
627  *  \param[in]      psHwReference       Hardware Reference, pre-initialized by
628  *                                      upper layer. \n
629  *
630  *  \param[in,out]  psTransceiveInfo    Information required by transceive is
631  *                                      concealed in this structure.It contains
632  *                                      the send,receive buffers and their
633  *                                      lengths.
634  *
635  *  \param[in]      psRemoteDevInfo     Points to the Remote Device Information
636  *                                      structure which identifies the selected
637  *                                      Remote Device.
638  *
639  *  \param[in]      pTrcvCallback       Callback function for returning the
640  *                                      received response or error.
641  *
642  *  \param[in]      pContext            Upper layer context to be returned in
643  *                                      the callback.
644  *
645  *  \retval NFCSTATUS_PENDING                Transceive initiated.pTrcvCallback
646  *                                           will return the response or error.
647  *  \retval NFCSTATUS_NOT_INITIALIZED        Hal is not initialized.
648  *  \retval NFCSTATUS_SUCCESS                This status is used when send data
649  *                                           length is zero and HAL contains
650  *                                           previously more bytes from previous
651  *                                           receive. \n
652  *  \retval NFCSTATUS_INVALID_PARAMETER      One or more of the supplied
653  *                                           parameters could not be properly
654  *                                           interpreted or are invalid.
655  *  \retval NFCSTATUS_INVALID_DEVICE         The device has not been opened or
656  *                                           has been disconnected meanwhile.
657  *  \retval NFCSTATUS_FEATURE_NOT_SUPPORTED  Transaction on this Device type is
658  *                                           not supported.
659  *  \retval NFCSTATUS_BUSY                   Previous transaction is not
660  *                                           completed.
661  *  \retval NFCSTATUS_INSUFFICIENT_RESOURCES System resources are insufficient
662  *                                           to complete the request at that
663  *                                           point in time.
664  *  \retval NFCSTATUS_MORE_INFORMATION       Received number of bytes is greater
665  *                                           than receive buffer provided by the
666  *                                           upper layer.Extra bytes will be
667  *                                           retained by Hal and returned on next
668  *                                           call to transceive.
669  *  \retval Others                           Errors related to the lower layers.
670  *
671  */
672 extern NFCSTATUS phHal4Nfc_Transceive(
673                             phHal_sHwReference_t            *psHwReference,
674                             phHal_sTransceiveInfo_t         *psTransceiveInfo,
675                             phHal_sRemoteDevInformation_t   *psRemoteDevInfo,
676                             pphHal4Nfc_TransceiveCallback_t  pTrcvCallback,
677                             void                            *pContext
678                             );
679 
680 
681 
682 
683 /**
684  *  \if hal
685  *   \ingroup grp_hal_nfci
686  *  \else
687  *   \ingroup grp_mw_external_hal_funcs
688  *  \endif
689  *
690  *  The function allows to disconnect from a specific Remote Device. This
691  *  function closes the session opened with \ref phHal4Nfc_Connect "Connect".It
692  *  is also used to switch from wired to virtual mode in case the discovered
693  *  device is SmartMX in wired mode. The status of discovery wheel after
694  *  disconnection is determined by the ReleaseType parameter.
695  *
696  *
697  *
698  *  \param[in]      psHwReference       Hardware Reference, pre-initialized by
699  *                                      upper layer. \n
700  *  \param[in,out]  psRemoteDevInfo     Points to the valid (connected) Remote
701  *                                      Device Information structure.
702  *
703  *  \param[in]      ReleaseType         Defines various modes of releasing an acquired
704  *                                      target or tag
705  *
706  *  \param[in]      pDscntCallback      Callback function to notify
707  *                                      disconnect success/error.
708  *
709  *  \param[in]      pContext            Upper layer context to be returned in
710  *                                      the callback.
711  *
712  *
713  *  \retval NFCSTATUS_PENDING                Disconnect initiated.pDscntCallback
714  *                                           will return the response or error.
715  *  \retval NFCSTATUS_INVALID_PARAMETER      One or more of the supplied
716  *                                           parameters could not be properly
717  *                                           interpreted.
718  *  \retval NFCSTATUS_INVALID_REMOTE_DEVICE  The device has not been opened
719  *                                           before or has already been closed.
720  *  \retval NFCSTATUS_NOT_INITIALIZED        Hal is not initialized.
721  *  \retval Others                           Errors related to the lower layers.
722  *
723  *  \if hal
724  *   \sa \ref phHal4Nfc_Connect
725  *  \endif
726  */
727 extern NFCSTATUS phHal4Nfc_Disconnect(
728                             phHal_sHwReference_t          *psHwReference,
729                             phHal_sRemoteDevInformation_t *psRemoteDevInfo,
730                             phHal_eReleaseType_t           ReleaseType,
731                             pphHal4Nfc_DiscntCallback_t    pDscntCallback,
732                             void                          *pContext
733                             );
734 
735 /**
736 *  \if hal
737 *   \ingroup grp_hal_common
738 *  \else
739 *   \ingroup grp_mw_external_hal_funcs
740 *  \endif
741 *
742 *  The function allows to do a one time check on whether the connected target
743 *  is still present in the field of the Reader. The call back returns the
744 *  result of the presence check sequence indicating whether it is still present
745 *  or moved out of the reader field.
746 *
747 *  \param[in]     psHwReference     Hardware Reference, pre-initialized by
748 *                                   upper layer. \n
749 *
750 *  \param[in]     pPresenceChkCb    Callback function called on completion of the
751 *                                   presence check sequence or in case an error
752 *                                   has occurred..
753 *
754 *  \param[in]     context          Upper layer context to be returned in the
755 *                                   callback.
756 *
757 *  \retval NFCSTATUS_PENDING           Call successfully issued to lower layer.
758 *                                      Status will be returned in pPresenceChkCb.
759 *
760 *  \retval NFCSTATUS_NOT_INITIALISED   The device has not been opened or has
761 *                                      been disconnected meanwhile.
762 *
763 *  \retval NFCSTATUS_BUSY              Previous presence check callback has not
764 *                                      been received
765 *
766 *  \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters
767 *                                      could not be properly interpreted.
768 *
769 *  \retval NFCSTATUS_RELEASED          P2P target has been released by Initiator.
770 *  \retval Others                      Errors related to the lower layers
771 *
772 */
773 extern NFCSTATUS phHal4Nfc_PresenceCheck(
774                                   phHal_sHwReference_t     *psHwReference,
775                                   pphHal4Nfc_GenCallback_t  pPresenceChkCb,
776                                   void                     *context
777                                   );
778 
779 
780 /**
781  *  \if hal
782  *   \ingroup grp_hal_common
783  *  \else
784  *   \ingroup grp_mw_external_hal_funcs
785  *  \endif
786  *
787  *  The I/O Control function allows the caller to use (vendor-) specific
788  *  functionality provided by the lower layer or by the hardware. Each feature
789  *  is accessible via a specific IOCTL Code and has to be documented by the
790  *  provider of the driver and the hardware.
791  *  See "IOCTL Codes" for the definition of a standard command set.\n
792  *
793  *
794  *  \param[in]      psHwReference       Hardware Reference, pre-initialized by
795  *                                      upper layer. \n
796  *  \param[in]      IoctlCode           Control code for the operation.
797  *                                      This value identifies the specific
798  *                                      operation to be performed and are defined
799  *                                      in  \ref phNfcIoctlCode.h
800  *
801  *  \param[in]      pInParam            Pointer to any input data structure
802  *                                      containing data which is interpreted
803  *                                      based on Ioctl code and the length of
804  *                                      the data.
805  *
806  *  \param[in]      pOutParam           Pointer to output data structure
807  *                                      containing data which is returned as a
808  *                                      result of the Ioctl operation and the
809  *                                      length of the data.
810  *
811  *  \param[in]      pIoctlCallback      callback function called in case an
812  *                                      error has occurred while performing
813  *                                      requested operation,or on successful
814  *                                      completion of the request
815  *
816  *  \param[in]      pContext            Upper layer context to be returned in
817  *                                      the callback.
818  *
819  *  \retval NFCSTATUS_SUCCESS           Success.
820  *  \retval NFCSTATUS_PENDING           Call issued to lower layer.Status will
821  *                                      be notified in pIoctlCallback.
822  *  \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters
823  *                                      could not be properly interpreted.
824  *  \retval NFCSTATUS_NOT_INITIALIZED   Hal is not initialized.
825  *  \retval Others                      Errors related to the lower layers.
826  *
827  */
828 extern NFCSTATUS phHal4Nfc_Ioctl(
829                                 phHal_sHwReference_t       *psHwReference,
830                                 uint32_t                    IoctlCode,
831                                 phNfc_sData_t              *pInParam,
832                                 phNfc_sData_t              *pOutParam,
833                                 pphHal4Nfc_IoctlCallback_t  pIoctlCallback,
834                                 void                       *pContext
835                                 );
836 
837 
838 
839 /**
840  *  \if hal
841  *   \ingroup grp_hal_common
842  *  \else
843  *   \ingroup grp_mw_external_hal_funcs
844  *  \endif
845  *
846  *  Closes the link to the NFC device. All configurations/setups
847  *  done until now are invalidated.To restart communication, phHal4Nfc_Open
848  *  needs to be called. The pClosecallback is called when all steps
849  *  in the close sequence are completed.
850  *
851  *
852  *  \param[in]     psHwReference        Hardware Reference, pre-initialized by
853  *                                      upper layer. \n
854  *
855  *  \param[in]     pCloseCallback       Callback function called on completion of
856  *                                      the close sequence or in case an error
857  *                                      has occurred..
858  *
859  *  \param[in]     pContext             Upper layer context to be returned
860  *                                      in the callback.
861  *
862  *  \retval NFCSTATUS_SUCCESS           Closing successful.
863  *  \retval NFCSTATUS_NOT_INITIALIZED   The device has not been opened or has
864  *                                      been disconnected meanwhile.
865  *  \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters
866  *                                      could not be properly interpreted.
867  *  \retval NFCSTATUS_BUSY              Configuration is in progress.Shutdown
868  *                                      is not allowed until configure complete.
869  *  \retval Others                      Errors related to the lower layers.
870  *
871  *  \if hal
872  *   \sa \ref phHal4Nfc_Open
873  *  \endif
874  */
875 extern NFCSTATUS phHal4Nfc_Close(
876                                 phHal_sHwReference_t     *psHwReference,
877                                 pphHal4Nfc_GenCallback_t  pCloseCallback,
878                                 void                     *pContext
879                                 );
880 
881 
882 /**
883  *  \if hal
884  *   \ingroup grp_hal_common
885  *  \else
886  *   \ingroup grp_mw_external_hal_funcs
887  *  \endif
888  *
889  *  Forcibly shutdown the HAl.This API makes a call to forcibly shutdown the
890  *  lower layer and frees all resources in use by Hal before shutting down.The
891  *  API always succeeds.It does not however reset the target.
892  *
893  *  \param[in]     psHwReference        Hardware Reference, pre-initialized by
894  *                                      upper layer. \n
895  *
896  *  \param[in]     pConfig              Reserved for future use.
897  *
898  *
899  */
900 extern void phHal4Nfc_Hal4Reset(
901                                 phHal_sHwReference_t *psHwReference,
902                                 void                 *pConfig
903                                 );
904 
905 
906 /**
907 *  \if hal
908 *   \ingroup grp_hal_common
909 *  \else
910 *   \ingroup grp_mw_external_hal_funcs
911 *  \endif
912 *
913 *  The function is used by the NFCIP1 Target to respond to packect received
914 *  from NFCIP1 initiator. pSendCallback()
915 *  is called , when all steps in the send sequence are completed.
916 *
917 *  \param[in]     psHwReference         Hardware Reference, pre-initialized by
918 *                                       upper layer. \n
919 *
920 *  \param[in]     psTransactInfo        information required for transferring
921 *                                       the data
922 *
923 *  \param[in]     sTransferData         Data and the length of the data to be
924 *                                       transferred
925 *
926 *  \param[in]     pSendCallback         Callback function called on completion
927 *                                       of the NfcIP sequence or in case an
928 *                                       error has occurred.
929 *
930 *  \param[in]     pContext              Upper layer context to be returned in
931 *                                       the callback.
932 *
933 *  \retval NFCSTATUS_PENDING            Send is in progress.
934 *  \retval NFCSTATUS_INVALID_DEVICE     The device has not been opened or has
935 *                                       been disconnected meanwhile.
936 *  \retval NFCSTATUS_INVALID_PARAMETER  One or more of the supplied parameters
937 *                                       could not be properly interpreted.
938 *  \retval NFCSTATUS_NOT_INITIALIZED    Hal is not initialized.
939 *  \retval Others                       Errors related to the lower layers.
940 *
941 *
942 */
943 extern
944 NFCSTATUS
945 phHal4Nfc_Send(
946                 phHal_sHwReference_t                    *psHwReference,
947                 phHal4Nfc_TransactInfo_t                *psTransactInfo,
948                 phNfc_sData_t                            sTransferData,
949                 pphHal4Nfc_SendCallback_t                pSendCallback,
950                 void                                    *pContext
951                 );
952 
953 /**
954 *  \if hal
955 *   \ingroup grp_hal_common
956 *  \else
957 *   \ingroup grp_mw_external_hal_funcs
958 *  \endif
959 *
960 *  This function is called by the NfcIP Peer to wait for receiving data from
961 *  the other peer.It is used only by the NfcIP Target.
962 *  \note NOTE: After this function is called, its mandatory to wait for the
963 *  pphHal4Nfc_ReceiveCallback_t callback, before calling any other function.
964 *  Only functions allowed are phHal4Nfc_Close() and phHal4Nfc_Hal4Reset().
965 *
966 *
967 *  \param[in]     psHwReference         Hardware Reference, pre-initialized by
968 *                                       upper layer. \n
969 *
970 *  \param[in]     psTransactInfo            information required for transferring the
971 *                                       data
972 *
973 *  \param[in]     pReceiveCallback      Callback function called after receiving
974 *                                       the data or in case an error has
975 *                                       has occurred.
976 *
977 *  \param[in]     pContext              Upper layer context to be returned
978 *                                       in the callback.
979 *
980 *  \retval NFCSTATUS_PENDING            Receive is in progress.
981 *  \retval NFCSTATUS_INVALID_DEVICE     The device has not been opened or has
982 *                                       been disconnected meanwhile.
983 *  \retval NFCSTATUS_INVALID_PARAMETER  One or more of the supplied parameters
984 *                                       could not be properly interpreted.
985 *  \retval NFCSTATUS_NOT_INITIALIZED    Hal is not initialized.
986 *  \retval Others                       Errors related to the lower layers
987 *
988 */
989 extern
990 NFCSTATUS
991 phHal4Nfc_Receive(
992                   phHal_sHwReference_t                  *psHwReference,
993                   phHal4Nfc_TransactInfo_t              *psTransactInfo,
994                   pphHal4Nfc_ReceiveCallback_t           pReceiveCallback,
995                   void                                  *pContext
996                  );
997 
998 
999 /**
1000 *  \if hal
1001 *   \ingroup grp_hal_common
1002 *  \else
1003 *   \ingroup grp_mw_external_hal_funcs
1004 *  \endif
1005 *
1006 *  This API is a synchronous call used to register a listener for either tag
1007 *  discovery, Secure element notification or P2P Notification or a general
1008 *  notification handler for all the three.
1009 *
1010 *
1011 *  \param[in] psHwRef               Hardware Reference, pre-initialized by
1012 *                                   upper layer. \n
1013 *
1014 *  \param[in] eRegisterType         Type of Notification registered.Informs
1015 *                                   whether upper layer is interested in Tag
1016 *                                   Discovery,secure element or P2P notification.
1017 *
1018 *  \param[in] pNotificationHandler  Notification callback.If this parameter is
1019 *                                   NULL,any notification from Hci will be
1020 *                                   ignored and upper layer will not be notified
1021 *                                   of the event.
1022 *
1023 *  \param[in] Context              Upper layer context.
1024 *
1025 *  \retval NFCSTATUS_SUCCESS            Notification unregister successful.
1026 *
1027 *  \retval NFCSTATUS_INVALID_PARAMETER  One or more of the supplied parameters
1028 *                                       could not be properly interpreted.
1029 *  \retval NFCSTATUS_NOT_INITIALIZED    Hal is not initialized.
1030 *
1031 */
1032 extern NFCSTATUS phHal4Nfc_RegisterNotification(
1033                             phHal_sHwReference_t      *psHwRef,
1034                             phHal4Nfc_RegisterType_t   eRegisterType,
1035                             pphHal4Nfc_Notification_t  pNotificationHandler,
1036                             void                      *Context
1037                             );
1038 
1039 /**
1040 *  \if hal
1041 *   \ingroup grp_hal_common
1042 *  \else
1043 *   \ingroup grp_mw_external_hal_funcs
1044 *  \endif
1045 *
1046 *  This API is a synchronous call used to unregister a listener for either tag
1047 *  discovery, Secure element notification or P2P Notification, previously
1048 *  registered using \ref phHal4Nfc_RegisterNotification.
1049 *
1050 *  \param[in]   psHwReference           Hardware Reference, pre-initialized by
1051 *                                       upper layer. \n
1052 *
1053 *  \param[in]   eRegisterType           Type of registration ,tells whether upper
1054 *                                       layer is interested in unregistering for
1055 *                                       Tag Discovery,Secure element or P2P. \n
1056 *
1057 *  \param[in]   Context                Upper layer context.
1058 *
1059 *  \retval NFCSTATUS_SUCCESS            Notification unregister successful.
1060 *
1061 *  \retval NFCSTATUS_INVALID_PARAMETER  One or more of the supplied parameters
1062 *                                       could not be properly interpreted.
1063 *
1064 *  \retval NFCSTATUS_NOT_INITIALIZED    Hal is not initialized.
1065 *
1066 *
1067 */
1068 extern NFCSTATUS phHal4Nfc_UnregisterNotification(
1069                                     phHal_sHwReference_t     *psHwReference,
1070                                     phHal4Nfc_RegisterType_t  eRegisterType,
1071                                     void                     *Context
1072                                     );
1073 
1074 
1075 /**
1076 *  \if hal
1077 *   \ingroup grp_hal_common
1078 *  \else
1079 *   \ingroup grp_mw_external_hal_funcs
1080 *  \endif
1081 *
1082 *  This function is called to switch the SmartMX to Wired Mode. After switching
1083 * to Wired mode the SmartMX can be discovered through Tag Discovery like a normal
1084 * tag and used in the same manner as a tag. SmartMx returns to previous mode
1085 * (Virtual or Off) when the tag is relased by phHal4Nfc_Disconnect
1086 *
1087 *
1088 *  \param[in]  psHwReference            Hardware Reference, pre-initialized by
1089 *                                       upper layer. \n
1090 *
1091 *  \param[in]  smx_mode                 Mode to which the switch should be made.
1092 *
1093 *  \param[in]  pSwitchModecb            Callback for Switch mode complete
1094 *                                       with success/error notification.
1095 *
1096 *  \param[in]  pContext                 Upper layer context.
1097 *
1098 *  \retval NFCSTATUS_PENDING                    Switch in progress.Status will be
1099 *                                               returned in pSwitchModecb.
1100 *  \retval NFCSTATUS_INVALID_PARAMETER          One or more of the supplied
1101 *                                               parameters could not be properly
1102 *                                               interpreted.
1103 *  \retval NFCSTATUS_NOT_INITIALIZED            Hal is not initialized.
1104 *  \retval NFCSTATUS_BUSY                       Configuration in Progress or
1105 *                                               remote device is connected.
1106 *  \retval NFCSTATUS_INSUFFICIENT_RESOURCES     System resources are insufficient
1107 *                                               to complete the request at that
1108 *                                               point in time.
1109 * \retval NFCSTATUS_FAILED                      No listener has been registered
1110 *                                               by the upper layer for Emulation
1111 *                                               before making this call.
1112 *  \retval Others                               Errors related to the lower
1113 *                                               layers.
1114 */
1115 extern NFCSTATUS phHal4Nfc_Switch_SMX_Mode(
1116                                     phHal_sHwReference_t      *psHwReference,
1117                                     phHal_eSmartMX_Mode_t      smx_mode,
1118                                     pphHal4Nfc_GenCallback_t   pSwitchModecb,
1119                                     void                      *pContext
1120                                     );
1121 
1122 
1123 /**
1124 *  \if hal
1125 *   \ingroup grp_hal_common
1126 *  \else
1127 *   \ingroup grp_mw_external_hal_funcs
1128 *  \endif
1129 *
1130 *  This function is called to switch the UICC on or Off.
1131 *
1132 *
1133 *  \param[in]  psHwReference            Hardware Reference, pre-initialized by
1134 *                                       upper layer. \n
1135 *
1136 *  \param[in]  smx_mode                 Mode to which the switch should be made.
1137 *
1138 *  \param[in]  pSwitchModecb            Callback for Switch mode complete
1139 *                                       with success/error notification.
1140 *
1141 *  \param[in]  pContext                 Upper layer context.
1142 *
1143 *  \retval NFCSTATUS_PENDING                    Switch in progress.Status will be
1144 *                                               returned in pSwitchModecb.
1145 *  \retval NFCSTATUS_INVALID_PARAMETER          One or more of the supplied
1146 *                                               parameters could not be properly
1147 *                                               interpreted.
1148 *  \retval NFCSTATUS_NOT_INITIALIZED            Hal is not initialized.
1149 *  \retval NFCSTATUS_BUSY                       Configuration in Progress or
1150 *                                               remote device is connected.
1151 *  \retval NFCSTATUS_INSUFFICIENT_RESOURCES     System resources are insufficient
1152 *                                               to complete the request at that
1153 *                                               point in time.
1154 * \retval NFCSTATUS_FAILED                      No listener has been registered
1155 *                                               by the upper layer for Emulation
1156 *                                               before making this call.
1157 *  \retval Others                               Errors related to the lower
1158 *                                               layers.
1159 */
1160 extern NFCSTATUS phHal4Nfc_Switch_Swp_Mode(
1161                                     phHal_sHwReference_t      *psHwReference,
1162                                     phHal_eSWP_Mode_t          swp_mode,
1163                                     pphHal4Nfc_GenCallback_t   pSwitchModecb,
1164                                     void                      *pContext
1165                                     );
1166 
1167 #endif /* end of PHHAL4NFC_H */
1168 
1169 
1170