• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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