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

#ifndef _PHNXPEXTNS_CUSTOM_H_
#define _PHNXPEXTNS_CUSTOM_H_

#include <errno.h>
#include <nfa_api.h>
#include <phNfcStatus.h>
#include <sys/types.h>

/*
 * TLV structure
 * For simple TLV, type[0] == 0x00
 * For extended TLV, type[0] == 0xA0
 */
typedef struct {
  uint8_t type[2];
  uint8_t len;
  uint8_t* val;
} tlv_t;

typedef enum {
  passive_106 = 0x01,
  passive_212 = 0x02,
  passive_424 = 0x04,
  active_106 = 0x10,
  active_212 = 0x20,
  active_424 = 0x40,
} p2p_speed_t;

typedef enum {
  NO_SE,
  UICC,
  eSE,
} SE_t;

typedef enum {
  ReaderMode = 0x01,
  P2PMode = 0x02,
  CEMode = 0x04,
} PollMode_t;

/*******************************************************************************
 **
 ** Function         phNxpExtns_get_version
 **
 ** Description      Function to get the HW, FW and SW versions.
 **
 ** Returns          NFCSTATUS_SUCCESS if successful,otherwise NFCSTATUS_FAILED.
 **
 ** NOTE: Internally this function will use phNxpNciHal_get_version from HAL.
 *******************************************************************************/

NFCSTATUS phNxpExtns_get_version(uint32_t* hw_ver, uint32_t* fw_ver,
                                 uint32_t* sw_ver);

/*******************************************************************************
 **
 ** Function         phNxpNciHal_read_tlv
 **
 ** Description      Function to read simple TLV and extended TLV.
 **                  Memory for TLV and fields are allocated and freed by
 *calling
 **                  function. Input is type and len. Response is provied in
 **val.
 **
 ** Returns          NFCSTATUS_SUCCESS if successful,otherwise NFCSTATUS_FAILED.
 **
 ** NOTE: Internally this function will use NFA_GetConfig for simple TLV.
 **       For extended TLV, it will use NFA_SendRawFrame.
 *******************************************************************************/

NFCSTATUS phNxpNciHal_read_tlv(tlv_t* tlv);

/*******************************************************************************
 **
 ** Function         phNxpNciHal_write_tlv
 **
 ** Description      Function to write simple TLV and extended TLV.
 **                  Memory for TLV and fields are allocated and freed by
 *calling
 **                  function. Input is type, len, *val.
 **
 ** Returns          NFCSTATUS_SUCCESS if successful,otherwise NFCSTATUS_FAILED.
 **
 ** NOTE: Internally this function will use NFA_SetConfig for simple TLV.
 **       For extended TLV, it will use NFA_SendRawFrame.
 *******************************************************************************/

NFCSTATUS phNxpNciHal_write_tlv(tlv_t* tlv);

/*******************************************************************************
 **
 ** Function        phNxpExtns_select_poll_tech
 **
 ** Description     This function selects the polling technology for starting
 **                 polling loop. This function does not start polling loop.
 **                 It is just a setting for polling technology.
 **
 ** Returns         NFCSTATUS_SUCCESS if operation successful,
 **                 otherwise NFCSTATUS_FAILED.
 **
 ** NOTE: Internally this function is using NFA_EnablePolling function.
 *******************************************************************************/

NFCSTATUS phNxpExtns_select_poll_tech(tNFA_TECHNOLOGY_MASK tech_mask);

/*******************************************************************************
 **
 ** Function        phNxpExtns_select_ce_listen_tech
 **
 ** Description     This function set the listen tech for card emulation.
 **                 This function does not include routing.
 **                 This function does not start polling loop.
 **
 ** Returns         NFCSTATUS_SUCCESS if operation successful,
 **                 otherwise NFCSTATUS_FAILED.
 **
 ** NOTE: Internally this function is using NFA_CeConfigureUiccListenTech.
 **       Not sure which handle to use, from UICC or eSE.
 *******************************************************************************/

NFCSTATUS phNxpExtns_select_ce_listen_tech(tNFA_TECHNOLOGY_MASK tech_mask);

/*******************************************************************************
 **
 ** Function        phNxpExtns_select_p2p_poll_speed
 **
 ** Description     This function will select the P2P polling speed.
 **                 phNxpExtns_select_poll_tech overwrite the settings of poll
 *if
 **                 reader mode is enabled.
 **                 There is only one active poll phase but device can use one
 **                 active speed and can move to higher speed if target
 *supports.
 **
 ** Returns         NFCSTATUS_SUCCESS if operation successful,
 **                 otherwise NFCSTATUS_FAILED.
 **
 ** NOTE: Internally this function will use NFA_EnablePolling and NFA_SetConfig
 *******************************************************************************/

NFCSTATUS phNxpExtns_select_p2p_poll_speed(p2p_speed_t p2p_initiator_speed);

/*******************************************************************************
 **
 ** Function        phNxpExtns_select_p2p_listen_speed
 **
 ** Description     This function will select the listen mode
 **                 This function does not include routing.
 **                 This function does not start polling loop.
 **
 ** Returns         NFCSTATUS_SUCCESS if operation successful,
 **                 otherwise NFCSTATUS_FAILED.
 **
 ** NOTE: Internally this function will use NFA_SetP2pListenTech and
 *NFA_SetConfig
 *******************************************************************************/

NFCSTATUS phNxpExtns_select_p2p_listen_speed(p2p_speed_t p2p_target_speed);

/*******************************************************************************
 **
 ** Function        phNxpExtns_select_se
 **
 ** Description     This function will set the routing of the traffic to
 *selected
 **                 SE. This function also does not start polling loop.
 **
 ** Returns         NFCSTATUS_SUCCESS if operation successful,
 **                 otherwise NFCSTATUS_FAILED.
 **
 ** NOTE:
 *******************************************************************************/

NFCSTATUS phNxpExtns_select_se(SE_t se);

/*******************************************************************************
 **
 ** Function        phNxpExtns_set_poll_mode
 **
 ** Description     This function selects which mode to enable for polling loop.
 **                 This function do not start polling loop.
 **
 ** Returns         NFCSTATUS_SUCCESS if operation successful,
 **                 otherwise NFCSTATUS_FAILED.
 **
 ** NOTE:
 *******************************************************************************/

NFCSTATUS phNxpExtns_set_poll_mode(PollMode_t poll_mode);

/*******************************************************************************
 **
 ** Function        phNxpExtns_start_poll
 **
 ** Description     This function starts polling loop based on the configuration
 **                 of the previous calls. If no configuration done through
 *other
 **                 function call then it uses the default configuration from
 **                 configuration files.
 **                 This function internally stops the polling loop if it is
 **                 already running.
 **
 ** Returns         NFCSTATUS_SUCCESS if operation successful,
 **                 otherwise NFCSTATUS_FAILED.
 **
 ** NOTE: Internally this function uses NFA_StartRfDiscovery.
 *******************************************************************************/

NFCSTATUS phNxpExtns_start_poll(void);

/*******************************************************************************
 **
 ** Function        phNxpExtns_stop_poll
 **
 ** Description     This function stops the polling loop if it is running.
 **
 ** Returns          NFCSTATUS_SUCCESS if operation successful,
 **                  otherwise NFCSTATUS_FAILED.
 **
 ** NOTE:Internally this function uses NFA_StopRfDiscovery.
 *******************************************************************************/

NFCSTATUS phNxpExtns_stop_poll(void);

/*******************************************************************************
 **
 ** Function        phNxpExtns_enable_Felica_CLT
 **
 ** Description     This function enables or disable Felica CLT feature.
 **
 ** Returns         NFCSTATUS_SUCCESS if operation successful,
 **                 otherwise NFCSTATUS_FAILED.
 **
 ** NOTE:
 *******************************************************************************/

NFCSTATUS phNxpExtns_enable_Felica_CLT(bool enable);

/*******************************************************************************
 **
 ** Function        phNxpExtns_enable_Mifare_CLT
 **
 ** Description     This function enables or disable Mifare CLT feature.
 **
 ** Returns         NFCSTATUS_SUCCESS if operation successful,
 **                 otherwise NFCSTATUS_FAILED.
 **
 ** NOTE:
 *******************************************************************************/

NFCSTATUS phNxpExtns_enable_Mifare_CLT(bool enable);

#endif /* _PHNXPEXTNS_CUSTOM_H_ */