Home | History | Annotate | Download | only in tml
      1 /*
      2  * Copyright (C) 2010-2014 NXP Semiconductors
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 /*
     18  * Transport Mapping Layer header files containing APIs related to initializing, reading
     19  * and writing data into files provided by the driver interface.
     20  *
     21  * API listed here encompasses Transport Mapping Layer interfaces required to be mapped
     22  * to different Interfaces and Platforms.
     23  *
     24  */
     25 
     26 #ifndef PHTMLNFC_H
     27 #define PHTMLNFC_H
     28 
     29 #include <phNfcCommon.h>
     30 
     31 /*
     32  * Message posted by Reader thread upon
     33  * completion of requested operation
     34  */
     35 #define PH_TMLNFC_READ_MESSAGE              (0xAA)
     36 
     37 /*
     38  * Message posted by Writer thread upon
     39  * completion of requested operation
     40  */
     41 #define PH_TMLNFC_WRITE_MESSAGE             (0x55)
     42 
     43 /*
     44  * Value indicates to reset device
     45  */
     46 #define PH_TMLNFC_RESETDEVICE               (0x00008001)
     47 
     48 /*
     49 ***************************Globals,Structure and Enumeration ******************
     50 */
     51 
     52 /*
     53  * Transaction (Tx/Rx) completion information structure of TML
     54  *
     55  * This structure holds the completion callback information of the
     56  * transaction passed from the TML layer to the Upper layer
     57  * along with the completion callback.
     58  *
     59  * The value of field wStatus can be interpreted as:
     60  *
     61  *     - NFCSTATUS_SUCCESS                    Transaction performed successfully.
     62  *     - NFCSTATUS_FAILED                     Failed to wait on Read/Write operation.
     63  *     - NFCSTATUS_INSUFFICIENT_STORAGE       Not enough memory to store data in case of read.
     64  *     - NFCSTATUS_BOARD_COMMUNICATION_ERROR  Failure to Read/Write from the file or timeout.
     65  */
     66 
     67 typedef struct phTmlNfc_TransactInfo
     68 {
     69     NFCSTATUS           wStatus;    /* Status of the Transaction Completion*/
     70     uint8_t             *pBuff;     /* Response Data of the Transaction*/
     71     uint16_t            wLength;    /* Data size of the Transaction*/
     72 }phTmlNfc_TransactInfo_t;           /* Instance of Transaction structure */
     73 
     74 /*
     75  * TML transreceive completion callback to Upper Layer
     76  *
     77  * pContext - Context provided by upper layer
     78  * pInfo    - Transaction info. See phTmlNfc_TransactInfo
     79  */
     80 typedef void (*pphTmlNfc_TransactCompletionCb_t) (void *pContext, phTmlNfc_TransactInfo_t *pInfo);
     81 
     82 /*
     83  * TML Deferred callback interface structure invoked by upper layer
     84  *
     85  * This could be used for read/write operations
     86  *
     87  * dwMsgPostedThread Message source identifier
     88  * pParams Parameters for the deferred call processing
     89  */
     90 typedef  void (*pphTmlNfc_DeferFuncPointer_t) (uint32_t dwMsgPostedThread,void *pParams);
     91 
     92 /*
     93  * Enum definition contains  supported ioctl control codes.
     94  *
     95  * phTmlNfc_IoCtl
     96  */
     97 typedef enum
     98 {
     99     phTmlNfc_e_Invalid = 0,
    100     phTmlNfc_e_ResetDevice = PH_TMLNFC_RESETDEVICE, /* Reset the device */
    101     phTmlNfc_e_EnableDownloadMode, /* Do the hardware setting to enter into download mode */
    102     phTmlNfc_e_EnableNormalMode /* Hardware setting for normal mode of operation */
    103 } phTmlNfc_ControlCode_t ;  /* Control code for IOCTL call */
    104 
    105 /*
    106  * Enable / Disable Re-Transmission of Packets
    107  *
    108  * phTmlNfc_ConfigNciPktReTx
    109  */
    110 typedef enum
    111 {
    112     phTmlNfc_e_EnableRetrans = 0x00, /*Enable retransmission of Nci packet */
    113     phTmlNfc_e_DisableRetrans = 0x01 /*Disable retransmission of Nci packet */
    114 } phTmlNfc_ConfigRetrans_t ;  /* Configuration for Retransmission */
    115 
    116 /*
    117  * Structure containing details related to read and write operations
    118  *
    119  */
    120 typedef struct phTmlNfc_ReadWriteInfo
    121 {
    122     volatile uint8_t bEnable; /*This flag shall decide whether to perform Write/Read operation */
    123     uint8_t bThreadBusy; /*Flag to indicate thread is busy on respective operation */
    124     /* Transaction completion Callback function */
    125     pphTmlNfc_TransactCompletionCb_t pThread_Callback;
    126     void *pContext; /*Context passed while invocation of operation */
    127     uint8_t *pBuffer; /*Buffer passed while invocation of operation */
    128     uint16_t wLength; /*Length of data read/written */
    129     NFCSTATUS wWorkStatus; /*Status of the transaction performed */
    130 } phTmlNfc_ReadWriteInfo_t;
    131 
    132 /*
    133  *Base Context Structure containing members required for entire session
    134  */
    135 typedef struct phTmlNfc_Context
    136 {
    137     pthread_t readerThread; /*Handle to the thread which handles write and read operations */
    138     pthread_t writerThread;
    139     volatile uint8_t bThreadDone; /*Flag to decide whether to run or abort the thread */
    140     phTmlNfc_ConfigRetrans_t eConfig; /*Retransmission of Nci Packet during timeout */
    141     uint8_t bRetryCount; /*Number of times retransmission shall happen */
    142     uint8_t bWriteCbInvoked; /* Indicates whether write callback is invoked during retransmission */
    143     uint32_t dwTimerId; /* Timer used to retransmit nci packet */
    144     phTmlNfc_ReadWriteInfo_t tReadInfo; /*Pointer to Reader Thread Structure */
    145     phTmlNfc_ReadWriteInfo_t tWriteInfo; /*Pointer to Writer Thread Structure */
    146     void *pDevHandle; /* Pointer to Device Handle */
    147     uintptr_t dwCallbackThreadId; /* Thread ID to which message to be posted */
    148     uint8_t bEnableCrc; /*Flag to validate/not CRC for input buffer */
    149     sem_t   rxSemaphore;
    150     sem_t   txSemaphore; /* Lock/Aquire txRx Semaphore */
    151     sem_t   postMsgSemaphore; /* Semaphore to post message atomically by Reader & writer thread */
    152 } phTmlNfc_Context_t;
    153 
    154 /*
    155  * TML Configuration exposed to upper layer.
    156  */
    157 typedef struct phTmlNfc_Config
    158 {
    159     /* Port name connected to PN54X
    160      *
    161      * Platform specific canonical device name to which PN54X is connected.
    162      *
    163      * e.g. On Linux based systems this would be /dev/PN54X
    164      */
    165     int8_t *pDevName;
    166     /* Callback Thread ID
    167      *
    168      * This is the thread ID on which the Reader & Writer thread posts message. */
    169     uintptr_t dwGetMsgThreadId;
    170     /* Communication speed between DH and PN54X
    171      *
    172      * This is the baudrate of the bus for communication between DH and PN54X */
    173     uint32_t dwBaudRate;
    174 } phTmlNfc_Config_t,*pphTmlNfc_Config_t;    /* pointer to phTmlNfc_Config_t */
    175 
    176 /*
    177  * TML Deferred Callback structure used to invoke Upper layer Callback function.
    178  */
    179 typedef struct {
    180     pphTmlNfc_DeferFuncPointer_t pDef_call; /*Deferred callback function to be invoked */
    181     /* Source identifier
    182      *
    183      * Identifier of the source which posted the message
    184      */
    185     uint32_t dwMsgPostedThread;
    186     /** Actual Message
    187      *
    188      * This is passed as a parameter passed to the deferred callback function pDef_call. */
    189     void* pParams;
    190 } phTmlNfc_DeferMsg_t;                      /* DeferMsg structure passed to User Thread */
    191 
    192 typedef enum
    193 {
    194     I2C_FRAGMENATATION_DISABLED,     /*i2c fragmentation_disabled           */
    195     I2C_FRAGMENTATION_ENABLED      /*i2c_fragmentation_enabled          */
    196 } phTmlNfc_i2cfragmentation_t;
    197 /* Function declarations */
    198 NFCSTATUS phTmlNfc_Init(pphTmlNfc_Config_t pConfig);
    199 NFCSTATUS phTmlNfc_Shutdown(void);
    200 NFCSTATUS phTmlNfc_Write(uint8_t *pBuffer, uint16_t wLength, pphTmlNfc_TransactCompletionCb_t pTmlWriteComplete,  void *pContext);
    201 NFCSTATUS phTmlNfc_Read(uint8_t *pBuffer, uint16_t wLength, pphTmlNfc_TransactCompletionCb_t pTmlReadComplete,  void *pContext);
    202 NFCSTATUS phTmlNfc_WriteAbort(void);
    203 NFCSTATUS phTmlNfc_ReadAbort(void);
    204 NFCSTATUS phTmlNfc_IoCtl(phTmlNfc_ControlCode_t eControlCode);
    205 void phTmlNfc_DeferredCall(uintptr_t dwThreadId, phLibNfc_Message_t *ptWorkerMsg);
    206 void phTmlNfc_ConfigNciPktReTx( phTmlNfc_ConfigRetrans_t eConfig, uint8_t bRetryCount);
    207 void phTmlNfc_set_fragmentation_enabled(phTmlNfc_i2cfragmentation_t enable);
    208 phTmlNfc_i2cfragmentation_t phTmlNfc_get_fragmentation_enabled();
    209 #endif /*  PHTMLNFC_H  */
    210