/******************************************************************************
 *
 *  Copyright 2018 NXP
 *
 *  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.
 *
 ******************************************************************************/

/**
 * \addtogroup spi_libese
 * \brief ESE Lib layer interface to application
 * @{ */

#ifndef _PHNXPSPILIB_API_H_
#define _PHNXPSPILIB_API_H_

#include <phEseStatus.h>

/**
 * \ingroup spi_libese
 * \brief Ese data buffer
 *
 */
typedef struct phNxpEse_data {
  uint32_t len;    /*!< length of the buffer */
  uint8_t* p_data; /*!< pointer to a buffer */
} phNxpEse_data;

/**
 * \ingroup spi_libese
 * \brief Ese Channel mode
 *
 */
typedef enum {
  ESE_MODE_NORMAL = 0, /*!< All wired transaction other OSU */
  ESE_MODE_OSU         /*!< Jcop Os update mode */
} phNxpEse_initMode;

/**
 * \ingroup spi_libese
 * \brief Ese library init parameters to be set while calling phNxpEse_init
 *
 */
typedef struct phNxpEse_initParams {
  phNxpEse_initMode initMode; /*!< Ese communication mode */
} phNxpEse_initParams;

/*!
 * \brief SEAccess kit MW Android version
 */
#define NXP_ANDROID_VER (8U)

/*!
 * \brief SEAccess kit MW Major version
 */
#define ESELIB_MW_VERSION_MAJ (0x3)

/*!
 * \brief SEAccess kit MW Minor version
 */
#define ESELIB_MW_VERSION_MIN (0x00)

/******************************************************************************
 * \ingroup spi_libese
 *
 * \brief  It Initializes protocol stack instance variables
 *
 * \retval This function return ESESTATUS_SUCCES (0) in case of success
 *         In case of failure returns other failure value.
 *
 ******************************************************************************/
ESESTATUS phNxpEse_init(phNxpEse_initParams initParams);

/******************************************************************************
 * \ingroup spi_libese
 *
 * \brief  Check if libese has opened
 *
 * \retval return false if it is close, otherwise true.
 *
 ******************************************************************************/
bool phNxpEse_isOpen();

/******************************************************************************
 * \ingroup spi_libese
 *
 * \brief  This function is used to communicate from nfc-hal to ese-hal
 *
 * \retval This function return ESESTATUS_SUCCES (0) in case of success
 *         In case of failure returns other failure value.
 *
 ******************************************************************************/
ESESTATUS phNxpEse_spiIoctl(uint64_t ioctlType, void* p_data);

/**
 * \ingroup spi_libese
 * \brief This function is called by Jni during the
 *        initialization of the ESE. It opens the physical connection
 *        with ESE () and initializes the protocol stack
 *
 *
 * \retval ESESTATUS_SUCCESS On Success ESESTATUS_SUCCESS else proper error code
 *
 */
ESESTATUS phNxpEse_open(phNxpEse_initParams initParams);

/**
 * \ingroup spi_libese
 * \brief It opens the physical connectio with ESE () and creates required
 *        client thread for operation. This will get priority access to ESE
 *        for timeout period.
 *
 * \retval ESESTATUS_SUCCESS On Success ESESTATUS_SUCCESS else proper error code
 *
 */
ESESTATUS phNxpEse_openPrioSession(phNxpEse_initParams initParams);

/**
 * \ingroup spi_libese
 * \brief This function prepares the C-APDU, send to ESE and then receives the
 *response from ESE,
 *         decode it and returns data.
 *
 * \param[in]       phNxpEse_data: Command to ESE
 * \param[out]     phNxpEse_data: Response from ESE (Returned data to be freed
 *after copying)
 *
 * \retval ESESTATUS_SUCCESS On Success ESESTATUS_SUCCESS else proper error code
 *
 */

ESESTATUS phNxpEse_Transceive(phNxpEse_data* pCmd, phNxpEse_data* pRsp);

/******************************************************************************
 * \ingroup spi_libese
 *
 * \brief  This function is called by Jni/phNxpEse_close during the
 *         de-initialization of the ESE. It de-initializes protocol stack
 *instance variables
 *
 * \retval This function return ESESTATUS_SUCCES (0) in case of success
 *         In case of failure returns other failure value.
 *
 ******************************************************************************/
ESESTATUS phNxpEse_deInit(void);

/**
 * \ingroup spi_libese
 * \brief This function close the ESE interface and free all resources.
 *
 * \param[in]       void
 *
 * \retval ESESTATUS_SUCCESS Always return ESESTATUS_SUCCESS (0).
 *
 */

ESESTATUS phNxpEse_close(void);

/**
 * \ingroup spi_libese
 * \brief This function reset the ESE interface and free all
 *
 * \param[in]       void
 *
 * \retval ESESTATUS_SUCCESS Always return ESESTATUS_SUCCESS (0).
 *
 */
ESESTATUS phNxpEse_reset(void);

/**
 * \ingroup spi_libese
 * \brief This function reset the ESE
 *
 * \param[in]       void
 *
 * \retval ESESTATUS_SUCCESS Always return ESESTATUS_SUCCESS (0).
 *
 */
ESESTATUS phNxpEse_resetJcopUpdate(void);

/**
 * \ingroup spi_libese
 * \brief This function reset the P73 through ISO RST pin
 *
 * \param[in]       void
 *
 * \retval ESESTATUS_SUCCESS Always return ESESTATUS_SUCCESS (0).
 *
 */
ESESTATUS phNxpEse_chipReset(void);

/**
 * \ingroup spi_libese
 * \brief This function is used to set IFSC size
 *
 * \param[in]       uint16_t IFSC_Size
 *
 * \retval ESESTATUS_SUCCESS Always return ESESTATUS_SUCCESS (0).
 *
 */
ESESTATUS phNxpEse_setIfsc(uint16_t IFSC_Size);

/**
 * \ingroup spi_libese
 * \brief This function sends the S-frame to indicate END_OF_APDU
 *
 * \param[in]       void
 *
 * \retval ESESTATUS_SUCCESS Always return ESESTATUS_SUCCESS (0).
 *
 */
ESESTATUS phNxpEse_EndOfApdu(void);

/**
 * \ingroup spi_libese
 * \brief This function  suspends execution of the calling thread for
 *           (at least) usec microseconds
 *
 * \param[in]       void
 *
 * \retval ESESTATUS_SUCCESS Always return ESESTATUS_SUCCESS (0).
 *
 */
ESESTATUS phNxpEse_Sleep(uint32_t usec);

/**
 * \ingroup spi_libese
 * \brief This function updates destination buffer with val
 *                 data in len size
 *
 * \param[in]    buff                - Array to be udpated
 * \param[in]    val                 - value to be updated
 * \param[in]    len                 - length of array to be updated
 *
 * \retval   void
 *
 */
void* phNxpEse_memset(void* buff, int val, size_t len);

/**
 * \ingroup spi_libese
 * \brief This function copies source buffer to  destination buffer
 *                 data in len size
 *
 * \param[in]    dest                - Destination array to be updated
 * \param[in]    src                 - Source array to be updated
 * \param[in]    len                 - length of array to be updated
 *
 * \retval   void
 *
 */
void* phNxpEse_memcpy(void* dest, const void* src, size_t len);

/**
 * \ingroup spi_libese
 * \brief This function  suspends allocate memory
 *
 * \param[in]       uint32_t size
 *
 * \retval allocated memory.
 *
 */
void* phNxpEse_memalloc(uint32_t size);

/**
 * \ingroup spi_libese
 * \brief This is utility function for runtime heap memory allocation
 *
 * \param[in]    len                 - number of bytes to be allocated
 *
 * \retval   void
 *
 */
void* phNxpEse_calloc(size_t dataType, size_t size);

/**
 * \ingroup spi_libese
 * \brief This is utility function for freeeing heap memory allocated
 *
 * \param[in]    ptr                 - Address pointer to previous allocation
 *
 * \retval   void
 *
 */
void phNxpEse_free(void* ptr);

/**
+ * \ingroup spi_libese
+ * \brief This function perfroms disbale/enable power control
+ *
+ * \param[in]       void
+ *
+ * \retval ESESTATUS_SUCCESS Always return ESESTATUS_SUCCESS (0).
+ *
+*/
ESESTATUS phNxpEse_DisablePwrCntrl(void);

/**
 * \ingroup spi_libese
 * \brief This function is used to get the ESE timer status
 *
 * \param[in]       phNxpEse_data timer_buffer
 *
 * \retval ESESTATUS_SUCCESS Always return ESESTATUS_SUCCESS (0).
 *
 */
ESESTATUS phNxpEse_GetEseStatus(phNxpEse_data* timer_buffer);
/** @} */
#endif /* _PHNXPSPILIB_API_H_ */