Nick Pelly | 5d9927b | 2010-09-23 12:47:58 -0700 | [diff] [blame] | 1 | /* |
| 2 | * Copyright (C) 2010 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 | * \file phLlcNfc_Frame.h |
| 19 | * \brief To append and delete the I or S or U frames. |
| 20 | * |
| 21 | * Project: NFC-FRI-1.1 |
| 22 | * |
| 23 | * $Date: Fri Apr 30 10:03:36 2010 $ |
| 24 | * $Author: ing02260 $ |
| 25 | * $Revision: 1.19 $ |
| 26 | * $Aliases: NFC_FRI1.1_WK1017_R34_1,NFC_FRI1.1_WK1017_R34_2,NFC_FRI1.1_WK1023_R35_1 $ |
| 27 | * |
| 28 | */ |
| 29 | |
| 30 | #ifndef PHLLCNFC_FRAME_H |
| 31 | #define PHLLCNFC_FRAME_H |
| 32 | |
| 33 | /** |
| 34 | * \name LLC NFC frame creation and deletion |
| 35 | * |
| 36 | * File: \ref phLlcNfc_Frame.h |
| 37 | * |
| 38 | */ |
| 39 | /*@{*/ |
| 40 | #define PHLLCNFCFRAME_FILEREVISION "$Revision: 1.19 $" /**< \ingroup grp_hal_nfc_llc */ |
| 41 | #define PHLLCNFCFRAME_FILEALIASES "$Aliases: NFC_FRI1.1_WK1017_R34_1,NFC_FRI1.1_WK1017_R34_2,NFC_FRI1.1_WK1023_R35_1 $" /**< \ingroup grp_hal_nfc_llc */ |
| 42 | /*@}*/ |
| 43 | |
| 44 | /*************************** Includes *******************************/ |
| 45 | |
| 46 | /*********************** End of includes ****************************/ |
| 47 | |
| 48 | /** \defgroup grp_hal_nfc_llc_helper LLC helper functions |
| 49 | * |
| 50 | * |
| 51 | * |
| 52 | */ |
| 53 | |
| 54 | /***************************** Macros *******************************/ |
| 55 | /** Maximum buffer that LLC can send and receive */ |
| 56 | #define PH_LLCNFC_MAX_BUFLEN_RECV_SEND (33) |
| 57 | /** Maximum buffer that LLC can send and receive */ |
| 58 | #define PH_LLCNFC_MIN_BUFLEN_RECVD (1) |
| 59 | /** Modulo to calculate the N(S) and N(R), when it extends 7, because |
| 60 | N(S) and N(R) can have the value maximum up to 7 */ |
| 61 | #define PH_LLCNFC_MOD_NS_NR (8) |
| 62 | /** When the entire LLC buffer is created or received, the header byte |
| 63 | will be the first byte (not the 0th byte which is the LLC length) |
| 64 | of the buffer */ |
| 65 | #define PH_LLCNFC_HEADER_BYTE_IN_BUFFER (1) |
| 66 | /** Maximum windows size, which is obtained by sending or |
| 67 | receiving the U - frame */ |
| 68 | #define PH_LLCNFC_U_FRAME_MAX_WIN_SIZE (4) |
| 69 | /** Minimum windows size, which is obtained by sending or |
| 70 | receiving the U - frame */ |
| 71 | #define PH_LLCNFC_U_FRAME_MIN_WIN_SIZE (2) |
| 72 | /** Start position of the U frame */ |
| 73 | #define PH_LLCNFC_U_FRAME_START_POS (0) |
| 74 | /** No of position to set the U frame */ |
| 75 | #define PH_LLCNFC_U_FRAME_NO_OF_POS (5) |
| 76 | /** This mask is to find the frame type ( S or U) */ |
| 77 | #define PH_LLCNFC_LLC_HEADER_MASK (0xE0) |
| 78 | /** This mask is to find the frame type (I, S or U) */ |
| 79 | #define PH_LLCNFC_I_FRM_HEADER_MASK (0x80) |
| 80 | /** If S frame is received or to be sent, the maximum length that |
| 81 | can be sent or received is 4 */ |
| 82 | #define PH_LLCNFC_MAX_S_FRAME_LEN (4) |
| 83 | /** If S frame is received, to know the command type like RR, RNR, |
| 84 | REJ or SREJ */ |
| 85 | #define PH_LLCNFC_S_FRAME_TYPE_MASK (0x18) |
| 86 | /** Maximum value of N(S) or N(R) */ |
| 87 | #define PH_LLCNFC_I_S_FRAME_MAX_NR (0x07) |
| 88 | /** If U frame is received or to be sent, the maximum length that |
| 89 | can be sent or received is 7 */ |
| 90 | #define PH_LLCNFC_U_FRAME_LEN (7) |
| 91 | /** If S frame is received, to know the command type like RSET or UA */ |
| 92 | #define PH_LLCNFC_U_FRAME_MODIFIER_MASK (0x1F) |
| 93 | /** Extra length to be append to the user buffer Length to create the |
| 94 | LLC buffer */ |
| 95 | #define PH_LLCNFC_LEN_APPEND (0x04) |
| 96 | /** U frame header without modifier */ |
| 97 | #define PH_LLCNFC_U_HEADER_INIT (0xE0) |
| 98 | /** I frame header without N(S) and N(R) */ |
| 99 | #define PH_LLCNFC_I_HEADER_INIT (0x80) |
| 100 | /** S frame header without type and N(R) */ |
| 101 | #define PH_LLCNFC_S_HEADER_INIT (0xC0) |
| 102 | /** N(S) start bit position */ |
| 103 | #define PH_LLCNFC_NS_START_BIT_POS (0x03) |
| 104 | /** N(R) start bit position */ |
| 105 | #define PH_LLCNFC_NR_START_BIT_POS (0x00) |
| 106 | /** Number of bits N(R) and N(S) */ |
| 107 | #define PH_LLCNFC_NR_NS_NO_OF_BITS (0x03) |
| 108 | /** S frame type start bit position */ |
| 109 | #define PH_LLCNFC_S_FRAME_TYPE_POS (0x03) |
| 110 | /** Number of bits (Type in S frame) */ |
| 111 | #define PH_LLCNFC_SFRAME_TYPE_NOOFBITS (0x02) |
| 112 | /** SREJ command */ |
| 113 | #define PH_LLCNFC_SREJ_BYTE_VALUE (0x00) |
| 114 | /** Number of CRC bytes in a LLC packet */ |
| 115 | #define PH_LLCNFC_NUM_OF_CRC_BYTES (0x02) |
| 116 | |
| 117 | /* This macro is used as the input for the function "phLlcNfc_H_IFrameList_Peek" |
| 118 | and "phLlcNfc_H_SendTimedOutIFrame" functions. This values means, take the starting |
| 119 | position as the reference */ |
| 120 | #define DEFAULT_PACKET_INPUT (0xFFU) |
| 121 | #define MAX_NS_NR_VALUE (0x07U) |
| 122 | |
| 123 | /************************ End of macros *****************************/ |
| 124 | |
| 125 | /********************** Callback functions **************************/ |
| 126 | |
| 127 | /******************* End of Callback functions **********************/ |
| 128 | |
| 129 | /********************* Structures and enums *************************/ |
| 130 | |
| 131 | /****************** End of structures and enums *********************/ |
| 132 | |
| 133 | /******************** Function declarations *************************/ |
| 134 | /** |
| 135 | * \ingroup grp_hal_nfc_llc_helper |
| 136 | * |
| 137 | * \brief LLC helper functions \b Frame Init function |
| 138 | * |
| 139 | * \copydoc page_reg Gets the LLC main context and stores it. |
| 140 | * |
| 141 | * \param[in] psLlcCtxt Llc main structure information |
| 142 | * |
| 143 | * \retval NFCSTATUS_SUCCESS Operation successful. |
| 144 | * \retval NFCSTATUS_INVALID_PARAMETER At least one parameter of the function is invalid. |
| 145 | * |
| 146 | */ |
| 147 | void phLlcNfc_H_Frame_Init ( |
| 148 | phLlcNfc_Context_t *psLlcCtxt |
| 149 | ); |
| 150 | |
| 151 | /** |
| 152 | * \ingroup grp_hal_nfc_llc_helper |
| 153 | * |
| 154 | * \brief LLC helper functions \b DeInit function |
| 155 | * |
| 156 | * \copydoc page_reg |
| 157 | * |
| 158 | * \param[in] psFrameInfo Frame structure information |
| 159 | * |
| 160 | * \retval NFCSTATUS_SUCCESS Operation successful. |
| 161 | * \retval NFCSTATUS_INVALID_PARAMETER At least one parameter of the function is invalid. |
| 162 | * |
| 163 | */ |
| 164 | void |
| 165 | phLlcNfc_H_Frame_DeInit ( |
| 166 | phLlcNfc_Frame_t *psFrameInfo |
| 167 | ); |
| 168 | |
| 169 | /** |
| 170 | * \ingroup grp_hal_nfc_llc_helper |
| 171 | * |
| 172 | * \brief LLC helper functions \b List append function |
| 173 | * |
| 174 | * \copydoc page_reg Append the new I frame information at the beginning of the list |
| 175 | * |
| 176 | * \param[in/out] psList List inofrmation to know where shall the packet should be stored |
| 177 | * \param[in] packetInfo Llc packet information |
| 178 | * |
| 179 | * \retval NFCSTATUS_SUCCESS Operation successful. |
| 180 | * \retval NFCSTATUS_INVALID_PARAMETER At least one parameter of the function is invalid. |
| 181 | * |
| 182 | */ |
| 183 | NFCSTATUS |
| 184 | phLlcNfc_H_StoreIFrame ( |
| 185 | phLlcNfc_StoreIFrame_t *psList, |
| 186 | phLlcNfc_LlcPacket_t sPacketInfo |
| 187 | |
| 188 | ); |
| 189 | |
| 190 | |
| 191 | /** |
| 192 | * \ingroup grp_hal_nfc_llc_helper |
| 193 | * |
| 194 | * \brief LLC helper functions <b>Create S frame</b> function |
| 195 | * |
| 196 | * \copydoc page_reg This function creates a S frame |
| 197 | * |
| 198 | * \param[in/out] pllcSFrmBuf Required buffer to create the S frame |
| 199 | * |
| 200 | * \retval NFCSTATUS_SUCCESS Operation successful. |
| 201 | * \retval NFCSTATUS_INVALID_PARAMETER At least one parameter of the function is invalid. |
| 202 | * |
| 203 | */ |
| 204 | void |
| 205 | phLlcNfc_H_Create_S_Frame( |
| 206 | uint8_t *pllcSFrmBuf |
| 207 | ); |
| 208 | |
| 209 | /** |
| 210 | * \ingroup grp_hal_nfc_llc_helper |
| 211 | * |
| 212 | * \brief LLC helper functions <b>Compute CRC</b> function |
| 213 | * |
| 214 | * \copydoc page_reg This function is used to compute CRC for the llc data |
| 215 | * |
| 216 | * \param[in] pData Llc data for which the CRC needs to be calculated |
| 217 | * \param[in] length Length is the value till the CRC needs to be |
| 218 | * calculated for the Llc data |
| 219 | * \param[in] pCrc1 1st CRC byte |
| 220 | * \param[in] pCrc2 2nd CRC byte |
| 221 | * |
| 222 | * \retval NFCSTATUS_SUCCESS Operation successful. |
| 223 | * \retval NFCSTATUS_INVALID_PARAMETER At least one parameter of the function is invalid. |
| 224 | * |
| 225 | */ |
| 226 | void |
| 227 | phLlcNfc_H_ComputeCrc( |
| 228 | uint8_t *pData, |
| 229 | uint8_t length, |
| 230 | uint8_t *pCrc1, |
| 231 | uint8_t *pCrc2 |
| 232 | ); |
| 233 | |
| 234 | /** |
| 235 | * \ingroup grp_hal_nfc_llc_helper |
| 236 | * |
| 237 | * \brief LLC helper functions <b>Create U frame payload </b> function |
| 238 | * |
| 239 | * \copydoc page_reg This function is used to create a LLC packet with U frame |
| 240 | * |
| 241 | * \param[in/out] psLlcCtxt Llc main structure information |
| 242 | * \param[in/out] psLlcPacket Llc packet sent by the upper layer |
| 243 | * \param[in/out] pLlcPacketLength Length of the llc packet |
| 244 | * \param[in] cmdType U frame has RSET/UA commands |
| 245 | * |
| 246 | * \retval NFCSTATUS_SUCCESS Operation successful. |
| 247 | * \retval NFCSTATUS_INVALID_PARAMETER At least one parameter of the function is invalid. |
| 248 | * |
| 249 | */ |
| 250 | NFCSTATUS |
| 251 | phLlcNfc_H_CreateUFramePayload ( |
| 252 | phLlcNfc_Context_t *psLlcCtxt, |
| 253 | phLlcNfc_LlcPacket_t *psLlcPacket, |
| 254 | uint8_t *pLlcPacketLength, |
| 255 | phLlcNfc_LlcCmd_t cmdType |
| 256 | ); |
| 257 | |
| 258 | /** |
| 259 | * \ingroup grp_hal_nfc_llc_helper |
| 260 | * |
| 261 | * \brief LLC helper functions <b>Create I frame payload </b> function |
| 262 | * |
| 263 | * \copydoc page_reg This function is used to create a LLC packet with I frame |
| 264 | * |
| 265 | * \param[in/out] psFrameInfo Information related to LLC frames are stored |
| 266 | * in this structure |
Daniel Tomas | b313c3d | 2011-05-26 15:52:17 +0200 | [diff] [blame] | 267 | * \param[in/out] psLlcPacket Llc packet sent by the upper layer |
Nick Pelly | 5d9927b | 2010-09-23 12:47:58 -0700 | [diff] [blame] | 268 | * \param[in] pLlcBuf User given buffer or the buffer which needs LLC framing |
| 269 | * \param[in] llcBufLength Length of the parameter "pLlcBuf" |
| 270 | * |
| 271 | * \retval NFCSTATUS_SUCCESS Operation successful. |
| 272 | * \retval NFCSTATUS_INVALID_PARAMETER At least one parameter of the function is invalid. |
| 273 | * |
| 274 | */ |
| 275 | NFCSTATUS |
| 276 | phLlcNfc_H_CreateIFramePayload ( |
| 277 | phLlcNfc_Frame_t *psFrameInfo, |
| 278 | phLlcNfc_LlcPacket_t *psLlcPacket, |
| 279 | uint8_t *pLlcBuf, |
| 280 | uint8_t llcBufLength |
| 281 | ); |
| 282 | |
| 283 | /** |
| 284 | * \ingroup grp_hal_nfc_llc_helper |
| 285 | * |
| 286 | * \brief LLC helper functions <b>Process received frame </b> function |
| 287 | * |
| 288 | * \copydoc page_reg This function process the received data |
| 289 | * |
| 290 | * \param[in] pLlcCtxt Llc main context |
| 291 | * |
| 292 | * \retval NFCSTATUS_SUCCESS Operation successful. |
| 293 | * \retval NFCSTATUS_INVALID_FORMAT If any error in the frame |
| 294 | */ |
| 295 | NFCSTATUS |
| 296 | phLlcNfc_H_ProRecvFrame ( |
| 297 | phLlcNfc_Context_t *psLlcCtxt |
| 298 | ); |
| 299 | |
| 300 | /** |
| 301 | * \ingroup grp_hal_nfc_llc_helper |
| 302 | * |
| 303 | * \brief LLC component <b>resend the I frame</b> function |
| 304 | * |
| 305 | * \copydoc page_reg This is a helper function which, sends back the timed out |
| 306 | * I frame to the PN544. This is due to the reason that ACK is not received |
| 307 | * from PN544 within the guard time-out value |
| 308 | * |
| 309 | * \param[in] psLlcCtxt Llc main structure information |
| 310 | * \param[in/out] psListInfo List of I frame information |
| 311 | * \param[in] ns_frame_no Frame number to send (to send the first stored |
| 312 | * frame send DEFAULT_PACKET_INPUT) |
| 313 | * |
| 314 | * \retval NFCSTATUS_SUCCESS Operation successful. |
| 315 | * \retval NFCSTATUS_INVALID_PARAMETER At least one parameter of the function is invalid. |
| 316 | * |
| 317 | */ |
| 318 | extern |
| 319 | NFCSTATUS |
| 320 | phLlcNfc_H_SendTimedOutIFrame ( |
| 321 | phLlcNfc_Context_t *psLlcCtxt, |
| 322 | phLlcNfc_StoreIFrame_t *psListInfo, |
| 323 | uint8_t ns_frame_no |
| 324 | ); |
| 325 | |
| 326 | /** |
| 327 | * \ingroup grp_hal_nfc_llc_helper |
| 328 | * |
| 329 | * \brief LLC state machine functions \b Change state function |
| 330 | * |
| 331 | * \copydoc page_reg changes the state if possible else returns error |
| 332 | * |
| 333 | * \param[in, out] psLlcCtxt Llc main structure information |
| 334 | * \param[in] changeStateTo Next state to change |
| 335 | * |
| 336 | * \retval NFCSTATUS_SUCCESS Operation successful. |
| 337 | * \retval NFCSTATUS_INVALID_PARAMETER At least one parameter of the function is invalid. |
| 338 | * |
| 339 | */ |
| 340 | extern |
| 341 | NFCSTATUS |
| 342 | phLlcNfc_H_ChangeState( |
| 343 | phLlcNfc_Context_t *psLlcCtxt, |
| 344 | phLlcNfc_State_t changeStateTo |
| 345 | ); |
| 346 | |
| 347 | #ifdef CRC_ERROR_REJ |
| 348 | /** |
| 349 | * \ingroup grp_hal_nfc_llc_helper |
| 350 | * |
| 351 | * \brief LLC send reject command function |
| 352 | * |
| 353 | * \copydoc page_reg Sends reject command, when CRC error is recieved |
| 354 | * |
| 355 | * \param[in, out] psLlcCtxt Llc main structure information |
| 356 | * |
| 357 | * \retval NFCSTATUS_SUCCESS Operation successful. |
| 358 | * \retval NFCSTATUS_INVALID_PARAMETER At least one parameter of the function is invalid. |
| 359 | * |
| 360 | */ |
| 361 | extern |
| 362 | NFCSTATUS |
| 363 | phLlcNfc_H_SendRejectFrame( |
| 364 | phLlcNfc_Context_t *psLlcCtxt |
| 365 | ); |
| 366 | #endif /* #ifdef CRC_ERROR_REJ */ |
| 367 | |
| 368 | /** |
| 369 | * \ingroup grp_hal_nfc_llc_helper |
| 370 | * |
| 371 | * \brief LLC Write wait call function |
| 372 | * |
| 373 | * \copydoc page_reg Write that has been ignored earlier will be called in this function |
| 374 | * |
| 375 | * \param[in, out] psLlcCtxt Llc main structure information |
| 376 | * |
| 377 | * \retval NFCSTATUS_SUCCESS Operation successful. |
| 378 | * \retval NFCSTATUS_BUSY Write is pended, so wait till it completes. |
| 379 | * \retval NFCSTATUS_INVALID_PARAMETER At least one parameter of the function is invalid. |
| 380 | * |
| 381 | */ |
| 382 | extern |
| 383 | NFCSTATUS |
| 384 | phLlcNfc_H_WriteWaitCall ( |
| 385 | phLlcNfc_Context_t *psLlcCtxt |
| 386 | ); |
| 387 | |
| 388 | /** |
| 389 | * \ingroup grp_hal_nfc_llc_helper |
| 390 | * |
| 391 | * \brief LLC Send user frame function |
| 392 | * |
| 393 | * \copydoc page_reg Sends the stored user frame, that are not sent. |
| 394 | * |
| 395 | * \param[in, out] psLlcCtxt Llc main structure information |
| 396 | * \param[in] psListInfo Stored list of packets |
| 397 | * |
| 398 | * No return value |
| 399 | * |
| 400 | */ |
| 401 | NFCSTATUS |
| 402 | phLlcNfc_H_SendUserIFrame ( |
| 403 | phLlcNfc_Context_t *psLlcCtxt, |
| 404 | phLlcNfc_StoreIFrame_t *psListInfo |
| 405 | ); |
| 406 | |
| 407 | /** |
| 408 | * \ingroup grp_hal_nfc_llc_helper |
| 409 | * |
| 410 | * \brief LLC Send rejected frame function |
| 411 | * |
| 412 | * \copydoc page_reg Sends the stored rejected frame from PN544. |
| 413 | * |
| 414 | * \param[in, out] psLlcCtxt Llc main structure information |
| 415 | * \param[in] psListInfo Stored list of packets |
| 416 | * \param[in] ns_rejected N(S) that was rejected |
| 417 | * |
| 418 | * No return value |
| 419 | * |
| 420 | */ |
| 421 | NFCSTATUS |
| 422 | phLlcNfc_H_SendRejectedIFrame ( |
| 423 | phLlcNfc_Context_t *psLlcCtxt, |
| 424 | phLlcNfc_StoreIFrame_t *psListInfo, |
| 425 | uint8_t ns_rejected |
| 426 | ); |
| 427 | |
| 428 | /** |
| 429 | * \ingroup grp_hal_nfc_llc_helper |
| 430 | * |
Daniel Tomas | b313c3d | 2011-05-26 15:52:17 +0200 | [diff] [blame] | 431 | * \brief LLC component <b>Create S frame</b> function |
| 432 | * |
| 433 | * \copydoc page_reg This is a helper function which, creates the S frame |
| 434 | * |
| 435 | * \param[in/out] psFrameInfo Generic frame information |
| 436 | * \param[in/out] psLlcPacket Llc packet sent by the upper layer |
| 437 | * \param[in/out] cmdType Command type of S frame |
| 438 | * |
| 439 | * \retval NFCSTATUS_SUCCESS Operation successful. |
| 440 | * \retval NFCSTATUS_INVALID_PARAMETER At least one parameter of the function is invalid. |
| 441 | * |
| 442 | */ |
| 443 | NFCSTATUS |
| 444 | phLlcNfc_H_CreateSFramePayload ( |
| 445 | phLlcNfc_Frame_t *psFrameInfo, |
| 446 | phLlcNfc_LlcPacket_t *psLlcPacket, |
| 447 | phLlcNfc_LlcCmd_t cmdType |
| 448 | ); |
| 449 | |
| 450 | /** |
| 451 | * \ingroup grp_hal_nfc_llc_helper |
| 452 | * |
Nick Pelly | 5d9927b | 2010-09-23 12:47:58 -0700 | [diff] [blame] | 453 | * \brief LLC Send upper layer information function |
| 454 | * |
| 455 | * \copydoc page_reg Sends received information to the upper layer frame. |
| 456 | * |
| 457 | * \param[in, out] psLlcCtxt Llc main structure information |
| 458 | * |
| 459 | * No return value |
| 460 | * |
| 461 | */ |
| 462 | void |
| 463 | phLlcNfc_H_SendInfo( |
| 464 | phLlcNfc_Context_t *psLlcCtxt |
| 465 | ); |
| 466 | |
| 467 | |
| 468 | /******************** Function declarations *************************/ |
| 469 | #endif /* #ifndef PHLLCNFC_FRAME_H */ |
| 470 | |
| 471 | |