/******************************************************************************
 *
 *  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.
 *
 ******************************************************************************/
#ifndef ANDROID_HARDWARE_HAL_NXPNFC_V1_0_H
#define ANDROID_HARDWARE_HAL_NXPNFC_V1_0_H

#define NFC_NCI_NXP_PN54X_HARDWARE_MODULE_ID "nfc_nci.pn54x"
#define MAX_IOCTL_TRANSCEIVE_CMD_LEN 256
#define MAX_IOCTL_TRANSCEIVE_RESP_LEN 256
#define MAX_ATR_INFO_LEN 128

enum {
  // HAL_NFC_ENABLE_I2C_FRAGMENTATION_EVT = 0x07,
  HAL_NFC_POST_MIN_INIT_CPLT_EVT = 0x08
};
/*
 * Data structures provided below are used of Hal Ioctl calls
 */
/*
 * nfc_nci_ExtnCmd_t shall contain data for commands used for transceive command
 * in ioctl
 */
typedef struct {
  uint16_t cmd_len;
  uint8_t p_cmd[MAX_IOCTL_TRANSCEIVE_CMD_LEN];
} nfc_nci_ExtnCmd_t;

/*
 * nfc_nci_ExtnRsp_t shall contain response for command sent in transceive
 * command
 */
typedef struct {
  uint16_t rsp_len;
  uint8_t p_rsp[MAX_IOCTL_TRANSCEIVE_RESP_LEN];
} nfc_nci_ExtnRsp_t;
/*
 * InputData_t :ioctl has multiple subcommands
 * Each command has corresponding input data which needs to be populated in this
 */
typedef union {
  uint16_t bootMode;
  uint8_t halType;
  nfc_nci_ExtnCmd_t nciCmd;
  uint32_t timeoutMilliSec;
  long nfcServicePid;
} InputData_t;
/*
 * nfc_nci_ExtnInputData_t :Apart from InputData_t, there are context data
 * which is required during callback from stub to proxy.
 * To avoid additional copy of data while propagating from libnfc to Adaptation
 * and Nfcstub to ncihal, common structure is used. As a sideeffect, context
 * data
 * is exposed to libnfc (Not encapsulated).
 */
typedef struct {
  /*context to be used/updated only by users of proxy & stub of Nfc.hal
  * i.e, NfcAdaptation & hardware/interface/Nfc.
  */
  void* context;
  InputData_t data;
  uint8_t data_source;
  long level;
} nfc_nci_ExtnInputData_t;

/*
 * outputData_t :ioctl has multiple commands/responses
 * This contains the output types for each ioctl.
 */
typedef union {
  uint32_t status;
  nfc_nci_ExtnRsp_t nciRsp;
  uint8_t nxpNciAtrInfo[MAX_ATR_INFO_LEN];
  uint32_t p61CurrentState;
  uint16_t fwUpdateInf;
  uint16_t fwDwnldStatus;
  uint16_t fwMwVerStatus;
  uint8_t chipType;
} outputData_t;

/*
 * nfc_nci_ExtnOutputData_t :Apart from outputData_t, there are other
 * information
 * which is required during callback from stub to proxy.
 * For ex (context, result of the operation , type of ioctl which was
 * completed).
 * To avoid additional copy of data while propagating from libnfc to Adaptation
 * and Nfcstub to ncihal, common structure is used. As a sideeffect, these data
 * is exposed(Not encapsulated).
 */
typedef struct {
  /*ioctlType, result & context to be used/updated only by users of
   * proxy & stub of Nfc.hal.
   * i.e, NfcAdaptation & hardware/interface/Nfc
   * These fields shall not be used by libnfc or halimplementation*/
  uint64_t ioctlType;
  uint32_t result;
  void* context;
  outputData_t data;
} nfc_nci_ExtnOutputData_t;

/*
 * nfc_nci_IoctlInOutData_t :data structure for input & output
 * to be sent for ioctl command. input is populated by client/proxy side
 * output is provided from server/stub to client/proxy
 */
typedef struct {
  nfc_nci_ExtnInputData_t inp;
  nfc_nci_ExtnOutputData_t out;
} nfc_nci_IoctlInOutData_t;

/*
 * nxpnfc_nci_device_t :data structure for nxp's extended nfc_nci_device
 * Extra features added are
 * -ioctl(manage sync between  and DWP & SPI)
 * -check request for fw download
 */
typedef struct nxpnfc_nci_device {
  // nfc_nci_device_t nci_device;
  /*
  * (*ioctl)() For P61 power management synchronization
  * between NFC Wired and SPI.
  */
  int (*ioctl)(const struct nxpnfc_nci_device* p_dev, long arg, void* p_data);
  /*
  * (*check_fw_dwnld_flag)() Is called to get FW downlaod request.
  */
  int (*check_fw_dwnld_flag)(const struct nxpnfc_nci_device* p_dev,
                             uint8_t* param1);
} nxpnfc_nci_device_t;

#endif  // ANDROID_HARDWARE_HAL_NXPNFC_V1_0_H
