/******************************************************************************
 *
 *  Copyright (C) 2010-2014 Broadcom Corporation
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at:
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 *
 ******************************************************************************/

/******************************************************************************
 *
 *  NFA interface for tag Reader/Writer
 *
 ******************************************************************************/
#include <string.h>

#include <android-base/stringprintf.h>
#include <base/logging.h>
#include <log/log.h>

#include "nfa_api.h"
#include "nfa_rw_int.h"

using android::base::StringPrintf;

extern bool nfc_debug_enabled;

/*****************************************************************************
**  Constants
*****************************************************************************/

/*****************************************************************************
**  APIs
*****************************************************************************/

/*******************************************************************************
**
** Function         NFA_RwDetectNDef
**
** Description      Perform the NDEF detection procedure  using the appropriate
**                  method for the currently activated tag.
**
**                  Upon successful completion of NDEF detection, a
**                  NFA_NDEF_DETECT_EVT will be sent, to notify the application
**                  of the NDEF attributes (NDEF total memory size, current
**                  size, etc.).
**
**                  It is not mandatory to call this function -  NFA_RwReadNDef
**                  and NFA_RwWriteNDef will perform NDEF detection internally
**                  if not performed already. This API may be called to get a
**                  tag's NDEF size before issuing a write-request.
**
** Returns:
**                  NFA_STATUS_OK if successfully initiated
**                  NFC_STATUS_REFUSED if tag does not support NDEF
**                  NFA_STATUS_FAILED otherwise
**
*******************************************************************************/
tNFA_STATUS NFA_RwDetectNDef(void) {
  tNFA_RW_OPERATION* p_msg;

  DLOG_IF(INFO, nfc_debug_enabled) << __func__;

  p_msg = (tNFA_RW_OPERATION*)GKI_getbuf((uint16_t)(sizeof(tNFA_RW_OPERATION)));
  if (p_msg != nullptr) {
    p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT;
    p_msg->op = NFA_RW_OP_DETECT_NDEF;

    nfa_sys_sendmsg(p_msg);

    return (NFA_STATUS_OK);
  }

  return (NFA_STATUS_FAILED);
}

/*******************************************************************************
**
** Function         NFA_RwReadNDef
**
** Description      Read NDEF message from tag. This function will internally
**                  perform the NDEF detection procedure (if not performed
**                  previously), and read the NDEF tag data using the
**                  appropriate method for the currently activated tag.
**
**                  Upon successful completion of NDEF detection (if performed),
**                  a NFA_NDEF_DETECT_EVT will be sent, to notify the
**                  application of the NDEF attributes (NDEF total memory size,
**                  current size, etc.).
**
**                  Upon receiving the NDEF message, the message will be sent to
**                  the handler registered with NFA_RegisterNDefTypeHandler or
**                  NFA_RequestExclusiveRfControl (if exclusive RF mode is
**                  active)
**
** Returns:
**                  NFA_STATUS_OK if successfully initiated
**                  NFC_STATUS_REFUSED if tag does not support NDEF
**                  NFC_STATUS_NOT_INITIALIZED if NULL NDEF was detected on the
**                  tag
**                  NFA_STATUS_FAILED otherwise
**
*******************************************************************************/
tNFA_STATUS NFA_RwReadNDef(void) {
  tNFA_RW_OPERATION* p_msg;

  DLOG_IF(INFO, nfc_debug_enabled) << __func__;

  p_msg = (tNFA_RW_OPERATION*)GKI_getbuf((uint16_t)(sizeof(tNFA_RW_OPERATION)));
  if (p_msg != nullptr) {
    p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT;
    p_msg->op = NFA_RW_OP_READ_NDEF;

    nfa_sys_sendmsg(p_msg);

    return (NFA_STATUS_OK);
  }

  return (NFA_STATUS_FAILED);
}

/*******************************************************************************
**
** Function         NFA_RwWriteNDef
**
** Description      Write NDEF data to the activated tag. This function will
**                  internally perform NDEF detection if necessary, and write
**                  the NDEF tag data using the appropriate method for the
**                  currently activated tag.
**
**                  When the entire message has been written, or if an error
**                  occurs, the app will be notified with NFA_WRITE_CPLT_EVT.
**
**                  p_data needs to be persistent until NFA_WRITE_CPLT_EVT
**
**
** Returns:
**                  NFA_STATUS_OK if successfully initiated
**                  NFC_STATUS_REFUSED if tag does not support NDEF/locked
**                  NFA_STATUS_FAILED otherwise
**
*******************************************************************************/
tNFA_STATUS NFA_RwWriteNDef(uint8_t* p_data, uint32_t len) {
  tNFA_RW_OPERATION* p_msg;

  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("ndef len: %i", len);

  /* Validate parameters */
  if (p_data == nullptr) return (NFA_STATUS_INVALID_PARAM);

  p_msg = (tNFA_RW_OPERATION*)GKI_getbuf((uint16_t)(sizeof(tNFA_RW_OPERATION)));
  if (p_msg != nullptr) {
    p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT;
    p_msg->op = NFA_RW_OP_WRITE_NDEF;
    p_msg->params.write_ndef.len = len;
    p_msg->params.write_ndef.p_data = p_data;
    nfa_sys_sendmsg(p_msg);

    return (NFA_STATUS_OK);
  }

  return (NFA_STATUS_FAILED);
}

/*****************************************************************************
**
** Function         NFA_RwPresenceCheck
**
** Description      Check if the tag is still in the field.
**
**                  The NFA_RW_PRESENCE_CHECK_EVT w/ status is used to
**                  indicate presence or non-presence.
**
**                  option is used only with ISO-DEP protocol
**
** Returns
**                  NFA_STATUS_OK if successfully initiated
**                  NFA_STATUS_FAILED otherwise
**
*****************************************************************************/
tNFA_STATUS NFA_RwPresenceCheck(tNFA_RW_PRES_CHK_OPTION option) {
  tNFA_RW_OPERATION* p_msg;

  DLOG_IF(INFO, nfc_debug_enabled) << __func__;

  p_msg = (tNFA_RW_OPERATION*)GKI_getbuf((uint16_t)(sizeof(tNFA_RW_OPERATION)));
  if (p_msg != nullptr) {
    p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT;
    p_msg->op = NFA_RW_OP_PRESENCE_CHECK;
    p_msg->params.option = option;

    nfa_sys_sendmsg(p_msg);

    return (NFA_STATUS_OK);
  }

  return (NFA_STATUS_FAILED);
}

/*****************************************************************************
**
** Function         NFA_RwFormatTag
**
** Description      Check if the tag is NDEF Formatable. If yes Format the tag
**
**                  The NFA_RW_FORMAT_CPLT_EVT w/ status is used to
**                  indicate if tag is successfully formated or not
**
** Returns
**                  NFA_STATUS_OK if successfully initiated
**                  NFA_STATUS_FAILED otherwise
**
*****************************************************************************/
tNFA_STATUS NFA_RwFormatTag(void) {
  tNFA_RW_OPERATION* p_msg;

  DLOG_IF(INFO, nfc_debug_enabled) << __func__;

  p_msg = (tNFA_RW_OPERATION*)GKI_getbuf((uint16_t)(sizeof(tNFA_RW_OPERATION)));
  if (p_msg != nullptr) {
    p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT;
    p_msg->op = NFA_RW_OP_FORMAT_TAG;

    nfa_sys_sendmsg(p_msg);

    return (NFA_STATUS_OK);
  }

  return (NFA_STATUS_FAILED);
}

/*******************************************************************************
**
** Function         NFA_RwSetTagReadOnly
**
** Description:
**      Sets tag as read only.
**
**      When tag is set as read only, or if an error occurs, the app will be
**      notified with NFA_SET_TAG_RO_EVT.
**
** Returns:
**      NFA_STATUS_OK if successfully initiated
**      NFA_STATUS_REJECTED if protocol is not T1/T2/T5T
**                 (or) if hard lock is not requested for protocol T5T
**      NFA_STATUS_FAILED otherwise
**
*******************************************************************************/
tNFA_STATUS NFA_RwSetTagReadOnly(bool b_hard_lock) {
  tNFA_RW_OPERATION* p_msg;
  tNFC_PROTOCOL protocol = nfa_rw_cb.protocol;

  if ((protocol != NFC_PROTOCOL_T1T) && (protocol != NFC_PROTOCOL_T2T) &&
      (protocol != NFC_PROTOCOL_T5T) && (protocol != NFC_PROTOCOL_ISO_DEP) &&
      (protocol != NFC_PROTOCOL_T3T)) {
    DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
        "Cannot Configure as read only for Protocol: "
        "%d",
        protocol);
    return (NFA_STATUS_REJECTED);
  }

  if ((!b_hard_lock && (protocol == NFC_PROTOCOL_T5T)) ||
      (b_hard_lock && (protocol == NFC_PROTOCOL_ISO_DEP))) {
    DLOG_IF(INFO, nfc_debug_enabled)
        << StringPrintf("Cannot %s for Protocol: %d",
                        b_hard_lock ? "Hard lock" : "Soft lock", protocol);
    return (NFA_STATUS_REJECTED);
  }

  DLOG_IF(INFO, nfc_debug_enabled)
      << StringPrintf("%s", b_hard_lock ? "Hard lock" : "Soft lock");

  p_msg = (tNFA_RW_OPERATION*)GKI_getbuf((uint16_t)(sizeof(tNFA_RW_OPERATION)));
  if (p_msg != nullptr) {
    /* Fill in tNFA_RW_OPERATION struct */
    p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT;
    p_msg->op = NFA_RW_OP_SET_TAG_RO;
    p_msg->params.set_readonly.b_hard_lock = b_hard_lock;

    nfa_sys_sendmsg(p_msg);
    return (NFA_STATUS_OK);
  }
  return (NFA_STATUS_FAILED);
}

/*******************************************************************************
** Tag specific APIs
** (note: for Type-4 tags, use NFA_SendRawFrame to exchange APDUs)
*******************************************************************************/

/*******************************************************************************
**
** Function         NFA_RwLocateTlv
**
** Description:
**      Search for the Lock/Memory contril TLV on the activated Type1/Type2 tag
**
**      Data is returned to the application using the NFA_TLV_DETECT_EVT. When
**      search operation has completed, or if an error occurs, the app will be
**      notified with NFA_TLV_DETECT_EVT.
**
** Description      Perform the TLV detection procedure  using the appropriate
**                  method for the currently activated tag.
**
**                  Upon successful completion of TLV detection in T1/T2 tag, a
**                  NFA_TLV_DETECT_EVT will be sent, to notify the application
**                  of the TLV attributes (total lock/reserved bytes etc.).
**                  However if the TLV type specified is NDEF then it is same as
**                  calling NFA_RwDetectNDef and should expect to receive
**                  NFA_NDEF_DETECT_EVT instead of NFA_TLV_DETECT_EVT
**
**                  It is not mandatory to call this function -
**                  NFA_RwDetectNDef, NFA_RwReadNDef and NFA_RwWriteNDef will
**                  perform TLV detection internally if not performed already.
**                  An application may call this API to check the a
**                  tag/card-emulator's total Reserved/
**                  Lock bytes before issuing a write-request.
**
** Returns:
**                  NFA_STATUS_OK if successfully initiated
**                  NFC_STATUS_REFUSED if tlv_type is NDEF & tag won't support
**                  NDEF
**                  NFA_STATUS_FAILED otherwise
**
*******************************************************************************/
tNFA_STATUS NFA_RwLocateTlv(uint8_t tlv_type) {
  tNFA_RW_OPERATION* p_msg;

  DLOG_IF(INFO, nfc_debug_enabled) << __func__;

  p_msg = (tNFA_RW_OPERATION*)GKI_getbuf((uint16_t)(sizeof(tNFA_RW_OPERATION)));
  if (p_msg != nullptr) {
    p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT;

    if (tlv_type == TAG_LOCK_CTRL_TLV) {
      p_msg->op = NFA_RW_OP_DETECT_LOCK_TLV;
    } else if (tlv_type == TAG_MEM_CTRL_TLV) {
      p_msg->op = NFA_RW_OP_DETECT_MEM_TLV;
    } else if (tlv_type == TAG_NDEF_TLV) {
      p_msg->op = NFA_RW_OP_DETECT_NDEF;
    } else
      return (NFA_STATUS_FAILED);

    nfa_sys_sendmsg(p_msg);

    return (NFA_STATUS_OK);
  }

  return (NFA_STATUS_FAILED);
}

/*******************************************************************************
**
** Function         NFA_RwT1tRid
**
** Description:
**      Send a RID command to the activated Type 1 tag.
**
**      Data is returned to the application using the NFA_DATA_EVT. When the
**      read operation has completed, or if an error occurs, the app will be
**      notified with NFA_READ_CPLT_EVT.
**
** Returns:
**      NFA_STATUS_OK if successfully initiated
**      NFA_STATUS_FAILED otherwise
**
*******************************************************************************/
tNFA_STATUS NFA_RwT1tRid(void) {
  tNFA_RW_OPERATION* p_msg;

  p_msg = (tNFA_RW_OPERATION*)GKI_getbuf((uint16_t)(sizeof(tNFA_RW_OPERATION)));
  if (p_msg != nullptr) {
    /* Fill in tNFA_RW_OPERATION struct */
    p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT;
    p_msg->op = NFA_RW_OP_T1T_RID;

    nfa_sys_sendmsg(p_msg);
    return (NFA_STATUS_OK);
  }
  return (NFA_STATUS_FAILED);
}

/*******************************************************************************
**
** Function         NFA_RwT1tReadAll
**
** Description:
**      Send a RALL command to the activated Type 1 tag.
**
**      Data is returned to the application using the NFA_DATA_EVT. When the
**      read operation has completed, or if an error occurs, the app will be
**      notified with NFA_READ_CPLT_EVT.
**
** Returns:
**      NFA_STATUS_OK if successfully initiated
**      NFA_STATUS_FAILED otherwise
**
*******************************************************************************/
tNFA_STATUS NFA_RwT1tReadAll(void) {
  tNFA_RW_OPERATION* p_msg;

  p_msg = (tNFA_RW_OPERATION*)GKI_getbuf((uint16_t)(sizeof(tNFA_RW_OPERATION)));
  if (p_msg != nullptr) {
    /* Fill in tNFA_RW_OPERATION struct */
    p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT;
    p_msg->op = NFA_RW_OP_T1T_RALL;

    nfa_sys_sendmsg(p_msg);
    return (NFA_STATUS_OK);
  }
  return (NFA_STATUS_FAILED);
}

/*******************************************************************************
**
** Function         NFA_RwT1tRead
**
** Description:
**      Send a READ command to the activated Type 1 tag.
**
**      Data is returned to the application using the NFA_DATA_EVT. When the
**      read operation has completed, or if an error occurs, the app will be
**      notified with NFA_READ_CPLT_EVT.
**
** Returns:
**      NFA_STATUS_OK if successfully initiated
**      NFA_STATUS_FAILED otherwise
**
*******************************************************************************/
tNFA_STATUS NFA_RwT1tRead(uint8_t block_number, uint8_t index) {
  tNFA_RW_OPERATION* p_msg;

  p_msg = (tNFA_RW_OPERATION*)GKI_getbuf((uint16_t)(sizeof(tNFA_RW_OPERATION)));
  if (p_msg != nullptr) {
    /* Fill in tNFA_RW_OPERATION struct */
    p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT;
    p_msg->op = NFA_RW_OP_T1T_READ;
    p_msg->params.t1t_read.block_number = block_number;
    p_msg->params.t1t_read.index = index;

    nfa_sys_sendmsg(p_msg);
    return (NFA_STATUS_OK);
  }
  return (NFA_STATUS_FAILED);
}

/*******************************************************************************
**
** Function         NFA_RwT1tWrite
**
** Description:
**      Send a WRITE command to the activated Type 1 tag.
**
**      Data is returned to the application using the NFA_DATA_EVT. When the
**      write operation has completed, or if an error occurs, the app will be
**      notified with NFA_WRITE_CPLT_EVT.
**
** Returns:
**      NFA_STATUS_OK if successfully initiated
**      NFA_STATUS_FAILED otherwise
**
*******************************************************************************/
tNFA_STATUS NFA_RwT1tWrite(uint8_t block_number, uint8_t index, uint8_t data,
                           bool b_erase) {
  tNFA_RW_OPERATION* p_msg;

  p_msg = (tNFA_RW_OPERATION*)GKI_getbuf((uint16_t)(sizeof(tNFA_RW_OPERATION)));
  if (p_msg != nullptr) {
    /* Fill in tNFA_RW_OPERATION struct */
    p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT;
    p_msg->params.t1t_write.b_erase = b_erase;
    p_msg->op = NFA_RW_OP_T1T_WRITE;
    p_msg->params.t1t_write.block_number = block_number;
    p_msg->params.t1t_write.index = index;
    p_msg->params.t1t_write.p_block_data[0] = data;

    nfa_sys_sendmsg(p_msg);
    return (NFA_STATUS_OK);
  }
  return (NFA_STATUS_FAILED);
}

/*******************************************************************************
**
** Function         NFA_RwT1tReadSeg
**
** Description:
**      Send a RSEG command to the activated Type 1 tag.
**
**      Data is returned to the application using the NFA_DATA_EVT. When the
**      read operation has completed, or if an error occurs, the app will be
**      notified with NFA_READ_CPLT_EVT.
**
** Returns:
**      NFA_STATUS_OK if successfully initiated
**      NFA_STATUS_FAILED otherwise
**
*******************************************************************************/
tNFA_STATUS NFA_RwT1tReadSeg(uint8_t segment_number) {
  tNFA_RW_OPERATION* p_msg;

  p_msg = (tNFA_RW_OPERATION*)GKI_getbuf((uint16_t)(sizeof(tNFA_RW_OPERATION)));
  if (p_msg != nullptr) {
    /* Fill in tNFA_RW_OPERATION struct */
    p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT;
    p_msg->op = NFA_RW_OP_T1T_RSEG;
    p_msg->params.t1t_read.segment_number = segment_number;

    nfa_sys_sendmsg(p_msg);
    return (NFA_STATUS_OK);
  }
  return (NFA_STATUS_FAILED);
}

/*******************************************************************************
**
** Function         NFA_RwT1tRead8
**
** Description:
**      Send a READ8 command to the activated Type 1 tag.
**
**      Data is returned to the application using the NFA_DATA_EVT. When the
**      read operation has completed, or if an error occurs, the app will be
**      notified with NFA_READ_CPLT_EVT.
**
** Returns:
**      NFA_STATUS_OK if successfully initiated
**      NFA_STATUS_FAILED otherwise
**
*******************************************************************************/
tNFA_STATUS NFA_RwT1tRead8(uint8_t block_number) {
  tNFA_RW_OPERATION* p_msg;

  p_msg = (tNFA_RW_OPERATION*)GKI_getbuf((uint16_t)(sizeof(tNFA_RW_OPERATION)));
  if (p_msg != nullptr) {
    /* Fill in tNFA_RW_OPERATION struct */
    p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT;
    p_msg->op = NFA_RW_OP_T1T_READ8;
    p_msg->params.t1t_write.block_number = block_number;

    nfa_sys_sendmsg(p_msg);
    return (NFA_STATUS_OK);
  }
  return (NFA_STATUS_FAILED);
}

/*******************************************************************************
**
** Function         NFA_RwT1tWrite8
**
** Description:
**      Send a WRITE8_E / WRITE8_NE command to the activated Type 1 tag.
**
**      Data is returned to the application using the NFA_DATA_EVT. When the
**      read operation has completed, or if an error occurs, the app will be
**      notified with NFA_READ_CPLT_EVT.
**
** Returns:
**      NFA_STATUS_OK if successfully initiated
**      NFA_STATUS_FAILED otherwise
**
*******************************************************************************/
tNFA_STATUS NFA_RwT1tWrite8(uint8_t block_number, uint8_t* p_data,
                            bool b_erase) {
  tNFA_RW_OPERATION* p_msg;

  p_msg = (tNFA_RW_OPERATION*)GKI_getbuf((uint16_t)(sizeof(tNFA_RW_OPERATION)));
  if (p_msg != nullptr) {
    /* Fill in tNFA_RW_OPERATION struct */
    p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT;
    p_msg->params.t1t_write.b_erase = b_erase;
    p_msg->op = NFA_RW_OP_T1T_WRITE8;
    p_msg->params.t1t_write.block_number = block_number;

    memcpy(p_msg->params.t1t_write.p_block_data, p_data, 8);

    nfa_sys_sendmsg(p_msg);
    return (NFA_STATUS_OK);
  }
  return (NFA_STATUS_FAILED);
}

/*******************************************************************************
**
** Function         NFA_RwT2tRead
**
** Description:
**      Send a READ command to the activated Type 2 tag.
**
**      Data is returned to the application using the NFA_DATA_EVT. When the
**      read operation has completed, or if an error occurs, the app will be
**      notified with NFA_READ_CPLT_EVT.
**
** Returns:
**      NFA_STATUS_OK if successfully initiated
**      NFA_STATUS_FAILED otherwise
**
*******************************************************************************/
tNFA_STATUS NFA_RwT2tRead(uint8_t block_number) {
  tNFA_RW_OPERATION* p_msg;

  DLOG_IF(INFO, nfc_debug_enabled)
      << StringPrintf("Block to read: %d", block_number);

  p_msg = (tNFA_RW_OPERATION*)GKI_getbuf((uint16_t)(sizeof(tNFA_RW_OPERATION)));
  if (p_msg != nullptr) {
    /* Fill in tNFA_RW_OPERATION struct */
    p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT;
    p_msg->op = NFA_RW_OP_T2T_READ;
    p_msg->params.t2t_read.block_number = block_number;

    nfa_sys_sendmsg(p_msg);
    return (NFA_STATUS_OK);
  }
  return (NFA_STATUS_FAILED);
}

/*******************************************************************************
**
** Function         NFA_RwT2tWrite
**
** Description:
**      Send an WRITE command to the activated Type 2 tag.
**
**      When the write operation has completed (or if an error occurs), the
**      app will be notified with NFA_WRITE_CPLT_EVT.
**
** Returns:
**      NFA_STATUS_OK if successfully initiated
**      NFA_STATUS_FAILED otherwise
**
*******************************************************************************/
tNFA_STATUS NFA_RwT2tWrite(uint8_t block_number, uint8_t* p_data) {
  tNFA_RW_OPERATION* p_msg;

  DLOG_IF(INFO, nfc_debug_enabled)
      << StringPrintf("Block to write: %d", block_number);

  p_msg = (tNFA_RW_OPERATION*)GKI_getbuf((uint16_t)(sizeof(tNFA_RW_OPERATION)));
  if (p_msg != nullptr) {
    /* Fill in tNFA_RW_OPERATION struct */
    p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT;
    p_msg->op = NFA_RW_OP_T2T_WRITE;

    p_msg->params.t2t_write.block_number = block_number;

    memcpy(p_msg->params.t2t_write.p_block_data, p_data, 4);

    nfa_sys_sendmsg(p_msg);
    return (NFA_STATUS_OK);
  }
  return (NFA_STATUS_FAILED);
}

/*******************************************************************************
**
** Function         NFA_RwT2tSectorSelect
**
** Description:
**      Send SECTOR SELECT command to the activated Type 2 tag.
**
**      When the sector select operation has completed (or if an error occurs),
**      the app will be notified with NFA_SECTOR_SELECT_CPLT_EVT.
**
** Returns:
**      NFA_STATUS_OK if successfully initiated
**      NFA_STATUS_FAILED otherwise
**
*******************************************************************************/
tNFA_STATUS NFA_RwT2tSectorSelect(uint8_t sector_number) {
  tNFA_RW_OPERATION* p_msg;

  DLOG_IF(INFO, nfc_debug_enabled)
      << StringPrintf("sector to select: %d", sector_number);

  p_msg = (tNFA_RW_OPERATION*)GKI_getbuf((uint16_t)(sizeof(tNFA_RW_OPERATION)));
  if (p_msg != nullptr) {
    /* Fill in tNFA_RW_OPERATION struct */
    p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT;
    p_msg->op = NFA_RW_OP_T2T_SECTOR_SELECT;

    p_msg->params.t2t_sector_select.sector_number = sector_number;

    nfa_sys_sendmsg(p_msg);
    return (NFA_STATUS_OK);
  }
  return (NFA_STATUS_FAILED);
}

/*******************************************************************************
**
** Function         NFA_RwT3tRead
**
** Description:
**      Send a CHECK (read) command to the activated Type 3 tag.
**
**      Data is returned to the application using the NFA_DATA_EVT. When the
**      read operation has completed, or if an error occurs, the app will be
**      notified with NFA_READ_CPLT_EVT.
**
** Returns:
**      NFA_STATUS_OK if successfully initiated
**      NFA_STATUS_FAILED otherwise
**
*******************************************************************************/
tNFA_STATUS NFA_RwT3tRead(uint8_t num_blocks, tNFA_T3T_BLOCK_DESC* t3t_blocks) {
  tNFA_RW_OPERATION* p_msg;
  uint8_t* p_block_desc;

  DLOG_IF(INFO, nfc_debug_enabled)
      << StringPrintf("num_blocks to read: %i", num_blocks);

  /* Validate parameters */
  if ((num_blocks == 0) || (t3t_blocks == nullptr))
    return (NFA_STATUS_INVALID_PARAM);

  p_msg = (tNFA_RW_OPERATION*)GKI_getbuf((uint16_t)(
      sizeof(tNFA_RW_OPERATION) + (num_blocks * sizeof(tNFA_T3T_BLOCK_DESC))));
  if (p_msg != nullptr) {
    /* point to area after tNFA_RW_OPERATION */
    p_block_desc = (uint8_t*)(p_msg + 1);

    /* Fill in tNFA_RW_OPERATION struct */
    p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT;
    p_msg->op = NFA_RW_OP_T3T_READ;

    p_msg->params.t3t_read.num_blocks = num_blocks;
    p_msg->params.t3t_read.p_block_desc = (tNFA_T3T_BLOCK_DESC*)p_block_desc;

    /* Copy block descriptor list */
    memcpy(p_block_desc, t3t_blocks,
           (num_blocks * sizeof(tNFA_T3T_BLOCK_DESC)));

    nfa_sys_sendmsg(p_msg);

    return (NFA_STATUS_OK);
  }

  return (NFA_STATUS_FAILED);
}

/*******************************************************************************
**
** Function         NFA_RwT3tWrite
**
** Description:
**      Send an UPDATE (write) command to the activated Type 3 tag.
**
**      When the write operation has completed (or if an error occurs), the
**      app will be notified with NFA_WRITE_CPLT_EVT.
**
** Returns:
**      NFA_STATUS_OK if successfully initiated
**      NFA_STATUS_FAILED otherwise
**
*******************************************************************************/
tNFA_STATUS NFA_RwT3tWrite(uint8_t num_blocks, tNFA_T3T_BLOCK_DESC* t3t_blocks,
                           uint8_t* p_data) {
  tNFA_RW_OPERATION* p_msg;
  uint8_t *p_block_desc, *p_data_area;

  DLOG_IF(INFO, nfc_debug_enabled)
      << StringPrintf("num_blocks to write: %i", num_blocks);

  /* Validate parameters */
  if ((num_blocks == 0) || (t3t_blocks == nullptr) | (p_data == nullptr))
    return (NFA_STATUS_INVALID_PARAM);

  p_msg = (tNFA_RW_OPERATION*)GKI_getbuf(
      (uint16_t)(sizeof(tNFA_RW_OPERATION) +
                 (num_blocks * (sizeof(tNFA_T3T_BLOCK_DESC) + 16))));
  if (p_msg != nullptr) {
    /* point to block descriptor and data areas after tNFA_RW_OPERATION */
    p_block_desc = (uint8_t*)(p_msg + 1);
    p_data_area = p_block_desc + (num_blocks * (sizeof(tNFA_T3T_BLOCK_DESC)));

    /* Fill in tNFA_RW_OPERATION struct */
    p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT;
    p_msg->op = NFA_RW_OP_T3T_WRITE;

    p_msg->params.t3t_write.num_blocks = num_blocks;
    p_msg->params.t3t_write.p_block_desc = (tNFA_T3T_BLOCK_DESC*)p_block_desc;
    p_msg->params.t3t_write.p_block_data = p_data_area;

    /* Copy block descriptor list */
    memcpy(p_block_desc, t3t_blocks,
           (num_blocks * sizeof(tNFA_T3T_BLOCK_DESC)));

    /* Copy data */
    memcpy(p_data_area, p_data, (num_blocks * 16));

    nfa_sys_sendmsg(p_msg);

    return (NFA_STATUS_OK);
  }

  return (NFA_STATUS_FAILED);
}

/*******************************************************************************
**
** Function         NFA_RwI93Inventory
**
** Description:
**      Send Inventory command to the activated ISO T5T tag with/without AFI
**      If UID is provided then set UID[0]:MSB, ... UID[7]:LSB
**
**      When the operation has completed (or if an error occurs), the
**      app will be notified with NFA_I93_CMD_CPLT_EVT.
**
** Returns:
**      NFA_STATUS_OK if successfully initiated
**      NFA_STATUS_WRONG_PROTOCOL: T5T tag not activated
**      NFA_STATUS_FAILED otherwise
**
*******************************************************************************/
tNFA_STATUS NFA_RwI93Inventory(bool afi_present, uint8_t afi, uint8_t* p_uid) {
  tNFA_RW_OPERATION* p_msg;

  DLOG_IF(INFO, nfc_debug_enabled)
      << StringPrintf("afi_present:%d, AFI: 0x%02X", afi_present, afi);

  if (nfa_rw_cb.protocol != NFC_PROTOCOL_T5T) {
    return (NFA_STATUS_WRONG_PROTOCOL);
  }

  p_msg = (tNFA_RW_OPERATION*)GKI_getbuf((uint16_t)(sizeof(tNFA_RW_OPERATION)));
  if (p_msg != nullptr) {
    /* Fill in tNFA_RW_OPERATION struct */
    p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT;
    p_msg->op = NFA_RW_OP_I93_INVENTORY;

    p_msg->params.i93_cmd.afi_present = afi_present;
    p_msg->params.i93_cmd.afi = afi;

    if (p_uid) {
      p_msg->params.i93_cmd.uid_present = true;
      memcpy(p_msg->params.i93_cmd.uid, p_uid, I93_UID_BYTE_LEN);
    } else {
      p_msg->params.i93_cmd.uid_present = false;
    }

    nfa_sys_sendmsg(p_msg);

    return (NFA_STATUS_OK);
  }

  return (NFA_STATUS_FAILED);
}

/*******************************************************************************
**
** Function         NFA_RwI93StayQuiet
**
** Description:
**      Send Stay Quiet command to the activated T5T tag.
**
**      When the operation has completed (or if an error occurs), the
**      app will be notified with NFA_I93_CMD_CPLT_EVT.
**
** Returns:
**      NFA_STATUS_OK if successfully initiated
**      NFA_STATUS_WRONG_PROTOCOL: T5T tag not activated
**      NFA_STATUS_FAILED otherwise
**
*******************************************************************************/
tNFA_STATUS NFA_RwI93StayQuiet(void) {
  tNFA_RW_OPERATION* p_msg;

  DLOG_IF(INFO, nfc_debug_enabled) << __func__;

  if (nfa_rw_cb.protocol != NFC_PROTOCOL_T5T) {
    return (NFA_STATUS_WRONG_PROTOCOL);
  }

  p_msg = (tNFA_RW_OPERATION*)GKI_getbuf((uint16_t)(sizeof(tNFA_RW_OPERATION)));
  if (p_msg != nullptr) {
    /* Fill in tNFA_RW_OPERATION struct */
    p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT;
    p_msg->op = NFA_RW_OP_I93_STAY_QUIET;

    nfa_sys_sendmsg(p_msg);

    return (NFA_STATUS_OK);
  }

  return (NFA_STATUS_FAILED);
}

/*******************************************************************************
**
** Function         NFA_RwI93ReadSingleBlock
**
** Description:
**      Send Read Single Block command to the activated T5T tag.
**
**      Data is returned to the application using the NFA_DATA_EVT. When the
**      read operation has completed, or if an error occurs, the app will be
**      notified with NFA_I93_CMD_CPLT_EVT.
**
** Returns:
**      NFA_STATUS_OK if successfully initiated
**      NFA_STATUS_WRONG_PROTOCOL: T5T tag not activated
**      NFA_STATUS_FAILED otherwise
**
*******************************************************************************/
tNFA_STATUS NFA_RwI93ReadSingleBlock(uint8_t block_number) {
  tNFA_RW_OPERATION* p_msg;

  DLOG_IF(INFO, nfc_debug_enabled)
      << StringPrintf("block_number: 0x%02X", block_number);

  if (nfa_rw_cb.protocol != NFC_PROTOCOL_T5T) {
    return (NFA_STATUS_WRONG_PROTOCOL);
  }

  p_msg = (tNFA_RW_OPERATION*)GKI_getbuf((uint16_t)(sizeof(tNFA_RW_OPERATION)));
  if (p_msg != nullptr) {
    /* Fill in tNFA_RW_OPERATION struct */
    p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT;
    p_msg->op = NFA_RW_OP_I93_READ_SINGLE_BLOCK;

    p_msg->params.i93_cmd.first_block_number = block_number;

    nfa_sys_sendmsg(p_msg);

    return (NFA_STATUS_OK);
  }

  return (NFA_STATUS_FAILED);
}

/*******************************************************************************
**
** Function         NFA_RwI93WriteSingleBlock
**
** Description:
**      Send Write Single Block command to the activated T5T tag.
**
**      When the write operation has completed (or if an error occurs), the
**      app will be notified with NFA_I93_CMD_CPLT_EVT.
**
** Returns:
**      NFA_STATUS_OK if successfully initiated
**      NFA_STATUS_WRONG_PROTOCOL: T5T tag not activated
**      NFA_STATUS_FAILED otherwise
**
*******************************************************************************/
tNFA_STATUS NFA_RwI93WriteSingleBlock(uint8_t block_number, uint8_t* p_data) {
  tNFA_RW_OPERATION* p_msg;

  DLOG_IF(INFO, nfc_debug_enabled)
      << StringPrintf("block_number: 0x%02X", block_number);

  if (nfa_rw_cb.protocol != NFC_PROTOCOL_T5T) {
    return (NFA_STATUS_WRONG_PROTOCOL);
  }

  /* we don't know block size of tag */
  if ((nfa_rw_cb.i93_block_size == 0) || (nfa_rw_cb.i93_num_block == 0)) {
    return (NFA_STATUS_FAILED);
  }

  p_msg = (tNFA_RW_OPERATION*)GKI_getbuf(
      (uint16_t)(sizeof(tNFA_RW_OPERATION) + nfa_rw_cb.i93_block_size));
  if (p_msg != nullptr) {
    /* Fill in tNFA_RW_OPERATION struct */
    p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT;
    p_msg->op = NFA_RW_OP_I93_WRITE_SINGLE_BLOCK;

    p_msg->params.i93_cmd.first_block_number = block_number;
    p_msg->params.i93_cmd.p_data = (uint8_t*)(p_msg + 1);

    memcpy(p_msg->params.i93_cmd.p_data, p_data, nfa_rw_cb.i93_block_size);

    nfa_sys_sendmsg(p_msg);

    return (NFA_STATUS_OK);
  }

  return (NFA_STATUS_FAILED);
}

/*******************************************************************************
**
** Function         NFA_RwI93LockBlock
**
** Description:
**      Send Lock block command to the activated T5T tag.
**
**      When the operation has completed (or if an error occurs), the
**      app will be notified with NFA_I93_CMD_CPLT_EVT.
**
** Returns:
**      NFA_STATUS_OK if successfully initiated
**      NFA_STATUS_WRONG_PROTOCOL: T5T tag not activated
**      NFA_STATUS_FAILED otherwise
**
*******************************************************************************/
tNFA_STATUS NFA_RwI93LockBlock(uint8_t block_number) {
  tNFA_RW_OPERATION* p_msg;

  DLOG_IF(INFO, nfc_debug_enabled)
      << StringPrintf("block_number: 0x%02X", block_number);

  if (nfa_rw_cb.protocol != NFC_PROTOCOL_T5T) {
    return (NFA_STATUS_WRONG_PROTOCOL);
  }

  p_msg = (tNFA_RW_OPERATION*)GKI_getbuf((uint16_t)(sizeof(tNFA_RW_OPERATION)));
  if (p_msg != nullptr) {
    /* Fill in tNFA_RW_OPERATION struct */
    p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT;
    p_msg->op = NFA_RW_OP_I93_LOCK_BLOCK;

    p_msg->params.i93_cmd.first_block_number = block_number;

    nfa_sys_sendmsg(p_msg);

    return (NFA_STATUS_OK);
  }

  return (NFA_STATUS_FAILED);
}

/*******************************************************************************
**
** Function         NFA_RwI93ReadMultipleBlocks
**
** Description:
**      Send Read Multiple Block command to the activated T5T tag.
**
**      Data is returned to the application using the NFA_DATA_EVT. When the
**      read operation has completed, or if an error occurs, the app will be
**      notified with NFA_I93_CMD_CPLT_EVT.
**
** Returns:
**      NFA_STATUS_OK if successfully initiated
**      NFA_STATUS_WRONG_PROTOCOL: T5T tag not activated
**      NFA_STATUS_FAILED otherwise
**
*******************************************************************************/
tNFA_STATUS NFA_RwI93ReadMultipleBlocks(uint8_t first_block_number,
                                        uint16_t number_blocks) {
  tNFA_RW_OPERATION* p_msg;

  DLOG_IF(INFO, nfc_debug_enabled)
      << StringPrintf("%d, %d", first_block_number, number_blocks);

  if (nfa_rw_cb.protocol != NFC_PROTOCOL_T5T) {
    return (NFA_STATUS_WRONG_PROTOCOL);
  }

  p_msg = (tNFA_RW_OPERATION*)GKI_getbuf((uint16_t)(sizeof(tNFA_RW_OPERATION)));
  if (p_msg != nullptr) {
    /* Fill in tNFA_RW_OPERATION struct */
    p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT;
    p_msg->op = NFA_RW_OP_I93_READ_MULTI_BLOCK;

    p_msg->params.i93_cmd.first_block_number = first_block_number;
    p_msg->params.i93_cmd.number_blocks = number_blocks;

    nfa_sys_sendmsg(p_msg);

    return (NFA_STATUS_OK);
  }

  return (NFA_STATUS_FAILED);
}

/*******************************************************************************
**
** Function         NFA_RwI93WriteMultipleBlocks
**
** Description:
**      Send Write Multiple Block command to the activated T5T tag.
**
**      When the write operation has completed (or if an error occurs), the
**      app will be notified with NFA_I93_CMD_CPLT_EVT.
**
** Returns:
**      NFA_STATUS_OK if successfully initiated
**      NFA_STATUS_WRONG_PROTOCOL: T5T tag not activated
**      NFA_STATUS_FAILED otherwise
**
*******************************************************************************/
tNFA_STATUS NFA_RwI93WriteMultipleBlocks(uint8_t first_block_number,
                                         uint16_t number_blocks,
                                         uint8_t* p_data) {
  tNFA_RW_OPERATION* p_msg;
  uint32_t data_length;

  DLOG_IF(INFO, nfc_debug_enabled)
      << StringPrintf("%d, %d", first_block_number, number_blocks);

  if (nfa_rw_cb.protocol != NFC_PROTOCOL_T5T) {
    return (NFA_STATUS_WRONG_PROTOCOL);
  }

  /* we don't know block size of tag */
  if ((nfa_rw_cb.i93_block_size == 0) || (nfa_rw_cb.i93_num_block == 0)) {
    return (NFA_STATUS_FAILED);
  }

  data_length = nfa_rw_cb.i93_block_size * number_blocks;

  if (data_length + sizeof(tNFA_RW_OPERATION) > UINT16_MAX) {
    android_errorWriteLog(0x534e4554, "157650338");
    return (NFA_STATUS_FAILED);
  }

  p_msg = (tNFA_RW_OPERATION*)GKI_getbuf(
      (uint16_t)(sizeof(tNFA_RW_OPERATION) + data_length));
  if (p_msg != nullptr) {
    /* Fill in tNFA_RW_OPERATION struct */
    p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT;
    p_msg->op = NFA_RW_OP_I93_WRITE_MULTI_BLOCK;

    p_msg->params.i93_cmd.first_block_number = first_block_number;
    p_msg->params.i93_cmd.number_blocks = number_blocks;
    p_msg->params.i93_cmd.p_data = (uint8_t*)(p_msg + 1);

    memcpy(p_msg->params.i93_cmd.p_data, p_data, data_length);

    nfa_sys_sendmsg(p_msg);

    return (NFA_STATUS_OK);
  }

  return (NFA_STATUS_FAILED);
}

/*******************************************************************************
**
** Function         NFA_RwI93Select
**
** Description:
**      Send Select command to the activated T5T tag.
**
**      UID[0]: 0xE0, MSB
**      UID[1]: IC Mfg Code
**      ...
**      UID[7]: LSB
**
**      When the operation has completed (or if an error occurs), the
**      app will be notified with NFA_I93_CMD_CPLT_EVT.
**
** Returns:
**      NFA_STATUS_OK if successfully initiated
**      NFA_STATUS_WRONG_PROTOCOL: T5T tag not activated
**      NFA_STATUS_FAILED otherwise
**
*******************************************************************************/
tNFA_STATUS NFA_RwI93Select(uint8_t* p_uid) {
  tNFA_RW_OPERATION* p_msg;

  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
      "UID: [%02X%02X%02X...]", *(p_uid), *(p_uid + 1), *(p_uid + 2));

  if (nfa_rw_cb.protocol != NFC_PROTOCOL_T5T) {
    return (NFA_STATUS_WRONG_PROTOCOL);
  }

  p_msg = (tNFA_RW_OPERATION*)GKI_getbuf(
      (uint16_t)(sizeof(tNFA_RW_OPERATION) + I93_UID_BYTE_LEN));
  if (p_msg != nullptr) {
    /* Fill in tNFA_RW_OPERATION struct */
    p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT;
    p_msg->op = NFA_RW_OP_I93_SELECT;

    p_msg->params.i93_cmd.p_data = (uint8_t*)(p_msg + 1);
    memcpy(p_msg->params.i93_cmd.p_data, p_uid, I93_UID_BYTE_LEN);

    nfa_sys_sendmsg(p_msg);

    return (NFA_STATUS_OK);
  }

  return (NFA_STATUS_FAILED);
}

/*******************************************************************************
**
** Function         NFA_RwI93ResetToReady
**
** Description:
**      Send Reset to ready command to the activated T5T tag.
**
**      When the operation has completed (or if an error occurs), the
**      app will be notified with NFA_I93_CMD_CPLT_EVT.
**
** Returns:
**      NFA_STATUS_OK if successfully initiated
**      NFA_STATUS_WRONG_PROTOCOL: T5T tag not activated
**      NFA_STATUS_FAILED otherwise
**
*******************************************************************************/
tNFA_STATUS NFA_RwI93ResetToReady(void) {
  tNFA_RW_OPERATION* p_msg;

  DLOG_IF(INFO, nfc_debug_enabled) << __func__;

  if (nfa_rw_cb.protocol != NFC_PROTOCOL_T5T) {
    return (NFA_STATUS_WRONG_PROTOCOL);
  }

  p_msg = (tNFA_RW_OPERATION*)GKI_getbuf((uint16_t)(sizeof(tNFA_RW_OPERATION)));
  if (p_msg != nullptr) {
    /* Fill in tNFA_RW_OPERATION struct */
    p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT;
    p_msg->op = NFA_RW_OP_I93_RESET_TO_READY;

    nfa_sys_sendmsg(p_msg);

    return (NFA_STATUS_OK);
  }

  return (NFA_STATUS_FAILED);
}

/*******************************************************************************
**
** Function         NFA_RwI93WriteAFI
**
** Description:
**      Send Write AFI command to the activated T5T tag.
**
**      When the operation has completed (or if an error occurs), the
**      app will be notified with NFA_I93_CMD_CPLT_EVT.
**
** Returns:
**      NFA_STATUS_OK if successfully initiated
**      NFA_STATUS_WRONG_PROTOCOL: T5T tag not activated
**      NFA_STATUS_FAILED otherwise
**
*******************************************************************************/
tNFA_STATUS NFA_RwI93WriteAFI(uint8_t afi) {
  tNFA_RW_OPERATION* p_msg;

  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("AFI: 0x%02X", afi);

  if (nfa_rw_cb.protocol != NFC_PROTOCOL_T5T) {
    return (NFA_STATUS_WRONG_PROTOCOL);
  }

  p_msg = (tNFA_RW_OPERATION*)GKI_getbuf((uint16_t)(sizeof(tNFA_RW_OPERATION)));
  if (p_msg != nullptr) {
    /* Fill in tNFA_RW_OPERATION struct */
    p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT;
    p_msg->op = NFA_RW_OP_I93_WRITE_AFI;

    p_msg->params.i93_cmd.afi = afi;

    nfa_sys_sendmsg(p_msg);

    return (NFA_STATUS_OK);
  }

  return (NFA_STATUS_FAILED);
}

/*******************************************************************************
**
** Function         NFA_RwI93LockAFI
**
** Description:
**      Send Lock AFI command to the activated T5T tag.
**
**      When the operation has completed (or if an error occurs), the
**      app will be notified with NFA_I93_CMD_CPLT_EVT.
**
** Returns:
**      NFA_STATUS_OK if successfully initiated
**      NFA_STATUS_WRONG_PROTOCOL: T5T tag not activated
**      NFA_STATUS_FAILED otherwise
**
*******************************************************************************/
tNFA_STATUS NFA_RwI93LockAFI(void) {
  tNFA_RW_OPERATION* p_msg;

  DLOG_IF(INFO, nfc_debug_enabled) << __func__;

  if (nfa_rw_cb.protocol != NFC_PROTOCOL_T5T) {
    return (NFA_STATUS_WRONG_PROTOCOL);
  }

  p_msg = (tNFA_RW_OPERATION*)GKI_getbuf((uint16_t)(sizeof(tNFA_RW_OPERATION)));
  if (p_msg != nullptr) {
    /* Fill in tNFA_RW_OPERATION struct */
    p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT;
    p_msg->op = NFA_RW_OP_I93_LOCK_AFI;

    nfa_sys_sendmsg(p_msg);

    return (NFA_STATUS_OK);
  }

  return (NFA_STATUS_FAILED);
}

/*******************************************************************************
**
** Function         NFA_RwI93WriteDSFID
**
** Description:
**      Send Write DSFID command to the activated T5T tag.
**
**      When the operation has completed (or if an error occurs), the
**      app will be notified with NFA_I93_CMD_CPLT_EVT.
**
** Returns:
**      NFA_STATUS_OK if successfully initiated
**      NFA_STATUS_WRONG_PROTOCOL: T5T tag not activated
**      NFA_STATUS_FAILED otherwise
**
*******************************************************************************/
tNFA_STATUS NFA_RwI93WriteDSFID(uint8_t dsfid) {
  tNFA_RW_OPERATION* p_msg;

  DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf("DSFID: 0x%02X", dsfid);

  if (nfa_rw_cb.protocol != NFC_PROTOCOL_T5T) {
    return (NFA_STATUS_WRONG_PROTOCOL);
  }

  p_msg = (tNFA_RW_OPERATION*)GKI_getbuf((uint16_t)(sizeof(tNFA_RW_OPERATION)));
  if (p_msg != nullptr) {
    /* Fill in tNFA_RW_OPERATION struct */
    p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT;
    p_msg->op = NFA_RW_OP_I93_WRITE_DSFID;

    p_msg->params.i93_cmd.dsfid = dsfid;

    nfa_sys_sendmsg(p_msg);

    return (NFA_STATUS_OK);
  }

  return (NFA_STATUS_FAILED);
}

/*******************************************************************************
**
** Function         NFA_RwI93LockDSFID
**
** Description:
**      Send Lock DSFID command to the activated T5T tag.
**
**      When the operation has completed (or if an error occurs), the
**      app will be notified with NFA_I93_CMD_CPLT_EVT.
**
** Returns:
**      NFA_STATUS_OK if successfully initiated
**      NFA_STATUS_WRONG_PROTOCOL: T5T tag not activated
**      NFA_STATUS_FAILED otherwise
**
*******************************************************************************/
tNFA_STATUS NFA_RwI93LockDSFID(void) {
  tNFA_RW_OPERATION* p_msg;

  DLOG_IF(INFO, nfc_debug_enabled) << __func__;

  if (nfa_rw_cb.protocol != NFC_PROTOCOL_T5T) {
    return (NFA_STATUS_WRONG_PROTOCOL);
  }

  p_msg = (tNFA_RW_OPERATION*)GKI_getbuf((uint16_t)(sizeof(tNFA_RW_OPERATION)));
  if (p_msg != nullptr) {
    /* Fill in tNFA_RW_OPERATION struct */
    p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT;
    p_msg->op = NFA_RW_OP_I93_LOCK_DSFID;

    nfa_sys_sendmsg(p_msg);

    return (NFA_STATUS_OK);
  }

  return (NFA_STATUS_FAILED);
}

/*******************************************************************************
**
** Function         NFA_RwI93GetSysInfo
**
** Description:
**      Send Get system information command to the activated T5T tag.
**      If UID is provided then set UID[0]:MSB, ... UID[7]:LSB
**
**      When the operation has completed (or if an error occurs), the
**      app will be notified with NFA_I93_CMD_CPLT_EVT.
**
** Returns:
**      NFA_STATUS_OK if successfully initiated
**      NFA_STATUS_WRONG_PROTOCOL: T5T tag not activated
**      NFA_STATUS_FAILED otherwise
**
*******************************************************************************/
tNFA_STATUS NFA_RwI93GetSysInfo(uint8_t* p_uid) {
  tNFA_RW_OPERATION* p_msg;

  DLOG_IF(INFO, nfc_debug_enabled) << __func__;

  if (nfa_rw_cb.protocol != NFC_PROTOCOL_T5T) {
    return (NFA_STATUS_WRONG_PROTOCOL);
  }

  p_msg = (tNFA_RW_OPERATION*)GKI_getbuf((uint16_t)(sizeof(tNFA_RW_OPERATION)));
  if (p_msg != nullptr) {
    /* Fill in tNFA_RW_OPERATION struct */
    p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT;
    p_msg->op = NFA_RW_OP_I93_GET_SYS_INFO;

    if (p_uid) {
      p_msg->params.i93_cmd.uid_present = true;
      memcpy(p_msg->params.i93_cmd.uid, p_uid, I93_UID_BYTE_LEN);
    } else {
      p_msg->params.i93_cmd.uid_present = false;
    }

    nfa_sys_sendmsg(p_msg);

    return (NFA_STATUS_OK);
  }

  return (NFA_STATUS_FAILED);
}

/*******************************************************************************
**
** Function         NFA_RwI93GetMultiBlockSecurityStatus
**
** Description:
**      Send Get Multiple block security status command to the activated
**      T5T tag.
**
**      Data is returned to the application using the NFA_DATA_EVT. When the
**      read operation has completed, or if an error occurs, the app will be
**      notified with NFA_I93_CMD_CPLT_EVT.
**
** Returns:
**      NFA_STATUS_OK if successfully initiated
**      NFA_STATUS_WRONG_PROTOCOL: T5T tag not activated
**      NFA_STATUS_FAILED otherwise
**
*******************************************************************************/
tNFA_STATUS NFA_RwI93GetMultiBlockSecurityStatus(uint8_t first_block_number,
                                                 uint16_t number_blocks) {
  tNFA_RW_OPERATION* p_msg;

  DLOG_IF(INFO, nfc_debug_enabled)
      << StringPrintf("%d, %d", first_block_number, number_blocks);

  if (nfa_rw_cb.protocol != NFC_PROTOCOL_T5T) {
    return (NFA_STATUS_WRONG_PROTOCOL);
  }

  p_msg = (tNFA_RW_OPERATION*)GKI_getbuf((uint16_t)(sizeof(tNFA_RW_OPERATION)));
  if (p_msg != nullptr) {
    /* Fill in tNFA_RW_OPERATION struct */
    p_msg->hdr.event = NFA_RW_OP_REQUEST_EVT;
    p_msg->op = NFA_RW_OP_I93_GET_MULTI_BLOCK_STATUS;

    p_msg->params.i93_cmd.first_block_number = first_block_number;
    p_msg->params.i93_cmd.number_blocks = number_blocks;

    nfa_sys_sendmsg(p_msg);

    return (NFA_STATUS_OK);
  }

  return (NFA_STATUS_FAILED);
}
