NFCSTATUS phFriNfc_MfUL_Format(phFriNfc_sNdefSmtCrdFmt_t    *NdefSmtCrdFmt)
{
    NFCSTATUS Result = NFCSTATUS_SUCCESS;
    uint8_t OTPBytes[] = PH_FRINFC_MFUL_FMT_OTP_BYTES_TEMPLATE;

    PH_LOG_NDEF_FUNC_ENTRY();

    if (NdefSmtCrdFmt->psRemoteDevInfo->RemoteDevInfo.Iso14443A_Info.ULType == phNfc_eMifareULType_UltralightC)
    {
        NdefSmtCrdFmt->CardType = PH_FRINFC_NDEFMAP_MIFARE_ULC_CARD;

        OTPBytes[PH_FRINFC_MFUL_FMT_OTP_DATA_AREA_SIZE_BYTE] = PH_FRINFC_MFULC_FMT_DATA_AREA_SIZE;
        phOsalNfc_MemCopy(NdefSmtCrdFmt->AddInfo.Type2Info.OTPBytes,
                          OTPBytes,
                          sizeof(NdefSmtCrdFmt->AddInfo.Type2Info.OTPBytes));
    }
    else if (NdefSmtCrdFmt->psRemoteDevInfo->RemoteDevInfo.Iso14443A_Info.ULType == phNfc_eMifareULType_UltralightEV1)
    {
        /* The NDEF TLV for Ultralight and Ultralight EV1 cards are the same, so just label
           the CardType as Ultralight */
        NdefSmtCrdFmt->CardType = PH_FRINFC_NDEFMAP_MIFARE_UL_CARD;

        OTPBytes[PH_FRINFC_MFUL_FMT_OTP_DATA_AREA_SIZE_BYTE] = NdefSmtCrdFmt->psRemoteDevInfo->RemoteDevInfo.Iso14443A_Info.DataAreaSize >> 3; // Divide by 8
        phOsalNfc_MemCopy(NdefSmtCrdFmt->AddInfo.Type2Info.OTPBytes,
                          OTPBytes,
                          sizeof(NdefSmtCrdFmt->AddInfo.Type2Info.OTPBytes));
    }
static NFCSTATUS
phFriNfc_TopazFormat_WriteByte(phFriNfc_sNdefSmtCrdFmt_t* NdefSmtCrdFmt,
                               uint8_t BlockNo,
                               uint8_t ByteNo,
                               uint8_t ByteToWrite)
{
    NFCSTATUS wStatus = NFCSTATUS_SUCCESS;
    uint8_t writeCmd[7] = { 0 };

    PH_LOG_NDEF_FUNC_ENTRY();

    assert(NdefSmtCrdFmt != NULL);

    writeCmd[0] = PH_FRINFC_TOPAZ_CMD_WRITE_1E;

    /* Block and byte numbers need to be in the following format:
    7 | 6   5   4   3 | 2   1   0 |
    0 |     Block     |   Byte    |
    */
    writeCmd[1] = ((BlockNo & 0x0F) << 3) | (ByteNo & 0x07);

    writeCmd[2] = ByteToWrite;

    /* Copy the UID to the end of command buffer */
    phOsalNfc_MemCopy(&writeCmd[3],
                      NdefSmtCrdFmt->psRemoteDevInfo->RemoteDevInfo.Jewel_Info.Uid,
                      TOPAZ_UID_LENGTH);

    wStatus = phFriNfc_TopazFormat_Transceive(NdefSmtCrdFmt,
                                              writeCmd,
                                              sizeof(writeCmd));

    PH_LOG_NDEF_FUNC_EXIT();
    return wStatus;
}
void phOsalNfc_PostMsg(_In_ uint32_t Message, _In_ UINT_PTR Param1, _In_ UINT_PTR Param2, _In_ UINT_PTR Param3, _In_ UINT_PTR Param4)
{
    phOsalNfc_MsgQueue_t msgEntry = {0};

    msgEntry.Message = Message;
    msgEntry.Param1 = Param1;
    msgEntry.Param2 = Param2;
    msgEntry.Param3 = Param3;
    msgEntry.Param4 = Param4;

    EnterCriticalSection(&gpphOsalNfc_Context->MsgQueueLock);

    if(gpphOsalNfc_Context->bMsgQueueUsed < PH_OSAL_MSG_QUEUE_MAX_SIZE)
    {
        phOsalNfc_MemCopy(&gpphOsalNfc_Context->MsgQueue[gpphOsalNfc_Context->bMsgQueueTail], &msgEntry, sizeof(phOsalNfc_MsgQueue_t));
        gpphOsalNfc_Context->bMsgQueueTail = ((gpphOsalNfc_Context->bMsgQueueTail+1) < PH_OSAL_MSG_QUEUE_MAX_SIZE) ? gpphOsalNfc_Context->bMsgQueueTail+1 : 0;
        gpphOsalNfc_Context->bMsgQueueUsed++;
        SetEvent(gpphOsalNfc_Context->hMsgQueueEvent);
    }
    else
    {
        //
        // This condition is only hit when the messaging thread is unresponsive and is not draining the message
        // queue and hence this is a fatal condition
        //
        phOsalNfc_RaiseException(phOsalNfc_e_InternalErr,1);
    }

    LeaveCriticalSection(&gpphOsalNfc_Context->MsgQueueLock);
}
NFCSTATUS phNciNfc_CoreIfTxRx(pphNciNfc_CoreContext_t pCtx,
                               pphNciNfc_CoreTxInfo_t pTxInfo,
                               pphNciNfc_Buff_t  pRxBuffInfo,
                               uint32_t dwTimeOutMs,
                               pphNciNfc_CoreIfNtf_t NciCb,
                               void *pContext)
{
    NFCSTATUS wStatus = NFCSTATUS_SUCCESS;

    PH_LOG_NCI_FUNC_ENTRY();
    if ((NULL != pCtx) &&
        (NULL != pTxInfo) &&
        (NULL != pRxBuffInfo) &&
        (NULL != NciCb))
    {
        if(pCtx->SendStateContext.CurrState == phNciNfc_StateSendIdle)
        {
            /* Either command or data message can be sent */
            if(phNciNfc_e_NciCoreMsgTypeCntrlCmd == pTxInfo->tHeaderInfo.eMsgType)
            {
                pTxInfo->tHeaderInfo.bConn_ID = 0;
            }
            else /* Sending a data message */
            {
                pTxInfo->tHeaderInfo.Group_ID = (phNciNfc_CoreGid_t)0;
                pTxInfo->tHeaderInfo.Opcode_ID.Val = 0;
            }
            /* All calling function which use 'phNciNfc_CoreIfTxRx' to send and receive cmd-Rsp or Data
            shall go for Auto deregistration */
            pTxInfo->tHeaderInfo.bEnabled = PHNCINFC_ENABLE_AUTO_DEREG;
            pCtx->tTemp.pTxInfo = pTxInfo;
            pCtx->tTemp.dwTimeOutMs = dwTimeOutMs;
            pCtx->tTemp.NciCb = NciCb;
            pCtx->tTemp.pContext = pContext;

            pCtx->bCoreTxOnly = 0; /* Notify upper layer after response is received for the command sent or
                                      sending command fails*/
            phOsalNfc_MemCopy(&(pCtx->TxInfo), pTxInfo, sizeof(phNciNfc_CoreTxInfo_t));
            /* Print the NCI packet details */
            phNciNfc_PrintPacketDescription(&pTxInfo->tHeaderInfo, pTxInfo->Buff, pTxInfo->wLen);
            wStatus = phNciNfc_StateHandler(pCtx, phNciNfc_EvtSendPacket);
        }
        else
        {
            wStatus = NFCSTATUS_BUSY;
        }
    }
    else
    {
        wStatus = NFCSTATUS_INVALID_PARAMETER;
    }
    PH_LOG_NCI_FUNC_EXIT();
    return wStatus;
}
void phFriNfc_MfUL_Reset(phFriNfc_sNdefSmtCrdFmt_t    *NdefSmtCrdFmt)
{
    uint8_t OTPBytes[] = PH_FRINFC_MFUL_FMT_OTP_BYTES_TEMPLATE;

    NdefSmtCrdFmt->AddInfo.Type2Info.CurrentBlock = PH_FRINFC_MFUL_FMT_VAL_0;
    OTPBytes[PH_FRINFC_MFUL_FMT_OTP_DATA_AREA_SIZE_BYTE] = PH_FRINFC_MFUL_FMT_DATA_AREA_SIZE;
    phOsalNfc_MemCopy(NdefSmtCrdFmt->AddInfo.Type2Info.OTPBytes,
                      OTPBytes,
                      sizeof(NdefSmtCrdFmt->AddInfo.Type2Info.OTPBytes));
    NdefSmtCrdFmt->AddInfo.Type2Info.LockBytes[0] = 0;
    NdefSmtCrdFmt->AddInfo.Type2Info.LockBytes[1] = 0;
    NdefSmtCrdFmt->AddInfo.Type2Info.LockBytes[2] = 0;
    NdefSmtCrdFmt->AddInfo.Type2Info.LockBytes[3] = 0;
}
void phFriNfc_MfUL_Reset(phFriNfc_sNdefSmtCrdFmt_t    *NdefSmtCrdFmt)
{
    uint8_t OTPByte[] = PH_FRINFC_MFUL_FMT_OTP_BYTES;
    PH_LOG_NDEF_FUNC_ENTRY();
    NdefSmtCrdFmt->AddInfo.Type2Info.CurrentBlock = PH_FRINFC_MFUL_FMT_VAL_0;
    phOsalNfc_MemCopy(NdefSmtCrdFmt->AddInfo.Type2Info.OTPBytes,
                OTPByte,
                sizeof(NdefSmtCrdFmt->AddInfo.Type2Info.OTPBytes));
    NdefSmtCrdFmt->AddInfo.Type2Info.LockBytes[0] = 0;
    NdefSmtCrdFmt->AddInfo.Type2Info.LockBytes[1] = 0;
    NdefSmtCrdFmt->AddInfo.Type2Info.LockBytes[2] = 0;
    NdefSmtCrdFmt->AddInfo.Type2Info.LockBytes[3] = 0;
    PH_LOG_NDEF_FUNC_EXIT();
}
static NFCSTATUS
phFriNfc_TopazDynamicFormat_ProcessWritingMemCtrlBytes(phFriNfc_sNdefSmtCrdFmt_t* NdefSmtCrdFmt)
{
    static const uint8_t c_expectedResponse[] =
    {
        PH_FRINFC_TOPAZ_TLV_LOCK_CTRL_V2, /* Lock control bytes */
        PH_FRINFC_TOPAZ_TLV_MEM_CTRL_T, PH_FRINFC_TOPAZ_TLV_MEM_CTRL_L, PH_FRINFC_TOPAZ_TLV_MEM_CTRL_V0, PH_FRINFC_TOPAZ_TLV_MEM_CTRL_V1, PH_FRINFC_TOPAZ_TLV_MEM_CTRL_V2, /* Memory control bytes */
        PH_FRINFC_TOPAZ_TLV_NDEF_T, PH_FRINFC_TOPAZ_TLV_NDEF_L, /* NDEF TLV */
    };

    uint8_t write8Cmd[] =
    {
        PH_FRINFC_TOPAZ_CMD_WRITE_E8, /* WRITE-E8 */
        0x03, /* Block 0x3 */
        PH_FRINFC_TOPAZ_TLV_TERM_T, /* Terminator TLV */
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* Rest of data bytes are zeros */
        0x00, 0x00, 0x00, 0x00 /* UID bytes (need to be copied over) */
    };

    NFCSTATUS wStatus = NFCSTATUS_SUCCESS;

    PH_LOG_NDEF_FUNC_ENTRY();

    assert(NdefSmtCrdFmt != NULL);

    if ((*NdefSmtCrdFmt->SendRecvLength != sizeof(c_expectedResponse)) ||
        (0 != phOsalNfc_MemCompare(NdefSmtCrdFmt->SendRecvBuf,
                                   (void*)c_expectedResponse,
                                   sizeof(c_expectedResponse))))
    {
        PH_LOG_NDEF_WARN_STR("Unexpected response received. Formatting failed");
        wStatus = PHNFCSTVAL(CID_FRI_NFC_NDEF_SMTCRDFMT, NFCSTATUS_FORMAT_ERROR);
    }
    else
    {
        /* Copy the UID to the end of command buffer */
        phOsalNfc_MemCopy(&write8Cmd[10],
                          NdefSmtCrdFmt->psRemoteDevInfo->RemoteDevInfo.Jewel_Info.Uid,
                          TOPAZ_UID_LENGTH);

        NdefSmtCrdFmt->State = PH_FRINFC_TOPAZ_STATE_WRITE_TERM_TLV_BYTES;
        wStatus = phFriNfc_TopazFormat_Transceive(NdefSmtCrdFmt,
                                                  write8Cmd,
                                                  sizeof(write8Cmd));
    }

    PH_LOG_NDEF_FUNC_EXIT();
    return wStatus;
}
static NFCSTATUS
phFriNfc_TopazFormat_Transceive(phFriNfc_sNdefSmtCrdFmt_t* NdefSmtCrdFmt,
                                const uint8_t* SendBuffer,
                                uint16_t SendBufferLength)
{
    NFCSTATUS wStatus = NFCSTATUS_SUCCESS;

    PH_LOG_NDEF_FUNC_ENTRY();

    assert(NdefSmtCrdFmt != NULL);
    assert(SendBuffer != NULL);
    assert(SendBufferLength != 0 && SendBufferLength <= PH_FRINFC_SMTCRDFMT_MAX_SEND_RECV_BUF_SIZE);

    /* Fill the send buffer */
    NdefSmtCrdFmt->Cmd.JewelCmd = phNfc_eJewel_Raw;
    phOsalNfc_MemCopy(NdefSmtCrdFmt->SendRecvBuf, SendBuffer, SendBufferLength);
    NdefSmtCrdFmt->SendLength = SendBufferLength;

    /* Set the data for additional data exchange */
    NdefSmtCrdFmt->psDepAdditionalInfo.DepFlags.MetaChaining = 0;
    NdefSmtCrdFmt->psDepAdditionalInfo.DepFlags.NADPresent = 0;
    NdefSmtCrdFmt->psDepAdditionalInfo.NodeAddress = 0;

    /* Set the completion routines for the card operations */
    NdefSmtCrdFmt->SmtCrdFmtCompletionInfo.CompletionRoutine = phFriNfc_NdefSmtCrd_Process;
    NdefSmtCrdFmt->SmtCrdFmtCompletionInfo.Context = NdefSmtCrdFmt;

    *NdefSmtCrdFmt->SendRecvLength = PH_FRINFC_SMTCRDFMT_MAX_SEND_RECV_BUF_SIZE;

    wStatus = phFriNfc_OvrHal_Transceive(NdefSmtCrdFmt->LowerDevice,
                                         &NdefSmtCrdFmt->SmtCrdFmtCompletionInfo,
                                         NdefSmtCrdFmt->psRemoteDevInfo,
                                         NdefSmtCrdFmt->Cmd,
                                         &NdefSmtCrdFmt->psDepAdditionalInfo,
                                         NdefSmtCrdFmt->SendRecvBuf,
                                         NdefSmtCrdFmt->SendLength,
                                         NdefSmtCrdFmt->SendRecvBuf,
                                         NdefSmtCrdFmt->SendRecvLength);

    PH_LOG_NDEF_FUNC_EXIT();
    return wStatus;
}
NFCSTATUS phFriNfc_MfUL_Format(phFriNfc_sNdefSmtCrdFmt_t    *NdefSmtCrdFmt)
{
    NFCSTATUS               Result = NFCSTATUS_SUCCESS;
    uint8_t                 OTPByte[] = PH_FRINFC_MFUL_FMT_OTP_BYTES;
    PH_LOG_NDEF_FUNC_ENTRY();
    NdefSmtCrdFmt->AddInfo.Type2Info.CurrentBlock = PH_FRINFC_MFUL_FMT_VAL_0;
    phOsalNfc_MemCopy(NdefSmtCrdFmt->AddInfo.Type2Info.OTPBytes,
                OTPByte,
                sizeof(NdefSmtCrdFmt->AddInfo.Type2Info.OTPBytes));

    /* Set the state */
    NdefSmtCrdFmt->State = PH_FRINFC_MFUL_FMT_RD_16BYTES;
    /* Initialise current block to the lock bits block */
    NdefSmtCrdFmt->AddInfo.Type2Info.CurrentBlock = PH_FRINFC_MFUL_FMT_VAL_2;

    /* Start authentication */
    Result = phFriNfc_MfUL_H_WrRd(NdefSmtCrdFmt);
    PH_LOG_NDEF_FUNC_EXIT();
    return Result;
}
NFCSTATUS phNciNfc_CoreIfTxOnly(pphNciNfc_CoreContext_t pCtx,
                               pphNciNfc_CoreTxInfo_t pTxInfo,
                               pphNciNfc_CoreIfNtf_t NciCb,
                               void *pContext)
{
    NFCSTATUS wStatus = NFCSTATUS_SUCCESS;

    PH_LOG_NCI_FUNC_ENTRY();
    if ((NULL != pCtx) &&
        (NULL != pTxInfo) &&
        (NULL != NciCb))
    {
        if(pCtx->SendStateContext.CurrState == phNciNfc_StateSendIdle)
        {
            pCtx->tTemp.pTxInfo = pTxInfo;
            /* No timer is used */
            pCtx->tTemp.dwTimeOutMs = 0;
            pCtx->tTemp.NciCb = NciCb;
            pCtx->tTemp.pContext = pContext;

            pCtx->bCoreTxOnly = 1; /* Send and receive operation is in progress */
            phOsalNfc_MemCopy(&(pCtx->TxInfo), pTxInfo, sizeof(phNciNfc_CoreTxInfo_t));
            /* Print the NCI packet details */
            phNciNfc_PrintPacketDescription(&pTxInfo->tHeaderInfo, pTxInfo->Buff, pTxInfo->wLen);
            wStatus = phNciNfc_StateHandler(pCtx, phNciNfc_EvtSendPacket);
        }
        else
        {
            wStatus = NFCSTATUS_BUSY;
        }
    }
    else
    {
        wStatus = NFCSTATUS_INVALID_PARAMETER;
    }
    PH_LOG_NCI_FUNC_EXIT();
    return wStatus;
}
NFCSTATUS
phFriNfc_TopazDynamicFormat_Format(phFriNfc_sNdefSmtCrdFmt_t* NdefSmtCrdFmt)
{
    uint8_t write8Cmd[] =
    {
        PH_FRINFC_TOPAZ_CMD_WRITE_E8, /* WRITE-E8 */
        0x01, /* Block 0x1 */
        PH_FRINFC_TOPAZ_CC_BYTE0, PH_FRINFC_TOPAZ_CC_BYTE1, PH_FRINFC_TOPAZ_DYNAMIC_CC_BYTE2_MMSIZE, PH_FRINFC_TOPAZ_CC_BYTE3_RW, /* CC bytes */
        PH_FRINFC_TOPAZ_TLV_LOCK_CTRL_T, PH_FRINFC_TOPAZ_TLV_LOCK_CTRL_L, PH_FRINFC_TOPAZ_TLV_LOCK_CTRL_V0, PH_FRINFC_TOPAZ_TLV_LOCK_CTRL_V1, /* Lock control bytes */
        0x00, 0x00, 0x00, 0x00 /* UID bytes (need to be copied over) */
    };

    NFCSTATUS wStatus = NFCSTATUS_SUCCESS;

    PH_LOG_NDEF_FUNC_ENTRY();

    if (NdefSmtCrdFmt == NULL)
    {
        wStatus = PHNFCSTVAL(CID_FRI_NFC_NDEF_SMTCRDFMT, NFCSTATUS_INVALID_PARAMETER);
    }
    else
    {
        /* Copy the UID to the end of command buffer */
        phOsalNfc_MemCopy(&write8Cmd[10],
                          NdefSmtCrdFmt->psRemoteDevInfo->RemoteDevInfo.Jewel_Info.Uid,
                          TOPAZ_UID_LENGTH);

        NdefSmtCrdFmt->State = PH_FRINFC_TOPAZ_STATE_WRITE_CC_BYTES;
        wStatus = phFriNfc_TopazFormat_Transceive(NdefSmtCrdFmt,
                                                  write8Cmd,
                                                  sizeof(write8Cmd));
    }

    PH_LOG_NDEF_FUNC_EXIT();
    return wStatus;
}
NFCSTATUS
phHciNfc_CoreRecvCB(void                           *pContext,
                    void                           *pInfo,
                    NFCSTATUS                      wStatus
                   )
{
    uint8_t bChainBit = 0;
    pphHciNfc_sCoreRecvBuff_List_t pNode = NULL;
    phHciNfc_ReceiveParams_t tHciNfcRxdParams;
    phNciNfc_TransactInfo_t        *pHciCoreReceiveInfo;
    NFCSTATUS wStat;

    if(pContext != NULL)
    {
        if(pInfo != NULL)
        {
            phHciNfc_HciContext_t      *pHciContext     = (phHciNfc_HciContext_t *) pContext;
            phHciNfc_HciCoreContext_t  *pHciCoreContext = &(pHciContext->pHciCoreContext);
            pHciCoreReceiveInfo                         = (phNciNfc_TransactInfo_t*)pInfo;

            if(wStatus == NFCSTATUS_SUCCESS)
            {
                bChainBit = (uint8_t) GET_BITS8(*(pHciCoreReceiveInfo->pbuffer),
                                                PHHCINFC_HCP_CHAINBIT_OFFSET,
                                                PHHCINFC_HCP_CHAINBIT_LEN);

                /* Store/Buffer HCP Header along with Data irrespective of whether chained or Unchained */
                if(pHciCoreReceiveInfo->wLength <= PHHCI_HCP_MAX_RECEIVE_PACKET_SIZE)
                {
                    /* Create the Data Node and copy the Data */
                    pNode = phHciNfc_CoreGetNewNode(pHciCoreContext,pHciCoreReceiveInfo->wLength);
                    if(pNode != NULL)
                    {
                        phOsalNfc_MemCopy((uint8_t*)&(pNode->tMem.aBuffer[0]),
                                          (uint8_t*)(pHciCoreReceiveInfo->pbuffer),
                                          pHciCoreReceiveInfo->wLength);
                        pNode->tMem.wLen      = pHciCoreReceiveInfo->wLength;
                    }else
                    {
                        PH_LOG_LIBNFC_CRIT_STR(" HCI Core Receive- Failed To Allocate Memory for Node");
                    }
                }else
                {
                    /* HCP Packet should not be bigger than PHHCI_HCP_MAX_PACKET_SIZE */
                }
                /* Check Chaining Bit to asceratain whether complete Message is received or Not*/
                if(bChainBit == HCP_CHAINBIT_UN_CHAINED)
                {
                    /* HCI message is complete extract the Data from linked list*/
                    tHciNfcRxdParams.pData = phOsalNfc_GetMemory(pHciCoreContext->tReceiveInfo.wPayloadSize);
                    wStat = phHciNfc_HciCoreExtractData(pHciCoreContext,&tHciNfcRxdParams);
                    if(wStat == NFCSTATUS_SUCCESS)
                    {
                        /*Once the HCI Packets are Extracted ,HCI packet info is captured so delete the linked list */
                        phHciNfc_CoreDeleteList(pHciCoreContext);
                        /* Send the Received Data To upper layer*/
                        /* TO DO Registration mechanism to be implemented*/
                        phHciNfc_ReceiveHandler(pHciContext,
                                                &tHciNfcRxdParams,
                                                wStatus
                                                );
                        phOsalNfc_FreeMemory(tHciNfcRxdParams.pData);
                    }else
                    {
                            PH_LOG_LIBNFC_CRIT_STR(" HCI Core - HCI Packet Extraction Failed");
                    }
                }
                else
                {
                    /* Chained HCI packets which are already buffered
                    ** No Action here waits for complete HCI Msg to be Rxd
                    */
                }
            }else
            {
                /* Failed Status from lower layer- Call the upper layer call back with the returned status */
                /* Send the Received Data To upper layer*/
                phHciNfc_ReceiveHandler(pHciContext->pHciCoreContext.pUpperLayerContext,
                                        NULL,
                                        wStatus
                                        );
            }
        }
        else
        {
            /* Do Nothing if no information is received from lower layer */
            PH_LOG_LIBNFC_CRIT_STR(" Invalid Receive Info Pointer received from lower layer ");
        }
    }else
    {
        PH_LOG_LIBNFC_CRIT_STR(" Invalid HCI Context received from Lower Layer ");
    }
    return wStatus;

}
NFCSTATUS phLibNfc_Mgt_SetLlcp_ConfigParams( phLibNfc_Llcp_sLinkParameters_t* pConfigInfo,
                                             pphLibNfc_RspCb_t                pConfigRspCb,
                                             void*                            pContext
                                            )
{
   NFCSTATUS      result;
   phNfc_sData_t  sGeneralBytesBuffer;
   phLibNfc_sNfcIPCfg_t sNfcIPCfg;
   const uint8_t  pMagicBuffer[] = { 0x46, 0x66, 0x6D };

   PH_LOG_LLCP_FUNC_ENTRY();
   result = static_CheckState();
   if (result != NFCSTATUS_SUCCESS)
   {
      PH_LOG_LLCP_FUNC_EXIT();
      return result;
   }

   if ((pConfigInfo == NULL) || (pConfigRspCb == NULL))
   {
      PH_LOG_LLCP_FUNC_EXIT();
      return NFCSTATUS_INVALID_PARAMETER;
   }

   /* Save the config for later use */
   phOsalNfc_MemCopy( &gpphLibNfc_Context->llcp_cntx.sLocalParams,
           pConfigInfo,
           sizeof(phLibNfc_Llcp_sLinkParameters_t) );

   /* Copy magic number in NFCIP General Bytes */
   phOsalNfc_MemCopy(sNfcIPCfg.generalBytes, pMagicBuffer, sizeof(pMagicBuffer));
   sNfcIPCfg.generalBytesLength = sizeof(pMagicBuffer);

   /* Encode link parameters in TLV to configure P2P General Bytes */
   sGeneralBytesBuffer.buffer = sNfcIPCfg.generalBytes + sizeof(pMagicBuffer);
   sGeneralBytesBuffer.length = sizeof(sNfcIPCfg.generalBytes) - sizeof(pMagicBuffer);
   result = phFriNfc_Llcp_EncodeLinkParams( &sGeneralBytesBuffer,
                                            pConfigInfo,
                                            PHFRINFC_LLCP_VERSION);
   if (result != NFCSTATUS_SUCCESS)
   {
      PH_LOG_LLCP_FUNC_EXIT();
      return PHNFCSTATUS(result);
   }
   sNfcIPCfg.generalBytesLength += (uint8_t)sGeneralBytesBuffer.length;

   /* Set the P2P general bytes */
   result = phLibNfc_Mgt_SetP2P_ConfigParams(&sNfcIPCfg, pConfigRspCb, pContext);
   if (result != NFCSTATUS_PENDING)
   {
      PH_LOG_LLCP_FUNC_EXIT();
      return PHNFCSTATUS(result);
   }

   /* Resets the LLCP LLC component */
   result = phFriNfc_Llcp_Reset( &gpphLibNfc_Context->llcp_cntx.sLlcpContext,
                                 gpphLibNfc_Context->psOverHalCtxt,
                                 pConfigInfo,
                                 gpphLibNfc_Context->llcp_cntx.pRxBuffer,
                                 sizeof(gpphLibNfc_Context->llcp_cntx.pRxBuffer),
                                 gpphLibNfc_Context->llcp_cntx.pTxBuffer,
                                 sizeof(gpphLibNfc_Context->llcp_cntx.pTxBuffer),
                                 gpphLibNfc_Context->bDtaFlag,
                                 phLibNfc_Llcp_Link_Cb,
                                 gpphLibNfc_Context);
   if (result != NFCSTATUS_SUCCESS)
   {
      PH_LOG_LLCP_FUNC_EXIT();
      return PHNFCSTATUS(result);
   }

   /* Resets the LLCP Transport component */
   result = phFriNfc_LlcpTransport_Reset( &gpphLibNfc_Context->llcp_cntx.sLlcpTransportContext,
                                          &gpphLibNfc_Context->llcp_cntx.sLlcpContext );
   if (result != NFCSTATUS_SUCCESS)
   {
      PH_LOG_LLCP_FUNC_EXIT();
      return PHNFCSTATUS(result);
   }

   PH_LOG_LLCP_FUNC_EXIT();
   return NFCSTATUS_PENDING;
}
NFCSTATUS
phLibNfc_Mgt_SetP2P_ConfigParams(phLibNfc_sNfcIPCfg_t *pConfigInfo,
                                 pphLibNfc_RspCb_t pConfigRspCb,
                                 void *  pContext)
{
    NFCSTATUS wStatus = NFCSTATUS_FAILED;
    pphLibNfc_LibContext_t pLibContext = gpphLibNfc_Context;
    pphNciNfc_RfDiscConfigParams_t pRfDiscConfParam = NULL;
    uint8_t bGeneralBytesLength = 0;
    phLibNfc_DummyInfo_t Info;
    phLibNfc_Event_t TrigEvent = phLibNfc_EventDummy;
    PH_LOG_LIBNFC_FUNC_ENTRY();
    Info.Evt = phLibNfc_DummyEventInvalid;
    if(NULL == pLibContext)
    {
        wStatus = NFCSTATUS_NOT_INITIALISED;
    }
    else if((NULL == pConfigInfo) ||(NULL == pConfigRspCb))
    {
        wStatus = NFCSTATUS_INVALID_PARAMETER;
    }
    else
    {
        bGeneralBytesLength = pConfigInfo->generalBytesLength;
        if((pLibContext->bDtaFlag || (0 != bGeneralBytesLength)) &&
           (PH_LIBNFC_INTERNAL_MAX_ATR_LENGTH >= bGeneralBytesLength))
        {
            /* Allocate memory for the input parameter that needs to be sent to
               'phNciNfc_SetConfigRfParameters' API */
            pRfDiscConfParam = (pphNciNfc_RfDiscConfigParams_t)phOsalNfc_GetMemory(
                                                sizeof(phNciNfc_RfDiscConfigParams_t));
            if(NULL != pRfDiscConfParam)
            {
                phOsalNfc_SetMemory(pRfDiscConfParam,0,sizeof(phNciNfc_RfDiscConfigParams_t));

                pLibContext->CBInfo.pClientNfcIpCfgCb = pConfigRspCb;
                pLibContext->CBInfo.pClientNfcIpCfgCntx = pContext;

                /* Set general bytes for Poll  Nfc-Dep parameters */
                switch(pConfigInfo->p2pMode)
                {
                    case NFC_DEP_POLL:
                        pRfDiscConfParam->tConfigInfo.PollNfcDepConfig = 1;
                        /* Configuring general bytes for ATR_REQ */
                        pRfDiscConfParam->tPollNfcDepDiscParams.PollNfcDepConfig.EnableConfig = 0;
                        pRfDiscConfParam->tPollNfcDepDiscParams.PollNfcDepConfig.Config.bSetGenBytes = 1;
                        pRfDiscConfParam->tPollNfcDepDiscParams.bAtrReqGeneBytesSize = bGeneralBytesLength;
                        phOsalNfc_MemCopy(pRfDiscConfParam->tPollNfcDepDiscParams.aAtrReqGenBytes,
                        pConfigInfo->generalBytes,bGeneralBytesLength);
                        /*Enable General Bytes to default values*/
                        /*Configure to default value = 0x30*/
                        pRfDiscConfParam->tPollNfcDepDiscParams.PollNfcDepConfig.Config.bSetAtrConfig = 1;
                        pRfDiscConfParam->tPollNfcDepDiscParams.AtrReqConfig.bDid = 0; /*0 For LLCP*/
                        pRfDiscConfParam->tPollNfcDepDiscParams.AtrReqConfig.bLr = 0x03;/*0x03 for LLCP*/
                    break;
                    case  NFC_DEP_LISTEN:
                        /* Set general bytes for Listen  Nfc-Dep parameters */
                        pRfDiscConfParam->tConfigInfo.LstnNfcDepConfig = 1;
                        /* Configuring general bytes for ATR_RES */
                        pRfDiscConfParam->tLstnNfcDepDiscParams.LstnNfcDepConfig.EnableConfig = 0;
                        pRfDiscConfParam->tLstnNfcDepDiscParams.LstnNfcDepConfig.Config.bSetGenBytes = 1;
                        pRfDiscConfParam->tLstnNfcDepDiscParams.bAtrResGenBytesSize = bGeneralBytesLength;
                        phOsalNfc_MemCopy(pRfDiscConfParam->tLstnNfcDepDiscParams.aAtrResGenBytes,
                        pConfigInfo->generalBytes,bGeneralBytesLength);
                        /*Enable General Bytes in response*/
                        /*Configure to defaule value*/
                        pRfDiscConfParam->tLstnNfcDepDiscParams.LstnNfcDepConfig.Config.bSetAtrRespConfig = 1;
                        pRfDiscConfParam->tLstnNfcDepDiscParams.AtrRespConfig.bLengthReduction = 0x03; /*For LLCP*/
                    break;
                    case NFC_DEP_DEFAULT:
                    default:
                        pRfDiscConfParam->tConfigInfo.PollNfcDepConfig = 1;
                        /* Configuring general bytes for ATR_REQ */
                        pRfDiscConfParam->tPollNfcDepDiscParams.PollNfcDepConfig.EnableConfig = 0;
                        pRfDiscConfParam->tPollNfcDepDiscParams.PollNfcDepConfig.Config.bSetGenBytes = 1;
                        pRfDiscConfParam->tPollNfcDepDiscParams.bAtrReqGeneBytesSize = bGeneralBytesLength;
                        phOsalNfc_MemCopy(pRfDiscConfParam->tPollNfcDepDiscParams.aAtrReqGenBytes,
                                          pConfigInfo->generalBytes,bGeneralBytesLength);
                        /*Enable General Bytes to default values*/
                        /*Configure to default value = 0x30*/
                        pRfDiscConfParam->tPollNfcDepDiscParams.PollNfcDepConfig.Config.bSetAtrConfig = 1;
                        pRfDiscConfParam->tPollNfcDepDiscParams.AtrReqConfig.bDid = 0; /*0 For LLCP*/
                        pRfDiscConfParam->tPollNfcDepDiscParams.AtrReqConfig.bLr = 0x03;/*0x03 for LLCP*/     
                        pRfDiscConfParam->tConfigInfo.LstnNfcDepConfig = 1;
                        /* Configuring general bytes for ATR_RES */
                        pRfDiscConfParam->tLstnNfcDepDiscParams.LstnNfcDepConfig.EnableConfig = 0;
                        pRfDiscConfParam->tLstnNfcDepDiscParams.LstnNfcDepConfig.Config.bSetGenBytes = 1;
                        pRfDiscConfParam->tLstnNfcDepDiscParams.bAtrResGenBytesSize = bGeneralBytesLength;
                        phOsalNfc_MemCopy(pRfDiscConfParam->tLstnNfcDepDiscParams.aAtrResGenBytes,
                                          pConfigInfo->generalBytes,bGeneralBytesLength);
                        /*Enable General Bytes in response*/
                        /*Configure to defaule value*/
                        pRfDiscConfParam->tLstnNfcDepDiscParams.LstnNfcDepConfig.Config.bSetAtrRespConfig = 1;
                        pRfDiscConfParam->tLstnNfcDepDiscParams.AtrRespConfig.bLengthReduction = 0x03; /*For LLCP*/		
                    break;
                }

                Info.Evt = phLibNfc_DummyEventSetP2PConfigs;
                Info.Params = (void *)pRfDiscConfParam;

                wStatus = phLibNfc_StateHandler(pLibContext,
                                                TrigEvent,
                                                NULL,
                                                &Info,
                                                NULL);
                if(NFCSTATUS_PENDING != wStatus)
                {
                    phOsalNfc_FreeMemory(pRfDiscConfParam);
                    pLibContext->CBInfo.pClientNfcIpCfgCb = NULL;
                    pLibContext->CBInfo.pClientNfcIpCfgCntx = NULL;
                }
            }
            else
            {
                wStatus = NFCSTATUS_INSUFFICIENT_RESOURCES;
            }
        }
        else
        {
            wStatus = NFCSTATUS_INVALID_PARAMETER;
        }
    }
    PH_LOG_LIBNFC_FUNC_EXIT();
    return wStatus;
}
static NFCSTATUS phFriNfc_MfUL_H_ProRd16Bytes( phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt )
{
    NFCSTATUS   Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_SMTCRDFMT,
                                    NFCSTATUS_FORMAT_ERROR);
    uint32_t    memcompare = PH_FRINFC_MFUL_FMT_VAL_0;
    uint8_t     ZeroBuf[] = {0x00, 0x00, 0x00, 0x00};
    uint8_t     OTPByteUL[] = PH_FRINFC_MFUL_FMT_OTP_BYTES;
    uint8_t     OTPByteULC[] = PH_FRINFC_MFULC_FMT_OTP_BYTES;

    PH_LOG_NDEF_FUNC_ENTRY();
    /* Check the lock bits (byte number 2 and 3 of block number 2) */
    if ((NdefSmtCrdFmt->SendRecvBuf[PH_FRINFC_MFUL_FMT_VAL_2] ==
        PH_FRINFC_MFUL_FMT_LOCK_BITS_VAL) &&
        (NdefSmtCrdFmt->SendRecvBuf[PH_FRINFC_MFUL_FMT_VAL_3] ==
        PH_FRINFC_MFUL_FMT_LOCK_BITS_VAL))
    {
        if (NdefSmtCrdFmt->SendRecvBuf[8] == 0x02 &&
            NdefSmtCrdFmt->SendRecvBuf[9] == 0x00)
        {
            NdefSmtCrdFmt->CardType = PH_FRINFC_NDEFMAP_MIFARE_ULC_CARD;

            phOsalNfc_MemCopy(NdefSmtCrdFmt->AddInfo.Type2Info.OTPBytes,
                        OTPByteULC,
                        sizeof(NdefSmtCrdFmt->AddInfo.Type2Info.OTPBytes));
        }
        else if (NdefSmtCrdFmt->SendRecvBuf[8] == 0xFF &&
                NdefSmtCrdFmt->SendRecvBuf[9] == 0xFF)
        {
            NdefSmtCrdFmt->CardType = PH_FRINFC_NDEFMAP_MIFARE_UL_CARD;

            phOsalNfc_MemCopy(NdefSmtCrdFmt->AddInfo.Type2Info.OTPBytes,
                        OTPByteUL,
                        sizeof(NdefSmtCrdFmt->AddInfo.Type2Info.OTPBytes));
        }
        else
        {
            NdefSmtCrdFmt->CardType = PH_FRINFC_NDEFMAP_MIFARE_UL_CARD;
        }

        memcompare = (uint32_t)
                    MemCompare1(&NdefSmtCrdFmt->SendRecvBuf[PH_FRINFC_MFUL_FMT_VAL_4],
                            NdefSmtCrdFmt->AddInfo.Type2Info.OTPBytes,
                            PH_FRINFC_MFUL_FMT_VAL_4);

        if (memcompare == PH_FRINFC_MFUL_FMT_VAL_0)
        {
            /* Write NDEF TLV in block number 4 */
            NdefSmtCrdFmt->AddInfo.Type2Info.CurrentBlock =
                                                PH_FRINFC_MFUL_FMT_VAL_4;
            /* Card already have the OTP bytes so write TLV */
            NdefSmtCrdFmt->State = PH_FRINFC_MFUL_FMT_WR_TLV;
        }
        else
        {
            /* IS the card new, OTP bytes = {0x00, 0x00, 0x00, 0x00} */
            memcompare = (uint32_t)MemCompare1(&NdefSmtCrdFmt->SendRecvBuf[PH_FRINFC_MFUL_FMT_VAL_4],
                                ZeroBuf,
                                PH_FRINFC_MFUL_FMT_VAL_4);
            /* If OTP bytes are Zero then the card is Zero */
            if (memcompare == PH_FRINFC_MFUL_FMT_VAL_0)
            {
                /* Write OTP bytes in block number 3 */
                NdefSmtCrdFmt->AddInfo.Type2Info.CurrentBlock =
                                                PH_FRINFC_MFUL_FMT_VAL_3;
                /* Card already have the OTP bytes so write TLV */
                NdefSmtCrdFmt->State = PH_FRINFC_MFUL_FMT_WR_OTPBYTES;
            }
        }
    }

    if(
        ((NdefSmtCrdFmt->State == PH_FRINFC_MFUL_FMT_WR_TLV) ||
        (NdefSmtCrdFmt->State == PH_FRINFC_MFUL_FMT_WR_OTPBYTES)) &&
        ((NdefSmtCrdFmt->CardType == PH_FRINFC_NDEFMAP_MIFARE_ULC_CARD) ||
        (NdefSmtCrdFmt->CardType == PH_FRINFC_NDEFMAP_MIFARE_UL_CARD))
        )
    {
        Result = phFriNfc_MfUL_H_WrRd(NdefSmtCrdFmt);
    }
    PH_LOG_NDEF_FUNC_EXIT();
    return Result;
}
static
NFCSTATUS
phFriNfc_MfUL_UpdateAndWriteLockBits (
    phFriNfc_sNdefSmtCrdFmt_t          *NdefSmtCrdFmt)
{
    NFCSTATUS                       result = NFCSTATUS_SUCCESS;
    phFriNfc_Type2_AddInfo_t        *ps_type2_info =
                                    &(NdefSmtCrdFmt->AddInfo.Type2Info);
    uint8_t                         byte_index = 0;
    uint8_t                         no_of_bits_left_in_block = 0;
    uint8_t                         remaining_lock_bits = 0;
    uint8_t                         remaining_lock_bytes = 0;
    /* Array of 3 is used because the lock bits with 4 bytes in a block
        is handled in the function phFriNfc_MfUL_ReadWriteLockBytes
        So use this function only if lock bytes doesnt use the entire block */
    uint8_t                         lock_bytes_value[MFUL_BLOCK_SIZE_IN_BYTES] = {0};
    uint8_t                         lock_byte_index = 0;

    (void)phOsalNfc_MemCopy ((void *)lock_bytes_value,
                (void*)(ps_type2_info->ReadData + ps_type2_info->ReadDataIndex),
                sizeof (ps_type2_info->DynLockBytes));
    remaining_lock_bits = phFriNfc_MfUL_CalcRemainingLockBits (NdefSmtCrdFmt);

    if (ps_type2_info->CurrentBlock == ps_type2_info->LockBlockNumber)
    {
        /* 1st write to lock bits, so byte_index is updated */
        byte_index = ps_type2_info->LockByteNumber;
    }

    no_of_bits_left_in_block = (uint8_t)((MFUL_BLOCK_SIZE_IN_BYTES - byte_index) *
                                MFUL_BYTE_SIZE_IN_BITS);

    if (no_of_bits_left_in_block >= remaining_lock_bits)
    {
        /* Entire lock bits can be written
            if block size is more than number of lock bits.
            so allocate the lock bits with value 1b and
            dont change the remaining bits */
        if (remaining_lock_bits % MFUL_BYTE_SIZE_IN_BITS)
        {
            /* mod operation has resulted in a value, means lock bits ends in between a byte */
            uint8_t         mod_value = 0;

            remaining_lock_bytes = ((remaining_lock_bits /
                                    MFUL_BYTE_SIZE_IN_BITS) + 1);

            /* mod_value is used to fill the only partial bits and
                remaining bits shall be untouched */
            mod_value = (uint8_t)(remaining_lock_bits % MFUL_BYTE_SIZE_IN_BITS);
            if (remaining_lock_bits > MFUL_BYTE_SIZE_IN_BITS)
            {
                /* lock bits to write is greater than 8 bits */
                while (lock_byte_index < (remaining_lock_bytes - 1))
                {
                    /* Set 1b to all bits left in the block */
                    lock_bytes_value[byte_index] = 0xFF;
                    lock_byte_index = (uint8_t)(lock_byte_index + 1);
                    byte_index = (uint8_t)(byte_index + 1);
                }
                /* Last byte of the lock bits shall be filled partially,
                    Set only the remaining lock bits and dont change
                    the other bit value */
                lock_bytes_value[byte_index] = 0;
                lock_bytes_value[byte_index] = (uint8_t)
                        SET_BITS8 (lock_bytes_value[byte_index], 0,
                                    mod_value, 1);
            }
            else
            {
                /* lock bits to write is less than 8 bits, so
                    there is only one byte to write.
                    Set only the remaining lock bits and dont change
                    the other bit value */
                lock_bytes_value[0] = (uint8_t)SET_BITS8 (lock_bytes_value[0], 0,
                                                        mod_value, 1);
            }
        } /* if (remaining_lock_bits % MFUL_BYTE_SIZE_IN_BITS) */
        else
        {
            /* MOD operation is 00, that means entire byte value shall be 0xFF, means
            every bit shall be to 1 */
            remaining_lock_bytes = (remaining_lock_bits /
                                    MFUL_BYTE_SIZE_IN_BITS);

            while (lock_byte_index < remaining_lock_bytes)
            {
                /* Set 1b to all bits left in the block */
                lock_bytes_value[byte_index] = 0xFF;
                lock_byte_index = (uint8_t)(lock_byte_index + 1);
                byte_index = (uint8_t)(byte_index + 1);
            }
        } /* else of if (remaining_lock_bits % MFUL_BYTE_SIZE_IN_BITS) */
        ps_type2_info->LockBitsWritten = (uint8_t)(ps_type2_info->LockBitsWritten +
                                            remaining_lock_bits);
    } /* if (no_of_bits_left_in_block >= remaining_lock_bits) */
    else
    {
        /* Update till the left bits in the block and then carry
            out next operation after this write */
        while (lock_byte_index < (no_of_bits_left_in_block / MFUL_BYTE_SIZE_IN_BITS))
        {
            /* Set 1b to all bits left in the block */
            lock_bytes_value[byte_index] = 0xFF;
            lock_byte_index = (uint8_t)(lock_byte_index + 1);
            byte_index = (uint8_t)(byte_index + 1);
        }
        ps_type2_info->LockBitsWritten = (uint8_t)(ps_type2_info->LockBitsWritten +
                                            no_of_bits_left_in_block);
    } /* else of if (no_of_bits_left_in_block >= remaining_lock_bits) */


    /* Copy the values back to the DynLockBytes structure member */
    (void)phOsalNfc_MemCopy ((void*)ps_type2_info->DynLockBytes,
                (void *)lock_bytes_value,
                sizeof (ps_type2_info->DynLockBytes));


    NdefSmtCrdFmt->State = PH_FRINFC_MFUL_FMT_RO_WR_DYN_LOCK_BYTES;
    result = phFriNfc_MfUL_H_WrRd (NdefSmtCrdFmt);

    return result;
}
static NFCSTATUS phNciNfc_ProcessInitRsp(void *pContext, NFCSTATUS Status)
{
    NFCSTATUS wStatus = Status;
    phNciNfc_sInitRspParams_t *pInitRsp = NULL;
    pphNciNfc_Context_t pNciContext = pContext;
    uint8_t Offset = 0;
    uint16_t wTemp = 0;

    PH_LOG_NCI_FUNC_ENTRY();
    if(NULL != pNciContext)
    {
        pInitRsp = &(pNciContext->InitRspParams);
        if (pNciContext->RspBuffInfo.wLen >= 19)
        {
            if (pNciContext->RspBuffInfo.pBuff[Offset++] == PH_NCINFC_STATUS_OK)
            {
                wStatus = NFCSTATUS_SUCCESS;

                /*NFCC Features*/
                pInitRsp->NfccFeatures.DiscConfSuprt =  pNciContext->RspBuffInfo.pBuff[Offset++];
                pInitRsp->NfccFeatures.RoutingType =  pNciContext->RspBuffInfo.pBuff[Offset++];
                pInitRsp->NfccFeatures.PwrOffState =  pNciContext->RspBuffInfo.pBuff[Offset++];
                pInitRsp->NfccFeatures.Byte3 =  pNciContext->RspBuffInfo.pBuff[Offset++];

                /*number of supported RF interfaces*/
                pInitRsp->NoOfRfIfSuprt = pNciContext->RspBuffInfo.pBuff[Offset++];

                if(pInitRsp->NoOfRfIfSuprt <= PH_NCINFC_CORE_MAX_SUP_RF_INTFS)
                {
                    /*Supported RF Interfaces */
                    phOsalNfc_MemCopy(pInitRsp->RfInterfaces, &(pNciContext->RspBuffInfo.pBuff[Offset]),
                                                                pInitRsp->NoOfRfIfSuprt);
                    Offset += pInitRsp->NoOfRfIfSuprt;

                    /*Max No of Logical Connection supported*/
                    pInitRsp->MaxLogicalCon = pNciContext->RspBuffInfo.pBuff[Offset++];

                    /*Routing Table Size*/
                    pInitRsp->RoutingTableSize = pNciContext->RspBuffInfo.pBuff[Offset++]; /*LSB*/
                    wTemp = pNciContext->RspBuffInfo.pBuff[Offset++];
                    pInitRsp->RoutingTableSize = (pInitRsp->RoutingTableSize) | (wTemp << 8);

                    /*Control Packet Payload Length*/
                    pInitRsp->CntrlPktPayloadLen = pNciContext->RspBuffInfo.pBuff[Offset++];

                    /*Max Size For Large parameter*/
                    pInitRsp->MaxSizeLarge = pNciContext->RspBuffInfo.pBuff[Offset++]; /*LSB*/
                    wTemp = (uint16_t)pNciContext->RspBuffInfo.pBuff[Offset++];
                    pInitRsp->MaxSizeLarge = (pInitRsp->MaxSizeLarge) | (wTemp << 8);

                    /*Manufacturer ID*/
                    pInitRsp->ManufacturerId = pNciContext->RspBuffInfo.pBuff[Offset++];
                    if(pInitRsp->ManufacturerId != 0x00)
                    {
                        /*Decided by Manufacturer*/
                        pInitRsp->ManufacturerInfo.Byte0 = pNciContext->RspBuffInfo.pBuff[Offset++];
                        pInitRsp->ManufacturerInfo.Byte1 = pNciContext->RspBuffInfo.pBuff[Offset++];
                        pInitRsp->ManufacturerInfo.Byte2 = pNciContext->RspBuffInfo.pBuff[Offset++];
                        pInitRsp->ManufacturerInfo.Byte3 = pNciContext->RspBuffInfo.pBuff[Offset++];
                    }

                    wStatus = phNciNfc_CoreIfSetMaxCtrlPacketSize(&(pNciContext->NciCoreContext),
                                                                     pInitRsp->CntrlPktPayloadLen);
                }
                else
                {
                    PH_LOG_NCI_CRIT_STR("Invalid number of supported Rf interfaces");
                    wStatus = NFCSTATUS_FAILED;
                }
            }
            else
            {
                wStatus = NFCSTATUS_FAILED;
            }
        }
        else
        {
            wStatus = NFCSTATUS_FAILED;
        }

        if((NFCSTATUS_SUCCESS == wStatus) &&
            (0 == pNciContext->tInitInfo.bSkipRegisterAllNtfs))
        {
            wStatus = phNciNfc_RegAllNtfs(pNciContext);
            if(NFCSTATUS_SUCCESS == wStatus)
            {
                pNciContext->dwNtfTimerId = phOsalNfc_Timer_Create();
                if(PH_OSALNFC_TIMER_ID_INVALID == pNciContext->dwNtfTimerId)
                {
                    PH_LOG_NCI_CRIT_STR("Notification Timer Create failed!!");
                    wStatus = NFCSTATUS_INSUFFICIENT_RESOURCES;
                }
                else
                {
                    PH_LOG_NCI_INFO_STR("Notification Timer Created Successfully");
                }
            }
        }
    }
    else
    {
        wStatus = NFCSTATUS_INVALID_PARAMETER;
    }
    PH_LOG_NCI_FUNC_EXIT();
    return wStatus;
}
NFCSTATUS
phNciNfc_Send4BData(
                    void   *psContext
                    )
{
    NFCSTATUS               status = NFCSTATUS_SUCCESS;
    phNciNfc_CoreTxInfo_t   TxInfo;
    uint16_t                wPldDataSize = 0;

    phNciNfc_Context_t *psNciContext = (phNciNfc_Context_t *)psContext;

    PH_LOG_NCI_FUNC_ENTRY();

    if( (NULL == psNciContext) )
    {
        status = PHNFCSTVAL(CID_NFC_NCI, NFCSTATUS_INVALID_PARAMETER);
        PH_LOG_NCI_INFO_STR(" Invalid Context Param..");
    }
    else if(NULL == (psNciContext->tActvDevIf.pDevInfo))
    {
        status = PHNFCSTVAL(CID_NFC_NCI, NFCSTATUS_INVALID_DEVICE);
        PH_LOG_NCI_INFO_STR(" Invalid Device..");
    }
    else
    {
        pphNciNfc_RemoteDevInformation_t  pActivDev = NULL;

        pActivDev = (psNciContext->tActvDevIf.pDevInfo);

        if(0 != (psNciContext->tTranscvCtxt.tTranscvInfo.tSendData.wLen))
        {
            /* Fill the data packet details into TxInfo */
            TxInfo.tHeaderInfo.eMsgType = phNciNfc_e_NciCoreMsgTypeData;
            status = phNciNfc_GetConnId(pActivDev, &(TxInfo.tHeaderInfo.bConn_ID));

            if(NFCSTATUS_SUCCESS == status)
            {
                wPldDataSize = (psNciContext->tTranscvCtxt.tTranscvInfo.tSendData.wLen);

                (psNciContext->tTranscvCtxt.tSendPld.wLen) = 0;
                (psNciContext->tTranscvCtxt.tSendPld.pBuff) = (uint8_t *)phOsalNfc_GetMemory(wPldDataSize);

                if(NULL != (psNciContext->tTranscvCtxt.tSendPld.pBuff))
                {
                    (psNciContext->tTranscvCtxt.tSendPld.wLen) = (wPldDataSize);
                    phOsalNfc_SetMemory((psNciContext->tTranscvCtxt.tSendPld.pBuff),0,
                        (psNciContext->tTranscvCtxt.tSendPld.wLen));

                    if(0 != wPldDataSize)
                    {
                        phOsalNfc_MemCopy((psNciContext->tTranscvCtxt.tSendPld.pBuff),
                            (psNciContext->tTranscvCtxt.tTranscvInfo.tSendData.pBuff),wPldDataSize);
                    }
                    PH_LOG_NCI_INFO_STR(" 4B Payload created successfully..");

                    TxInfo.Buff = (psNciContext->tTranscvCtxt.tSendPld.pBuff);
                    TxInfo.wLen = (psNciContext->tTranscvCtxt.tSendPld.wLen);
                    status = phNciNfc_CoreIfTxRx(&(psNciContext->NciCoreContext), &TxInfo,
                        &(psNciContext->RspBuffInfo), psNciContext->tTranscvCtxt.tTranscvInfo.wTimeout,
                        (pphNciNfc_CoreIfNtf_t)&phNciNfc_RdrDataXchgSequence, psContext);
                    /* Clear the timeout value so that it wont be used mistakenly in subsequent transceive */
                    psNciContext->tTranscvCtxt.tTranscvInfo.wTimeout = 0;
                }
                else
                {
                    status = PHNFCSTVAL(CID_NFC_NCI, NFCSTATUS_INSUFFICIENT_RESOURCES);
                    PH_LOG_NCI_INFO_STR(" Payload MemAlloc for Send request Failed..");
                }
            }
            else
            {
                status = PHNFCSTVAL(CID_NFC_NCI, NFCSTATUS_FAILED);
                PH_LOG_NCI_INFO_STR(" Couldn't Get ConnId..");
            }
        }
        else
        {
            status = PHNFCSTVAL(CID_NFC_NCI, NFCSTATUS_FAILED);
            PH_LOG_NCI_INFO_STR(" Send Data Buff not valid..");
        }
    }
    PH_LOG_NCI_FUNC_EXIT();

    return status;
}
NFCSTATUS
phNciNfc_Recv4BResp(
                        void                *psContext,
                        NFCSTATUS          wStatus
                       )
{
    NFCSTATUS                   status = NFCSTATUS_SUCCESS;
    phNciNfc_Context_t          *psNciContext = (phNciNfc_Context_t *)psContext;
    uint16_t                wRecvDataSz = 0;
    uint16_t CopyLen = 0;

    PH_LOG_NCI_FUNC_ENTRY();

    if(NULL == psNciContext)
    {
      status = PHNFCSTVAL(CID_NFC_NCI, NFCSTATUS_INVALID_PARAMETER);
      PH_LOG_NCI_INFO_STR(" Invalid Context Param..");
    }
    else
    {
        if((0 == (psNciContext->RspBuffInfo.wLen))
                || (PH_NCINFC_STATUS_OK != wStatus)
                || (NULL == (psNciContext->RspBuffInfo.pBuff))
                )
        {
            /* NOTE:- ( TODO) In this fail scenario,map the status code from response handler
            to the status code in Nci Context and use the same in the status below */
            status = PHNFCSTVAL(CID_NFC_NCI, NFCSTATUS_FAILED);
            PH_LOG_NCI_INFO_STR(" Data Receive Failed..");
        }
        else
        {
            wRecvDataSz = (psNciContext->tTranscvCtxt.tTranscvInfo.tRecvData.wLen);

            if((psNciContext->RspBuffInfo.wLen) > wRecvDataSz)
            {
                CopyLen = wRecvDataSz;
                status = NFCSTATUS_SUCCESS; // Change to this if handling is added NFCSTATUS_MORE_INFORMATION;
            }else
            {
                CopyLen = psNciContext->RspBuffInfo.wLen;
                status = NFCSTATUS_SUCCESS;
            }

            /* Extract the data part from pBuff[3] & fill it to be sent to upper layer */
                phOsalNfc_MemCopy((psNciContext->tTranscvCtxt.tTranscvInfo.tRecvData.pBuff),
                    (psNciContext->RspBuffInfo.pBuff),CopyLen);
                psNciContext->tTranscvCtxt.tTranscvInfo.tRecvData.wLen = CopyLen;
        }
        (psNciContext->tTranscvCtxt.wPrevStatus) = status;
    }

    if((NULL != psNciContext) && (NULL != (psNciContext->tTranscvCtxt.tSendPld.pBuff)))
    {
        (psNciContext->tTranscvCtxt.tSendPld.wLen) = 0;
        PH_LOG_NCI_INFO_STR(" Freeing Send Request Payload Buffer..");
        phOsalNfc_FreeMemory((psNciContext->tTranscvCtxt.tSendPld.pBuff));
        psNciContext->tTranscvCtxt.tSendPld.pBuff = NULL;
    }

    PH_LOG_NCI_FUNC_EXIT();

    return status;
}
static
NFCSTATUS
phFriNfc_ISO15693_H_FmtReadWrite (
    phFriNfc_sNdefSmtCrdFmt_t   *psNdefSmtCrdFmt,
    uint8_t                     command,
    uint8_t                     *p_data,
    uint8_t                     data_length)
{
    NFCSTATUS                   result = NFCSTATUS_SUCCESS;
    uint8_t                     send_index = 0;

    /* set the data for additional data exchange*/
    psNdefSmtCrdFmt->psDepAdditionalInfo.DepFlags.MetaChaining = 0;
    psNdefSmtCrdFmt->psDepAdditionalInfo.DepFlags.NADPresent = 0;
    psNdefSmtCrdFmt->psDepAdditionalInfo.NodeAddress = 0;

    psNdefSmtCrdFmt->SmtCrdFmtCompletionInfo.CompletionRoutine =
                                            phFriNfc_ISO15693_FmtProcess;
    psNdefSmtCrdFmt->SmtCrdFmtCompletionInfo.Context = psNdefSmtCrdFmt;

    *psNdefSmtCrdFmt->SendRecvLength = PH_FRINFC_SMTCRDFMT_MAX_SEND_RECV_BUF_SIZE;

    psNdefSmtCrdFmt->Cmd.Iso15693Cmd = phHal_eIso15693_Cmd;

    *(psNdefSmtCrdFmt->SendRecvBuf + send_index) = (uint8_t)ISO15693_FMT_FLAGS;
    send_index = (uint8_t)(send_index + 1);

    *(psNdefSmtCrdFmt->SendRecvBuf + send_index) = (uint8_t)command;
    send_index = (uint8_t)(send_index + 1);

    (void)phOsalNfc_MemCopy ((void *)(psNdefSmtCrdFmt->SendRecvBuf + send_index),
        (void *)psNdefSmtCrdFmt->psRemoteDevInfo->RemoteDevInfo.Iso15693_Info.Uid,
        psNdefSmtCrdFmt->psRemoteDevInfo->RemoteDevInfo.Iso15693_Info.UidLength);
    send_index = (uint8_t)(send_index +
            psNdefSmtCrdFmt->psRemoteDevInfo->RemoteDevInfo.Iso15693_Info.UidLength);

    switch (command)
    {
        case ISO15693_WR_SINGLE_BLK_CMD:
        case ISO15693_RD_MULTIPLE_BLKS_CMD:
        {
            *(psNdefSmtCrdFmt->SendRecvBuf + send_index) = (uint8_t)
                        psNdefSmtCrdFmt->AddInfo.s_iso15693_info.current_block;
            send_index = (uint8_t)(send_index + 1);

            if (data_length)
            {
                (void)phOsalNfc_MemCopy ((void *)(psNdefSmtCrdFmt->SendRecvBuf + send_index),
                            (void *)p_data, data_length);
                send_index = (uint8_t)(send_index + data_length);
            }
            else
            {
                result = PHNFCSTVAL (CID_FRI_NFC_NDEF_SMTCRDFMT,
                                    NFCSTATUS_INVALID_DEVICE_REQUEST);
            }
            break;
        }

        case ISO15693_RD_SINGLE_BLK_CMD:
        {
            *(psNdefSmtCrdFmt->SendRecvBuf + send_index) = (uint8_t)
                        psNdefSmtCrdFmt->AddInfo.s_iso15693_info.current_block;
            send_index = (uint8_t)(send_index + 1);
            break;
        }

        case ISO15693_GET_SYSTEM_INFO_CMD:
        {
            /* Dont do anything */
            break;
        }

        default:
        {
            result = PHNFCSTVAL (CID_FRI_NFC_NDEF_SMTCRDFMT,
                                NFCSTATUS_INVALID_DEVICE_REQUEST);
            break;
        }
    }

    psNdefSmtCrdFmt->SendLength = send_index;

    if (!result)
    {
        result = phFriNfc_OvrHal_Transceive(psNdefSmtCrdFmt->LowerDevice,
                                            &psNdefSmtCrdFmt->SmtCrdFmtCompletionInfo,
                                            psNdefSmtCrdFmt->psRemoteDevInfo,
                                            psNdefSmtCrdFmt->Cmd,
                                            &psNdefSmtCrdFmt->psDepAdditionalInfo,
                                            psNdefSmtCrdFmt->SendRecvBuf,
                                            psNdefSmtCrdFmt->SendLength,
                                            psNdefSmtCrdFmt->SendRecvBuf,
                                            psNdefSmtCrdFmt->SendRecvLength);
    }

    return result;
}
NFCSTATUS
phHciNfc_CoreSend(void                            *pHciContextHandle,
                  phHciNfc_SendParams_t           *pSendMsgParams,
                  pphHciNfc_UpperLayerSendCb_t    phHciNfcUpperLayerSendCb,
                  void                            *pContext
                 )
{
    NFCSTATUS wStatus;
    phHciNfc_HciContext_t *pHciContext = (phHciNfc_HciContext_t *) pHciContextHandle;
    uint8_t               *pBuiltHciPkt;
    uint32_t              dwTotalLenOfBuiltPkt=0;
    phNfc_sData_t         tSendData;

    if( (pHciContext == NULL) || (pSendMsgParams == NULL) )
    {
        PH_LOG_LIBNFC_CRIT_STR("Invalid parameter");
        wStatus = NFCSTATUS_INVALID_PARAMETER;
    }else
    {
        pBuiltHciPkt = phOsalNfc_GetMemory(PHHCI_HCP_MAX_PACKET_SIZE);

        if( pBuiltHciPkt == NULL )
        {
            /* Failed to allocate memory for HCI packet */
            wStatus = NFCSTATUS_FAILED;
        }else
        {
            /* Store Send Call back, Uppler Layer Context and received msg params in Hci context */
            phOsalNfc_MemCopy(&(pHciContext->pHciCoreContext.tHciCtxSendMsgParams),pSendMsgParams,sizeof(phHciNfc_SendParams_t));

            /* Check whether Fragmenation is required
            *  If fragmentation is required fragmentation is performed in phHciNfcLowerLayerSendCb callback
            *  which is invoked by NCI after transmission of first packet here
            */
            if( pSendMsgParams->dwLen <= ( PHHCI_HCI_MAX_PACKET_PAYLOAD_SIZE ) )
            {
                wStatus = phHciNfc_HciCoreBuildHcipacket(pSendMsgParams,
                                                         HCP_CHAINBIT_UN_CHAINED,
                                                         pSendMsgParams->dwLen,
                                                         &dwTotalLenOfBuiltPkt,
                                                         pBuiltHciPkt);
                pHciContext->pHciCoreContext.tHciFragInfo.dwTxdHcpPayloadNoOfDataBytes = pSendMsgParams->dwLen;

            }else
            {
                /* The HCI packets needs to be fragmented, send the First HCI packet and start
                *  HCI Fragmenation in the Send Call Back(after sucessfull transmission by lower layer)
                */
                wStatus = phHciNfc_HciCoreBuildHcipacket(pSendMsgParams,
                                                         HCP_CHAINBIT_CHAINED,
                                                         PHHCI_HCI_MAX_PACKET_PAYLOAD_SIZE,
                                                         &dwTotalLenOfBuiltPkt,
                                                         pBuiltHciPkt);
                pHciContext->pHciCoreContext.tHciFragInfo.dwTxdHcpPayloadNoOfDataBytes =
                                                                          PHHCI_HCI_MAX_PACKET_PAYLOAD_SIZE;
            }
            /* Send the HCI packet to lower layer */
            if( wStatus == NFCSTATUS_SUCCESS )
            {
                tSendData.length = dwTotalLenOfBuiltPkt;
                tSendData.buffer = pBuiltHciPkt;
                wStatus = phNciNfc_SeSendData(pHciContext->pNciContext,
                                  pHciContext->pSeHandle,
                                  (pphNciNfc_IfNotificationCb_t)&phHciNfc_HciCoreLowerLayerSendCb,
                                  pHciContext,
                                  &tSendData);
                if(wStatus == NFCSTATUS_PENDING)
                {
                    /* Store Send Call back, Uppler Layer Context in Hci context */
                    pHciContext->pHciCoreContext.phHciNfcCoreUpperLayerSendCb = phHciNfcUpperLayerSendCb;
                    pHciContext->pHciCoreContext.pUpperLayerContext           = pContext;

                    PH_LOG_LIBNFC_CRIT_STR(" HCP Packet Sent to NCI ");
                }
                else
                {
                    PH_LOG_LIBNFC_CRIT_STR(" Failed to send HCP to Lower ");
                }
            }
            else
            {
                PH_LOG_LIBNFC_CRIT_STR(" HCI packet Formation Failed ");
                wStatus = NFCSTATUS_INVALID_PARAMETER;
            }

            phOsalNfc_FreeMemory(pBuiltHciPkt);
        }
    }
    return wStatus;
}
static void phFriNfc_MfUL_H_fillSendBuf( phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt,
                                 uint8_t                    BlockNo)
{
    uint8_t     NDEFTLV1[4] = {0x01, 0x03, 0xA0, 0x10};
    uint8_t     NDEFTLV2[4] = {0x44, 0x03, 0x00, 0xFE};
    uint8_t     NDEFTLV[4] = {0x03, 0x00, 0xFE, 0x00};

    PH_LOG_NDEF_FUNC_ENTRY();

    /* First byte for send buffer is always the block number */
    NdefSmtCrdFmt->SendRecvBuf[PH_FRINFC_MFUL_FMT_VAL_0] = (uint8_t)BlockNo;
    switch(NdefSmtCrdFmt->State)
    {
        case PH_FRINFC_MFUL_FMT_RO_RD_16BYTES:
        {
            NdefSmtCrdFmt->Cmd.MfCmd = phHal_eMifareRead;
            *NdefSmtCrdFmt->SendRecvBuf = RD_LOCK_OTP_BLOCK_NUMBER;
            /* Send length for read command is always one */
            NdefSmtCrdFmt->SendLength = PH_FRINFC_MFUL_FMT_VAL_1;
            break;
        }
        case PH_FRINFC_MFUL_FMT_RO_NDEF_PARSE_RD_BYTES:
        {
            NdefSmtCrdFmt->Cmd.MfCmd = phHal_eMifareRead;
            *NdefSmtCrdFmt->SendRecvBuf =
                    NdefSmtCrdFmt->AddInfo.Type2Info.CurrentBlock;
            /* Send length for read command is always one */
            NdefSmtCrdFmt->SendLength = PH_FRINFC_MFUL_FMT_VAL_1;
            break;
        }

        case PH_FRINFC_MFUL_FMT_RO_RD_DYN_LOCK_BYTES:
        {
            NdefSmtCrdFmt->Cmd.MfCmd = phHal_eMifareRead;
            *NdefSmtCrdFmt->SendRecvBuf = NdefSmtCrdFmt->AddInfo.Type2Info.CurrentBlock;
            /* Send length for read command is always one */
            NdefSmtCrdFmt->SendLength = PH_FRINFC_MFUL_FMT_VAL_1;
            break;
        }

        case PH_FRINFC_MFUL_FMT_RO_WR_DYN_LOCK_BYTES:
        {
            NdefSmtCrdFmt->Cmd.MfCmd = phHal_eMifareWrite4;
            /* Send length for read command is always one */
            NdefSmtCrdFmt->SendLength = PH_FRINFC_MFUL_FMT_VAL_5;
            *NdefSmtCrdFmt->SendRecvBuf = NdefSmtCrdFmt->AddInfo.Type2Info.CurrentBlock;
            (void)phOsalNfc_MemCopy(&NdefSmtCrdFmt->SendRecvBuf[PH_FRINFC_MFUL_FMT_VAL_1],
                         NdefSmtCrdFmt->AddInfo.Type2Info.DynLockBytes,
                         PH_FRINFC_MFUL_FMT_VAL_4);
            break;
        }

        case PH_FRINFC_MFUL_FMT_RO_WR_LOCK_BYTES:
        {
            NdefSmtCrdFmt->Cmd.MfCmd = phHal_eMifareWrite4;
            /* Send length for read command is always one */
            NdefSmtCrdFmt->SendLength = PH_FRINFC_MFUL_FMT_VAL_5;
            *NdefSmtCrdFmt->SendRecvBuf = RD_LOCK_OTP_BLOCK_NUMBER;
            (void)phOsalNfc_MemCopy(&NdefSmtCrdFmt->SendRecvBuf[PH_FRINFC_MFUL_FMT_VAL_1],
                         NdefSmtCrdFmt->AddInfo.Type2Info.LockBytes,
                         PH_FRINFC_MFUL_FMT_VAL_4);
            break;
        }

        case PH_FRINFC_MFUL_FMT_RO_WR_OTP_BYTES:
        {
            NdefSmtCrdFmt->Cmd.MfCmd = phHal_eMifareWrite4;
            /* Send length for read command is always one */
            NdefSmtCrdFmt->SendLength = PH_FRINFC_MFUL_FMT_VAL_5;
            *NdefSmtCrdFmt->SendRecvBuf = OTP_BLOCK_NUMBER;
            phOsalNfc_MemCopy(&NdefSmtCrdFmt->SendRecvBuf[PH_FRINFC_MFUL_FMT_VAL_1],
                         NdefSmtCrdFmt->AddInfo.Type2Info.OTPBytes,
                         PH_FRINFC_MFUL_FMT_VAL_4);
            break;
        }

    case PH_FRINFC_MFUL_FMT_RD_16BYTES:
        NdefSmtCrdFmt->Cmd.MfCmd = phHal_eMifareRead;
        /* Send length for read command is always one */
        NdefSmtCrdFmt->SendLength = PH_FRINFC_MFUL_FMT_VAL_1;
        break;

    case PH_FRINFC_MFUL_FMT_WR_OTPBYTES:
        /* Send length for read command is always Five */
        NdefSmtCrdFmt->SendLength = PH_FRINFC_MFUL_FMT_VAL_5;
        /* Write command */
        NdefSmtCrdFmt->Cmd.MfCmd = phHal_eMifareWrite4;
        /* Copy the OTP bytes */
        phOsalNfc_MemCopy(&NdefSmtCrdFmt->SendRecvBuf[PH_FRINFC_MFUL_FMT_VAL_1],
                    NdefSmtCrdFmt->AddInfo.Type2Info.OTPBytes,
                    PH_FRINFC_MFUL_FMT_VAL_4);
        break;

    case PH_FRINFC_MFUL_FMT_WR_TLV:
        /* Send length for read command is always Five */
        NdefSmtCrdFmt->SendLength = PH_FRINFC_MFUL_FMT_VAL_5;
        /* Write command */
        NdefSmtCrdFmt->Cmd.MfCmd = phHal_eMifareWrite4;
        /* Copy the NDEF TLV */

        if (NdefSmtCrdFmt->CardType == PH_FRINFC_NDEFMAP_MIFARE_ULC_CARD)
        {
            phOsalNfc_MemCopy(&NdefSmtCrdFmt->SendRecvBuf[PH_FRINFC_MFUL_FMT_VAL_1],
                    NDEFTLV1,
                    PH_FRINFC_MFUL_FMT_VAL_4);
        }
        else if (NdefSmtCrdFmt->CardType == PH_FRINFC_NDEFMAP_MIFARE_UL_CARD)
        {
            phOsalNfc_MemCopy(&NdefSmtCrdFmt->SendRecvBuf[PH_FRINFC_MFUL_FMT_VAL_1],
                NDEFTLV,
                PH_FRINFC_MFUL_FMT_VAL_4);
        }
        else
        {
        }
        break;

    case PH_FRINFC_MFUL_FMT_WR_TLV1:
        if (NdefSmtCrdFmt->CardType == PH_FRINFC_NDEFMAP_MIFARE_ULC_CARD)
        {
            /* Send length for write command is always Five */
            NdefSmtCrdFmt->SendLength = PH_FRINFC_MFUL_FMT_VAL_5;
            /* Write command */
            NdefSmtCrdFmt->Cmd.MfCmd = phHal_eMifareWrite4;
            phOsalNfc_MemCopy(&NdefSmtCrdFmt->SendRecvBuf[PH_FRINFC_MFUL_FMT_VAL_1],
                        NDEFTLV2,
                        PH_FRINFC_MFUL_FMT_VAL_4);
        }
        break;

    default:
        break;
    }
    PH_LOG_NDEF_FUNC_EXIT();
}
static NFCSTATUS phLibNfc_InitSetConfig(void* pContext, NFCSTATUS status, void* pInfo)
{
    NFCSTATUS wStatus = NFCSTATUS_SUCCESS;
    pphLibNfc_Context_t pCtx = (pphLibNfc_Context_t) pContext;
#ifdef NFC_LA_NFCID1
    uint8_t aNfcId1[NFC_LA_NFCID1_LEN] = NFC_LA_NFCID1_VALUE;
#endif
#ifdef NFC_PB_H_INFO
    uint8_t aInfo[NFC_PB_H_INFO_LEN] = NFC_PB_H_INFO_VALUE;
#endif
#ifdef NFC_PN_ATR_REQ_GEN_BYTES
    uint8_t aGenBytes[NFC_NFC_PN_ATR_REQ_GEN_BYTES_LEN] = NFC_NFC_PN_ATR_REQ_GEN_BYTES_VALUE;
#endif
#ifdef NFC_LB_NFCID0
    uint8_t aNfcId0[NFC_LB_NFCID0_LEN] = NFC_LB_NFCID0_VALUE;
#endif
#ifdef NFC_LB_APPLICATION_DATA
    uint8_t aAppData[NFC_LB_APPLICATION_DATA_LEN] = NFC_LB_APPLICATION_DATA_VALUE;
#endif
#ifdef NFC_LF_T3T_IDENTIFIERS_1
    uint8_t aT3TId1[NFC_LF_T3T_IDENTIFIERS_1_LEN] = NFC_LF_T3T_IDENTIFIERS_1_VALUE;
    uint8_t bT3tId1Len = (uint8_t) NFC_LF_T3T_IDENTIFIERS_1_LEN;
#endif
#ifdef NFC_LF_T3T_IDENTIFIERS_2
    uint8_t aT3TId2[NFC_LF_T3T_IDENTIFIERS_2_LEN] = NFC_LF_T3T_IDENTIFIERS_2_VALUE;
#endif
#ifdef NFC_LF_T3T_IDENTIFIERS_3
    uint8_t aT3TId3[NFC_LF_T3T_IDENTIFIERS_3_LEN] = NFC_LF_T3T_IDENTIFIERS_3_VALUE;
#endif
#ifdef NFC_LF_T3T_IDENTIFIERS_4
    uint8_t aT3TId4[NFC_LF_T3T_IDENTIFIERS_4_LEN] = NFC_LF_T3T_IDENTIFIERS_4_VALUE;
#endif
#ifdef NFC_LF_T3T_IDENTIFIERS_5
    uint8_t aT3TId5[NFC_LF_T3T_IDENTIFIERS_15_LEN] = NFC_LF_T3T_IDENTIFIERS_5_VALUE;
#endif
#ifdef NFC_LF_T3T_IDENTIFIERS_6
    uint8_t aT3TId6[NFC_LF_T3T_IDENTIFIERS_6_LEN] = NFC_LF_T3T_IDENTIFIERS_6_VALUE;
#endif
#ifdef NFC_LF_T3T_IDENTIFIERS_7
    uint8_t aT3TId7[NFC_LF_T3T_IDENTIFIERS_7_LEN] = NFC_LF_T3T_IDENTIFIERS_7_VALUE;
#endif
#ifdef NFC_LF_T3T_IDENTIFIERS_8
    uint8_t aT3TId8[NFC_LF_T3T_IDENTIFIERS_8_LEN] = NFC_LF_T3T_IDENTIFIERS_8_VALUE;
#endif
#ifdef NFC_LF_T3T_IDENTIFIERS_9
    uint8_t aT3TId9[NFC_LF_T3T_IDENTIFIERS_9_LEN] = NFC_LF_T3T_IDENTIFIERS_9_VALUE;
#endif
#ifdef NFC_LF_T3T_IDENTIFIERS_10
    uint8_t aT3TId10[NFC_LF_T3T_IDENTIFIERS_10_LEN] = NFC_LF_T3T_IDENTIFIERS_10_VALUE;
#endif
#ifdef NFC_LF_T3T_IDENTIFIERS_11
    uint8_t aT3TId11[NFC_LF_T3T_IDENTIFIERS_11_LEN] = NFC_LF_T3T_IDENTIFIERS_11_VALUE;
#endif
#ifdef NFC_LF_T3T_IDENTIFIERS_12
    uint8_t aT3TId12[NFC_LF_T3T_IDENTIFIERS_12_LEN] = NFC_LF_T3T_IDENTIFIERS_12_VALUE;
#endif
#ifdef NFC_LF_T3T_IDENTIFIERS_13
    uint8_t aT3TId13[NFC_LF_T3T_IDENTIFIERS_13_LEN] = NFC_LF_T3T_IDENTIFIERS_13_VALUE;
#endif
#ifdef NFC_LF_T3T_IDENTIFIERS_14
    uint8_t aT3TId14[NFC_LF_T3T_IDENTIFIERS_14_LEN] = NFC_LF_T3T_IDENTIFIERS_14_VALUE;
#endif
#ifdef NFC_LF_T3T_IDENTIFIERS_15
    uint8_t aT3TId15[NFC_LF_T3T_IDENTIFIERS_15_LEN] = NFC_LF_T3T_IDENTIFIERS_15_VALUE;
#endif
#ifdef NFC_LF_T3T_IDENTIFIERS_16
    uint8_t aT3TId16[NFC_LF_T3T_IDENTIFIERS_16_LEN] = NFC_LF_T3T_IDENTIFIERS_16_VALUE;
#endif
#ifdef NFC_LF_T3T_PMM
    uint8_t aT3TPmm[NFC_LF_T3T_PMM_LEN] = NFC_LF_T3T_PMM_VALUE;
#endif
    phNciNfc_RfDiscConfigParams_t ConfigParams = {0};

    UNUSED(pContext);
    UNUSED(status);
    UNUSED(pInfo);

    PH_LOG_LIBNFC_FUNC_ENTRY();

    ConfigParams.tConfigInfo.CommonConfig = 1;
    ConfigParams.tCommonDiscParams.ComnParamsConfig.Config.SetRfFieldInfo = 1;
    #if PH_LIBNFC_ENABLE_RFFIELD_INFO_NTF
        ConfigParams.tCommonDiscParams.bRfFieldInfo = 1;
    #else
        ConfigParams.tCommonDiscParams.bRfFieldInfo = 0;
    #endif
    #if PH_LIBNFC_ENABLE_RF_NFCEE_ACTION_NTF
        ConfigParams.tConfigInfo.CommonConfig = 1;
        ConfigParams.tCommonDiscParams.ComnParamsConfig.Config.SetRfNfceeAction = 1;
        ConfigParams.tCommonDiscParams.bRfNfceeAction = (uint8_t)pCtx->Config.bNfceeActionNtf;
    #endif
    #if PH_LIBNFC_ENABLE_NFCDEP_RTOX
        ConfigParams.tConfigInfo.CommonConfig = 1;
        ConfigParams.tCommonDiscParams.ComnParamsConfig.Config.SetNfcDepOperationParam = 1;
        ConfigParams.tCommonDiscParams.NfcDepOperationParam.bRtoxReq = 0;
        ConfigParams.tCommonDiscParams.NfcDepOperationParam.bAttentionCommand = 1;
        ConfigParams.tCommonDiscParams.NfcDepOperationParam.bInformationPdu = 1;
        ConfigParams.tCommonDiscParams.NfcDepOperationParam.bUseMaxTxLen = 1;
    #endif
    #ifdef NFC_LA_NFCID1
        ConfigParams.tConfigInfo.LstnNfcAConfig = 1;
        ConfigParams.tLstnNfcADiscParams.LstnNfcAConfig.Config.SetNfcID1 = 1;
        phOsalNfc_MemCopy(ConfigParams.tLstnNfcADiscParams.aNfcID1,\
                          aNfcId1,(uint32_t)NFC_LA_NFCID1_LEN);
        ConfigParams.tLstnNfcADiscParams.bNfcID1Size = (uint8_t)NFC_LA_NFCID1_LEN;
    #endif
    #ifdef NFC_PB_H_INFO
        if(NFC_PB_H_INFO_LEN <= PH_NCINFC_MAX_HIGHER_LAYER_INF_LEN)
        {
            ConfigParams.tConfigInfo.PollIsoDepConfig = 1;
            ConfigParams.tPollIsoDepDiscParams.PollIsoDepConfig.Config.SetHigherLayerInfo = 1;
            phOsalNfc_MemCopy(ConfigParams.tPollIsoDepDiscParams.aHigherLayerInfo,\
                              aInfo,(uint32_t)NFC_PB_H_INFO_LEN);
            ConfigParams.tPollIsoDepDiscParams.bHigherLayerInfoSize = (uint8_t)NFC_PB_H_INFO_LEN;
        }
    #endif
    #ifdef NFC_PN_ATR_REQ_GEN_BYTES
        if(NFC_NFC_PN_ATR_REQ_GEN_BYTES_LEN <= PH_NCINFC_MAX_ATR_REQ_GEN_BYTES_LEN)
        {
            ConfigParams.tConfigInfo.PollNfcDepConfig = 1;
            ConfigParams.tPollNfcDepDiscParams.PollNfcDepConfig.Config.bSetGenBytes = 1;
            phOsalNfc_MemCopy(ConfigParams.tPollNfcDepDiscParams.aAtrReqGenBytes,\
                              aGenBytes,(uint32_t)NFC_NFC_PN_ATR_REQ_GEN_BYTES_LEN);
            ConfigParams.tPollNfcDepDiscParams.bAtrReqGeneBytesSize = (uint8_t)NFC_NFC_PN_ATR_REQ_GEN_BYTES_LEN;
        }
    #endif
    #ifdef NFC_LB_NFCID0
        if(NFC_LB_NFCID0_LEN <= PH_NCINFC_MAX_NFCID0_LEN)
        {
            ConfigParams.tConfigInfo.LstnNfcBConfig = 1;
            ConfigParams.tLstnNfcBDiscParams.LstnNfcBConfig.Config.SetNfcID0 = 1;
            phOsalNfc_MemCopy(ConfigParams.tLstnNfcBDiscParams.aNfcID0,\
                              aNfcId0,(uint32_t)NFC_LB_NFCID0_LEN);
            ConfigParams.tLstnNfcBDiscParams.bNfcID0Size = (uint8_t)NFC_LB_NFCID0_LEN;
        }
    #endif
    #ifdef NFC_LB_APPLICATION_DATA
        if(NFC_LB_APPLICATION_DATA_LEN <= PH_NCINFC_APP_DATA_LEN)
        {
            ConfigParams.tConfigInfo.LstnNfcBConfig = 1;
            ConfigParams.tLstnNfcBDiscParams.LstnNfcBConfig.Config.SetAppData = 1;
            phOsalNfc_MemCopy(ConfigParams.tLstnNfcBDiscParams.aAppData,\
                              aAppData,(uint32_t)NFC_LB_APPLICATION_DATA_LEN);
        }
    #endif
    #ifdef NFC_LF_T3T_IDENTIFIERS_1
        if(pCtx->bT3tMax <= PH_NCINFC_MAX_NUM_T3T_IDS)
        {
            if(pCtx->bT3tMax >= 1)
            {
                if(bT3tId1Len == PH_NCINFC_T3TID_LEN)
                {
                    ConfigParams.tConfigInfo.LstnNfcFConfig = 1;
                    ConfigParams.tLstnNfcFDiscParams.LstnNfcFConfig.Config.SetT3tId = 1;
                    phOsalNfc_MemCopy(ConfigParams.tLstnNfcFDiscParams.aT3tId[0],\
                                      aT3TId1,(uint32_t)NFC_LF_T3T_IDENTIFIERS_1_LEN);
                    ConfigParams.tLstnNfcFDiscParams.LstnNfcFConfig.Config.SetT3tFlags = 1;
                    ConfigParams.tLstnNfcFDiscParams.wT3tFlags |= 1;
                }
            }
        }
    #endif /* NFC_LF_T3T_IDENTIFIERS_1 */
    #ifdef NFC_LF_T3T_IDENTIFIERS_2
        if(pCtx->bT3tMax <= PH_NCINFC_MAX_NUM_T3T_IDS)
        {
            if(pCtx->bT3tMax >= 2)
            {
                if(NFC_LF_T3T_IDENTIFIERS_2_LEN == PH_NCINFC_T3TID_LEN)
                {
                    ConfigParams.tConfigInfo.LstnNfcFConfig = 1;
                    ConfigParams.tLstnNfcFDiscParams.LstnNfcFConfig.Config.SetT3tId = 1;
                    phOsalNfc_MemCopy(ConfigParams.tLstnNfcFDiscParams.aT3tId[1],\
                                      aT3TId2,(uint32_t)NFC_LF_T3T_IDENTIFIERS_2_LEN);
                }
            }
        }
    #endif /* NFC_LF_T3T_IDENTIFIERS_2 */
    #ifdef NFC_LF_T3T_IDENTIFIERS_3
        if(pCtx->bT3tMax <= PH_NCINFC_MAX_NUM_T3T_IDS)
        {
            if(pCtx->bT3tMax >= 3)
            {
                if(NFC_LF_T3T_IDENTIFIERS_3_LEN == PH_NCINFC_T3TID_LEN)
                {
                    ConfigParams.tConfigInfo.LstnNfcFConfig = 1;
                    ConfigParams.tLstnNfcFDiscParams.LstnNfcFConfig.Config.SetT3tId = 1;
                    phOsalNfc_MemCopy(ConfigParams.tLstnNfcFDiscParams.aT3tId[2],\
                                      aT3TId3,(uint32_t)NFC_LF_T3T_IDENTIFIERS_3_LEN);
                }
            }
        }
    #endif /* NFC_LF_T3T_IDENTIFIERS_3 */
    #ifdef NFC_LF_T3T_IDENTIFIERS_4
        if(pCtx->bT3tMax <= PH_NCINFC_MAX_NUM_T3T_IDS)
        {
            if(pCtx->bT3tMax >= 4)
            {
                if(NFC_LF_T3T_IDENTIFIERS_4_LEN == PH_NCINFC_T3TID_LEN)
                {
                    ConfigParams.tConfigInfo.LstnNfcFConfig = 1;
                    ConfigParams.tLstnNfcFDiscParams.LstnNfcFConfig.Config.SetT3tId = 1;
                    phOsalNfc_MemCopy(ConfigParams.tLstnNfcFDiscParams.aT3tId[3],\
                                      aT3TId4,(uint32_t)NFC_LF_T3T_IDENTIFIERS_4_LEN);
                }
            }
        }
    #endif /* NFC_LF_T3T_IDENTIFIERS_4 */
    #ifdef NFC_LF_T3T_IDENTIFIERS_5
        if(pCtx->bT3tMax <= PH_NCINFC_MAX_NUM_T3T_IDS)
        {
            if(pCtx->bT3tMax >= 5)
            {
                if(NFC_LF_T3T_IDENTIFIERS_5_LEN == PH_NCINFC_T3TID_LEN)
                {
                    ConfigParams.tConfigInfo.LstnNfcFConfig = 1;
                    ConfigParams.tLstnNfcFDiscParams.LstnNfcFConfig.Config.SetT3tId = 1;
                    phOsalNfc_MemCopy(ConfigParams.tLstnNfcFDiscParams.aT3tId[4],\
                                      aT3TId5,(uint32_t)NFC_LF_T3T_IDENTIFIERS_5_LEN);
                }
            }
        }
    #endif /* NFC_LF_T3T_IDENTIFIERS_5 */
    #ifdef NFC_LF_T3T_IDENTIFIERS_6
        if(pCtx->bT3tMax <= PH_NCINFC_MAX_NUM_T3T_IDS)
        {
            if(pCtx->bT3tMax >= 6)
            {
                if(NFC_LF_T3T_IDENTIFIERS_6_LEN == PH_NCINFC_T3TID_LEN)
                {
                    ConfigParams.tConfigInfo.LstnNfcFConfig = 1;
                    ConfigParams.tLstnNfcFDiscParams.LstnNfcFConfig.Config.SetT3tId = 1;
                    phOsalNfc_MemCopy(ConfigParams.tLstnNfcFDiscParams.aT3tId[5],\
                                      aT3TId6,(uint32_t)NFC_LF_T3T_IDENTIFIERS_6_LEN);
                }
            }
        }
    #endif /* NFC_LF_T3T_IDENTIFIERS_6 */
    #ifdef NFC_LF_T3T_IDENTIFIERS_7
        if(pCtx->bT3tMax <= PH_NCINFC_MAX_NUM_T3T_IDS)
        {
            if(pCtx->bT3tMax >= 7)
            {
                if(NFC_LF_T3T_IDENTIFIERS_7_LEN == PH_NCINFC_T3TID_LEN)
                {
                    ConfigParams.tConfigInfo.LstnNfcFConfig = 1;
                    ConfigParams.tLstnNfcFDiscParams.LstnNfcFConfig.Config.SetT3tId = 1;
                    phOsalNfc_MemCopy(ConfigParams.tLstnNfcFDiscParams.aT3tId[6],\
                                      aT3TId7,(uint32_t)NFC_LF_T3T_IDENTIFIERS_7_LEN);
                }
            }
        }
    #endif /* NFC_LF_T3T_IDENTIFIERS_7 */
    #ifdef NFC_LF_T3T_IDENTIFIERS_8
        if(pCtx->bT3tMax <= PH_NCINFC_MAX_NUM_T3T_IDS)
        {
            if(pCtx->bT3tMax >= 8)
            {
                if(NFC_LF_T3T_IDENTIFIERS_8_LEN == PH_NCINFC_T3TID_LEN)
                {
                    ConfigParams.tConfigInfo.LstnNfcFConfig = 1;
                    ConfigParams.tLstnNfcFDiscParams.LstnNfcFConfig.Config.SetT3tId = 1;
                    phOsalNfc_MemCopy(ConfigParams.tLstnNfcFDiscParams.aT3tId[7],\
                                      aT3TId8,(uint32_t)NFC_LF_T3T_IDENTIFIERS_8_LEN);
                }
            }
        }
    #endif /* NFC_LF_T3T_IDENTIFIERS_8 */
    #ifdef NFC_LF_T3T_IDENTIFIERS_9
        if(pCtx->bT3tMax <= PH_NCINFC_MAX_NUM_T3T_IDS)
        {
            if(pCtx->bT3tMax >= 9)
            {
                if(NFC_LF_T3T_IDENTIFIERS_9_LEN == PH_NCINFC_T3TID_LEN)
                {
                    ConfigParams.tConfigInfo.LstnNfcFConfig = 1;
                    ConfigParams.tLstnNfcFDiscParams.LstnNfcFConfig.Config.SetT3tId = 1;
                    phOsalNfc_MemCopy(ConfigParams.tLstnNfcFDiscParams.aT3tId[8],\
                                      aT3TId9,(uint32_t)NFC_LF_T3T_IDENTIFIERS_9_LEN);
                }
            }
        }
    #endif /* NFC_LF_T3T_IDENTIFIERS_9 */
    #ifdef NFC_LF_T3T_IDENTIFIERS_10
        if(pCtx->bT3tMax <= PH_NCINFC_MAX_NUM_T3T_IDS)
        {
            if(pCtx->bT3tMax >= 10)
            {
                if(NFC_LF_T3T_IDENTIFIERS_10_LEN == PH_NCINFC_T3TID_LEN)
                {
                    ConfigParams.tConfigInfo.LstnNfcFConfig = 1;
                    ConfigParams.tLstnNfcFDiscParams.LstnNfcFConfig.Config.SetT3tId = 1;
                    phOsalNfc_MemCopy(ConfigParams.tLstnNfcFDiscParams.aT3tId[9],\
                                      aT3TId10,(uint32_t)NFC_LF_T3T_IDENTIFIERS_10_LEN);
                }
            }
        }
    #endif /* NFC_LF_T3T_IDENTIFIERS_10 */
    #ifdef NFC_LF_T3T_IDENTIFIERS_11
        if(pCtx->bT3tMax <= PH_NCINFC_MAX_NUM_T3T_IDS)
        {
            if(pCtx->bT3tMax >= 11)
            {
                if(NFC_LF_T3T_IDENTIFIERS_11_LEN == PH_NCINFC_T3TID_LEN)
                {
                    ConfigParams.tConfigInfo.LstnNfcFConfig = 1;
                    ConfigParams.tLstnNfcFDiscParams.LstnNfcFConfig.Config.SetT3tId = 1;
                    phOsalNfc_MemCopy(ConfigParams.tLstnNfcFDiscParams.aT3tId[10],\
                                      aT3TId11,(uint32_t)NFC_LF_T3T_IDENTIFIERS_11_LEN);
                }
            }
        }
    #endif /* NFC_LF_T3T_IDENTIFIERS_11 */
    #ifdef NFC_LF_T3T_IDENTIFIERS_12
        if(pCtx->bT3tMax <= PH_NCINFC_MAX_NUM_T3T_IDS)
        {
            if(pCtx->bT3tMax >= 12)
            {
                if(NFC_LF_T3T_IDENTIFIERS_12_LEN == PH_NCINFC_T3TID_LEN)
                {
                    ConfigParams.tConfigInfo.LstnNfcFConfig = 1;
                    ConfigParams.tLstnNfcFDiscParams.LstnNfcFConfig.Config.SetT3tId = 1;
                    phOsalNfc_MemCopy(ConfigParams.tLstnNfcFDiscParams.aT3tId[11],\
                                      aT3TId12,(uint32_t)NFC_LF_T3T_IDENTIFIERS_12_LEN);
                }
            }
        }
    #endif /* NFC_LF_T3T_IDENTIFIERS_12 */
    #ifdef NFC_LF_T3T_IDENTIFIERS_13
        if(pCtx->bT3tMax <= PH_NCINFC_MAX_NUM_T3T_IDS)
        {
            if(pCtx->bT3tMax >= 13)
            {
                if(NFC_LF_T3T_IDENTIFIERS_13_LEN == PH_NCINFC_T3TID_LEN)
                {
                    ConfigParams.tConfigInfo.LstnNfcFConfig = 1;
                    ConfigParams.tLstnNfcFDiscParams.LstnNfcFConfig.Config.SetT3tId = 1;
                    phOsalNfc_MemCopy(ConfigParams.tLstnNfcFDiscParams.aT3tId[12],\
                                      aT3TId13,(uint32_t)NFC_LF_T3T_IDENTIFIERS_13_LEN);
                }
            }
        }
    #endif /* NFC_LF_T3T_IDENTIFIERS_13 */
    #ifdef NFC_LF_T3T_IDENTIFIERS_14
        if(pCtx->bT3tMax <= PH_NCINFC_MAX_NUM_T3T_IDS)
        {
            if(pCtx->bT3tMax >= 14)
            {
                if(NFC_LF_T3T_IDENTIFIERS_14_LEN == PH_NCINFC_T3TID_LEN)
                {
                    ConfigParams.tConfigInfo.LstnNfcFConfig = 1;
                    ConfigParams.tLstnNfcFDiscParams.LstnNfcFConfig.Config.SetT3tId = 1;
                    phOsalNfc_MemCopy(ConfigParams.tLstnNfcFDiscParams.aT3tId[13],\
                                      aT3TId14,(uint32_t)NFC_LF_T3T_IDENTIFIERS_14_LEN);
                }
            }
        }
    #endif /* NFC_LF_T3T_IDENTIFIERS_14 */
    #ifdef NFC_LF_T3T_IDENTIFIERS_15
        if(pCtx->bT3tMax <= PH_NCINFC_MAX_NUM_T3T_IDS)
        {
            if(pCtx->bT3tMax >= 15)
            {
                if(NFC_LF_T3T_IDENTIFIERS_15_LEN == PH_NCINFC_T3TID_LEN)
                {
                    ConfigParams.tConfigInfo.LstnNfcFConfig = 1;
                    ConfigParams.tLstnNfcFDiscParams.LstnNfcFConfig.Config.SetT3tId = 1;
                    phOsalNfc_MemCopy(ConfigParams.tLstnNfcFDiscParams.aT3tId[14],\
                                      aT3TId15,(uint32_t)NFC_LF_T3T_IDENTIFIERS_15_LEN);
                }
            }
        }
    #endif /* NFC_LF_T3T_IDENTIFIERS_15 */
    #ifdef NFC_LF_T3T_IDENTIFIERS_16
        if(pCtx->bT3tMax <= PH_NCINFC_MAX_NUM_T3T_IDS)
        {
            if(pCtx->bT3tMax >= 16)
            {
                if(NFC_LF_T3T_IDENTIFIERS_16_LEN == PH_NCINFC_T3TID_LEN)
                {
                    ConfigParams.tConfigInfo.LstnNfcFConfig = 1;
                    ConfigParams.tLstnNfcFDiscParams.LstnNfcFConfig.Config.SetT3tId = 1;
                    phOsalNfc_MemCopy(ConfigParams.tLstnNfcFDiscParams.aT3tId[15],\
                                      aT3TId16,(uint32_t)NFC_LF_T3T_IDENTIFIERS_16_LEN);
                }
            }
        }
    #endif /* NFC_LF_T3T_IDENTIFIERS_16 */
    #ifdef NFC_LF_T3T_PMM
        if(NFC_LF_T3T_PMM_LEN == PH_NCINFC_T3TPMM_LEN)
        {
            ConfigParams.tConfigInfo.LstnNfcFConfig = 1;
            ConfigParams.tLstnNfcFDiscParams.LstnNfcFConfig.Config.SetT3tPmm = 1;
            phOsalNfc_MemCopy(ConfigParams.tLstnNfcFDiscParams.aT3tPmm,\
                              aT3TPmm,(uint32_t)NFC_LF_T3T_PMM_LEN);
        }
    #endif

    #ifdef NFC_LF_T3T_FLAGS
        if(NFC_LF_T3T_FLAGS_LEN == 0x02)
        {
            ConfigParams.tConfigInfo.LstnNfcFConfig = 1;
            ConfigParams.tLstnNfcFDiscParams.LstnNfcFConfig.Config.SetT3tFlags = 1;
            ConfigParams.tLstnNfcFDiscParams.wT3tFlags = NFC_LF_T3T_FLAGS_VALUE;
        }
    #endif
    #ifdef NFC_PB_AFI
        ConfigParams.tConfigInfo.PollNfcBConfig = 1;
        ConfigParams.tPollNfcBDiscParams.PollNfcBConfig.Config.SetAfi = 1;
        ConfigParams.tPollNfcBDiscParams.bAfi = (uint8_t)NFC_PB_AFI;
    #endif

    /* Poll Iso-Dep bit rate configuration */
    #ifdef NFC_PI_BIT_RATE
        ConfigParams.tConfigInfo.PollIsoDepConfig = 1;
        ConfigParams.tPollIsoDepDiscParams.PollIsoDepConfig.Config.SetBitRate = 1;
        ConfigParams.tPollIsoDepDiscParams.bBitRate = (uint8_t)NFC_PI_BIT_RATE_SPEED;
    #endif

    /* Poll Nfc-Dep Data exchange bit rate configuration
       (0-Use max bit rate supported during data exchange
       1-use the same bit rate used during activation) */
    #ifdef NFC_PN_NFC_DEP_SPEED
        ConfigParams.tConfigInfo.PollNfcDepConfig = 1;
        ConfigParams.tPollNfcDepDiscParams.PollNfcDepConfig.Config.bSetSpeed = 1;
        ConfigParams.tPollNfcDepDiscParams.bNfcDepSpeed = (uint8_t)NFC_PN_NFC_DEP_SPEED_VALUE;
    #endif
    #ifdef NFC_PN_ATR_REQ_CONFIG
        ConfigParams.tConfigInfo.PollNfcDepConfig = 1;
        ConfigParams.tPollNfcDepDiscParams.PollNfcDepConfig.Config.bSetAtrConfig = 1;
        ConfigParams.tPollNfcDepDiscParams.AtrReqConfig.bDid = NFC_PN_ATR_REQ_DID;
        ConfigParams.tPollNfcDepDiscParams.AtrReqConfig.bLr = NFC_PN_ATR_REQ_LR;
    #endif
    #ifdef NFC_LA_BIT_FRAME_SDD
        ConfigParams.tConfigInfo.LstnNfcAConfig = 1;
        ConfigParams.tLstnNfcADiscParams.LstnNfcAConfig.Config.SetBitFrameSdd = 1;
        ConfigParams.tLstnNfcADiscParams.bBitFrameSDD = (uint8_t)NFC_LA_BIT_FRAME_SDD;
    #endif
    #ifdef NFC_LA_PLATFORM_CONFIG
        ConfigParams.tConfigInfo.LstnNfcAConfig = 1;
        ConfigParams.tLstnNfcADiscParams.LstnNfcAConfig.Config.SetPlatformConfig = 1;
        ConfigParams.tLstnNfcADiscParams.bPlatformConfig = (uint8_t)NFC_LA_PLATFORM_CONFIG;
    #endif
    #ifdef NFC_LB_SENSB_INFO
        ConfigParams.tConfigInfo.LstnNfcBConfig = 1;
        ConfigParams.tLstnNfcBDiscParams.LstnNfcBConfig.Config.SetSensBInfo = 1;
        ConfigParams.tLstnNfcBDiscParams.SensBInfo = (uint8_t)NFC_LB_SENSB_INFO;
    #endif
    #ifdef NFC_LB_SFGI
        ConfigParams.tConfigInfo.LstnNfcBConfig = 1;
        ConfigParams.tLstnNfcBDiscParams.LstnNfcBConfig.Config.SetSfgi = 1;
        ConfigParams.tLstnNfcBDiscParams.bSfgi = (uint8_t)NFC_LB_SFGI;
    #endif
    #ifdef NFC_LB_ADC_FO
        ConfigParams.tConfigInfo.LstnNfcBConfig = 1;
        ConfigParams.tLstnNfcBDiscParams.LstnNfcBConfig.Config.SetAdcFo = 1;
        ConfigParams.tLstnNfcBDiscParams.AdcFo.bDid = 1;
        ConfigParams.tLstnNfcBDiscParams.AdcFo.bAdcCodingField = 0x01;
    #endif
    #ifdef NFC_LF_CON_BITR_F
        ConfigParams.tConfigInfo.LstnNfcFConfig = 1;
        ConfigParams.tLstnNfcFDiscParams.LstnNfcFConfig.Config.SetConfigBitRate = 1;

        switch(NFC_LISTEN_F_BITRATE_SEL)
        {
        case BITRATE_LISTEN_F_212:
            ConfigParams.tLstnNfcFDiscParams.ConfigBitRate.bLstn212kbps = 1;
            ConfigParams.tLstnNfcFDiscParams.ConfigBitRate.bLstn424kbps = 0;
            break;
        case BITRATE_LISTEN_F_424:
            ConfigParams.tLstnNfcFDiscParams.ConfigBitRate.bLstn212kbps = 0;
            ConfigParams.tLstnNfcFDiscParams.ConfigBitRate.bLstn424kbps = 1;
            break;
        case BITRATE_LISTEN_F_212_424:
            ConfigParams.tLstnNfcFDiscParams.ConfigBitRate.bLstn212kbps = 1;
            ConfigParams.tLstnNfcFDiscParams.ConfigBitRate.bLstn424kbps = 1;
            break;
        default:
            /* Invalid bitrate selected */
            ConfigParams.tLstnNfcFDiscParams.LstnNfcFConfig.Config.SetConfigBitRate = 0;
            break;
        }
    #endif
    #ifdef NFC_LI_FWI
        ConfigParams.tConfigInfo.LstnIsoDepConfig = 1;
        ConfigParams.tLstnIsoDepDiscParams.LstnIsoDepConfig.Config.SetFwt = 1;
        ConfigParams.tLstnIsoDepDiscParams.bFrameWaitingTime = (uint8_t)NFC_LI_FWI;
    #endif
    #ifdef NFC_LI_BIT_RATE
        ConfigParams.tConfigInfo.LstnIsoDepConfig = 1;
        ConfigParams.tLstnIsoDepDiscParams.LstnIsoDepConfig.Config.SetbBitRate = 1;
        ConfigParams.tLstnIsoDepDiscParams.bBitRate = (uint8_t)NFC_LI_BIT_RATE_SPEED;
    #endif

    #ifdef NFC_LN_WT
        ConfigParams.tConfigInfo.LstnNfcDepConfig = 1;
        ConfigParams.tLstnNfcDepDiscParams.LstnNfcDepConfig.Config.bSetWT = 1;
        ConfigParams.tLstnNfcDepDiscParams.bWaitingTime = (uint8_t)NFC_LN_WT;
    #endif

    wStatus = phNciNfc_SetConfigRfParameters(pCtx->sHwReference.pNciHandle,
                                            &ConfigParams,
                                            (pphNciNfc_IfNotificationCb_t)&phLibNfc_InternalSequence,
                                            pContext);
    PH_LOG_LIBNFC_FUNC_EXIT();
    return wStatus;
}
NFCSTATUS
phNciNfc_NfcDepLstnRdrAInit(
                                pphNciNfc_RemoteDevInformation_t  pRemDevInf,
                                uint8_t *pBuff,
                                uint16_t wLen
                         )
{
    NFCSTATUS                  status = NFCSTATUS_SUCCESS;
    uint8_t                     *pRfNtfBuff = NULL;
    uint8_t                     RfTechSpecParamsLen = 0;
    uint8_t                     ActvnParamsLen = 0;

    PH_LOG_NCI_FUNC_ENTRY();
    if((0 != (wLen)) && (NULL != pBuff) && (NULL != pRemDevInf))
    {
        /* No Technology specific parameters incase of Listen A as per NCI Spec */
        RfTechSpecParamsLen = pBuff[6];

        /* Shift the buffer pointer points to first parameter of technology specific parameters */
        pRfNtfBuff = &pBuff[7];

        /* The activated remote device is a P2P Initiator */
        (pRemDevInf->RemDevType) = phNciNfc_eNfcIP1_Initiator;

        /* NOTE: NO TECHNOLOGY SPECIFIC PARAMETERS ARE DEFINED FOR LISTEN NFC-A TECHN (as per Nci Spec Rev.21) */
        /* Initiator speed (Initiator to target speed) */
        pRemDevInf->tRemoteDevInfo.NfcIP_Info.Nfcip_Datarate = (phNciNfc_BitRates_t)pRemDevInf->bTransBitRate;
        switch(pRemDevInf->eRFTechMode)
        {
            case phNciNfc_NFCA_Active_Listen:
            case phNciNfc_NFCF_Active_Listen:
                pRemDevInf->tRemoteDevInfo.NfcIP_Info.Nfcip_Active = 1; /* Active communciation */
            break;
            default:
                pRemDevInf->tRemoteDevInfo.NfcIP_Info.Nfcip_Active = 0; /* Passive communciation */
            break;
        }
        /* Obtain the length of Activation parameters from pBuff */
        ActvnParamsLen = pBuff[7+RfTechSpecParamsLen+PH_NCINFCTYPES_DATA_XCHG_PARAMS_LEN];

        /* Holds ATR_RES if remote device is a P2P target and ATR_REQ if remote device is a
           P2P initiator */
        if(0 != ActvnParamsLen)
        {
            pRemDevInf->tRemoteDevInfo.NfcIP_Info.bATRInfo_Length = (ActvnParamsLen-1);
            pRfNtfBuff = &(pBuff[7+RfTechSpecParamsLen+PH_NCINFCTYPES_DATA_XCHG_PARAMS_LEN+2]);
            phOsalNfc_SetMemory(pRemDevInf->tRemoteDevInfo.NfcIP_Info.aAtrInfo,0,
                                PH_NCINFCTYPES_ATR_MAX_LEN);
            if(pRemDevInf->tRemoteDevInfo.NfcIP_Info.bATRInfo_Length <= PH_NCINFCTYPES_ATR_MAX_LEN)
            {
                phOsalNfc_MemCopy(pRemDevInf->tRemoteDevInfo.NfcIP_Info.aAtrInfo,
                            pRfNtfBuff,pRemDevInf->tRemoteDevInfo.NfcIP_Info.bATRInfo_Length);
            }
            else
            {
                pRemDevInf->tRemoteDevInfo.NfcIP_Info.bATRInfo_Length = 0;
                PH_LOG_NCI_CRIT_STR("Invalid ATR_INFO length");
                status = NFCSTATUS_FAILED;
            }
        }
        /* The Activated device is a P2P Initiator. The P2P 'Send' and 'Receive' functions shall be active.
           The P2P Target (i.e., us) is expected to receive data from remote P2P initiator and expected
           to send data to Remote P2P target in response */
    }
    else
    {
        status = PHNFCSTVAL(CID_NFC_NCI, NFCSTATUS_INVALID_PARAMETER);
        PH_LOG_NCI_INFO_STR(" Invalid Params..");
     }
    PH_LOG_NCI_FUNC_EXIT();
    return status;
}
NFCSTATUS
phNciNfc_RdrBInit(
                    pphNciNfc_RemoteDevInformation_t  pRemDevInf,
                    uint8_t *pBuff,
                    uint16_t wLen
                )
{
    NFCSTATUS                  status = NFCSTATUS_SUCCESS;
    uint8_t                     *pRfNtfBuff;
    uint8_t                     RfTechSpecParamsLen;
    uint8_t                     ActvnParamsLen = 0;
    uint8_t                     bSensBRespLen = 0;
    uint8_t                     bSensBRespVal;
    phNciNfc_RFDevType_t        DevType = phNciNfc_eInvalid_DevType;

    PH_LOG_NCI_FUNC_ENTRY();

    if((0 != (wLen)) && (NULL != pBuff) && (NULL != pRemDevInf))
    {
        /* Capture Poll mode specific params info */
        if(phNciNfc_NFCB_Poll == pBuff[3])
        {
            PH_LOG_NCI_INFO_STR(" NFC-B Passive Poll Mode Info being captured..");

            bSensBRespLen = pBuff[7];
            (pRemDevInf->tRemoteDevInfo.Iso14443B_Info.bSensBRespLen) = bSensBRespLen;

            if((0 != bSensBRespLen) && ((11 == bSensBRespLen) || (12 == bSensBRespLen)))
            {
                phOsalNfc_SetMemory((pRemDevInf->tRemoteDevInfo.Iso14443B_Info.aSensBResp),0,bSensBRespLen);
                phOsalNfc_MemCopy(&(pRemDevInf->tRemoteDevInfo.Iso14443B_Info.aSensBResp)
                ,&pBuff[8],bSensBRespLen);

                /* Update the actual type of target device */
                bSensBRespVal = (pRemDevInf->tRemoteDevInfo.Iso14443B_Info.aSensBResp[9]);

                phNciNfc_GetRfDevType(bSensBRespVal,bSensBRespLen,pRemDevInf,&DevType);

                (pRemDevInf->RemDevType) = DevType;

                switch((pRemDevInf->RemDevType))
                {
                    case phNciNfc_eISO14443_4B_PICC:
                    {
                        if(phNciNfc_e_RfInterfacesISODEP_RF == (pRemDevInf->eRfIf))
                        {
                            /* Obtain the length of Activation parameters from pBuff */
                            RfTechSpecParamsLen = pBuff[6];
                            ActvnParamsLen = pBuff[7+RfTechSpecParamsLen+DATA_XCHG_PARAMS_LEN];

                            if(0 != ActvnParamsLen)
                            {
                                pRfNtfBuff = &(pBuff[ActvnParamsLen+1]);
                                (pRemDevInf->tRemoteDevInfo.Iso14443B_Info.bAttribRespLen) = *pRfNtfBuff;

                                if(0 != (pRemDevInf->tRemoteDevInfo.Iso14443B_Info.bAttribRespLen))
                                {
                                    phOsalNfc_SetMemory(&(pRemDevInf->tRemoteDevInfo.Iso14443B_Info.tAttribResp),0,
                                        sizeof(phNciNfc_ATTRIBResp_t));

                                    phOsalNfc_MemCopy(&(pRemDevInf->tRemoteDevInfo.Iso14443B_Info.tAttribResp),
                                        (pRfNtfBuff+1),(pRemDevInf->tRemoteDevInfo.Iso14443B_Info.bAttribRespLen));
                                }
                            }
                        }
                        else
                        {
                            /* TODO:- RF Frame interface case,no activation parameters available for 4B Tag */
                        }
                        gpphNciNfc_RdrDataXchgSequence[0].SequnceInitiate = &phNciNfc_Send4BData;
                        gpphNciNfc_RdrDataXchgSequence[0].SequenceProcess = &phNciNfc_Recv4BResp;
                        break;
                    }
                    case phNciNfc_eISO14443_BPrime_PICC:
                    {
                        break;
                    }
                    default:
                    {
                        break;
                    }
                }

                /* Update gpphNciNfc_RdrDataXchgSequence with the appropriate functions to be called
                   by sequence handler on invocation during data exchange */

                gpphNciNfc_RdrDataXchgSequence[1].SequnceInitiate = NULL;
                gpphNciNfc_RdrDataXchgSequence[1].SequenceProcess = &phNciNfc_CompleteDataXchgSequence;
            }
            else
            {
                status = PHNFCSTVAL(CID_NFC_NCI, NFCSTATUS_FAILED);
                PH_LOG_NCI_INFO_STR(" Invalid SENSB_RES Length received..");
            }
        }
    }
    else
    {
        status = PHNFCSTVAL(CID_NFC_NCI, NFCSTATUS_INVALID_PARAMETER);
        PH_LOG_NCI_INFO_STR(" Invalid Params..");
    }
    PH_LOG_NCI_FUNC_EXIT();
    return status;
}
void phFriNfc_MfUL_Process(void             *Context,
                           NFCSTATUS        Status)
{
    phFriNfc_sNdefSmtCrdFmt_t  *NdefSmtCrdFmt = (phFriNfc_sNdefSmtCrdFmt_t *)Context;
    PH_LOG_NDEF_FUNC_ENTRY();
    if(Status == NFCSTATUS_SUCCESS)
    {
        switch(NdefSmtCrdFmt->State)
        {
        case PH_FRINFC_MFUL_FMT_RD_16BYTES:
            Status = phFriNfc_MfUL_H_ProRd16Bytes(NdefSmtCrdFmt);
            break;

        case PH_FRINFC_MFUL_FMT_WR_OTPBYTES:
            Status = phFriNfc_MfUL_H_ProWrOTPBytes(NdefSmtCrdFmt);
            break;

        case PH_FRINFC_MFUL_FMT_WR_TLV:
            if (NdefSmtCrdFmt->CardType == PH_FRINFC_NDEFMAP_MIFARE_ULC_CARD)
            {
                /* Write NDEF TLV in block number 5 */
                NdefSmtCrdFmt->AddInfo.Type2Info.CurrentBlock =
                                                        PH_FRINFC_MFUL_FMT_VAL_5;
                /* Card already have the OTP bytes so write TLV */
                NdefSmtCrdFmt->State = PH_FRINFC_MFUL_FMT_WR_TLV1;

                Status = phFriNfc_MfUL_H_WrRd (NdefSmtCrdFmt);
            }
            break;

        case PH_FRINFC_MFUL_FMT_RO_RD_16BYTES:
        {
            if (MIFARE_UL_READ_MAX_SIZE == *NdefSmtCrdFmt->SendRecvLength)
            {
                uint8_t         otp_lock_page_size = 0;
                uint8_t         i = 0;

                otp_lock_page_size = sizeof (NdefSmtCrdFmt->AddInfo.Type2Info.LockBytes);
                (void)phOsalNfc_MemCopy ((void *)NdefSmtCrdFmt->AddInfo.Type2Info.LockBytes,
                            (void *)NdefSmtCrdFmt->SendRecvBuf,
                            sizeof(NdefSmtCrdFmt->AddInfo.Type2Info.LockBytes));

                NdefSmtCrdFmt->AddInfo.Type2Info.LockBytes[2] = (uint8_t)
                                    (NdefSmtCrdFmt->AddInfo.Type2Info.LockBytes[2]
                                    | MIFARE_UL_LOCK_BYTE1_VALUE);
                NdefSmtCrdFmt->AddInfo.Type2Info.LockBytes[3] = MIFARE_UL_LOCK_BYTE2_VALUE;
                i = (uint8_t)(i + otp_lock_page_size);

                otp_lock_page_size = sizeof (NdefSmtCrdFmt->AddInfo.Type2Info.OTPBytes);

                phOsalNfc_MemCopy ((void *)NdefSmtCrdFmt->AddInfo.Type2Info.OTPBytes,
                            (void *)(NdefSmtCrdFmt->SendRecvBuf + i),
                            sizeof(NdefSmtCrdFmt->AddInfo.Type2Info.OTPBytes));

                NdefSmtCrdFmt->AddInfo.Type2Info.OTPBytes[(otp_lock_page_size - 1)] =
                                                        READ_ONLY_VALUE_IN_OTP;

                switch (NdefSmtCrdFmt->AddInfo.Type2Info.OTPBytes[TYPE_2_MEM_SIZE_POSITION])
                {
                    case TYPE_2_STATIC_MEM_SIZE_VALUE:
                    {
                        NdefSmtCrdFmt->State = PH_FRINFC_MFUL_FMT_RO_WR_OTP_BYTES;
                        Status = phFriNfc_MfUL_H_WrRd (NdefSmtCrdFmt);
                        break;
                    }

                    case TYPE_2_DYNAMIC_MEM_SIZE_VALUE:
                    {
                        NdefSmtCrdFmt->State =
                                PH_FRINFC_MFUL_FMT_RO_NDEF_PARSE_RD_BYTES;

                        /* Start reading from block 4 */
                        NdefSmtCrdFmt->AddInfo.Type2Info.CurrentBlock = 4;
                        Status = phFriNfc_MfUL_H_WrRd (NdefSmtCrdFmt);
                        break;
                    }

                    default:
                    {
                        Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_SMTCRDFMT,
                                            NFCSTATUS_INVALID_DEVICE_REQUEST);
                        break;
                    }
                }
            }
            else
            {
                Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_SMTCRDFMT,
                                    NFCSTATUS_INVALID_RECEIVE_LENGTH);
            }
            break;
        }

        case PH_FRINFC_MFUL_FMT_RO_WR_OTP_BYTES:
        {
            switch (NdefSmtCrdFmt->AddInfo.Type2Info.OTPBytes[TYPE_2_MEM_SIZE_POSITION])
            {
                case TYPE_2_STATIC_MEM_SIZE_VALUE:
                case TYPE_2_DYNAMIC_MEM_SIZE_VALUE:
                {
                    NdefSmtCrdFmt->State = PH_FRINFC_MFUL_FMT_RO_WR_LOCK_BYTES;
                    Status = phFriNfc_MfUL_H_WrRd (NdefSmtCrdFmt);
                    break;
                }

                default:
                {
                    Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_SMTCRDFMT,
                                        NFCSTATUS_INVALID_DEVICE_REQUEST);
                    break;
                }
            }
            break;
        }

        case PH_FRINFC_MFUL_FMT_RO_NDEF_PARSE_RD_BYTES:
        {
            if (MIFARE_UL_READ_MAX_SIZE == *NdefSmtCrdFmt->SendRecvLength)
            {
                Status = phFriNfc_MfUL_ParseTLVs (NdefSmtCrdFmt,
                                        NdefSmtCrdFmt->SendRecvBuf,
                                        (uint8_t)*NdefSmtCrdFmt->SendRecvLength);

                if (!Status)
                {
                    NdefSmtCrdFmt->AddInfo.Type2Info.CurrentBlock =
                        NdefSmtCrdFmt->AddInfo.Type2Info.LockBlockNumber;
                    Status = phFriNfc_MfUL_ReadWriteLockBytes (NdefSmtCrdFmt);
                }
            }
            else
            {
                Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_SMTCRDFMT,
                                    NFCSTATUS_INVALID_RECEIVE_LENGTH);
            }
            break;
        }

        case PH_FRINFC_MFUL_FMT_RO_RD_DYN_LOCK_BYTES:
        {
            if (MIFARE_UL_READ_MAX_SIZE == *NdefSmtCrdFmt->SendRecvLength)
            {
                (void)phOsalNfc_MemCopy ((void *)NdefSmtCrdFmt->AddInfo.Type2Info.ReadData,
                            (void *)NdefSmtCrdFmt->SendRecvBuf,
                            sizeof(NdefSmtCrdFmt->AddInfo.Type2Info.ReadData));

                NdefSmtCrdFmt->AddInfo.Type2Info.ReadDataIndex = 0;

                Status = phFriNfc_MfUL_UpdateAndWriteLockBits (NdefSmtCrdFmt);

            }
            else
            {
                Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_SMTCRDFMT,
                                    NFCSTATUS_INVALID_RECEIVE_LENGTH);
            }
            break;
        }

        case PH_FRINFC_MFUL_FMT_RO_WR_DYN_LOCK_BYTES:
        {
            NdefSmtCrdFmt->AddInfo.Type2Info.ReadDataIndex = (uint8_t)
                                    (NdefSmtCrdFmt->AddInfo.Type2Info.ReadDataIndex +
                                    MFUL_BLOCK_SIZE_IN_BYTES);

            if (!phFriNfc_MfUL_CalcRemainingLockBits (NdefSmtCrdFmt))
            {
                /* There is no lock bits to write, then write OTP bytes */
                NdefSmtCrdFmt->State = PH_FRINFC_MFUL_FMT_RO_WR_OTP_BYTES;
                Status = phFriNfc_MfUL_H_WrRd (NdefSmtCrdFmt);
            }
            else if ((NdefSmtCrdFmt->AddInfo.Type2Info.ReadDataIndex <
                MIFARE_UL_READ_MAX_SIZE)
                && (phFriNfc_MfUL_CalcRemainingLockBits (NdefSmtCrdFmt)))
            {
                /* If remaining lock bits has to be written and the data is already read */
                Status = phFriNfc_MfUL_UpdateAndWriteLockBits (NdefSmtCrdFmt);
            }
            else
            {
                /* Increment current block by 4 because if a data is read then 16
                    bytes will be given which is 4 blocks */
                NdefSmtCrdFmt->AddInfo.Type2Info.CurrentBlock = (uint8_t)
                            (NdefSmtCrdFmt->AddInfo.Type2Info.CurrentBlock + 4);
                Status = phFriNfc_MfUL_ReadWriteLockBytes (NdefSmtCrdFmt);
            }
            break;
        }

        case PH_FRINFC_MFUL_FMT_RO_WR_LOCK_BYTES:
        {
            /* Do nothing */
            break;
        }

        case PH_FRINFC_MFUL_FMT_WR_TLV1:
            break;

        default:
            Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_SMTCRDFMT,
                                NFCSTATUS_INVALID_DEVICE_REQUEST);
            break;
        }
    }
    /* Status is not success then call completion routine */
    if(Status != NFCSTATUS_PENDING)
    {
        phFriNfc_SmtCrdFmt_HCrHandler(NdefSmtCrdFmt, Status);
    }
    PH_LOG_NDEF_FUNC_EXIT();
}
NFCSTATUS
phNciNfc_NfcDepLstnRdrFInit(
                           pphNciNfc_RemoteDevInformation_t  pRemDevInf,
                           uint8_t *pBuff,
                           uint16_t wLen)
{
    NFCSTATUS                   status = NFCSTATUS_SUCCESS;
    uint8_t                     *pRfNtfBuff;
    uint8_t                     RfTechSpecParamsLen;
    uint8_t                     bNfcId2Len;
    uint8_t                     ActvnParamsLen = 0;

    PH_LOG_NCI_FUNC_ENTRY();
    if( (0 != (wLen)) && (NULL != pBuff) && (NULL != pRemDevInf))
    {
        /* Remote devuce is a P2P Initiator */
        pRemDevInf->RemDevType = phNciNfc_eNfcIP1_Initiator;

        /* Obtain the len of RF tech specific parameters from Resp buff */
        RfTechSpecParamsLen = pBuff[6]; /*TODO: Check should added for this*/
        pRfNtfBuff = &pBuff[7];

        bNfcId2Len = *(pRfNtfBuff);

        pRemDevInf->tRemoteDevInfo.NfcIP_Info.NFCID_Length = 0;
        if(0 != RfTechSpecParamsLen)
        {
            pRemDevInf->tRemoteDevInfo.NfcIP_Info.NFCID_Length = bNfcId2Len;
            phOsalNfc_SetMemory(pRemDevInf->tRemoteDevInfo.NfcIP_Info.NFCID,0,PH_NCINFCTYPES_MAX_NFCID3_SIZE);
            if(0 == bNfcId2Len)
            {
                PH_LOG_NCI_CRIT_STR("No NFCID2 received");
            }
            else if(PH_NCINFCTYPES_NFCID2_LEN == bNfcId2Len)
            {
                phOsalNfc_SetMemory(pRemDevInf->tRemoteDevInfo.NfcIP_Info.NFCID,0,PH_NCINFCTYPES_MAX_NFCID3_SIZE);
                phOsalNfc_MemCopy(pRemDevInf->tRemoteDevInfo.NfcIP_Info.NFCID,(pRfNtfBuff+1),bNfcId2Len);
            }
            else
            {
                status = NFCSTATUS_FAILED;
                PH_LOG_NCI_CRIT_STR("Invalid NFCID2 received");
            }
        }

        if(NFCSTATUS_SUCCESS == status)
        {
            /* Initiator speed (Initiator to target speed) */
            pRemDevInf->tRemoteDevInfo.NfcIP_Info.Nfcip_Datarate = (phNciNfc_BitRates_t)pRemDevInf->bTransBitRate;

            switch(pRemDevInf->eRFTechMode)
            {
                case phNciNfc_NFCA_Active_Listen:
                case phNciNfc_NFCF_Active_Listen:
                    pRemDevInf->tRemoteDevInfo.NfcIP_Info.Nfcip_Active = 1; /* Active communciation */
                break;
                default:
                    pRemDevInf->tRemoteDevInfo.NfcIP_Info.Nfcip_Active = 0; /* Passive communciation */
                break;
            }
            /* Obtain the length of Activation parameters from pBuff */
            ActvnParamsLen = pBuff[7+RfTechSpecParamsLen+PH_NCINFCTYPES_DATA_XCHG_PARAMS_LEN];

            if(0 != ActvnParamsLen)
            {
                pRemDevInf->tRemoteDevInfo.NfcIP_Info.bATRInfo_Length = (ActvnParamsLen-1);
                pRfNtfBuff = &(pBuff[7+RfTechSpecParamsLen+PH_NCINFCTYPES_DATA_XCHG_PARAMS_LEN+2]);
                phOsalNfc_SetMemory(pRemDevInf->tRemoteDevInfo.NfcIP_Info.aAtrInfo,0,
                                    PH_NCINFCTYPES_ATR_MAX_LEN);
                if(pRemDevInf->tRemoteDevInfo.NfcIP_Info.bATRInfo_Length <= PH_NCINFCTYPES_ATR_MAX_LEN)
                {
                    phOsalNfc_MemCopy(pRemDevInf->tRemoteDevInfo.NfcIP_Info.aAtrInfo,
                                pRfNtfBuff,pRemDevInf->tRemoteDevInfo.NfcIP_Info.bATRInfo_Length);
                }
                else
                {
                    pRemDevInf->tRemoteDevInfo.NfcIP_Info.bATRInfo_Length = 0;
                    PH_LOG_NCI_CRIT_STR("Invalid ATR_INFO length");
                    status = NFCSTATUS_FAILED;
                }
            }
            /* The Activated device is a P2P Initiator. The P2P 'Send' and 'Receive' functions shall be active.
               The P2P Target (i.e., us) is expected to receive data from remote P2P initiator and expected
               to send data to Remote P2P target in response */
        }
    }
    else
    {
        status = PHNFCSTVAL(CID_NFC_NCI, NFCSTATUS_INVALID_PARAMETER);
        PH_LOG_NCI_INFO_STR(" Invalid Params..");
    }
    PH_LOG_NCI_FUNC_EXIT();
    return status;
}
NFCSTATUS
phNciNfc_RdrAInit(
                    pphNciNfc_RemoteDevInformation_t  pRemDevInf,
                    uint8_t *pBuff,
                    uint16_t wLen
                )
{
    NFCSTATUS                  status = NFCSTATUS_SUCCESS;
    uint8_t                     *pRfNtfBuff = NULL;
    uint8_t                     RfTechSpecParamsLen = 0;
    uint8_t                     ActvnParamsLen = 0;
    uint8_t                     bSelResRespLen = 0;
    uint8_t                     bUidLength = 0;
    uint8_t                     bSelRespVal = 0;
    phNciNfc_RFDevType_t        eDevType = phNciNfc_eInvalid_DevType;

    PH_LOG_NCI_FUNC_ENTRY();
    if((0 != (wLen)) && (NULL != pBuff) && (NULL != pRemDevInf))
    {
        PH_LOG_NCI_INFO_STR(" NFC-A Passive Poll Mode Info being captured..");

        /* Length of technology specific parameters */
        RfTechSpecParamsLen = pBuff[6];

        /* Shift the buffer pointer points to first parameter of technology specific parameters */
        pRfNtfBuff = &pBuff[7];

        /* Get technology specific parameters incase of Nfc-A poll mode */
        if (phNciNfc_NFCA_Kovio_Poll == pRemDevInf->eRFTechMode)
        {
            if (RfTechSpecParamsLen > PH_NCINFCTYPES_KOVIO_TAG_ID_LENGTH)
            {
                status = NFCSTATUS_FAILED;
            }
        }
        else if(phNciNfc_NFCA_Listen != pRemDevInf->eRFTechMode)
        {
            /* Length of NFCID1 */
            bUidLength = *(pRfNtfBuff+2);

            if((0 != bUidLength) &&
               (NFCID1_LEN4 != bUidLength) &&
               (NFCID1_LEN7 != bUidLength) &&
               (NFCID1_LEN10 != bUidLength))
            {
                PH_LOG_NCI_CRIT_STR("Invalid Nfc-A UID length");
                status = NFCSTATUS_FAILED;
            }

            if(NFCSTATUS_SUCCESS == status)
            {
                /* Length of SEL_RES response */
                bSelResRespLen = *(pRfNtfBuff + 3 + bUidLength);
                if(1 == bSelResRespLen)
                {
                    /* Length of SEL_RES shall be '0' incase of Nfc Forum Type 1 Tag */
                    bSelRespVal = *(pRfNtfBuff + 3 + bUidLength + 1);
                }
                else if(0 == bSelResRespLen)
                {
                    bSelRespVal = 0;
                }
                else
                {
                    PH_LOG_NCI_CRIT_STR("Invalid Nfc-A SEL_RES length");
                    status = NFCSTATUS_FAILED;
                }
            }
        }
        if(NFCSTATUS_SUCCESS == status)
        {
            phNciNfc_GetRfDevType(bSelRespVal,bSelResRespLen,pRemDevInf,&eDevType);
            (pRemDevInf->RemDevType) = eDevType;
        }
        else
        {
            pRemDevInf->RemDevType = phNciNfc_eInvalid_DevType;
        }

        /*Update technology specific parameters (these parameters are specific to the remote device type detected)*/
        switch((pRemDevInf->RemDevType))
        {
            case phNciNfc_eISO14443_4A_PICC:
            case phNciNfc_eMifareUL_PICC:
            case phNciNfc_eMifare1k_PICC:
            case phNciNfc_eMifare4k_PICC:
            case phNciNfc_eMifareMini_PICC:
            {
                if(0 != bUidLength)
                {
                    (pRemDevInf->tRemoteDevInfo.Iso14443A_Info.UidLength) = bUidLength;
                    (pRemDevInf->tRemoteDevInfo.Iso14443A_Info.bSelResRespLen) = bSelResRespLen;
                    (pRemDevInf->tRemoteDevInfo.Iso14443A_Info.Sak) = bSelRespVal;

                    phOsalNfc_MemCopy(&(pRemDevInf->tRemoteDevInfo.Iso14443A_Info.bSensResResp),pRfNtfBuff,2);
                    phOsalNfc_SetMemory((pRemDevInf->tRemoteDevInfo.Iso14443A_Info.Uid),0,PH_NCINFCTYPES_MAX_UID_LENGTH);
                    phOsalNfc_MemCopy(&(pRemDevInf->tRemoteDevInfo.Iso14443A_Info.Uid),
                        (pRfNtfBuff+3),(pRemDevInf->tRemoteDevInfo.Iso14443A_Info.UidLength));
                }
                else
                {
                    status = PHNFCSTVAL(CID_NFC_NCI, NFCSTATUS_INVALID_PARAMETER);
                    PH_LOG_NCI_INFO_STR(" Invalid UID Length received");
                }
            }
            break;
            case phNciNfc_eJewel_PICC:
            {
                if((0 == bUidLength) || (NFCID1_LEN4 == bUidLength))
                {
                    phOsalNfc_MemCopy(&(pRemDevInf->tRemoteDevInfo.Jewel_Info.bSensResResp),pRfNtfBuff,2);
                }
                else
                {
                    status = PHNFCSTVAL(CID_NFC_NCI, NFCSTATUS_INVALID_PARAMETER);
                    PH_LOG_NCI_INFO_STR(" Invalid UID Length received");
                }
            }
            break;
            case phNciNfc_eKovio_PICC:
            {
                // The tag ID is all we get
                if(RfTechSpecParamsLen > 0)
                {
                    pRemDevInf->tRemoteDevInfo.Kovio_Info.TagIdLength = RfTechSpecParamsLen;
                    phOsalNfc_MemCopy(&(pRemDevInf->tRemoteDevInfo.Kovio_Info.TagId), pRfNtfBuff, RfTechSpecParamsLen);
                }
            }
            break;
            default:
            {
                break;
            }
        }

        /* Update gpphNciNfc_RdrDataXchgSequence with the appropriate functions to be called
               by sequence handler on invocation during data exchange */

        switch(pRemDevInf->RemDevType)
        {
            case phNciNfc_eISO14443_A_PICC:
            {
                break;
            }
            case phNciNfc_eKovio_PICC:
            {
                break;
            }
            case phNciNfc_eISO14443_4A_PICC:
            {
                if(NFCSTATUS_SUCCESS == status)
                {
                    if(phNciNfc_e_RfInterfacesISODEP_RF == (pRemDevInf->eRfIf))
                    {
                        /* Obtain the length of Activation parameters from pBuff */
                        ActvnParamsLen = pBuff[7+RfTechSpecParamsLen+PH_NCINFCTYPES_DATA_XCHG_PARAMS_LEN];

                        if(0 != ActvnParamsLen)
                        {
                            pRfNtfBuff = &(pBuff[7+RfTechSpecParamsLen+PH_NCINFCTYPES_DATA_XCHG_PARAMS_LEN+1]);
                            pRemDevInf->tRemoteDevInfo.Iso14443A_Info.bRatsRespLen = *pRfNtfBuff;

                            if(0 != pRemDevInf->tRemoteDevInfo.Iso14443A_Info.bRatsRespLen)
                            {
                                if(((ActvnParamsLen - 1) >= pRemDevInf->tRemoteDevInfo.Iso14443A_Info.bRatsRespLen) &&
                                    (sizeof(phNciNfc_RATSResp_t) >= pRemDevInf->tRemoteDevInfo.Iso14443A_Info.bRatsRespLen))
                                {
                                    phOsalNfc_MemCopy(&(pRemDevInf->tRemoteDevInfo.Iso14443A_Info.
                                        tRatsResp),(pRfNtfBuff+1),(pRemDevInf->tRemoteDevInfo.
                                        Iso14443A_Info.bRatsRespLen));
                                }
                                else
                                {
                                    PH_LOG_NCI_CRIT_STR("Invalid RATS Resp Recvd!!, ActvnParamsLen %d, RatsRespLen %d",
                                        ActvnParamsLen, pRemDevInf->tRemoteDevInfo.Iso14443A_Info.bRatsRespLen);
                                    status = NFCSTATUS_FAILED;
                                }
                            }
                        }
                    }
                    else
                    {
                        /* TODO:- RF Frame interface case,no activation parameters available for 4A Tag */
                    }
                    gpphNciNfc_RdrDataXchgSequence[0].SequnceInitiate = &phNciNfc_Send4AData;
                    gpphNciNfc_RdrDataXchgSequence[0].SequenceProcess = &phNciNfc_Recv4AResp;
                }
                break;
            }
            case phNciNfc_eMifareUL_PICC:
            case phNciNfc_eMifare1k_PICC:
            case phNciNfc_eMifare4k_PICC:
            case phNciNfc_eMifareMini_PICC:
            {
                if(NFCSTATUS_SUCCESS == status)
                {
                    gpphNciNfc_RdrDataXchgSequence[0].SequnceInitiate = &phNciNfc_SendMfReq;
                    gpphNciNfc_RdrDataXchgSequence[0].SequenceProcess = &phNciNfc_RecvMfResp;
                }
                break;
            }
            case phNciNfc_eJewel_PICC:
            {
                if(NFCSTATUS_SUCCESS == status)
                {
                    /* Validate Technology specific parameters */
                    status = phNciNfc_JewelInit(pRemDevInf->tRemoteDevInfo.Jewel_Info.bSensResResp);

                    gpphNciNfc_RdrDataXchgSequence[0].SequnceInitiate = &phNciNfc_SendJewelReq;
                    gpphNciNfc_RdrDataXchgSequence[0].SequenceProcess = &phNciNfc_RecvJewelResp;
                }
                break;
            }
            default:
            {
                break;
            }
        }
        gpphNciNfc_RdrDataXchgSequence[1].SequnceInitiate = NULL;
        gpphNciNfc_RdrDataXchgSequence[1].SequenceProcess = &phNciNfc_CompleteDataXchgSequence;
    }
    else
    {
        status = PHNFCSTVAL(CID_NFC_NCI, NFCSTATUS_INVALID_PARAMETER);
        PH_LOG_NCI_INFO_STR(" Invalid Params..");
     }
    PH_LOG_NCI_FUNC_EXIT();
#pragma prefast(suppress: __WARNING_POTENTIAL_RANGE_POSTCONDITION_VIOLATION, "ESP:1220 PreFast Bug")
    return status;
}
NFCSTATUS
phNciNfc_SeSendData(void* pNciCtx,
                    void* pSeHandle,
                    pphNciNfc_IfNotificationCb_t pSendCb,
                    void* pContext,
                    phNfc_sData_t *pSendData)
{
    NFCSTATUS               wStatus = NFCSTATUS_SUCCESS;
    phNciNfc_CoreTxInfo_t   TxInfo;
    uint16_t                wPldDataSize;
    phNciNfc_Context_t* pNciContext = (phNciNfc_Context_t *)pNciCtx;

    PH_LOG_NCI_FUNC_ENTRY();
    if((NULL == pNciContext) || (pNciContext != phNciNfc_GetContext()))
    {
        PH_LOG_NCI_CRIT_STR("Stack not initialized");
        wStatus = NFCSTATUS_NOT_INITIALISED;
    }
    else if((NULL == pSendData) || (NULL == pSendCb))
    {
        wStatus = NFCSTATUS_INVALID_PARAMETER;
        PH_LOG_NCI_CRIT_STR("Invalid input parameter!");
    }
    else
    {
        if((0 == pSendData->length) || (NULL == pSendData->buffer))
        {
            PH_LOG_NCI_CRIT_STR("Invalid Send buffer!");
            wStatus = NFCSTATUS_FAILED;
        }
        else
        {
            /* Fill the data packet details into TxInfo */
            TxInfo.tHeaderInfo.eMsgType = phNciNfc_e_NciCoreMsgTypeData;
            if (!phNciNfc_IsVersion1x(pNciContext))
            {
                TxInfo.tHeaderInfo.bConn_ID = CONNHCITYPE_STATIC;
            }
            else
            {
                wStatus = phNciNfc_GetConnId(pSeHandle, &(TxInfo.tHeaderInfo.bConn_ID));
            }

            if(NFCSTATUS_SUCCESS == wStatus)
            {
                wPldDataSize = (uint16_t)pSendData->length;

                (pNciContext->tTranscvCtxt.tSendPld.wLen) = 0;
                (pNciContext->tTranscvCtxt.tSendPld.pBuff) = (uint8_t *)phOsalNfc_GetMemory(wPldDataSize);

                if(NULL != (pNciContext->tTranscvCtxt.tSendPld.pBuff))
                {
                    (pNciContext->tTranscvCtxt.tSendPld.wLen) = (wPldDataSize);
                    phOsalNfc_SetMemory((pNciContext->tTranscvCtxt.tSendPld.pBuff),0,
                        (pNciContext->tTranscvCtxt.tSendPld.wLen));

                    /* Copy data to be sent to the local buffer */
                    phOsalNfc_MemCopy((pNciContext->tTranscvCtxt.tSendPld.pBuff),
                        (pSendData->buffer),wPldDataSize);

                    TxInfo.Buff = (pNciContext->tTranscvCtxt.tSendPld.pBuff);
                    TxInfo.wLen = (pNciContext->tTranscvCtxt.tSendPld.wLen);

                    /* Send data */
                    wStatus = phNciNfc_CoreIfTxOnly(&(pNciContext->NciCoreContext), &TxInfo,
                                (pphNciNfc_CoreIfNtf_t)&phNciNfc_SeSendCb, pNciContext);
                    if(NFCSTATUS_PENDING == wStatus)
                    {
                        /* Store upper layer call back function and upper layer context */
                        phNciNfc_SetUpperLayerCallback(pNciContext, pSendCb, pContext);
                    }
                    else
                    {
                        /* Deallocate memory allcoated for send buffer */
                        phOsalNfc_FreeMemory(pNciContext->tTranscvCtxt.tSendPld.pBuff);
                        pNciContext->tTranscvCtxt.tSendPld.pBuff = NULL;
                        pNciContext->tTranscvCtxt.tSendPld.wLen = 0;
                    }
                }
                else
                {
                    wStatus = NFCSTATUS_INSUFFICIENT_RESOURCES;
                    PH_LOG_NCI_CRIT_STR("Payload MemAlloc for Send request Failed!");
                }
            }
            else
            {
                wStatus = NFCSTATUS_FAILED;
                PH_LOG_NCI_CRIT_STR(" Couldn't Get ConnId!");
            }
        }
    }
    PH_LOG_NCI_FUNC_EXIT();
    return wStatus;
}