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_DataTypes.h 19* \brief Contains the structure information. 20* 21* Project: NFC-FRI-1.1 22* 23* $Date: Fri Apr 30 10:03:36 2010 $ 24* $Author: ing02260 $ 25* $Revision: 1.43 $ 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_DATATYPES_H 31#define PHLLCNFC_DATATYPES_H 32 33/** 34* \name LLC NFC frame creation, deletion and processing 35* 36* File: \ref phLlcNfc_DataTypes.h 37* 38*/ 39/*@{*/ 40#define PH_LLCNFC_DATATYPES_FILEREVISION "$Revision: 1.43 $" /**< \ingroup grp_hal_nfc_llc */ 41#define PH_LLCNFC_DATATYPES_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/*************************** Includes *******************************/ 44#include <phNfcCompId.h> 45/*********************** End of includes ****************************/ 46/***************************** Macros *******************************/ 47 48/* Trace buffer declaration */ 49#if defined (LLC_TRACE) 50 #include <phOsalNfc.h> 51 #include <stdio.h> 52 53 extern char phOsalNfc_DbgTraceBuffer[]; 54 #define trace_buffer phOsalNfc_DbgTraceBuffer 55 56 #define MAX_TRACE_BUFFER 150 57 #define PH_LLCNFC_PRINT( str ) phOsalNfc_DbgString(str) 58 #define PH_LLCNFC_PRINT_DATA(buf,len) 59 #define PH_LLCNFC_STRING( str ) 60 #define PH_LLCNFC_DEBUG(str, arg) \ 61 { \ 62 snprintf(trace_buffer,MAX_TRACE_BUFFER,str,arg); \ 63 phOsalNfc_DbgString(trace_buffer); \ 64 } 65 #define PH_LLCNFC_PRINT_BUFFER(buf,len) \ 66 { \ 67 /* uint16_t i = 0; \ 68 char trace_buffer[MAX_TRACE_BUFFER]; \ 69 snprintf(trace_buffer,MAX_TRACE_BUFFER,"\n\t %s:",msg); \ 70 phOsalNfc_DbgString(trace); */\ 71 phOsalNfc_DbgTrace(buf,len); \ 72 phOsalNfc_DbgString("\r"); \ 73 } 74#endif /* #if defined (LLC_TRACE) */ 75 76 77#if (!defined (LLC_TRACE) && defined (LLC_DATA_BYTES)) 78 #include <phOsalNfc.h> 79 80 extern char phOsalNfc_DbgTraceBuffer[]; 81 #define trace_buffer phOsalNfc_DbgTraceBuffer 82 83 #define PH_LLCNFC_PRINT( str ) 84 #define PH_LLCNFC_PRINT_BUFFER(buf, len) 85 #define PH_LLCNFC_DEBUG(str, arg1) 86 #define PH_LLCNFC_STRING( str ) phOsalNfc_DbgString(str) 87 #define PH_LLCNFC_PRINT_DATA(buf,len) \ 88 { \ 89 /* uint16_t i = 0; \ 90 char trace_buffer[MAX_TRACE_BUFFER]; \ 91 snprintf(trace_buffer,MAX_TRACE_BUFFER,"\n\t %s:",msg); \ 92 phOsalNfc_DbgString(trace_buffer); */\ 93 phOsalNfc_DbgTrace(buf,len); \ 94 } 95#endif /* #if (!defined (LLC_TRACE) && defined (LLC_DATA_BYTES)) */ 96 97 98#if (!defined (LLC_TRACE) && !defined (LLC_DATA_BYTES)) 99 /** To disable prints */ 100 #define PH_LLCNFC_PRINT(str) 101 #define PH_LLCNFC_PRINT_BUFFER(buf, len) 102 #define PH_LLCNFC_DEBUG(str, arg1) 103 #define PH_LLCNFC_PRINT_DATA(buf,len) 104 #define PH_LLCNFC_STRING( str ) 105#endif /* #if (!defined (LLC_TRACE) && !defined (LLC_DATA_BYTES)) */ 106 107 108/* If the below MACRO (RECV_NR_CHECK_ENABLE) is 109DEFINED : then check for the NR frame received from PN544 in the I frame is 110 added. This shall be greater than sent NS from the HOST. 111 This is used to stop the timer 112COMMENTED : dont check the N(R) frame received from the PN544 113*/ 114/* #define RECV_NR_CHECK_ENABLE */ 115 116/* If the below MACRO (LLC_UPP_LAYER_NTFY_WRITE_RSP_CB) is 117DEFINED : then if an I frame is received and the 118 upper layer response callback (before another READ is pended) is called 119 only after sending S frame and wait for the callback and then notify the 120 upper layer 121COMMENTED : then if an I frame is received and the 122 upper layer response callback (before another READ is pended) is called 123 immediately after sending S frame (not waiting for the sent S frame 124 callback) 125*/ 126/* #define LLC_UPP_LAYER_NTFY_WRITE_RSP_CB */ 127 128/* PN544 continuously sends an incorrect I frames to the HOST, 129 even after the REJ frame from HOST to PN544 130If the below MACRO (LLC_RR_INSTEAD_OF_REJ) is 131DEFINED : then if the received NS = (expected NR - 1) then instead of REJ 132 RR frame is sent 133COMMENTED : then REJ frame is sent 134*/ 135// #define LLC_RR_INSTEAD_OF_REJ 136 137#define SEND_UFRAME 138 139/* If the below MACRO (CTRL_WIN_SIZE_COUNT) is 140DEFINED : then window size will be maximum 141COMMENTED : then window size is 1 142*/ 143#define CTRL_WIN_SIZE_COUNT 144 145/* 146If the below MACRO (LLC_URSET_NO_DELAY) is 147DEFINED : then after receiving the UA frame, then immediately this will be 148 notified or further operation will be carried on. 149COMMENTED : then after receiving the UA frame, then a timer is started, to 150 delay the notifiation or to carry on the next operation 151*/ 152#define LLC_URSET_NO_DELAY 153 154 /* 155 If the below MACRO (LLC_RELEASE_FLAG) is 156DEFINED : then whenever LLC release is called the g_release_flag variable 157 will be made TRUE. Also, NO notification is allowed to the 158 upper layer. 159COMMENTED : g_release_flag is not declared and not used 160 */ 161 #define LLC_RELEASE_FLAG 162 163 164 /* 165 Actually, there is a send and receive error count, if either of them reaches 166 limit, then exception is raised. 167 If the below MACRO (LLC_RSET_INSTEAD_OF_EXCEPTION) is 168DEFINED : then exception is not raised, instead a U RSET command is sent. 169COMMENTED : then exception is raised 170 */ 171/* #define LLC_RSET_INSTEAD_OF_EXCEPTION */ 172 173#ifndef LLC_UPP_LAYER_NTFY_WRITE_RSP_CB 174 /* 175 If the below MACRO (PIGGY_BACK) is 176 DEFINED : After receiving I frame, wait till the ACK timer to expire to send an ACK to PN544. 177 COMMENTED : immediately ACK the received I frame 178 */ 179 #define PIGGY_BACK 180 181#endif /* LLC_UPP_LAYER_NTFY_WRITE_RSP_CB */ 182 183#define LLC_SEND_ERROR_COUNT 184 185#define RECV_ERROR_FRAME_COUNT (0x50U) 186#define SENT_ERROR_FRAME_COUNT (0x50U) 187 188/** Initial bytes to read */ 189#define PH_LLCNFC_BYTES_INIT_READ (1) 190/** Maximum buffer that I frame can send */ 191#define PH_LLCNFC_MAX_IFRAME_BUFLEN (29) 192#define PH_LLCNFC_MAX_UFRAME_BUFLEN (4) 193#define PH_LLCNFC_CRC_LENGTH (2) 194#define PH_LLCNFC_MAX_LLC_PAYLOAD ((PH_LLCNFC_MAX_IFRAME_BUFLEN) + (4)) 195/** Maximum timer used in the Llc */ 196#define PH_LLCNFC_MAX_TIMER_USED (3) 197/** Maximum timer used in the Llc */ 198#define PH_LLCNFC_MAX_ACK_GUARD_TIMER (4) 199/** Maximum I frame that can be stored */ 200#define PH_LLCNFC_MAX_I_FRAME_STORE (8) 201 202/** Read pending for one byte */ 203#define PH_LLCNFC_READPEND_ONE_BYTE (0x01U) 204 /** Read pending for remaining byte */ 205#define PH_LLCNFC_READPEND_REMAIN_BYTE (0x02U) 206/** Read pending not done */ 207#define PH_LLCNFC_READPEND_FLAG_OFF FALSE 208#define PH_LLCNFC_MAX_REJ_RETRY_COUNT (200) 209 210 211/**** Macros for state machine ****/ 212 213typedef enum phLlcNfc_State 214{ 215 /** This specifies that LLC is in uninitialise state */ 216 phLlcNfc_Uninitialise_State = 0x00, 217 /** This specifies that LLC initialise is in progress */ 218 phLlcNfc_Initialising_State = 0x01, 219 /** This specifies that LLC is in initialise is complete */ 220 phLlcNfc_Initialised_State = 0x02, 221 /** This specifies that LLC is send with the 222 lower layer */ 223 phLlcNfc_Sending_State = 0x03, 224 /** This specifies that LLC is receive with the 225 lower layer */ 226 phLlcNfc_Receiving_State = 0x04, 227 /** This specifies that LLC is receive wait with the 228 lower layer */ 229 phLlcNfc_ReceiveWait_State = 0x05, 230 /** This specifies that LLC is resending the I frames */ 231 phLlcNfc_Resend_State = 0x06 232}phLlcNfc_State_t; 233/**** Macros for state machine end ****/ 234 235/************************ End of macros *****************************/ 236 237/********************** Callback functions **************************/ 238 239/******************* End of Callback functions **********************/ 240 241/********************* Structures and enums *************************/ 242/** 243* \ingroup grp_hal_nfc_llc 244* \brief Enum to get the baud rate 245* 246* This enum contains the baud rate information. 247* 248*/ 249/*@{*/ 250typedef enum phLlcNfc_LlcBaudRate 251{ 252 /** Baud rate = 9600 */ 253 phLlcNfc_e_9600 = 0x00, 254 /** Baud rate = 19200 */ 255 phLlcNfc_e_19200 = 0x01, 256 /** Baud rate = 28800 */ 257 phLlcNfc_e_28800 = 0x02, 258 /** Baud rate = 38400 */ 259 phLlcNfc_e_38400 = 0x03, 260 /** Baud rate = 57600 */ 261 phLlcNfc_e_57600 = 0x04, 262 /** Baud rate = 115200 */ 263 phLlcNfc_e_115200 = 0x05, 264 /** Baud rate = 23400 */ 265 phLlcNfc_e_234000 = 0x06, 266 /** Baud rate = 46800 */ 267 phLlcNfc_e_460800 = 0x07, 268 /** Baud rate = 921600 */ 269 phLlcNfc_e_921600 = 0x08, 270 /** Baud rate = 1228000 */ 271 phLlcNfc_e_1228000 = 0x09, 272 /** Baud rate error */ 273 phLlcNfc_e_bdrate_err = 0xFF 274}phLlcNfc_LlcBaudRate_t; 275/*@}*/ 276 277/** 278* \ingroup grp_hal_nfc_llc 279* \brief Enum to select the U or I or S frame 280* 281* This enum is to set the frames. 282* 283*/ 284/*@{*/ 285typedef enum phLlcNfc_LlcCmd 286{ 287 /** This command is for I frame (no command) */ 288 phLlcNfc_e_no_cmd = 0xFF, 289 /** This command is for U frame */ 290 phLlcNfc_e_rset = 0x19, 291 /** This command is for U frame */ 292 phLlcNfc_e_ua = 0x06, 293 /** This is RR command for S frame */ 294 phLlcNfc_e_rr = 0x00, 295 /** This is REJ command for S frame */ 296 phLlcNfc_e_rej = 0x08, 297 /** This is RNR command for S frame */ 298 phLlcNfc_e_rnr = 0x10, 299 /** This is SREJ command for S frame */ 300 phLlcNfc_e_srej = 0x18, 301 /** Error command */ 302 phLlcNfc_e_error = 0xFE 303}phLlcNfc_LlcCmd_t; 304/*@}*/ 305 306/** 307* \ingroup grp_hal_nfc_llc 308* \brief Enum to select the U or I or S frame 309* 310* This enum is to set the frames. 311* 312*/ 313/*@{*/ 314typedef enum phLlcNfc_FrameType 315{ 316 /** U frame type */ 317 phLlcNfc_eU_frame = 0x00, 318 /** I frame type */ 319 phLlcNfc_eI_frame = 0x01, 320 /** S frame type */ 321 phLlcNfc_eS_frame = 0x02, 322 /** Error frame type */ 323 phLlcNfc_eErr_frame = 0x03 324}phLlcNfc_FrameType_t; 325/*@}*/ 326 327/** 328* \ingroup grp_hal_nfc_llc 329* \brief LLC sent frame type 330* 331* This enum values defines what are the frames sent to the PN544 332* 333*/ 334/*@{*/ 335 336typedef enum phLlcNfc_eSentFrameType 337{ 338 invalid_frame, 339 /* During initialisation the U RSET is sent to PN544 */ 340 init_u_rset_frame, 341 /* During initialisation the UA is sent to PN544 */ 342 init_u_a_frame, 343 /* After unsuccessful retries of sending I frame to PN544, 344 URSET is sent */ 345 u_rset_frame, 346 /* If PN544 sends the URSET frame in between any transaction, then 347 the UA response shall be sent */ 348 u_a_frame, 349 /* S frame is sent to PN544, this will be sent only if an I frame 350 is received from PN544 */ 351 s_frame, 352 /* User has sent an I frame, for that a write response callback 353 shall be called */ 354 user_i_frame, 355 /* LLC, internally (means stored non acknowledged frames) has sent 356 an I frame as it doesnt get a proper acknowledgement */ 357 resend_i_frame, 358 /* LLC, internally (means stored non acknowledged frames) has sent 359 an I frame as it doesnt get a reject as acknowledgement */ 360 rejected_i_frame, 361 /* LLC has received a I frame for the re-sent I frames, so an S 362 frame is sent */ 363 resend_s_frame, 364 /* LLC has received a I frame for the re-sent I frames, so an S 365 frame is sent */ 366 resend_rej_s_frame, 367 /* PN544 has sent an I frame, which is wrong, so send a reject S 368 frame */ 369 reject_s_frame, 370#ifdef LLC_RR_INSTEAD_OF_REJ 371 372 /* RR is sent instead of REJECT */ 373 rej_rr_s_frame, 374 375#endif /* #ifdef LLC_RR_INSTEAD_OF_REJ */ 376 /* For any of the above sent frames, the response shall be received */ 377 write_resp_received 378}phLlcNfc_eSentFrameType_t; 379 380/*@}*/ 381 382/** 383* \ingroup grp_hal_nfc_llc 384* \brief LLC payload 385* 386* This structure contains both the header information and 387* the exact length of the buffer. 388* 389*/ 390/*@{*/ 391typedef struct phLlcNfc_Payload 392{ 393 /** Llc header information */ 394 uint8_t llcheader; 395 396 /** User or received buffer */ 397 uint8_t llcpayload[PH_LLCNFC_MAX_LLC_PAYLOAD]; 398}phLlcNfc_Payload_t; 399/*@}*/ 400 401/** 402* \ingroup grp_hal_nfc_llc 403* \brief Llc buffer 404* 405* This structure contains the information of the LLC length byte 406* and payload. 407* 408*/ 409/*@{*/ 410typedef struct phLlcNfc_Buffer 411{ 412 /** Llc length */ 413 uint8_t llc_length_byte; 414 415 /** LLC data including the LLC header and CRC */ 416 phLlcNfc_Payload_t sllcpayload; 417}phLlcNfc_Buffer_t; 418/*@}*/ 419 420/** 421* \ingroup grp_hal_nfc_llc 422* \brief Packet information 423* 424* This structure contains the length and buffer of the packet. 425* 426*/ 427/*@{*/ 428typedef struct phLlcNfc_LlcPacket 429{ 430 /** Complete LLC buffer */ 431 phLlcNfc_Buffer_t s_llcbuf; 432 433 /** LLC buffer length */ 434 uint8_t llcbuf_len; 435 436 /** Stored frame needs completion callback, to be sent to HCI */ 437 phLlcNfc_eSentFrameType_t frame_to_send; 438 439}phLlcNfc_LlcPacket_t; 440/*@}*/ 441 442/** 443* \ingroup grp_hal_nfc_llc_helper 444* \brief I frame details 445* 446* This structure stores the information of the I frame 447* (to support sliding window). 448* 449*/ 450/*@{*/ 451typedef struct phLlcNfc_StoreIFrame 452{ 453 /** Complete LLC packet */ 454 phLlcNfc_LlcPacket_t s_llcpacket[PH_LLCNFC_MAX_I_FRAME_STORE]; 455 456 /** Window size count */ 457 uint8_t winsize_cnt; 458 459 /** Start position */ 460 uint8_t start_pos; 461 462}phLlcNfc_StoreIFrame_t; 463/*@}*/ 464 465/** 466* \ingroup grp_hal_nfc_llc 467* \brief LLC timer information 468* 469* This structure contains the timer related information 470* 471*/ 472/*@{*/ 473typedef struct phLlcNfc_Timerinfo 474{ 475 /** Store the timer id for each timer create */ 476 uint32_t timer_id[PH_LLCNFC_MAX_TIMER_USED]; 477 478 /** This will store the connection time out value */ 479 uint16_t con_to_value; 480 481 /** This will store the guard time out values */ 482 uint16_t guard_to_value[PH_LLCNFC_MAX_ACK_GUARD_TIMER]; 483 484 /** This will store the guard time out values */ 485 uint16_t iframe_send_count[PH_LLCNFC_MAX_ACK_GUARD_TIMER]; 486 487 /** This will store ns value for the sent N(S) */ 488 uint8_t timer_ns_value[PH_LLCNFC_MAX_ACK_GUARD_TIMER]; 489 490 /** Each frame stored needs to be */ 491 uint8_t frame_type[PH_LLCNFC_MAX_ACK_GUARD_TIMER]; 492 493 /** Index to re-send */ 494 uint8_t index_to_send; 495 496 /** This is a count for gaurd time out */ 497 uint8_t guard_to_count; 498 499#ifdef PIGGY_BACK 500 /** This will store the ack time out values */ 501 uint16_t ack_to_value; 502#endif /* #ifdef PIGGY_BACK */ 503 504 /** This is a timer flag 505 Bit 0 = 1 means connection time out started else stopped 506 Bit 1 = 1 means guard time out started else stopped 507 Bit 2 = 1 means ack time out started else stopped 508 */ 509 uint8_t timer_flag; 510}phLlcNfc_Timerinfo_t; 511/*@}*/ 512 513/** 514* \ingroup grp_hal_nfc_llc 515* \brief LLC frame information 516* 517* This structure contains the information of the LLC frame. 518* 519*/ 520/*@{*/ 521typedef struct phLlcNfc_Frame 522{ 523 /** N(S) - Number of information frame */ 524 uint8_t n_s; 525 526 /** N(R) - Number of next information frame to receive */ 527 uint8_t n_r; 528 529 /** Store the window size */ 530 uint8_t window_size; 531 532 /** SREJ is optional, so store the flag whether it is set or not */ 533 uint8_t srej_on_off; 534 535 /** Store the baud rate */ 536 uint8_t baud_rate; 537 538 /** Flag to find the rset_recvd */ 539 uint8_t rset_recvd; 540 541 /** Complete LLC packet information */ 542 phLlcNfc_LlcPacket_t s_llcpacket; 543 544 /** Store the I frames, that has been sent, Storage will be till 545 the window size */ 546 phLlcNfc_StoreIFrame_t s_send_store; 547 548#ifdef PIGGY_BACK 549 /** Store the I frames, that has been received, Storage will be 550 till the window size */ 551 phLlcNfc_StoreIFrame_t s_recv_store; 552 553 /** Response received count to send the ACK once it reaches the window size */ 554 uint8_t resp_recvd_count; 555#endif /* #ifdef PIGGY_BACK */ 556 557 /** To receive the packet sent by below layer */ 558 phLlcNfc_LlcPacket_t s_recvpacket; 559 560 /** Number of window I frames has to be sent again */ 561 uint8_t rejected_ns; 562 563 /** To store the count received error frames like 564 wrong CRC, REJ and RNR frames */ 565 uint8_t recv_error_count; 566 567 /** Sending error frames like REJ frames to the PN544 */ 568 uint8_t send_error_count; 569 570 /** Send U frame count */ 571 uint8_t retry_cnt; 572 573 /** Read pending flag, to know that read is already pended 574 or not. Use the below macros to ON and OFF the flag 575 PH_LLCNFC_READPEND_FLAG_OFF 576 PH_LLCNFC_READPEND_ONE_BYTE 577 PH_LLCNFC_READPEND_REMAIN_BYTE 578 */ 579 uint8_t read_pending; 580 581 /** Write pending */ 582 uint8_t write_pending; 583 584 /** Sent frame type */ 585 phLlcNfc_eSentFrameType_t sent_frame_type; 586 587 /** upper receive called */ 588 uint8_t upper_recv_call; 589 590 /** Status returned during DAL write */ 591 NFCSTATUS write_status; 592 593 /** Depending on the "write_status", write call has to be called */ 594 phLlcNfc_eSentFrameType_t write_wait_call; 595}phLlcNfc_Frame_t; 596/*@}*/ 597 598/** 599* \ingroup grp_hal_nfc_llc 600* \brief LLC Component Context Structure 601* 602* This structure is used to store the current context information 603* of the instance. 604* 605*/ 606/*@{*/ 607typedef struct phLlcNfc_Context 608{ 609 /** Information regarding all the LLC frame */ 610 phLlcNfc_Frame_t s_frameinfo; 611 612 /** Local send and receive */ 613 phNfc_sLowerIF_t lower_if; 614 615 /** Register attention, send and receive callback from the 616 register functions of the upper layer */ 617 phNfcIF_sCallBack_t cb_for_if; 618 619 /** Store the length, which shall be sent later through the 620 "send complete" callback */ 621 uint32_t send_cb_len; 622 623 /** Receive buffer provided by the upper layer */ 624 uint8_t precv_buf[PH_LLCNFC_MAX_LLC_PAYLOAD]; 625 626 /** Receive length provided by the upper layer */ 627 uint32_t recvbuf_length; 628 629 /** Llc state */ 630 phLlcNfc_State_t state; 631 632 /** Hardware information */ 633 void *phwinfo; 634 635 /** Timer information */ 636 phLlcNfc_Timerinfo_t s_timerinfo; 637}phLlcNfc_Context_t; 638/*@}*/ 639/****************** End of structures and enums *********************/ 640 641/******************** Function declarations *************************/ 642 643/******************** Function declarations *************************/ 644#endif /* PHLLCNFC_DATATYPES_H */ 645 646 647