/*
 * Copyright (C) 2010 NXP Semiconductors
 *
 * 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.
 */


/**
* \file phHal4Nfc_Internal.h
* \brief HAL callback Function Prototypes
*
*  The HAL4.0 Internal header file
*
* Project: NFC-FRI-1.1 / HAL4.0
*
* $Date: Mon May 31 11:43:42 2010 $
* $Author: ing07385 $
* $Revision: 1.40 $
* $Aliases: NFC_FRI1.1_WK1023_R35_1 $
*
*/

/*@{*/
#ifndef PHHAL4NFC_INTERNAL_H
#define PHHAL4NFC_INTERNAL_H
/*@}*/

#include <phHciNfc.h>

/** 
*  \name HAL4
*
* File: \ref phHal4Nfc_Internal.h
*
*/

/*@{*/
#define PH_HAL4NFC_INTERNAL_FILEREVISION "$Revision: 1.40 $" /**< \ingroup grp_file_attributes */
#define PH_HAL4NFC_INTERNAL_FILEALIASES  "$Aliases: NFC_FRI1.1_WK1023_R35_1 $"     /**< \ingroup grp_file_attributes */
/*@}*/

/* -----------------Include files ---------------------------------------*/ 

/* ---------------- Macros ----------------------------------------------*/
#define LLCP_DISCON_CHANGES
#define PH_HAL4NFC_TRANSCEIVE_TIMEOUT        30000  /**<Transceive operation
                                                        on any target should be 
                                                        completed within this 
                                                        interval.Else the
                                                        operation is timed out*/

#define   PH_HAL4NFC_TGT_MERGE_ADDRESS          0x988BU
#define   PH_HAL4NFC_TGT_MERGE_SAK                0x00U 


/*---------------- Hal4 Internal Data Structures -------------------------*/
/**HAL4 states*/
typedef enum{
    eHal4StateClosed = 0x00,  /**<closed state*/
    eHal4StateSelfTestMode, /**<Self test mode*/
    eHal4StateOpenAndReady ,/**<Fully initialised*/
    eHal4StateConfiguring ,  /**<configuration ongoing,transient state*/
    eHal4StateTargetDiscovered,/**<target discovered*/
    eHal4StateTargetActivate,/**<state during a select or reactivate*/
    eHal4StateEmulation,/**<Emulation state*/
    eHal4StateTargetConnected,/**<Connected state*/
    eHal4StateTransaction,/**<configuration ongoing,transient state*/
    eHal4StatePresenceCheck,/**<Presence Check state*/
    eHal4StateInvalid
} phHal4Nfc_Hal4state_t;


/**Global Pointer to hardware reference used in timer callbacks to get the 
   context pointer*/
extern phHal_sHwReference_t *gpphHal4Nfc_Hwref;

/**Context info for HAL4 transceive*/
typedef struct phHal4Nfc_TrcvCtxtInfo{
    /*Upper layer's Transceive callback*/
    pphHal4Nfc_TransceiveCallback_t  pUpperTranceiveCb;
     /*Upper layer's Send callback*/
    pphHal4Nfc_SendCallback_t        pP2PSendCb;
     /*Upper layer's receive callback*/
    pphHal4Nfc_ReceiveCallback_t     pP2PRecvCb;
    /**Flag to check if a P2P Send is ongoing when target release is issued by
       the upper layer.If this flag is set ,then a remote device disconnect call
       will be deferred*/
    uint8_t                          P2P_Send_In_Progress;
    /*Data structure to provide transceive info to Hci*/
    phHciNfc_XchgInfo_t              XchangeInfo;
    /*sData pointer to point to upper layer's send data*/
    phNfc_sData_t                   *psUpperSendData;
    /*Maintains the offset of number of bytes sent in one go ,so that the 
      remaining bytes can be sent during the next transceive*/
    uint32_t                         NumberOfBytesSent;
    /*Number of bytes received during a P2p receive*/
    uint32_t                         P2PRecvLength;
    /*sData pointer to point to upper layer's recv data*/
    phNfc_sData_t                   *psUpperRecvData;
    /*structure to hold data received from lower layer*/
    phNfc_sData_t                    sLowerRecvData;
    /*Offset for Lower Recv Data buffer*/
    uint32_t                         LowerRecvBufferOffset;
    /*Holds the status of the RecvDataBuffer:
    NFCSTATUS_SUCCESS:Receive data buffer is complete with data & P2P receive has
                      not yet been called
    NFCSTATUS_PENDING:RecvDataBuffer is yet to receive the data from lower layer
    */
    NFCSTATUS                        RecvDataBufferStatus;
    /*Transaction timer ,currently used only for P2P receive on target*/
    uint32_t                         TransactionTimerId;
}phHal4Nfc_TrcvCtxtInfo_t,*pphHal4Nfc_TrcvCtxtInfo_t;


/**Context info for HAL4 Device discovery feature*/
typedef struct phHal4Nfc_ADDCtxtInfo{
    /*total number of devices discovered*/
    uint8_t                          nbr_of_devices;
    /*smx_discovery*/
    uint8_t                          smx_discovery;
    /*Most recently used ADD configuration*/
    phHal_sADD_Cfg_t                 sADDCfg;
    /*Most recently used Poll configuration*/
    phHal_sPollDevInfo_t             sCurrentPollConfig;
    /*Set when Poll Configured and reset when polling is disabled.*/
    uint8_t                          IsPollConfigured;
}phHal4Nfc_ADDCtxtInfo_t,*pphHal4Nfc_ADDCtxtInfo_t;

/**Context info for HAL4 connect/disconnect*/
typedef struct phHal4Nfc_TargetConnectInfo{
    /*connect callback*/
    pphHal4Nfc_ConnectCallback_t     pUpperConnectCb;
    /*Disconnect callback*/
    pphHal4Nfc_DiscntCallback_t      pUpperDisconnectCb;
    /*used when a release call is pending in HAL*/
    phHal_eReleaseType_t             ReleaseType;
    /*Points to Remote device info of a connected device*/
    phHal_sRemoteDevInformation_t   *psConnectedDevice; 
    /*Emulation state Activated/Deactivated*/
    phHal_Event_t                    EmulationState; 
    /*Presence check callback*/
    pphHal4Nfc_GenCallback_t         pPresenceChkCb;
}phHal4Nfc_TargetConnectInfo_t,*pphHal4Nfc_TargetConnectInfo_t;

/**Context info for HAL4 connect & disconnect*/
typedef struct phHal4Nfc_UpperLayerInfo{
    /*Upper layer Context for discovery call*/
    void                            *DiscoveryCtxt;
    /*Upper layer Context for P2P discovery call*/
    void                            *P2PDiscoveryCtxt;
    /**Context and function pointer for default event handler registered
      by upper layer during initialization*/
    void                            *DefaultListenerCtxt;
    /*Default event handler*/
    pphHal4Nfc_Notification_t        pDefaultEventHandler;
    /**Upper layer has to register this listener for receiving info about 
        discovered tags*/
    pphHal4Nfc_Notification_t        pTagDiscoveryNotification;
    /**Upper layer has to register this  listener for receiving info about 
        discovered P2P devices*/
    pphHal4Nfc_Notification_t        pP2PNotification;
    /*Event Notification Context*/
    void                            *EventNotificationCtxt;
    /**Notification handler for emulation and other events*/
    pphHal4Nfc_Notification_t        pEventNotification;
    /**Upper layer's Config discovery/Emulation callback registry*/
    pphHal4Nfc_GenCallback_t         pConfigCallback;
    void                            *psUpperLayerCtxt;
    void                            *psUpperLayerDisconnectCtxt;
#ifdef LLCP_DISCON_CHANGES
    void                            *psUpperLayerCfgDiscCtxt;
#endif /* #ifdef LLCP_DISCON_CHANGES */
     /**Upper layer's Open Callback registry*/
    pphHal4Nfc_GenCallback_t         pUpperOpenCb;
    /**Upper layer's Close Callback registry */
    pphHal4Nfc_GenCallback_t         pUpperCloseCb; 
    /*Ioctl out param pointer ,points to buffer provided by upper layer during
      a ioctl call*/
    phNfc_sData_t                   *pIoctlOutParam;
    /*Ioctl callback*/
    pphHal4Nfc_IoctlCallback_t       pUpperIoctlCb;
}phHal4Nfc_UpperLayerInfo_t;

/**Context structure for HAL4.0*/
typedef struct phHal4Nfc_Hal4Ctxt{
    /**Hci handle obtained in Hci_Init*/ 
    void                            *psHciHandle;
    /**Layer configuration*/
    pphNfcLayer_sCfg_t               pHal4Nfc_LayerCfg;
    /**Device capabilities*/
    phHal_sDeviceCapabilities_t      Hal4Nfc_DevCaps;
    /*Current state of HAL4.Updated generally in callbacks*/
    phHal4Nfc_Hal4state_t            Hal4CurrentState; 
    /*Next state of HAL.Updated during calls*/
    phHal4Nfc_Hal4state_t            Hal4NextState; 
    /**Info related to upper layer*/
    phHal4Nfc_UpperLayerInfo_t       sUpperLayerInfo;
     /*ADD context info*/
    pphHal4Nfc_ADDCtxtInfo_t         psADDCtxtInfo;
    /*union for different configurations ,used in a config_parameters()call*/
    phHal_uConfig_t                  uConfig;
     /*Event info*/
    phHal_sEventInfo_t              *psEventInfo;
    /*Select sector flag*/
    uint8_t                          SelectSectorFlag;
    /**List of pointers to remote device information for all discovered 
       targets*/
    phHal_sRemoteDevInformation_t   *rem_dev_list[MAX_REMOTE_DEVICES];
    /*Transceive context info*/
    pphHal4Nfc_TrcvCtxtInfo_t        psTrcvCtxtInfo; 
    /*Connect context info*/
    phHal4Nfc_TargetConnectInfo_t    sTgtConnectInfo;
    /*Last called Ioctl_type*/
    uint32_t                         Ioctl_Type;
#ifdef IGNORE_EVT_PROTECTED
    /*used to ignore multiple Protected events*/
    uint8_t                          Ignore_Event_Protected;
#endif/*#ifdef IGNORE_EVT_PROTECTED*/
    uint8_t                          FelicaIDm[(PHHAL_FEL_ID_LEN + 2)];
}phHal4Nfc_Hal4Ctxt_t;


/*---------------- Function Prototypes ----------------------------------------------*/

/*Callback completion routine for Connect*/
extern void phHal4Nfc_ConnectComplete(
                                      phHal4Nfc_Hal4Ctxt_t  *Hal4Ctxt,
                                      void *pInfo
                                      );

/*Callback completion routine for Disconnect*/
extern void phHal4Nfc_DisconnectComplete(
                            phHal4Nfc_Hal4Ctxt_t  *Hal4Ctxt,
                            void *pInfo
                            );

/*Callback completion routine for Transceive*/
extern void phHal4Nfc_TransceiveComplete(
                        phHal4Nfc_Hal4Ctxt_t  *Hal4Ctxt,
                        void *pInfo
                        );

/*Callback completion routine for Presence check*/
extern void phHal4Nfc_PresenceChkComplete(
                        phHal4Nfc_Hal4Ctxt_t  *Hal4Ctxt,
                        void *pInfo
                        );

/*Configuration completion routine*/
extern void phHal4Nfc_ConfigureComplete(
                                        phHal4Nfc_Hal4Ctxt_t  *Hal4Ctxt,
                                        void *pInfo,
                                        uint8_t type
                                        );


/*Callback completion routine for ADD*/
extern void phHal4Nfc_TargetDiscoveryComplete(
                            phHal4Nfc_Hal4Ctxt_t  *Hal4Ctxt,
                            void *pInfo
                            );

/*Event handler routine for Emulation*/
extern void phHal4Nfc_HandleEmulationEvent(
                        phHal4Nfc_Hal4Ctxt_t  *Hal4Ctxt,
                        void *pInfo
                        );

/*Callback completion routine for NFCIP1 Receive*/
extern void phHal4Nfc_RecvCompleteHandler(phHal4Nfc_Hal4Ctxt_t  *Hal4Ctxt,void *pInfo);

/*Callback completion routine for Send*/
extern void phHal4Nfc_SendCompleteHandler(phHal4Nfc_Hal4Ctxt_t  *Hal4Ctxt,void *pInfo);

/*Callback completion routine for P2P Activate Event received from HCI*/
extern void phHal4Nfc_P2PActivateComplete(
                    phHal4Nfc_Hal4Ctxt_t  *Hal4Ctxt,
                    void *pInfo
                    );
/*Callback completion routine for P2P Deactivate Event received from HCI*/
extern void phHal4Nfc_HandleP2PDeActivate(
                        phHal4Nfc_Hal4Ctxt_t  *Hal4Ctxt,
                        void *pInfo
                        );

/*Callback completion routine for reactivate target*/
extern void phHal4Nfc_ReactivationComplete(
                        phHal4Nfc_Hal4Ctxt_t  *Hal4Ctxt,
                        void *pInfo
                        );

/**Execute Hal4 Disconnect*/
extern NFCSTATUS phHal4Nfc_Disconnect_Execute(
                            phHal_sHwReference_t  *psHwReference
                            );

/**Handle transceive timeout*/
#ifdef TRANSACTION_TIMER
extern void phHal4Nfc_TrcvTimeoutHandler(uint32_t TrcvTimerId);
#endif /*TRANSACTION_TIMER*/

#endif/*PHHAL4NFC_INTERNAL_H*/