Home | History | Annotate | Download | only in rw
      1 /******************************************************************************
      2  *
      3  *  Copyright (C) 2010-2013 Broadcom Corporation
      4  *
      5  *  Licensed under the Apache License, Version 2.0 (the "License");
      6  *  you may not use this file except in compliance with the License.
      7  *  You may obtain a copy of the License at:
      8  *
      9  *  http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  *  Unless required by applicable law or agreed to in writing, software
     12  *  distributed under the License is distributed on an "AS IS" BASIS,
     13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  *  See the License for the specific language governing permissions and
     15  *  limitations under the License.
     16  *
     17  ******************************************************************************/
     18 
     19 
     20 /******************************************************************************
     21  *
     22  *  NFA interface for tag Reader/Writer
     23  *
     24  ******************************************************************************/
     25 #include <string.h>
     26 #include "nfa_api.h"
     27 #include "nfa_sys.h"
     28 #include "nfa_rw_int.h"
     29 #include "nfa_sys_int.h"
     30 
     31 /*****************************************************************************
     32 **  Constants
     33 *****************************************************************************/
     34 
     35 
     36 /*****************************************************************************
     37 **  APIs
     38 *****************************************************************************/
     39 
     40 /*******************************************************************************
     41 **
     42 ** Function         NFA_RwDetectNDef
     43 **
     44 ** Description      Perform the NDEF detection procedure  using the appropriate
     45 **                  method for the currently activated tag.
     46 **
     47 **                  Upon successful completion of NDEF detection, a
     48 **                  NFA_NDEF_DETECT_EVT will be sent, to notify the application
     49 **                  of the NDEF attributes (NDEF total memory size, current
     50 **                  size, etc.).
     51 **
     52 **                  It is not mandatory to call this function -  NFA_RwReadNDef
     53 **                  and NFA_RwWriteNDef will perform NDEF detection internally if
     54 **                  not performed already. This API may be called to get a
     55 **                  tag's NDEF size before issuing a write-request.
     56 **
     57 ** Returns:
     58 **                  NFA_STATUS_OK if successfully initiated
     59 **                  NFC_STATUS_REFUSED if tag does not support NDEF
     60 **                  NFA_STATUS_FAILED otherwise
     61 **
     62 *******************************************************************************/
     63 tNFA_STATUS NFA_RwDetectNDef (void)
     64 {
     65     tNFA_RW_OPERATION *p_msg;
     66 
     67     NFA_TRACE_API0 ("NFA_RwDetectNDef");
     68 
     69     if ((p_msg = (tNFA_RW_OPERATION *) GKI_getbuf ((UINT16) (sizeof (tNFA_RW_OPERATION)))) != NULL)
     70     {
     71         p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT;
     72         p_msg->op        = NFA_RW_OP_DETECT_NDEF;
     73 
     74         nfa_sys_sendmsg (p_msg);
     75 
     76         return (NFA_STATUS_OK);
     77     }
     78 
     79     return (NFA_STATUS_FAILED);
     80 }
     81 
     82 /*******************************************************************************
     83 **
     84 ** Function         NFA_RwReadNDef
     85 **
     86 ** Description      Read NDEF message from tag. This function will internally
     87 **                  perform the NDEF detection procedure (if not performed
     88 **                  previously), and read the NDEF tag data using the
     89 **                  appropriate method for the currently activated tag.
     90 **
     91 **                  Upon successful completion of NDEF detection (if performed),
     92 **                  a NFA_NDEF_DETECT_EVT will be sent, to notify the application
     93 **                  of the NDEF attributes (NDEF total memory size, current size,
     94 **                  etc.).
     95 **
     96 **                  Upon receiving the NDEF message, the message will be sent to
     97 **                  the handler registered with NFA_RegisterNDefTypeHandler or
     98 **                  NFA_RequestExclusiveRfControl (if exclusive RF mode is active)
     99 **
    100 ** Returns:
    101 **                  NFA_STATUS_OK if successfully initiated
    102 **                  NFC_STATUS_REFUSED if tag does not support NDEF
    103 **                  NFC_STATUS_NOT_INITIALIZED if NULL NDEF was detected on the tag
    104 **                  NFA_STATUS_FAILED otherwise
    105 **
    106 *******************************************************************************/
    107 tNFA_STATUS NFA_RwReadNDef (void)
    108 {
    109     tNFA_RW_OPERATION *p_msg;
    110 
    111     NFA_TRACE_API0 ("NFA_RwReadNDef");
    112 
    113     if ((p_msg = (tNFA_RW_OPERATION *) GKI_getbuf ((UINT16) (sizeof (tNFA_RW_OPERATION)))) != NULL)
    114     {
    115         p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT;
    116         p_msg->op        = NFA_RW_OP_READ_NDEF;
    117 
    118         nfa_sys_sendmsg (p_msg);
    119 
    120         return (NFA_STATUS_OK);
    121     }
    122 
    123     return (NFA_STATUS_FAILED);
    124 }
    125 
    126 
    127 
    128 /*******************************************************************************
    129 **
    130 ** Function         NFA_RwWriteNDef
    131 **
    132 ** Description      Write NDEF data to the activated tag. This function will
    133 **                  internally perform NDEF detection if necessary, and write
    134 **                  the NDEF tag data using the appropriate method for the
    135 **                  currently activated tag.
    136 **
    137 **                  When the entire message has been written, or if an error
    138 **                  occurs, the app will be notified with NFA_WRITE_CPLT_EVT.
    139 **
    140 **                  p_data needs to be persistent until NFA_WRITE_CPLT_EVT
    141 **
    142 **
    143 ** Returns:
    144 **                  NFA_STATUS_OK if successfully initiated
    145 **                  NFC_STATUS_REFUSED if tag does not support NDEF/locked
    146 **                  NFA_STATUS_FAILED otherwise
    147 **
    148 *******************************************************************************/
    149 tNFA_STATUS NFA_RwWriteNDef (UINT8 *p_data, UINT32 len)
    150 {
    151     tNFA_RW_OPERATION *p_msg;
    152 
    153     NFA_TRACE_API2 ("NFA_RwWriteNDef (): ndef p_data=%08x, len: %i", p_data, len);
    154 
    155     /* Validate parameters */
    156     if (p_data == NULL)
    157         return (NFA_STATUS_INVALID_PARAM);
    158 
    159     if ((p_msg = (tNFA_RW_OPERATION *) GKI_getbuf ((UINT16) (sizeof (tNFA_RW_OPERATION)))) != NULL)
    160     {
    161         p_msg->hdr.event                = NFA_RW_OP_REQUEST_EVT;
    162         p_msg->op                       = NFA_RW_OP_WRITE_NDEF;
    163         p_msg->params.write_ndef.len    = len;
    164         p_msg->params.write_ndef.p_data = p_data;
    165         nfa_sys_sendmsg (p_msg);
    166 
    167         return (NFA_STATUS_OK);
    168     }
    169 
    170     return (NFA_STATUS_FAILED);
    171 }
    172 
    173 /*****************************************************************************
    174 **
    175 ** Function         NFA_RwPresenceCheck
    176 **
    177 ** Description      Check if the tag is still in the field.
    178 **
    179 **                  The NFA_RW_PRESENCE_CHECK_EVT w/ status is used to
    180 **                  indicate presence or non-presence.
    181 **
    182 ** Returns
    183 **                  NFA_STATUS_OK if successfully initiated
    184 **                  NFA_STATUS_FAILED otherwise
    185 **
    186 *****************************************************************************/
    187 tNFA_STATUS NFA_RwPresenceCheck (void)
    188 {
    189     tNFA_RW_OPERATION *p_msg;
    190 
    191     NFA_TRACE_API0 ("NFA_RwPresenceCheck");
    192 
    193     if ((p_msg = (tNFA_RW_OPERATION *) GKI_getbuf ((UINT16) (sizeof (tNFA_RW_OPERATION)))) != NULL)
    194     {
    195         p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT;
    196         p_msg->op        = NFA_RW_OP_PRESENCE_CHECK;
    197 
    198         nfa_sys_sendmsg (p_msg);
    199 
    200         return (NFA_STATUS_OK);
    201     }
    202 
    203     return (NFA_STATUS_FAILED);
    204 }
    205 
    206 /*****************************************************************************
    207 **
    208 ** Function         NFA_RwFormatTag
    209 **
    210 ** Description      Check if the tag is NDEF Formatable. If yes Format the tag
    211 **
    212 **                  The NFA_RW_FORMAT_CPLT_EVT w/ status is used to
    213 **                  indicate if tag is successfully formated or not
    214 **
    215 ** Returns
    216 **                  NFA_STATUS_OK if successfully initiated
    217 **                  NFA_STATUS_FAILED otherwise
    218 **
    219 *****************************************************************************/
    220 tNFA_STATUS NFA_RwFormatTag (void)
    221 {
    222     tNFA_RW_OPERATION *p_msg;
    223 
    224     NFA_TRACE_API0 ("NFA_RwFormatTag");
    225 
    226     if ((p_msg = (tNFA_RW_OPERATION *) GKI_getbuf ((UINT16)(sizeof (tNFA_RW_OPERATION)))) != NULL)
    227     {
    228         p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT;
    229         p_msg->op        = NFA_RW_OP_FORMAT_TAG;
    230 
    231         nfa_sys_sendmsg (p_msg);
    232 
    233         return (NFA_STATUS_OK);
    234     }
    235 
    236     return (NFA_STATUS_FAILED);
    237 }
    238 
    239 /*******************************************************************************
    240 **
    241 ** Function         NFA_RwSetTagReadOnly
    242 **
    243 ** Description:
    244 **      Sets tag as read only.
    245 **
    246 **      When tag is set as read only, or if an error occurs, the app will be
    247 **      notified with NFA_SET_TAG_RO_EVT.
    248 **
    249 ** Returns:
    250 **      NFA_STATUS_OK if successfully initiated
    251 **      NFA_STATUS_REJECTED if protocol is not T1/T2/ISO15693
    252 **                 (or) if hard lock is not requested for protocol ISO15693
    253 **      NFA_STATUS_FAILED otherwise
    254 **
    255 *******************************************************************************/
    256 tNFA_STATUS NFA_RwSetTagReadOnly (BOOLEAN b_hard_lock)
    257 {
    258     tNFA_RW_OPERATION *p_msg;
    259     tNFC_PROTOCOL      protocol = nfa_rw_cb.protocol;
    260 
    261     if ((protocol != NFC_PROTOCOL_T1T) && (protocol != NFC_PROTOCOL_T2T) && (protocol != NFC_PROTOCOL_15693) && (protocol != NFC_PROTOCOL_ISO_DEP) && (protocol != NFC_PROTOCOL_T3T))
    262     {
    263         NFA_TRACE_API1 ("NFA_RwSetTagReadOnly (): Cannot Configure as read only for Protocol: %d", protocol);
    264         return (NFA_STATUS_REJECTED);
    265     }
    266 
    267     if (  (!b_hard_lock && (protocol == NFC_PROTOCOL_15693))
    268         ||(b_hard_lock && (protocol == NFC_PROTOCOL_ISO_DEP))  )
    269     {
    270         NFA_TRACE_API2 ("NFA_RwSetTagReadOnly (): Cannot %s for Protocol: %d", b_hard_lock ? "Hard lock" : "Soft lock", protocol);
    271         return (NFA_STATUS_REJECTED);
    272     }
    273 
    274     if ((p_msg = (tNFA_RW_OPERATION *) GKI_getbuf ((UINT16) (sizeof (tNFA_RW_OPERATION)))) != NULL)
    275     {
    276         /* Fill in tNFA_RW_OPERATION struct */
    277         p_msg->hdr.event                       = NFA_RW_OP_REQUEST_EVT;
    278         p_msg->op                              = NFA_RW_OP_SET_TAG_RO;
    279         p_msg->params.set_readonly.b_hard_lock = b_hard_lock;
    280 
    281         nfa_sys_sendmsg (p_msg);
    282         return (NFA_STATUS_OK);
    283     }
    284     return (NFA_STATUS_FAILED);
    285 }
    286 
    287 /*******************************************************************************
    288 ** Tag specific APIs
    289 ** (note: for Type-4 tags, use NFA_SendRawFrame to exchange APDUs)
    290 *******************************************************************************/
    291 
    292 /*******************************************************************************
    293 **
    294 ** Function         NFA_RwLocateTlv
    295 **
    296 ** Description:
    297 **      Search for the Lock/Memory contril TLV on the activated Type1/Type2 tag
    298 **
    299 **      Data is returned to the application using the NFA_TLV_DETECT_EVT. When
    300 **      search operation has completed, or if an error occurs, the app will be
    301 **      notified with NFA_TLV_DETECT_EVT.
    302 **
    303 ** Description      Perform the TLV detection procedure  using the appropriate
    304 **                  method for the currently activated tag.
    305 **
    306 **                  Upon successful completion of TLV detection in T1/T2 tag, a
    307 **                  NFA_TLV_DETECT_EVT will be sent, to notify the application
    308 **                  of the TLV attributes (total lock/reserved bytes etc.).
    309 **                  However if the TLV type specified is NDEF then it is same as
    310 **                  calling NFA_RwDetectNDef and should expect to receive
    311 **                  NFA_NDEF_DETECT_EVT instead of NFA_TLV_DETECT_EVT
    312 **
    313 **                  It is not mandatory to call this function -  NFA_RwDetectNDef,
    314 **                  NFA_RwReadNDef and NFA_RwWriteNDef will perform TLV detection
    315 **                  internally if not performed already. An application may call
    316 **                  this API to check the a tag/card-emulator's total Reserved/
    317 **                  Lock bytes before issuing a write-request.
    318 **
    319 ** Returns:
    320 **                  NFA_STATUS_OK if successfully initiated
    321 **                  NFC_STATUS_REFUSED if tlv_type is NDEF & tag won't support NDEF
    322 **                  NFA_STATUS_FAILED otherwise
    323 **
    324 *******************************************************************************/
    325 tNFA_STATUS NFA_RwLocateTlv (UINT8 tlv_type)
    326 {
    327     tNFA_RW_OPERATION *p_msg;
    328 
    329     NFA_TRACE_API0 ("NFA_RwLocateTlv");
    330 
    331     if ((p_msg = (tNFA_RW_OPERATION *) GKI_getbuf ((UINT16) (sizeof (tNFA_RW_OPERATION)))) != NULL)
    332     {
    333         p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT;
    334 
    335         if (tlv_type == TAG_LOCK_CTRL_TLV)
    336         {
    337             p_msg->op = NFA_RW_OP_DETECT_LOCK_TLV;
    338         }
    339         else if (tlv_type == TAG_MEM_CTRL_TLV)
    340         {
    341             p_msg->op = NFA_RW_OP_DETECT_MEM_TLV;
    342         }
    343         else if (tlv_type == TAG_NDEF_TLV)
    344         {
    345             p_msg->op = NFA_RW_OP_DETECT_NDEF;
    346         }
    347         else
    348             return (NFA_STATUS_FAILED);
    349 
    350         nfa_sys_sendmsg (p_msg);
    351 
    352         return (NFA_STATUS_OK);
    353     }
    354 
    355     return (NFA_STATUS_FAILED);
    356 }
    357 
    358 /*******************************************************************************
    359 **
    360 ** Function         NFA_RwT1tRid
    361 **
    362 ** Description:
    363 **      Send a RID command to the activated Type 1 tag.
    364 **
    365 **      Data is returned to the application using the NFA_DATA_EVT. When the read
    366 **      operation has completed, or if an error occurs, the app will be notified with
    367 **      NFA_READ_CPLT_EVT.
    368 **
    369 ** Returns:
    370 **      NFA_STATUS_OK if successfully initiated
    371 **      NFA_STATUS_FAILED otherwise
    372 **
    373 *******************************************************************************/
    374 tNFA_STATUS NFA_RwT1tRid (void)
    375 {
    376     tNFA_RW_OPERATION *p_msg;
    377 
    378     if ((p_msg = (tNFA_RW_OPERATION *) GKI_getbuf ((UINT16) (sizeof (tNFA_RW_OPERATION)))) != NULL)
    379     {
    380         /* Fill in tNFA_RW_OPERATION struct */
    381         p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT;
    382         p_msg->op        = NFA_RW_OP_T1T_RID;
    383 
    384         nfa_sys_sendmsg (p_msg);
    385         return (NFA_STATUS_OK);
    386     }
    387     return (NFA_STATUS_FAILED);
    388 }
    389 
    390 /*******************************************************************************
    391 **
    392 ** Function         NFA_RwT1tReadAll
    393 **
    394 ** Description:
    395 **      Send a RALL command to the activated Type 1 tag.
    396 **
    397 **      Data is returned to the application using the NFA_DATA_EVT. When the read
    398 **      operation has completed, or if an error occurs, the app will be notified with
    399 **      NFA_READ_CPLT_EVT.
    400 **
    401 ** Returns:
    402 **      NFA_STATUS_OK if successfully initiated
    403 **      NFA_STATUS_FAILED otherwise
    404 **
    405 *******************************************************************************/
    406 tNFA_STATUS NFA_RwT1tReadAll (void)
    407 {
    408     tNFA_RW_OPERATION *p_msg;
    409 
    410     if ((p_msg = (tNFA_RW_OPERATION *) GKI_getbuf ((UINT16) (sizeof (tNFA_RW_OPERATION)))) != NULL)
    411     {
    412         /* Fill in tNFA_RW_OPERATION struct */
    413         p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT;
    414         p_msg->op        = NFA_RW_OP_T1T_RALL;
    415 
    416         nfa_sys_sendmsg (p_msg);
    417         return (NFA_STATUS_OK);
    418     }
    419     return (NFA_STATUS_FAILED);
    420 }
    421 
    422 /*******************************************************************************
    423 **
    424 ** Function         NFA_RwT1tRead
    425 **
    426 ** Description:
    427 **      Send a READ command to the activated Type 1 tag.
    428 **
    429 **      Data is returned to the application using the NFA_DATA_EVT. When the read
    430 **      operation has completed, or if an error occurs, the app will be notified with
    431 **      NFA_READ_CPLT_EVT.
    432 **
    433 ** Returns:
    434 **      NFA_STATUS_OK if successfully initiated
    435 **      NFA_STATUS_FAILED otherwise
    436 **
    437 *******************************************************************************/
    438 tNFA_STATUS NFA_RwT1tRead (UINT8 block_number, UINT8 index)
    439 {
    440     tNFA_RW_OPERATION *p_msg;
    441 
    442     if ((p_msg = (tNFA_RW_OPERATION *) GKI_getbuf ((UINT16) (sizeof (tNFA_RW_OPERATION)))) != NULL)
    443     {
    444         /* Fill in tNFA_RW_OPERATION struct */
    445         p_msg->hdr.event                    = NFA_RW_OP_REQUEST_EVT;
    446         p_msg->op                           = NFA_RW_OP_T1T_READ;
    447         p_msg->params.t1t_read.block_number = block_number;
    448         p_msg->params.t1t_read.index        = index;
    449 
    450         nfa_sys_sendmsg (p_msg);
    451         return (NFA_STATUS_OK);
    452     }
    453     return (NFA_STATUS_FAILED);
    454 }
    455 
    456 /*******************************************************************************
    457 **
    458 ** Function         NFA_RwT1tWrite
    459 **
    460 ** Description:
    461 **      Send a WRITE command to the activated Type 1 tag.
    462 **
    463 **      Data is returned to the application using the NFA_DATA_EVT. When the write
    464 **      operation has completed, or if an error occurs, the app will be notified with
    465 **      NFA_WRITE_CPLT_EVT.
    466 **
    467 ** Returns:
    468 **      NFA_STATUS_OK if successfully initiated
    469 **      NFA_STATUS_FAILED otherwise
    470 **
    471 *******************************************************************************/
    472 tNFA_STATUS NFA_RwT1tWrite (UINT8 block_number, UINT8 index, UINT8 data, BOOLEAN b_erase)
    473 {
    474     tNFA_RW_OPERATION *p_msg;
    475 
    476     if ((p_msg = (tNFA_RW_OPERATION *) GKI_getbuf ((UINT16) (sizeof (tNFA_RW_OPERATION)))) != NULL)
    477     {
    478         /* Fill in tNFA_RW_OPERATION struct */
    479         p_msg->hdr.event                     = NFA_RW_OP_REQUEST_EVT;
    480         p_msg->params.t1t_write.b_erase      = b_erase;
    481         p_msg->op                            = NFA_RW_OP_T1T_WRITE;
    482         p_msg->params.t1t_write.block_number = block_number;
    483         p_msg->params.t1t_write.index        = index;
    484         p_msg->params.t1t_write.p_block_data[0] = data;
    485 
    486         nfa_sys_sendmsg (p_msg);
    487         return (NFA_STATUS_OK);
    488     }
    489     return (NFA_STATUS_FAILED);
    490 }
    491 
    492 /*******************************************************************************
    493 **
    494 ** Function         NFA_RwT1tReadSeg
    495 **
    496 ** Description:
    497 **      Send a RSEG command to the activated Type 1 tag.
    498 **
    499 **      Data is returned to the application using the NFA_DATA_EVT. When the read
    500 **      operation has completed, or if an error occurs, the app will be notified with
    501 **      NFA_READ_CPLT_EVT.
    502 **
    503 ** Returns:
    504 **      NFA_STATUS_OK if successfully initiated
    505 **      NFA_STATUS_FAILED otherwise
    506 **
    507 *******************************************************************************/
    508 tNFA_STATUS NFA_RwT1tReadSeg (UINT8 segment_number)
    509 {
    510     tNFA_RW_OPERATION *p_msg;
    511 
    512     if ((p_msg = (tNFA_RW_OPERATION *) GKI_getbuf ((UINT16) (sizeof (tNFA_RW_OPERATION)))) != NULL)
    513     {
    514         /* Fill in tNFA_RW_OPERATION struct */
    515         p_msg->hdr.event                      = NFA_RW_OP_REQUEST_EVT;
    516         p_msg->op                             = NFA_RW_OP_T1T_RSEG;
    517         p_msg->params.t1t_read.segment_number = segment_number;
    518 
    519         nfa_sys_sendmsg (p_msg);
    520         return (NFA_STATUS_OK);
    521     }
    522     return (NFA_STATUS_FAILED);
    523 }
    524 
    525 /*******************************************************************************
    526 **
    527 ** Function         NFA_RwT1tRead8
    528 **
    529 ** Description:
    530 **      Send a READ8 command to the activated Type 1 tag.
    531 **
    532 **      Data is returned to the application using the NFA_DATA_EVT. When the read
    533 **      operation has completed, or if an error occurs, the app will be notified with
    534 **      NFA_READ_CPLT_EVT.
    535 **
    536 ** Returns:
    537 **      NFA_STATUS_OK if successfully initiated
    538 **      NFA_STATUS_FAILED otherwise
    539 **
    540 *******************************************************************************/
    541 tNFA_STATUS NFA_RwT1tRead8 (UINT8 block_number)
    542 {
    543     tNFA_RW_OPERATION *p_msg;
    544 
    545     if ((p_msg = (tNFA_RW_OPERATION *) GKI_getbuf ((UINT16) (sizeof (tNFA_RW_OPERATION)))) != NULL)
    546     {
    547         /* Fill in tNFA_RW_OPERATION struct */
    548         p_msg->hdr.event                     = NFA_RW_OP_REQUEST_EVT;
    549         p_msg->op                            = NFA_RW_OP_T1T_READ8;
    550         p_msg->params.t1t_write.block_number = block_number;
    551 
    552         nfa_sys_sendmsg (p_msg);
    553         return (NFA_STATUS_OK);
    554     }
    555     return (NFA_STATUS_FAILED);
    556 }
    557 
    558 /*******************************************************************************
    559 **
    560 ** Function         NFA_RwT1tWrite8
    561 **
    562 ** Description:
    563 **      Send a WRITE8_E / WRITE8_NE command to the activated Type 1 tag.
    564 **
    565 **      Data is returned to the application using the NFA_DATA_EVT. When the read
    566 **      operation has completed, or if an error occurs, the app will be notified with
    567 **      NFA_READ_CPLT_EVT.
    568 **
    569 ** Returns:
    570 **      NFA_STATUS_OK if successfully initiated
    571 **      NFA_STATUS_FAILED otherwise
    572 **
    573 *******************************************************************************/
    574 tNFA_STATUS NFA_RwT1tWrite8 (UINT8 block_number, UINT8 *p_data, BOOLEAN b_erase)
    575 {
    576     tNFA_RW_OPERATION *p_msg;
    577 
    578     if ((p_msg = (tNFA_RW_OPERATION *) GKI_getbuf ((UINT16) (sizeof (tNFA_RW_OPERATION)))) != NULL)
    579     {
    580         /* Fill in tNFA_RW_OPERATION struct */
    581         p_msg->hdr.event                     = NFA_RW_OP_REQUEST_EVT;
    582         p_msg->params.t1t_write.b_erase      = b_erase;
    583         p_msg->op                            = NFA_RW_OP_T1T_WRITE8;
    584         p_msg->params.t1t_write.block_number = block_number;
    585 
    586         memcpy (p_msg->params.t1t_write.p_block_data,p_data,8);
    587 
    588         nfa_sys_sendmsg (p_msg);
    589         return (NFA_STATUS_OK);
    590     }
    591     return (NFA_STATUS_FAILED);
    592 }
    593 
    594 /*******************************************************************************
    595 **
    596 ** Function         NFA_RwT2tRead
    597 **
    598 ** Description:
    599 **      Send a READ command to the activated Type 2 tag.
    600 **
    601 **      Data is returned to the application using the NFA_DATA_EVT. When the read
    602 **      operation has completed, or if an error occurs, the app will be notified with
    603 **      NFA_READ_CPLT_EVT.
    604 **
    605 ** Returns:
    606 **      NFA_STATUS_OK if successfully initiated
    607 **      NFA_STATUS_FAILED otherwise
    608 **
    609 *******************************************************************************/
    610 tNFA_STATUS NFA_RwT2tRead (UINT8 block_number)
    611 {
    612     tNFA_RW_OPERATION *p_msg;
    613 
    614     NFA_TRACE_API1 ("NFA_RwT2tRead (): Block to read: %d", block_number);
    615 
    616     if ((p_msg = (tNFA_RW_OPERATION *) GKI_getbuf ((UINT16) (sizeof (tNFA_RW_OPERATION)))) != NULL)
    617     {
    618         /* Fill in tNFA_RW_OPERATION struct */
    619         p_msg->hdr.event                    = NFA_RW_OP_REQUEST_EVT;
    620         p_msg->op                           = NFA_RW_OP_T2T_READ;
    621         p_msg->params.t2t_read.block_number = block_number;
    622 
    623         nfa_sys_sendmsg (p_msg);
    624         return (NFA_STATUS_OK);
    625     }
    626     return (NFA_STATUS_FAILED);
    627 }
    628 
    629 /*******************************************************************************
    630 **
    631 ** Function         NFA_RwT2tWrite
    632 **
    633 ** Description:
    634 **      Send an WRITE command to the activated Type 2 tag.
    635 **
    636 **      When the write operation has completed (or if an error occurs), the
    637 **      app will be notified with NFA_WRITE_CPLT_EVT.
    638 **
    639 ** Returns:
    640 **      NFA_STATUS_OK if successfully initiated
    641 **      NFA_STATUS_FAILED otherwise
    642 **
    643 *******************************************************************************/
    644 tNFA_STATUS NFA_RwT2tWrite (UINT8 block_number,	UINT8 *p_data)
    645 {
    646     tNFA_RW_OPERATION *p_msg;
    647 
    648     NFA_TRACE_API1 ("NFA_RwT2tWrite (): Block to write: %d", block_number);
    649 
    650     if ((p_msg = (tNFA_RW_OPERATION *) GKI_getbuf ((UINT16) (sizeof (tNFA_RW_OPERATION)))) != NULL)
    651     {
    652         /* Fill in tNFA_RW_OPERATION struct */
    653         p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT;
    654         p_msg->op        = NFA_RW_OP_T2T_WRITE;
    655 
    656         p_msg->params.t2t_write.block_number = block_number;
    657 
    658         memcpy (p_msg->params.t2t_write.p_block_data,p_data,4);
    659 
    660         nfa_sys_sendmsg (p_msg);
    661         return (NFA_STATUS_OK);
    662     }
    663     return (NFA_STATUS_FAILED);
    664 }
    665 
    666 /*******************************************************************************
    667 **
    668 ** Function         NFA_RwT2tSectorSelect
    669 **
    670 ** Description:
    671 **      Send SECTOR SELECT command to the activated Type 2 tag.
    672 **
    673 **      When the sector select operation has completed (or if an error occurs), the
    674 **      app will be notified with NFA_SECTOR_SELECT_CPLT_EVT.
    675 **
    676 ** Returns:
    677 **      NFA_STATUS_OK if successfully initiated
    678 **      NFA_STATUS_FAILED otherwise
    679 **
    680 *******************************************************************************/
    681 tNFA_STATUS NFA_RwT2tSectorSelect (UINT8 sector_number)
    682 {
    683     tNFA_RW_OPERATION *p_msg;
    684 
    685     NFA_TRACE_API1 ("NFA_RwT2tRead (): sector to select: %d", sector_number);
    686 
    687     if ((p_msg = (tNFA_RW_OPERATION *) GKI_getbuf ((UINT16) (sizeof (tNFA_RW_OPERATION)))) != NULL)
    688     {
    689         /* Fill in tNFA_RW_OPERATION struct */
    690         p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT;
    691         p_msg->op        = NFA_RW_OP_T2T_SECTOR_SELECT;
    692 
    693         p_msg->params.t2t_sector_select.sector_number = sector_number;
    694 
    695         nfa_sys_sendmsg (p_msg);
    696         return (NFA_STATUS_OK);
    697     }
    698     return (NFA_STATUS_FAILED);
    699 }
    700 
    701 /*******************************************************************************
    702 **
    703 ** Function         NFA_RwT3tRead
    704 **
    705 ** Description:
    706 **      Send a CHECK (read) command to the activated Type 3 tag.
    707 **
    708 **      Data is returned to the application using the NFA_DATA_EVT. When the read
    709 **      operation has completed, or if an error occurs, the app will be notified with
    710 **      NFA_READ_CPLT_EVT.
    711 **
    712 ** Returns:
    713 **      NFA_STATUS_OK if successfully initiated
    714 **      NFA_STATUS_FAILED otherwise
    715 **
    716 *******************************************************************************/
    717 tNFA_STATUS NFA_RwT3tRead (UINT8 num_blocks, tNFA_T3T_BLOCK_DESC *t3t_blocks)
    718 {
    719     tNFA_RW_OPERATION *p_msg;
    720     UINT8 *p_block_desc;
    721 
    722     NFA_TRACE_API1 ("NFA_RwT3tRead (): num_blocks to read: %i", num_blocks);
    723 
    724     /* Validate parameters */
    725     if ((num_blocks == 0) || (t3t_blocks == NULL))
    726         return (NFA_STATUS_INVALID_PARAM);
    727 
    728     if ((p_msg = (tNFA_RW_OPERATION *) GKI_getbuf ((UINT16) (sizeof (tNFA_RW_OPERATION) + (num_blocks * sizeof (tNFA_T3T_BLOCK_DESC))))) != NULL)
    729     {
    730         /* point to area after tNFA_RW_OPERATION */
    731         p_block_desc = (UINT8 *) (p_msg+1);
    732 
    733         /* Fill in tNFA_RW_OPERATION struct */
    734         p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT;
    735         p_msg->op        = NFA_RW_OP_T3T_READ;
    736 
    737         p_msg->params.t3t_read.num_blocks   = num_blocks;
    738         p_msg->params.t3t_read.p_block_desc = (tNFA_T3T_BLOCK_DESC *) p_block_desc;
    739 
    740         /* Copy block descriptor list */
    741         memcpy (p_block_desc, t3t_blocks, (num_blocks * sizeof (tNFA_T3T_BLOCK_DESC)));
    742 
    743         nfa_sys_sendmsg (p_msg);
    744 
    745         return (NFA_STATUS_OK);
    746     }
    747 
    748     return (NFA_STATUS_FAILED);
    749 }
    750 
    751 /*******************************************************************************
    752 **
    753 ** Function         NFA_RwT3tWrite
    754 **
    755 ** Description:
    756 **      Send an UPDATE (write) command to the activated Type 3 tag.
    757 **
    758 **      When the write operation has completed (or if an error occurs), the
    759 **      app will be notified with NFA_WRITE_CPLT_EVT.
    760 **
    761 ** Returns:
    762 **      NFA_STATUS_OK if successfully initiated
    763 **      NFA_STATUS_FAILED otherwise
    764 **
    765 *******************************************************************************/
    766 tNFA_STATUS NFA_RwT3tWrite (UINT8 num_blocks, tNFA_T3T_BLOCK_DESC *t3t_blocks,	UINT8 *p_data)
    767 {
    768     tNFA_RW_OPERATION *p_msg;
    769     UINT8 *p_block_desc, *p_data_area;
    770 
    771     NFA_TRACE_API1 ("NFA_RwT3tWrite (): num_blocks to write: %i", num_blocks);
    772 
    773     /* Validate parameters */
    774     if ((num_blocks == 0) || (t3t_blocks == NULL) | (p_data == NULL))
    775         return (NFA_STATUS_INVALID_PARAM);
    776 
    777     if ((p_msg = (tNFA_RW_OPERATION *) GKI_getbuf ((UINT16) (sizeof (tNFA_RW_OPERATION) + (num_blocks * (sizeof (tNFA_T3T_BLOCK_DESC) + 16))))) != NULL)
    778     {
    779         /* point to block descriptor and data areas after tNFA_RW_OPERATION */
    780         p_block_desc = (UINT8 *) (p_msg+1);
    781         p_data_area  = p_block_desc + (num_blocks * (sizeof (tNFA_T3T_BLOCK_DESC)));
    782 
    783         /* Fill in tNFA_RW_OPERATION struct */
    784         p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT;
    785         p_msg->op        = NFA_RW_OP_T3T_WRITE;
    786 
    787         p_msg->params.t3t_write.num_blocks   = num_blocks;
    788         p_msg->params.t3t_write.p_block_desc = (tNFA_T3T_BLOCK_DESC *) p_block_desc;
    789         p_msg->params.t3t_write.p_block_data = p_data_area;
    790 
    791         /* Copy block descriptor list */
    792         memcpy (p_block_desc, t3t_blocks, (num_blocks * sizeof (tNFA_T3T_BLOCK_DESC)));
    793 
    794         /* Copy data */
    795         memcpy (p_data_area, p_data, (num_blocks * 16));
    796 
    797         nfa_sys_sendmsg (p_msg);
    798 
    799         return (NFA_STATUS_OK);
    800     }
    801 
    802     return (NFA_STATUS_FAILED);
    803 }
    804 
    805 /*******************************************************************************
    806 **
    807 ** Function         NFA_RwI93Inventory
    808 **
    809 ** Description:
    810 **      Send Inventory command to the activated ISO 15693 tag with/without AFI
    811 **      If UID is provided then set UID[0]:MSB, ... UID[7]:LSB
    812 **
    813 **      When the operation has completed (or if an error occurs), the
    814 **      app will be notified with NFA_I93_CMD_CPLT_EVT.
    815 **
    816 ** Returns:
    817 **      NFA_STATUS_OK if successfully initiated
    818 **      NFA_STATUS_WRONG_PROTOCOL: ISO 15693 tag not activated
    819 **      NFA_STATUS_FAILED otherwise
    820 **
    821 *******************************************************************************/
    822 tNFA_STATUS NFA_RwI93Inventory (BOOLEAN afi_present, UINT8 afi, UINT8 *p_uid)
    823 {
    824     tNFA_RW_OPERATION *p_msg;
    825 
    826     NFA_TRACE_API2 ("NFA_RwI93Inventory (): afi_present:%d, AFI: 0x%02X", afi_present, afi);
    827 
    828     if (nfa_rw_cb.protocol != NFC_PROTOCOL_15693)
    829     {
    830         return (NFA_STATUS_WRONG_PROTOCOL);
    831     }
    832 
    833     if ((p_msg = (tNFA_RW_OPERATION *) GKI_getbuf ((UINT16) (sizeof (tNFA_RW_OPERATION)))) != NULL)
    834     {
    835         /* Fill in tNFA_RW_OPERATION struct */
    836         p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT;
    837         p_msg->op        = NFA_RW_OP_I93_INVENTORY;
    838 
    839         p_msg->params.i93_cmd.afi_present = afi_present;
    840         p_msg->params.i93_cmd.afi = afi;
    841 
    842         if (p_uid)
    843         {
    844             p_msg->params.i93_cmd.uid_present = TRUE;
    845             memcpy (p_msg->params.i93_cmd.uid, p_uid, I93_UID_BYTE_LEN);
    846         }
    847         else
    848         {
    849             p_msg->params.i93_cmd.uid_present = FALSE;
    850         }
    851 
    852         nfa_sys_sendmsg (p_msg);
    853 
    854         return (NFA_STATUS_OK);
    855     }
    856 
    857     return (NFA_STATUS_FAILED);
    858 }
    859 
    860 /*******************************************************************************
    861 **
    862 ** Function         NFA_RwI93StayQuiet
    863 **
    864 ** Description:
    865 **      Send Stay Quiet command to the activated ISO 15693 tag.
    866 **
    867 **      When the operation has completed (or if an error occurs), the
    868 **      app will be notified with NFA_I93_CMD_CPLT_EVT.
    869 **
    870 ** Returns:
    871 **      NFA_STATUS_OK if successfully initiated
    872 **      NFA_STATUS_WRONG_PROTOCOL: ISO 15693 tag not activated
    873 **      NFA_STATUS_FAILED otherwise
    874 **
    875 *******************************************************************************/
    876 tNFA_STATUS NFA_RwI93StayQuiet (void)
    877 {
    878     tNFA_RW_OPERATION *p_msg;
    879 
    880     NFA_TRACE_API0 ("NFA_RwI93StayQuiet ()");
    881 
    882     if (nfa_rw_cb.protocol != NFC_PROTOCOL_15693)
    883     {
    884         return (NFA_STATUS_WRONG_PROTOCOL);
    885     }
    886 
    887     if ((p_msg = (tNFA_RW_OPERATION *) GKI_getbuf ((UINT16) (sizeof (tNFA_RW_OPERATION)))) != NULL)
    888     {
    889         /* Fill in tNFA_RW_OPERATION struct */
    890         p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT;
    891         p_msg->op        = NFA_RW_OP_I93_STAY_QUIET;
    892 
    893         nfa_sys_sendmsg (p_msg);
    894 
    895         return (NFA_STATUS_OK);
    896     }
    897 
    898     return (NFA_STATUS_FAILED);
    899 }
    900 
    901 /*******************************************************************************
    902 **
    903 ** Function         NFA_RwI93ReadSingleBlock
    904 **
    905 ** Description:
    906 **      Send Read Single Block command to the activated ISO 15693 tag.
    907 **
    908 **      Data is returned to the application using the NFA_DATA_EVT. When the read
    909 **      operation has completed, or if an error occurs, the app will be notified with
    910 **      NFA_I93_CMD_CPLT_EVT.
    911 **
    912 ** Returns:
    913 **      NFA_STATUS_OK if successfully initiated
    914 **      NFA_STATUS_WRONG_PROTOCOL: ISO 15693 tag not activated
    915 **      NFA_STATUS_FAILED otherwise
    916 **
    917 *******************************************************************************/
    918 tNFA_STATUS NFA_RwI93ReadSingleBlock (UINT8 block_number)
    919 {
    920     tNFA_RW_OPERATION *p_msg;
    921 
    922     NFA_TRACE_API1 ("NFA_RwI93ReadSingleBlock (): block_number: 0x%02X", block_number);
    923 
    924     if (nfa_rw_cb.protocol != NFC_PROTOCOL_15693)
    925     {
    926         return (NFA_STATUS_WRONG_PROTOCOL);
    927     }
    928 
    929     if ((p_msg = (tNFA_RW_OPERATION *) GKI_getbuf ((UINT16) (sizeof (tNFA_RW_OPERATION)))) != NULL)
    930     {
    931         /* Fill in tNFA_RW_OPERATION struct */
    932         p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT;
    933         p_msg->op        = NFA_RW_OP_I93_READ_SINGLE_BLOCK;
    934 
    935         p_msg->params.i93_cmd.first_block_number = block_number;
    936 
    937         nfa_sys_sendmsg (p_msg);
    938 
    939         return (NFA_STATUS_OK);
    940     }
    941 
    942     return (NFA_STATUS_FAILED);
    943 }
    944 
    945 /*******************************************************************************
    946 **
    947 ** Function         NFA_RwI93WriteSingleBlock
    948 **
    949 ** Description:
    950 **      Send Write Single Block command to the activated ISO 15693 tag.
    951 **
    952 **      When the write operation has completed (or if an error occurs), the
    953 **      app will be notified with NFA_I93_CMD_CPLT_EVT.
    954 **
    955 ** Returns:
    956 **      NFA_STATUS_OK if successfully initiated
    957 **      NFA_STATUS_WRONG_PROTOCOL: ISO 15693 tag not activated
    958 **      NFA_STATUS_FAILED otherwise
    959 **
    960 *******************************************************************************/
    961 tNFA_STATUS NFA_RwI93WriteSingleBlock (UINT8 block_number,
    962                                        UINT8 *p_data)
    963 {
    964     tNFA_RW_OPERATION *p_msg;
    965 
    966     NFA_TRACE_API1 ("NFA_RwI93WriteSingleBlock (): block_number: 0x%02X", block_number);
    967 
    968     if (nfa_rw_cb.protocol != NFC_PROTOCOL_15693)
    969     {
    970         return (NFA_STATUS_WRONG_PROTOCOL);
    971     }
    972 
    973     /* we don't know block size of tag */
    974     if (  (nfa_rw_cb.i93_block_size == 0)
    975         ||(nfa_rw_cb.i93_num_block == 0)  )
    976     {
    977         return (NFA_STATUS_FAILED);
    978     }
    979 
    980     if ((p_msg = (tNFA_RW_OPERATION *) GKI_getbuf ((UINT16) (sizeof (tNFA_RW_OPERATION) + nfa_rw_cb.i93_block_size))) != NULL)
    981     {
    982         /* Fill in tNFA_RW_OPERATION struct */
    983         p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT;
    984         p_msg->op        = NFA_RW_OP_I93_WRITE_SINGLE_BLOCK;
    985 
    986         p_msg->params.i93_cmd.first_block_number = block_number;
    987         p_msg->params.i93_cmd.p_data             = (UINT8*) (p_msg + 1);
    988 
    989         memcpy (p_msg->params.i93_cmd.p_data, p_data, nfa_rw_cb.i93_block_size);
    990 
    991         nfa_sys_sendmsg (p_msg);
    992 
    993         return (NFA_STATUS_OK);
    994     }
    995 
    996     return (NFA_STATUS_FAILED);
    997 }
    998 
    999 /*******************************************************************************
   1000 **
   1001 ** Function         NFA_RwI93LockBlock
   1002 **
   1003 ** Description:
   1004 **      Send Lock block command to the activated ISO 15693 tag.
   1005 **
   1006 **      When the operation has completed (or if an error occurs), the
   1007 **      app will be notified with NFA_I93_CMD_CPLT_EVT.
   1008 **
   1009 ** Returns:
   1010 **      NFA_STATUS_OK if successfully initiated
   1011 **      NFA_STATUS_WRONG_PROTOCOL: ISO 15693 tag not activated
   1012 **      NFA_STATUS_FAILED otherwise
   1013 **
   1014 *******************************************************************************/
   1015 tNFA_STATUS NFA_RwI93LockBlock (UINT8 block_number)
   1016 {
   1017     tNFA_RW_OPERATION *p_msg;
   1018 
   1019     NFA_TRACE_API1 ("NFA_RwI93LockBlock (): block_number: 0x%02X", block_number);
   1020 
   1021     if (nfa_rw_cb.protocol != NFC_PROTOCOL_15693)
   1022     {
   1023         return (NFA_STATUS_WRONG_PROTOCOL);
   1024     }
   1025 
   1026     if ((p_msg = (tNFA_RW_OPERATION *) GKI_getbuf ((UINT16) (sizeof (tNFA_RW_OPERATION)))) != NULL)
   1027     {
   1028         /* Fill in tNFA_RW_OPERATION struct */
   1029         p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT;
   1030         p_msg->op        = NFA_RW_OP_I93_LOCK_BLOCK;
   1031 
   1032         p_msg->params.i93_cmd.first_block_number = block_number;
   1033 
   1034         nfa_sys_sendmsg (p_msg);
   1035 
   1036         return (NFA_STATUS_OK);
   1037     }
   1038 
   1039     return (NFA_STATUS_FAILED);
   1040 }
   1041 
   1042 /*******************************************************************************
   1043 **
   1044 ** Function         NFA_RwI93ReadMultipleBlocks
   1045 **
   1046 ** Description:
   1047 **      Send Read Multiple Block command to the activated ISO 15693 tag.
   1048 **
   1049 **      Data is returned to the application using the NFA_DATA_EVT. When the read
   1050 **      operation has completed, or if an error occurs, the app will be notified with
   1051 **      NFA_I93_CMD_CPLT_EVT.
   1052 **
   1053 ** Returns:
   1054 **      NFA_STATUS_OK if successfully initiated
   1055 **      NFA_STATUS_WRONG_PROTOCOL: ISO 15693 tag not activated
   1056 **      NFA_STATUS_FAILED otherwise
   1057 **
   1058 *******************************************************************************/
   1059 tNFA_STATUS NFA_RwI93ReadMultipleBlocks (UINT8  first_block_number,
   1060                                          UINT16 number_blocks)
   1061 {
   1062     tNFA_RW_OPERATION *p_msg;
   1063 
   1064     NFA_TRACE_API2 ("NFA_RwI93ReadMultipleBlocks(): %d, %d", first_block_number, number_blocks);
   1065 
   1066     if ( nfa_rw_cb.protocol != NFC_PROTOCOL_15693)
   1067     {
   1068         return (NFA_STATUS_WRONG_PROTOCOL);
   1069     }
   1070 
   1071     if ((p_msg = (tNFA_RW_OPERATION *) GKI_getbuf ((UINT16) (sizeof (tNFA_RW_OPERATION)))) != NULL)
   1072     {
   1073         /* Fill in tNFA_RW_OPERATION struct */
   1074         p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT;
   1075         p_msg->op        = NFA_RW_OP_I93_READ_MULTI_BLOCK;
   1076 
   1077         p_msg->params.i93_cmd.first_block_number = first_block_number;
   1078         p_msg->params.i93_cmd.number_blocks      = number_blocks;
   1079 
   1080         nfa_sys_sendmsg (p_msg);
   1081 
   1082         return (NFA_STATUS_OK);
   1083     }
   1084 
   1085     return (NFA_STATUS_FAILED);
   1086 }
   1087 
   1088 /*******************************************************************************
   1089 **
   1090 ** Function         NFA_RwI93WriteMultipleBlocks
   1091 **
   1092 ** Description:
   1093 **      Send Write Multiple Block command to the activated ISO 15693 tag.
   1094 **
   1095 **      When the write operation has completed (or if an error occurs), the
   1096 **      app will be notified with NFA_I93_CMD_CPLT_EVT.
   1097 **
   1098 ** Returns:
   1099 **      NFA_STATUS_OK if successfully initiated
   1100 **      NFA_STATUS_WRONG_PROTOCOL: ISO 15693 tag not activated
   1101 **      NFA_STATUS_FAILED otherwise
   1102 **
   1103 *******************************************************************************/
   1104 tNFA_STATUS NFA_RwI93WriteMultipleBlocks (UINT8  first_block_number,
   1105                                           UINT16 number_blocks,
   1106                                           UINT8 *p_data)
   1107 {
   1108     tNFA_RW_OPERATION *p_msg;
   1109     UINT16      data_length;
   1110 
   1111     NFA_TRACE_API2 ("NFA_RwI93WriteMultipleBlocks (): %d, %d", first_block_number, number_blocks);
   1112 
   1113     if ( nfa_rw_cb.protocol != NFC_PROTOCOL_15693)
   1114     {
   1115         return (NFA_STATUS_WRONG_PROTOCOL);
   1116     }
   1117 
   1118     /* we don't know block size of tag */
   1119     if ((nfa_rw_cb.i93_block_size == 0) || (nfa_rw_cb.i93_num_block == 0))
   1120     {
   1121         return (NFA_STATUS_FAILED);
   1122     }
   1123 
   1124     data_length = nfa_rw_cb.i93_block_size * number_blocks;
   1125 
   1126     if ((p_msg = (tNFA_RW_OPERATION *) GKI_getbuf ((UINT16) (sizeof (tNFA_RW_OPERATION) + data_length))) != NULL)
   1127     {
   1128         /* Fill in tNFA_RW_OPERATION struct */
   1129         p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT;
   1130         p_msg->op        = NFA_RW_OP_I93_WRITE_MULTI_BLOCK;
   1131 
   1132         p_msg->params.i93_cmd.first_block_number = first_block_number;
   1133         p_msg->params.i93_cmd.number_blocks      = number_blocks;
   1134         p_msg->params.i93_cmd.p_data             = (UINT8*) (p_msg + 1);
   1135 
   1136         memcpy (p_msg->params.i93_cmd.p_data, p_data, data_length);
   1137 
   1138         nfa_sys_sendmsg (p_msg);
   1139 
   1140         return (NFA_STATUS_OK);
   1141     }
   1142 
   1143     return (NFA_STATUS_FAILED);
   1144 }
   1145 
   1146 /*******************************************************************************
   1147 **
   1148 ** Function         NFA_RwI93Select
   1149 **
   1150 ** Description:
   1151 **      Send Select command to the activated ISO 15693 tag.
   1152 **
   1153 **      UID[0]: 0xE0, MSB
   1154 **      UID[1]: IC Mfg Code
   1155 **      ...
   1156 **      UID[7]: LSB
   1157 **
   1158 **      When the operation has completed (or if an error occurs), the
   1159 **      app will be notified with NFA_I93_CMD_CPLT_EVT.
   1160 **
   1161 ** Returns:
   1162 **      NFA_STATUS_OK if successfully initiated
   1163 **      NFA_STATUS_WRONG_PROTOCOL: ISO 15693 tag not activated
   1164 **      NFA_STATUS_FAILED otherwise
   1165 **
   1166 *******************************************************************************/
   1167 tNFA_STATUS NFA_RwI93Select (UINT8 *p_uid)
   1168 {
   1169     tNFA_RW_OPERATION *p_msg;
   1170 
   1171     NFA_TRACE_API3 ("NFA_RwI93Select (): UID: [%02X%02X%02X...]", *(p_uid), *(p_uid+1), *(p_uid+2));
   1172 
   1173     if (nfa_rw_cb.protocol != NFC_PROTOCOL_15693)
   1174     {
   1175         return (NFA_STATUS_WRONG_PROTOCOL);
   1176     }
   1177 
   1178     if ((p_msg = (tNFA_RW_OPERATION *) GKI_getbuf ((UINT16) (sizeof (tNFA_RW_OPERATION) + I93_UID_BYTE_LEN))) != NULL)
   1179     {
   1180         /* Fill in tNFA_RW_OPERATION struct */
   1181         p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT;
   1182         p_msg->op        = NFA_RW_OP_I93_SELECT;
   1183 
   1184         p_msg->params.i93_cmd.p_data = (UINT8 *) (p_msg + 1);
   1185         memcpy (p_msg->params.i93_cmd.p_data, p_uid, I93_UID_BYTE_LEN);
   1186 
   1187         nfa_sys_sendmsg (p_msg);
   1188 
   1189         return (NFA_STATUS_OK);
   1190     }
   1191 
   1192     return (NFA_STATUS_FAILED);
   1193 }
   1194 
   1195 /*******************************************************************************
   1196 **
   1197 ** Function         NFA_RwI93ResetToReady
   1198 **
   1199 ** Description:
   1200 **      Send Reset to ready command to the activated ISO 15693 tag.
   1201 **
   1202 **      When the operation has completed (or if an error occurs), the
   1203 **      app will be notified with NFA_I93_CMD_CPLT_EVT.
   1204 **
   1205 ** Returns:
   1206 **      NFA_STATUS_OK if successfully initiated
   1207 **      NFA_STATUS_WRONG_PROTOCOL: ISO 15693 tag not activated
   1208 **      NFA_STATUS_FAILED otherwise
   1209 **
   1210 *******************************************************************************/
   1211 tNFA_STATUS NFA_RwI93ResetToReady (void)
   1212 {
   1213     tNFA_RW_OPERATION *p_msg;
   1214 
   1215     NFA_TRACE_API0 ("NFA_RwI93ResetToReady ()");
   1216 
   1217     if (nfa_rw_cb.protocol != NFC_PROTOCOL_15693)
   1218     {
   1219         return (NFA_STATUS_WRONG_PROTOCOL);
   1220     }
   1221 
   1222     if ((p_msg = (tNFA_RW_OPERATION *) GKI_getbuf ((UINT16) (sizeof (tNFA_RW_OPERATION)))) != NULL)
   1223     {
   1224         /* Fill in tNFA_RW_OPERATION struct */
   1225         p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT;
   1226         p_msg->op        = NFA_RW_OP_I93_RESET_TO_READY;
   1227 
   1228         nfa_sys_sendmsg (p_msg);
   1229 
   1230         return (NFA_STATUS_OK);
   1231     }
   1232 
   1233     return (NFA_STATUS_FAILED);
   1234 }
   1235 
   1236 /*******************************************************************************
   1237 **
   1238 ** Function         NFA_RwI93WriteAFI
   1239 **
   1240 ** Description:
   1241 **      Send Write AFI command to the activated ISO 15693 tag.
   1242 **
   1243 **      When the operation has completed (or if an error occurs), the
   1244 **      app will be notified with NFA_I93_CMD_CPLT_EVT.
   1245 **
   1246 ** Returns:
   1247 **      NFA_STATUS_OK if successfully initiated
   1248 **      NFA_STATUS_WRONG_PROTOCOL: ISO 15693 tag not activated
   1249 **      NFA_STATUS_FAILED otherwise
   1250 **
   1251 *******************************************************************************/
   1252 tNFA_STATUS NFA_RwI93WriteAFI (UINT8 afi)
   1253 {
   1254     tNFA_RW_OPERATION *p_msg;
   1255 
   1256     NFA_TRACE_API1 ("NFA_RwI93WriteAFI (): AFI: 0x%02X", afi);
   1257 
   1258     if (nfa_rw_cb.protocol != NFC_PROTOCOL_15693)
   1259     {
   1260         return (NFA_STATUS_WRONG_PROTOCOL);
   1261     }
   1262 
   1263     if ((p_msg = (tNFA_RW_OPERATION *) GKI_getbuf ((UINT16) (sizeof (tNFA_RW_OPERATION)))) != NULL)
   1264     {
   1265         /* Fill in tNFA_RW_OPERATION struct */
   1266         p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT;
   1267         p_msg->op        = NFA_RW_OP_I93_WRITE_AFI;
   1268 
   1269         p_msg->params.i93_cmd.afi = afi;
   1270 
   1271         nfa_sys_sendmsg (p_msg);
   1272 
   1273         return (NFA_STATUS_OK);
   1274     }
   1275 
   1276     return (NFA_STATUS_FAILED);
   1277 }
   1278 
   1279 /*******************************************************************************
   1280 **
   1281 ** Function         NFA_RwI93LockAFI
   1282 **
   1283 ** Description:
   1284 **      Send Lock AFI command to the activated ISO 15693 tag.
   1285 **
   1286 **      When the operation has completed (or if an error occurs), the
   1287 **      app will be notified with NFA_I93_CMD_CPLT_EVT.
   1288 **
   1289 ** Returns:
   1290 **      NFA_STATUS_OK if successfully initiated
   1291 **      NFA_STATUS_WRONG_PROTOCOL: ISO 15693 tag not activated
   1292 **      NFA_STATUS_FAILED otherwise
   1293 **
   1294 *******************************************************************************/
   1295 tNFA_STATUS NFA_RwI93LockAFI (void)
   1296 {
   1297     tNFA_RW_OPERATION *p_msg;
   1298 
   1299     NFA_TRACE_API0 ("NFA_RwI93LockAFI ()");
   1300 
   1301     if (nfa_rw_cb.protocol != NFC_PROTOCOL_15693)
   1302     {
   1303         return (NFA_STATUS_WRONG_PROTOCOL);
   1304     }
   1305 
   1306     if ((p_msg = (tNFA_RW_OPERATION *) GKI_getbuf ((UINT16) (sizeof (tNFA_RW_OPERATION)))) != NULL)
   1307     {
   1308         /* Fill in tNFA_RW_OPERATION struct */
   1309         p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT;
   1310         p_msg->op        = NFA_RW_OP_I93_LOCK_AFI;
   1311 
   1312         nfa_sys_sendmsg (p_msg);
   1313 
   1314         return (NFA_STATUS_OK);
   1315     }
   1316 
   1317     return (NFA_STATUS_FAILED);
   1318 }
   1319 
   1320 /*******************************************************************************
   1321 **
   1322 ** Function         NFA_RwI93WriteDSFID
   1323 **
   1324 ** Description:
   1325 **      Send Write DSFID command to the activated ISO 15693 tag.
   1326 **
   1327 **      When the operation has completed (or if an error occurs), the
   1328 **      app will be notified with NFA_I93_CMD_CPLT_EVT.
   1329 **
   1330 ** Returns:
   1331 **      NFA_STATUS_OK if successfully initiated
   1332 **      NFA_STATUS_WRONG_PROTOCOL: ISO 15693 tag not activated
   1333 **      NFA_STATUS_FAILED otherwise
   1334 **
   1335 *******************************************************************************/
   1336 tNFA_STATUS NFA_RwI93WriteDSFID (UINT8 dsfid)
   1337 {
   1338     tNFA_RW_OPERATION *p_msg;
   1339 
   1340     NFA_TRACE_API1 ("NFA_RwI93WriteDSFID (): DSFID: 0x%02X", dsfid);
   1341 
   1342     if (nfa_rw_cb.protocol != NFC_PROTOCOL_15693)
   1343     {
   1344         return (NFA_STATUS_WRONG_PROTOCOL);
   1345     }
   1346 
   1347     if ((p_msg = (tNFA_RW_OPERATION *) GKI_getbuf ((UINT16) (sizeof (tNFA_RW_OPERATION)))) != NULL)
   1348     {
   1349         /* Fill in tNFA_RW_OPERATION struct */
   1350         p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT;
   1351         p_msg->op        = NFA_RW_OP_I93_WRITE_DSFID;
   1352 
   1353         p_msg->params.i93_cmd.dsfid = dsfid;
   1354 
   1355         nfa_sys_sendmsg (p_msg);
   1356 
   1357         return (NFA_STATUS_OK);
   1358     }
   1359 
   1360     return (NFA_STATUS_FAILED);
   1361 }
   1362 
   1363 /*******************************************************************************
   1364 **
   1365 ** Function         NFA_RwI93LockDSFID
   1366 **
   1367 ** Description:
   1368 **      Send Lock DSFID command to the activated ISO 15693 tag.
   1369 **
   1370 **      When the operation has completed (or if an error occurs), the
   1371 **      app will be notified with NFA_I93_CMD_CPLT_EVT.
   1372 **
   1373 ** Returns:
   1374 **      NFA_STATUS_OK if successfully initiated
   1375 **      NFA_STATUS_WRONG_PROTOCOL: ISO 15693 tag not activated
   1376 **      NFA_STATUS_FAILED otherwise
   1377 **
   1378 *******************************************************************************/
   1379 tNFA_STATUS NFA_RwI93LockDSFID (void)
   1380 {
   1381     tNFA_RW_OPERATION *p_msg;
   1382 
   1383     NFA_TRACE_API0 ("NFA_RwI93LockDSFID ()");
   1384 
   1385     if (nfa_rw_cb.protocol != NFC_PROTOCOL_15693)
   1386     {
   1387         return (NFA_STATUS_WRONG_PROTOCOL);
   1388     }
   1389 
   1390     if ((p_msg = (tNFA_RW_OPERATION *) GKI_getbuf ((UINT16) (sizeof (tNFA_RW_OPERATION)))) != NULL)
   1391     {
   1392         /* Fill in tNFA_RW_OPERATION struct */
   1393         p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT;
   1394         p_msg->op        = NFA_RW_OP_I93_LOCK_DSFID;
   1395 
   1396         nfa_sys_sendmsg (p_msg);
   1397 
   1398         return (NFA_STATUS_OK);
   1399     }
   1400 
   1401     return (NFA_STATUS_FAILED);
   1402 }
   1403 
   1404 /*******************************************************************************
   1405 **
   1406 ** Function         NFA_RwI93GetSysInfo
   1407 **
   1408 ** Description:
   1409 **      Send Get system information command to the activated ISO 15693 tag.
   1410 **      If UID is provided then set UID[0]:MSB, ... UID[7]:LSB
   1411 **
   1412 **      When the operation has completed (or if an error occurs), the
   1413 **      app will be notified with NFA_I93_CMD_CPLT_EVT.
   1414 **
   1415 ** Returns:
   1416 **      NFA_STATUS_OK if successfully initiated
   1417 **      NFA_STATUS_WRONG_PROTOCOL: ISO 15693 tag not activated
   1418 **      NFA_STATUS_FAILED otherwise
   1419 **
   1420 *******************************************************************************/
   1421 tNFA_STATUS NFA_RwI93GetSysInfo (UINT8 *p_uid)
   1422 {
   1423     tNFA_RW_OPERATION *p_msg;
   1424 
   1425     NFA_TRACE_API0 ("NFA_RwI93GetSysInfo ()");
   1426 
   1427     if (nfa_rw_cb.protocol != NFC_PROTOCOL_15693)
   1428     {
   1429         return (NFA_STATUS_WRONG_PROTOCOL);
   1430     }
   1431 
   1432     if ((p_msg = (tNFA_RW_OPERATION *) GKI_getbuf ((UINT16) (sizeof (tNFA_RW_OPERATION)))) != NULL)
   1433     {
   1434         /* Fill in tNFA_RW_OPERATION struct */
   1435         p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT;
   1436         p_msg->op        = NFA_RW_OP_I93_GET_SYS_INFO;
   1437 
   1438         if (p_uid)
   1439         {
   1440             p_msg->params.i93_cmd.uid_present = TRUE;
   1441             memcpy (p_msg->params.i93_cmd.uid, p_uid, I93_UID_BYTE_LEN);
   1442         }
   1443         else
   1444         {
   1445             p_msg->params.i93_cmd.uid_present = FALSE;
   1446         }
   1447 
   1448         nfa_sys_sendmsg (p_msg);
   1449 
   1450         return (NFA_STATUS_OK);
   1451     }
   1452 
   1453     return (NFA_STATUS_FAILED);
   1454 }
   1455 
   1456 /*******************************************************************************
   1457 **
   1458 ** Function         NFA_RwI93GetMultiBlockSecurityStatus
   1459 **
   1460 ** Description:
   1461 **      Send Get Multiple block security status command to the activated ISO 15693 tag.
   1462 **
   1463 **      Data is returned to the application using the NFA_DATA_EVT. When the read
   1464 **      operation has completed, or if an error occurs, the app will be notified with
   1465 **      NFA_I93_CMD_CPLT_EVT.
   1466 **
   1467 ** Returns:
   1468 **      NFA_STATUS_OK if successfully initiated
   1469 **      NFA_STATUS_WRONG_PROTOCOL: ISO 15693 tag not activated
   1470 **      NFA_STATUS_FAILED otherwise
   1471 **
   1472 *******************************************************************************/
   1473 tNFA_STATUS NFA_RwI93GetMultiBlockSecurityStatus (UINT8  first_block_number,
   1474                                                   UINT16 number_blocks)
   1475 {
   1476     tNFA_RW_OPERATION *p_msg;
   1477 
   1478     NFA_TRACE_API2 ("NFA_RwI93GetMultiBlockSecurityStatus(): %d, %d", first_block_number, number_blocks);
   1479 
   1480     if ( nfa_rw_cb.protocol != NFC_PROTOCOL_15693)
   1481     {
   1482         return (NFA_STATUS_WRONG_PROTOCOL);
   1483     }
   1484 
   1485     if ((p_msg = (tNFA_RW_OPERATION *) GKI_getbuf ((UINT16) (sizeof (tNFA_RW_OPERATION)))) != NULL)
   1486     {
   1487         /* Fill in tNFA_RW_OPERATION struct */
   1488         p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT;
   1489         p_msg->op        = NFA_RW_OP_I93_GET_MULTI_BLOCK_STATUS;
   1490 
   1491         p_msg->params.i93_cmd.first_block_number = first_block_number;
   1492         p_msg->params.i93_cmd.number_blocks      = number_blocks;
   1493 
   1494         nfa_sys_sendmsg (p_msg);
   1495 
   1496         return (NFA_STATUS_OK);
   1497     }
   1498 
   1499     return (NFA_STATUS_FAILED);
   1500 }
   1501