merge with master
[adaptation/devices/nfc-plugin-nxp.git] / src / phFriNfc_Llcp.h
1 /*\r
2  * Copyright (C) 2010 NXP Semiconductors\r
3  *\r
4  * Licensed under the Apache License, Version 2.0 (the "License");\r
5  * you may not use this file except in compliance with the License.\r
6  * You may obtain a copy of the License at\r
7  *\r
8  *      http://www.apache.org/licenses/LICENSE-2.0\r
9  *\r
10  * Unless required by applicable law or agreed to in writing, software\r
11  * distributed under the License is distributed on an "AS IS" BASIS,\r
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
13  * See the License for the specific language governing permissions and\r
14  * limitations under the License.\r
15  */\r
16 \r
17 /**\r
18  * \file  phFriNfc_Llcp.h\r
19  * \brief NFC LLCP core\r
20  *\r
21  * Project: NFC-FRI\r
22  *\r
23  */\r
24 \r
25 #ifndef PHFRINFC_LLCP_H\r
26 #define PHFRINFC_LLCP_H\r
27 \r
28 /*include files*/\r
29 #include <phNfcTypes.h>\r
30 #include <phNfcLlcpTypes.h>\r
31 #include <phNfcStatus.h>\r
32 #include <phFriNfc.h>\r
33 \r
34 #include <phFriNfc_LlcpMac.h>\r
35 \r
36 /** \r
37  * \name NFC Forum Logical Link Control Protocol\r
38  *\r
39  * File: \ref phFriNfc_Llcp.h\r
40  *\r
41  */\r
42 \r
43 \r
44 /** \defgroup grp_fri_nfc_llcp NFC Forum Logical Link Control Protocol Component\r
45  *\r
46  *  TODO\r
47  *\r
48  */\r
49 \r
50 /*=========== DEBUG MACROS ===========*/\r
51 \r
52 /* LLCP TRACE Macros */\r
53 #if defined(LLCP_TRACE)\r
54 #include <phOsalNfc.h>\r
55 #include <stdio.h>\r
56 extern char phOsalNfc_DbgTraceBuffer[];\r
57 #define LLCP_MAX_TRACE_BUFFER   150\r
58 #define LLCP_PRINT( str )  phOsalNfc_DbgString(str)\r
59 #define LLCP_DEBUG(str, arg) \\r
60    {                                                                    \\r
61       snprintf(phOsalNfc_DbgTraceBuffer,LLCP_MAX_TRACE_BUFFER,str,arg); \\r
62       phOsalNfc_DbgString(phOsalNfc_DbgTraceBuffer);                    \\r
63    }\r
64 #define LLCP_PRINT_BUFFER(msg,buf,len) \\r
65    {                                                                             \\r
66       snprintf(phOsalNfc_DbgTraceBuffer,LLCP_MAX_TRACE_BUFFER,"\n\t %s:",msg);   \\r
67       phOsalNfc_DbgString(phOsalNfc_DbgTraceBuffer);                             \\r
68       phOsalNfc_DbgTrace(buf,len);                                               \\r
69       phOsalNfc_DbgString("\r");                                                 \\r
70    }\r
71 #else\r
72 #define LLCP_PRINT( str ) \r
73 #define LLCP_DEBUG(str, arg) \r
74 #define LLCP_PRINT_BUFFER(msg,buf,len)\r
75 #endif\r
76 \r
77 \r
78 /*=========== CONSTANTS ===========*/\r
79 \r
80 /**\r
81  *  \name LLCP local protocol version.\r
82  *\r
83  */\r
84  /*@{*/\r
85 #define PHFRINFC_LLCP_VERSION_MAJOR   0x01  /**< Major number of local LLCP version.*/\r
86 #define PHFRINFC_LLCP_VERSION_MINOR   0x00  /**< Minor number of local LLCP version.*/\r
87 #define PHFRINFC_LLCP_VERSION         ((PHFRINFC_LLCP_VERSION_MAJOR << 4) | PHFRINFC_LLCP_VERSION_MINOR) /**< Local LLCP version.*/\r
88 /*@}*/\r
89 \r
90 /**\r
91  *  \name LLCP packet types.\r
92  *\r
93  */\r
94  /*@{*/\r
95 #define PHFRINFC_LLCP_PTYPE_SYMM       0x00 /**< Symmetry.*/\r
96 #define PHFRINFC_LLCP_PTYPE_PAX        0x01 /**< PArameter Exchange.*/\r
97 #define PHFRINFC_LLCP_PTYPE_AGF        0x02 /**< AGgregated Frame.*/\r
98 #define PHFRINFC_LLCP_PTYPE_UI         0x03 /**< Unnumbered Information.*/\r
99 #define PHFRINFC_LLCP_PTYPE_CONNECT    0x04 /**< Connect.*/\r
100 #define PHFRINFC_LLCP_PTYPE_DISC       0x05 /**< Didconnect.*/\r
101 #define PHFRINFC_LLCP_PTYPE_CC         0x06 /**< Connection Complete.*/\r
102 #define PHFRINFC_LLCP_PTYPE_DM         0x07 /**< Disconnected Mode.*/\r
103 #define PHFRINFC_LLCP_PTYPE_FRMR       0x08 /**< FRaMe Reject.*/\r
104 #define PHFRINFC_LLCP_PTYPE_RESERVED1  0x09 /**< Reserved.*/\r
105 #define PHFRINFC_LLCP_PTYPE_RESERVED2  0x0A /**< Reserved.*/\r
106 #define PHFRINFC_LLCP_PTYPE_RESERVED3  0x0B /**< Reserved.*/\r
107 #define PHFRINFC_LLCP_PTYPE_I          0x0C /**< Information.*/\r
108 #define PHFRINFC_LLCP_PTYPE_RR         0x0D /**< Receive Ready.*/\r
109 #define PHFRINFC_LLCP_PTYPE_RNR        0x0E /**< Receive Not Ready.*/\r
110 #define PHFRINFC_LLCP_PTYPE_RESERVED4  0x0F /**< Reserved.*/\r
111 /*@}*/\r
112 \r
113 /**\r
114  *  \name LLCP well-known SAPs.\r
115  *\r
116  */\r
117  /*@{*/\r
118 #define PHFRINFC_LLCP_SAP_LINK                     0x00 /**< Link SAP.*/\r
119 #define PHFRINFC_LLCP_SAP_SDP                      0x01 /**< Service Discovery Protocol SAP.*/\r
120 #define PHFRINFC_LLCP_SAP_WKS_FIRST                0x02 /**< Other Well-Known Services defined by the NFC Forum.*/\r
121 #define PHFRINFC_LLCP_SAP_SDP_ADVERTISED_FIRST     0x10 /**< First SAP number from SDP-avertised SAP range.*/\r
122 #define PHFRINFC_LLCP_SAP_SDP_UNADVERTISED_FIRST   0x20 /**< First SAP number from SDP-unavertised SAP range.*/\r
123 #define PHFRINFC_LLCP_SAP_NUMBER                   0x40 /**< Number of possible SAP values (also first invalid value).*/\r
124 #define PHFRINFC_LLCP_SAP_DEFAULT                  0xFF /**< Default number when a socket is created or reset */\r
125 /*@}*/\r
126 \r
127 /**\r
128  *  \name Length value for DM opCode\r
129  *\r
130  */\r
131  /*@{*/\r
132 #define PHFRINFC_LLCP_DM_LENGTH                    0x01 /**< Length value for DM opCode */\r
133 /*@}*/\r
134 \r
135 \r
136 /**\r
137  * \internal \r
138  * \name Masks used with parameters value.\r
139  *\r
140  */\r
141 /*@{*/\r
142 #define PHFRINFC_LLCP_TLV_MIUX_MASK                 0x07FF   /**< \internal Mask to apply to MIUX TLV Value.*/\r
143 #define PHFRINFC_LLCP_TLV_WKS_MASK                  0x0001   /**< \internal Minimal bits to be set in WKS TLV Value.*/\r
144 #define PHFRINFC_LLCP_TLV_RW_MASK                   0x0F     /**< \internal Mask to apply to RW TLV Value.*/\r
145 #define PHFRINFC_LLCP_TLV_OPT_MASK                  0x03     /**< \internal Mask to apply to OPT TLV Value.*/\r
146 /*@}*/\r
147 \r
148 /**\r
149  * \internal \r
150  * \name Type codes for parameters in TLV.\r
151  *\r
152  */\r
153 /*@{*/\r
154 #define PHFRINFC_LLCP_TLV_TYPE_VERSION               0x01   /**< \internal VERSION parameter Type code.*/\r
155 #define PHFRINFC_LLCP_TLV_TYPE_MIUX                  0x02   /**< \internal MIUX parameter Type code.*/\r
156 #define PHFRINFC_LLCP_TLV_TYPE_WKS                   0x03   /**< \internal WKS parameter Type code.*/\r
157 #define PHFRINFC_LLCP_TLV_TYPE_LTO                   0x04   /**< \internal LTO parameter Type code.*/\r
158 #define PHFRINFC_LLCP_TLV_TYPE_RW                    0x05   /**< \internal RW parameter Type code.*/\r
159 #define PHFRINFC_LLCP_TLV_TYPE_SN                    0x06   /**< \internal SN parameter Type code.*/\r
160 #define PHFRINFC_LLCP_TLV_TYPE_OPT                   0x07   /**< \internal OPT parameter Type code.*/\r
161 /*@}*/\r
162 \r
163 /**\r
164  * \internal \r
165  * \name Fixed Value length for parameters in TLV.\r
166  *\r
167  */\r
168 /*@{*/\r
169 #define PHFRINFC_LLCP_TLV_LENGTH_HEADER              2   /**< \internal Fixed length of Type and Length fields in TLV.*/\r
170 #define PHFRINFC_LLCP_TLV_LENGTH_VERSION             1   /**< \internal Fixed length of VERSION parameter Value.*/\r
171 #define PHFRINFC_LLCP_TLV_LENGTH_MIUX                2   /**< \internal Fixed length of MIUX parameter Value.*/\r
172 #define PHFRINFC_LLCP_TLV_LENGTH_WKS                 2   /**< \internal Fixed length of WKS parameter Value.*/\r
173 #define PHFRINFC_LLCP_TLV_LENGTH_LTO                 1   /**< \internal Fixed length of LTO parameter Value.*/\r
174 #define PHFRINFC_LLCP_TLV_LENGTH_RW                  1   /**< \internal Fixed length of RW parameter Value.*/\r
175 #define PHFRINFC_LLCP_TLV_LENGTH_OPT                 1   /**< \internal Fixed length of OPT parameter Value.*/\r
176 /*@}*/\r
177 \r
178 /**\r
179  *  \name LLCP packet field sizes.\r
180  *\r
181  */\r
182  /*@{*/\r
183 #define PHFRINFC_LLCP_PACKET_HEADER_SIZE     2 /**< Size of the general packet header (DSAP+PTYPE+SSAP).*/\r
184 #define PHFRINFC_LLCP_PACKET_SEQUENCE_SIZE   1 /**< Size of the sequence field, if present.*/\r
185 #define PHFRINFC_LLCP_PACKET_MAX_SIZE        (PHFRINFC_LLCP_PACKET_HEADER_SIZE + \\r
186                                              PHFRINFC_LLCP_PACKET_SEQUENCE_SIZE + \\r
187                                              PHFRINFC_LLCP_MIU_DEFAULT + \\r
188                                              PHFRINFC_LLCP_TLV_MIUX_MASK) /**< Maximum size of a packet */\r
189 /*@}*/\r
190 \r
191 /*========== MACROS ===========*/\r
192 \r
193 #define CHECK_SEND_RW(socket) ( (((socket)->socket_VS - (socket)->socket_VSA)  % 16) < (socket)->remoteRW )\r
194 \r
195 /*========== ENUMERATES ===========*/\r
196 \r
197 typedef phFriNfc_LlcpMac_ePeerType_t      phFriNfc_Llcp_eRole_t;\r
198 \r
199 typedef phFriNfc_LlcpMac_eLinkStatus_t    phFriNfc_Llcp_eLinkStatus_t;\r
200 \r
201 /*========== CALLBACKS ===========*/\r
202 \r
203 typedef void (*phFriNfc_Llcp_Check_CB_t) (\r
204    void                             *pContext,\r
205    NFCSTATUS                        status\r
206 );\r
207 \r
208 typedef void (*phFriNfc_Llcp_LinkStatus_CB_t) (\r
209    void                             *pContext,\r
210    phFriNfc_Llcp_eLinkStatus_t      eLinkStatus\r
211 );\r
212 \r
213 typedef void (*phFriNfc_Llcp_Send_CB_t) (\r
214    void                             *pContext,\r
215    NFCSTATUS                        status\r
216 );\r
217 \r
218 typedef void (*phFriNfc_Llcp_Recv_CB_t) (\r
219    void                             *pContext,\r
220    phNfc_sData_t                    *psData,\r
221    NFCSTATUS                        status\r
222 );\r
223 \r
224 /*========== STRUCTURES ===========*/\r
225 \r
226 typedef struct phFriNfc_Llcp_sPacketHeader\r
227 {\r
228    /**< The destination service access point*/\r
229    unsigned   dsap : 6;\r
230 \r
231    /**< The packet type*/\r
232    unsigned   ptype : 4;\r
233 \r
234    /**< The source service access point*/\r
235    unsigned   ssap : 6;\r
236 \r
237 } phFriNfc_Llcp_sPacketHeader_t;\r
238 \r
239 typedef struct phFriNfc_Llcp_sPacketSequence\r
240 {\r
241    /**< Sequence number for sending*/\r
242    unsigned   ns : 4;\r
243 \r
244    /**< Sequence number for reception*/\r
245    unsigned   nr : 4;\r
246 \r
247 } phFriNfc_Llcp_sPacketSequence_t;\r
248 \r
249 typedef struct phFriNfc_Llcp_sSendOperation\r
250 {\r
251    /**< Sequence number for sending*/\r
252    phFriNfc_Llcp_sPacketHeader_t    *psHeader;\r
253 \r
254    /**< Sequence number for sending*/\r
255    phFriNfc_Llcp_sPacketSequence_t  *psSequence;\r
256 \r
257    /**< Sequence number for sending*/\r
258    phNfc_sData_t                    *psInfo;\r
259 \r
260    /**< Sequence number for sending*/\r
261    phFriNfc_Llcp_Send_CB_t          pfSend_CB;\r
262 \r
263    /**< Sequence number for sending*/\r
264    void                             *pContext;\r
265 \r
266 } phFriNfc_Llcp_sSendOperation_t;\r
267 \r
268 typedef struct phFriNfc_Llcp_sRecvOperation\r
269 {\r
270    /**< Sequence number for sending*/\r
271    uint8_t                    nSap;\r
272 \r
273    /**< Sequence number for sending*/\r
274    phNfc_sData_t              *psBuffer;\r
275 \r
276    /**< Sequence number for sending*/\r
277    phFriNfc_Llcp_Recv_CB_t    pfRecv_CB;\r
278 \r
279    /**< Sequence number for sending*/\r
280    void                       *pContext;\r
281 \r
282 } phFriNfc_Llcp_sRecvOperation_t;\r
283 \r
284 typedef struct phFriNfc_Llcp\r
285 {\r
286    /**< The current state*/\r
287    uint8_t                          state;\r
288 \r
289    /**< MAC mapping instance*/\r
290    phFriNfc_LlcpMac_t               MAC;\r
291 \r
292    /**< Local LLC role*/\r
293    phFriNfc_LlcpMac_ePeerType_t         eRole;\r
294 \r
295    /**< Local link parameters*/\r
296    phFriNfc_Llcp_sLinkParameters_t  sLocalParams;\r
297 \r
298    /**< Remote link parameters*/\r
299    phFriNfc_Llcp_sLinkParameters_t  sRemoteParams;\r
300 \r
301    /**< Negociated protocol version (major number on MSB, minor on LSB)*/\r
302    uint8_t                          version;\r
303 \r
304    /**< Internal reception buffer, its size may vary during time but not exceed nRxBufferSize*/\r
305    phNfc_sData_t                   sRxBuffer;\r
306 \r
307    /**< Actual size of reception buffer*/\r
308    uint16_t                        nRxBufferLength;\r
309 \r
310    /**< Internal emission buffer, its size may vary during time but not exceed nTxBufferSize*/\r
311    phNfc_sData_t                   sTxBuffer;\r
312 \r
313    /**< Actual size of emission buffer*/\r
314    uint16_t                        nTxBufferLength;\r
315 \r
316    /**< Callback function for link status notification*/\r
317    phFriNfc_Llcp_LinkStatus_CB_t    pfLink_CB;\r
318 \r
319    /**< Callback context for link status notification*/\r
320    void                             *pLinkContext;\r
321 \r
322    /**< Callback function for compliance checking*/\r
323    phFriNfc_Llcp_Check_CB_t         pfChk_CB;\r
324 \r
325    /**< Callback context for compliance checking*/\r
326    void                             *pChkContext;\r
327 \r
328    /**< Symmetry timer*/\r
329    uint32_t                         hSymmTimer;\r
330 \r
331    /**< Control frames buffer*/\r
332    uint8_t                          pCtrlTxBuffer[10];\r
333 \r
334    /**< Control frames buffer size*/\r
335    uint8_t                          pCtrlTxBufferLength;\r
336 \r
337    /**< DISC packet send pending flag*/\r
338    bool_t                           bDiscPendingFlag;\r
339 \r
340    /**< FRMR packet send pending flag*/\r
341    bool_t                           bFrmrPendingFlag;\r
342 \r
343    /**< Header of pending FRMR packet*/\r
344    phFriNfc_Llcp_sPacketHeader_t    sFrmrHeader;\r
345 \r
346    /**< Info field of pending FRMR packet*/\r
347    uint8_t                          pFrmrInfo[4];\r
348 \r
349    /**< Send callback*/\r
350    phFriNfc_Llcp_Send_CB_t          pfSendCB;\r
351 \r
352    /**< Send callback*/\r
353    void                             *pSendContext;\r
354 \r
355    /**< Pending send header*/\r
356    phFriNfc_Llcp_sPacketHeader_t    *psSendHeader;\r
357 \r
358    /**< Pending send sequence*/\r
359    phFriNfc_Llcp_sPacketSequence_t  *psSendSequence;\r
360 \r
361    /**< Pending send info*/\r
362    phNfc_sData_t                    *psSendInfo;\r
363 \r
364    /**< Receive callback*/\r
365    phFriNfc_Llcp_Recv_CB_t          pfRecvCB;\r
366 \r
367    /**< Receive callback*/\r
368    void                             *pRecvContext;\r
369 \r
370 } phFriNfc_Llcp_t;\r
371 \r
372 /*========== UNIONS ===========*/\r
373 \r
374 \r
375 /*========== FUNCTIONS ===========*/\r
376 \r
377 /*!\r
378  * \brief TODO\r
379  */\r
380 NFCSTATUS phFriNfc_Llcp_EncodeLinkParams( phNfc_sData_t                   *psRawBuffer,\r
381                                           phFriNfc_Llcp_sLinkParameters_t *psLinkParams,\r
382                                           uint8_t                         nVersion );\r
383 \r
384 \r
385 /*!\r
386  * \brief TODO\r
387  */\r
388 NFCSTATUS phFriNfc_Llcp_Reset( phFriNfc_Llcp_t                 *Llcp,\r
389                                void                            *LowerDevice,\r
390                                phFriNfc_Llcp_sLinkParameters_t *psLinkParams,\r
391                                void                            *pRxBuffer,\r
392                                uint16_t                        nRxBufferLength,\r
393                                void                            *pTxBuffer,\r
394                                uint16_t                        nTxBufferLength,\r
395                                phFriNfc_Llcp_LinkStatus_CB_t   pfLink_CB,\r
396                                void                            *pContext );\r
397 \r
398 /*!\r
399  * \brief TODO\r
400  */\r
401 NFCSTATUS phFriNfc_Llcp_ChkLlcp( phFriNfc_Llcp_t               *Llcp,\r
402                                  phHal_sRemoteDevInformation_t *psRemoteDevInfo,\r
403                                  phFriNfc_Llcp_Check_CB_t      pfCheck_CB,\r
404                                  void                          *pContext );\r
405 \r
406 /*!\r
407  * \brief TODO\r
408  */\r
409 NFCSTATUS phFriNfc_Llcp_Activate( phFriNfc_Llcp_t  *Llcp );\r
410 \r
411 /*!\r
412  * \brief TODO\r
413  */\r
414 NFCSTATUS phFriNfc_Llcp_Deactivate( phFriNfc_Llcp_t *Llcp );\r
415 \r
416 /*!\r
417  * \brief TODO\r
418  */\r
419 NFCSTATUS phFriNfc_Llcp_GetLocalInfo( phFriNfc_Llcp_t                   *Llcp,\r
420                                       phFriNfc_Llcp_sLinkParameters_t   *pParams );\r
421 \r
422 /*!\r
423  * \brief TODO\r
424  */\r
425 NFCSTATUS phFriNfc_Llcp_GetRemoteInfo( phFriNfc_Llcp_t                  *Llcp,\r
426                                        phFriNfc_Llcp_sLinkParameters_t  *pParams );\r
427 \r
428 /*!\r
429  * \brief TODO\r
430  */\r
431 NFCSTATUS phFriNfc_Llcp_Send( phFriNfc_Llcp_t                  *Llcp,\r
432                               phFriNfc_Llcp_sPacketHeader_t    *psHeader,\r
433                               phFriNfc_Llcp_sPacketSequence_t  *psSequence,\r
434                               phNfc_sData_t                    *psInfo,\r
435                               phFriNfc_Llcp_Send_CB_t          pfSend_CB,\r
436                               void                             *pContext );\r
437 \r
438 /*!\r
439  * \brief TODO\r
440  */\r
441 NFCSTATUS phFriNfc_Llcp_Recv( phFriNfc_Llcp_t            *Llcp,\r
442                               phFriNfc_Llcp_Recv_CB_t    pfRecv_CB,\r
443                               void                       *pContext );\r
444 \r
445 \r
446 #endif /* PHFRINFC_LLCP_H */\r