You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
260 lines
9.3 KiB
260 lines
9.3 KiB
/*
|
|
* Copyright 2010-2021 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.
|
|
*/
|
|
|
|
/*
|
|
* Transport Mapping Layer header files containing APIs related to initializing,
|
|
* reading
|
|
* and writing data into files provided by the driver interface.
|
|
*
|
|
* API listed here encompasses Transport Mapping Layer interfaces required to be
|
|
* mapped
|
|
* to different Interfaces and Platforms.
|
|
*
|
|
*/
|
|
|
|
#ifndef PHTMLNFC_H
|
|
#define PHTMLNFC_H
|
|
|
|
#include <phNfcCommon.h>
|
|
|
|
/*
|
|
* Message posted by Reader thread upon
|
|
* completion of requested operation
|
|
*/
|
|
#define PH_TMLNFC_READ_MESSAGE (0xAA)
|
|
|
|
/*
|
|
* Message posted by Writer thread upon
|
|
* completion of requested operation
|
|
*/
|
|
#define PH_TMLNFC_WRITE_MESSAGE (0x55)
|
|
|
|
/*
|
|
* Value indicates to reset device
|
|
*/
|
|
#define PH_TMLNFC_RESETDEVICE (0x00008001)
|
|
|
|
/*
|
|
***************************Globals,Structure and Enumeration ******************
|
|
*/
|
|
|
|
/*
|
|
* Transaction (Tx/Rx) completion information structure of TML
|
|
*
|
|
* This structure holds the completion callback information of the
|
|
* transaction passed from the TML layer to the Upper layer
|
|
* along with the completion callback.
|
|
*
|
|
* The value of field wStatus can be interpreted as:
|
|
*
|
|
* - NFCSTATUS_SUCCESS Transaction performed
|
|
* successfully.
|
|
* - NFCSTATUS_FAILED Failed to wait on Read/Write
|
|
* operation.
|
|
* - NFCSTATUS_INSUFFICIENT_STORAGE Not enough memory to store data in
|
|
* case of read.
|
|
* - NFCSTATUS_BOARD_COMMUNICATION_ERROR Failure to Read/Write from the
|
|
* file or timeout.
|
|
*/
|
|
|
|
typedef struct phTmlNfc_TransactInfo {
|
|
NFCSTATUS wStatus; /* Status of the Transaction Completion*/
|
|
uint8_t* pBuff; /* Response Data of the Transaction*/
|
|
uint16_t wLength; /* Data size of the Transaction*/
|
|
} phTmlNfc_TransactInfo_t; /* Instance of Transaction structure */
|
|
|
|
/*
|
|
* TML transreceive completion callback to Upper Layer
|
|
*
|
|
* pContext - Context provided by upper layer
|
|
* pInfo - Transaction info. See phTmlNfc_TransactInfo
|
|
*/
|
|
typedef void (*pphTmlNfc_TransactCompletionCb_t)(
|
|
void* pContext, phTmlNfc_TransactInfo_t* pInfo);
|
|
|
|
/*
|
|
* TML Deferred callback interface structure invoked by upper layer
|
|
*
|
|
* This could be used for read/write operations
|
|
*
|
|
* dwMsgPostedThread Message source identifier
|
|
* pParams Parameters for the deferred call processing
|
|
*/
|
|
typedef void (*pphTmlNfc_DeferFuncPointer_t)(uint32_t dwMsgPostedThread,
|
|
void* pParams);
|
|
|
|
/*
|
|
* Enum definition contains supported ioctl control codes.
|
|
*
|
|
* phTmlNfc_IoCtl
|
|
*/
|
|
typedef enum {
|
|
phTmlNfc_e_Invalid = 0,
|
|
phTmlNfc_e_ResetDevice = PH_TMLNFC_RESETDEVICE, /* Reset the device */
|
|
phTmlNfc_e_EnableDownloadMode, /* Do the hardware setting to enter into
|
|
download mode */
|
|
phTmlNfc_e_EnableNormalMode, /* Hardware setting for normal mode of operation
|
|
*/
|
|
phTmlNfc_e_EnableDownloadModeWithVenRst,
|
|
phTmlNfc_e_PowerReset = 5,
|
|
} phTmlNfc_ControlCode_t; /* Control code for IOCTL call */
|
|
|
|
/*
|
|
* Enable / Disable Re-Transmission of Packets
|
|
*
|
|
* phTmlNfc_ConfigNciPktReTx
|
|
*/
|
|
typedef enum {
|
|
phTmlNfc_e_EnableRetrans = 0x00, /*Enable retransmission of Nci packet */
|
|
phTmlNfc_e_DisableRetrans = 0x01 /*Disable retransmission of Nci packet */
|
|
} phTmlNfc_ConfigRetrans_t; /* Configuration for Retransmission */
|
|
|
|
/*nfc state flags*/
|
|
enum nfc_state_flags {
|
|
/*nfc in unknown state */
|
|
NFC_STATE_UNKNOWN = 0,
|
|
/*nfc booted in download mode */
|
|
NFC_STATE_FW_DWL = 0x1,
|
|
/*nfc booted in NCI mode */
|
|
NFC_STATE_NCI = 0x2,
|
|
};
|
|
/*
|
|
* Structure containing details related to read and write operations
|
|
*
|
|
*/
|
|
typedef struct phTmlNfc_ReadWriteInfo {
|
|
volatile uint8_t bEnable; /*This flag shall decide whether to perform
|
|
Write/Read operation */
|
|
uint8_t
|
|
bThreadBusy; /*Flag to indicate thread is busy on respective operation */
|
|
/* Transaction completion Callback function */
|
|
pphTmlNfc_TransactCompletionCb_t pThread_Callback;
|
|
void* pContext; /*Context passed while invocation of operation */
|
|
uint8_t* pBuffer; /*Buffer passed while invocation of operation */
|
|
uint16_t wLength; /*Length of data read/written */
|
|
NFCSTATUS wWorkStatus; /*Status of the transaction performed */
|
|
} phTmlNfc_ReadWriteInfo_t;
|
|
|
|
/*nfc platform interface type*/
|
|
enum platform_interface_type {
|
|
/*I2C physical IF for NFCC*/
|
|
PLATFORM_IF_I2C = 0,
|
|
/*I3C physical IF for NFCC*/
|
|
PLATFORM_IF_I3C,
|
|
};
|
|
/*
|
|
*Base Context Structure containing members required for entire session
|
|
*/
|
|
typedef struct phTmlNfc_Context {
|
|
pthread_t readerThread; /*Handle to the thread which handles write and read
|
|
operations */
|
|
pthread_t writerThread;
|
|
volatile uint8_t
|
|
bThreadDone; /*Flag to decide whether to run or abort the thread */
|
|
phTmlNfc_ConfigRetrans_t
|
|
eConfig; /*Retransmission of Nci Packet during timeout */
|
|
uint8_t bRetryCount; /*Number of times retransmission shall happen */
|
|
uint8_t bWriteCbInvoked; /* Indicates whether write callback is invoked during
|
|
retransmission */
|
|
uint32_t dwTimerId; /* Timer used to retransmit nci packet */
|
|
phTmlNfc_ReadWriteInfo_t tReadInfo; /*Pointer to Reader Thread Structure */
|
|
phTmlNfc_ReadWriteInfo_t tWriteInfo; /*Pointer to Writer Thread Structure */
|
|
void* pDevHandle; /* Pointer to Device Handle */
|
|
uintptr_t dwCallbackThreadId; /* Thread ID to which message to be posted */
|
|
uint8_t bEnableCrc; /*Flag to validate/not CRC for input buffer */
|
|
sem_t rxSemaphore;
|
|
sem_t txSemaphore; /* Lock/Acquire txRx Semaphore */
|
|
sem_t postMsgSemaphore; /* Semaphore to post message atomically by Reader &
|
|
writer thread */
|
|
pthread_cond_t wait_busy_condition; /*Condition to wait reader thread*/
|
|
pthread_mutex_t wait_busy_lock; /*Condition lock to wait reader thread*/
|
|
volatile uint8_t wait_busy_flag; /*Condition flag to wait reader thread*/
|
|
volatile uint8_t gWriterCbflag; /* flag to indicate write callback message is
|
|
pushed to queue*/
|
|
long nfc_service_pid; /*NFC Service PID to be used by driver to signal*/
|
|
int platform_type; /*for common(i2c or i3c) mw implementation*/
|
|
int nfc_state; /*to get the initial boot state*/
|
|
} phTmlNfc_Context_t;
|
|
|
|
/*
|
|
* TML Configuration exposed to upper layer.
|
|
*/
|
|
typedef struct phTmlNfc_Config {
|
|
/* Port name connected to PN54X
|
|
*
|
|
* Platform specific canonical device name to which PN54X is connected.
|
|
*
|
|
* e.g. On Linux based systems this would be /dev/PN54X
|
|
*/
|
|
int8_t* pDevName;
|
|
/* Callback Thread ID
|
|
*
|
|
* This is the thread ID on which the Reader & Writer thread posts message. */
|
|
uintptr_t dwGetMsgThreadId;
|
|
/* Communication speed between DH and PN54X
|
|
*
|
|
* This is the baudrate of the bus for communication between DH and PN54X */
|
|
uint32_t dwBaudRate;
|
|
} phTmlNfc_Config_t, *pphTmlNfc_Config_t; /* pointer to phTmlNfc_Config_t */
|
|
|
|
/*
|
|
* TML Deferred Callback structure used to invoke Upper layer Callback function.
|
|
*/
|
|
typedef struct {
|
|
/* Deferred callback function to be invoked */
|
|
pphTmlNfc_DeferFuncPointer_t pDef_call;
|
|
/* Source identifier
|
|
*
|
|
* Identifier of the source which posted the message
|
|
*/
|
|
uint32_t dwMsgPostedThread;
|
|
/** Actual Message
|
|
*
|
|
* This is passed as a parameter passed to the deferred callback function
|
|
* pDef_call. */
|
|
void* pParams;
|
|
} phTmlNfc_DeferMsg_t; /* DeferMsg structure passed to User Thread */
|
|
|
|
typedef enum {
|
|
I2C_FRAGMENATATION_DISABLED, /*i2c fragmentation_disabled */
|
|
I2C_FRAGMENTATION_ENABLED /*i2c_fragmentation_enabled */
|
|
} phTmlNfc_i2cfragmentation_t;
|
|
/* Function declarations */
|
|
NFCSTATUS phTmlNfc_Init(pphTmlNfc_Config_t pConfig);
|
|
NFCSTATUS phTmlNfc_Shutdown(void);
|
|
NFCSTATUS phTmlNfc_Shutdown_CleanUp();
|
|
void phTmlNfc_CleanUp(void);
|
|
NFCSTATUS phTmlNfc_Write(uint8_t* pBuffer, uint16_t wLength,
|
|
pphTmlNfc_TransactCompletionCb_t pTmlWriteComplete,
|
|
void* pContext);
|
|
NFCSTATUS phTmlNfc_Read(uint8_t* pBuffer, uint16_t wLength,
|
|
pphTmlNfc_TransactCompletionCb_t pTmlReadComplete,
|
|
void* pContext);
|
|
NFCSTATUS phTmlNfc_WriteAbort(void);
|
|
NFCSTATUS phTmlNfc_ReadAbort(void);
|
|
NFCSTATUS phTmlNfc_IoCtl(phTmlNfc_ControlCode_t eControlCode);
|
|
void phTmlNfc_DeferredCall(uintptr_t dwThreadId,
|
|
phLibNfc_Message_t* ptWorkerMsg);
|
|
void phTmlNfc_ConfigNciPktReTx(phTmlNfc_ConfigRetrans_t eConfig,
|
|
uint8_t bRetryCount);
|
|
void phTmlNfc_set_fragmentation_enabled(phTmlNfc_i2cfragmentation_t enable);
|
|
phTmlNfc_i2cfragmentation_t phTmlNfc_get_fragmentation_enabled();
|
|
NFCSTATUS phTmlNfc_ConfigTransport();
|
|
void phTmlNfc_EnableFwDnldMode(bool mode);
|
|
bool phTmlNfc_IsFwDnldModeEnabled(void);
|
|
void phTmlNfc_WaitForIRQLow();
|
|
#endif /* PHTMLNFC_H */
|