/* * Copyright (C) 2010 NXP Semiconductors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* * \file phLlcNfc_DataTypes.h * \brief Contains the structure information. * * Project: NFC-FRI-1.1 * * $Date: Fri Apr 30 10:03:36 2010 $ * $Author: ing02260 $ * $Revision: 1.43 $ * $Aliases: NFC_FRI1.1_WK1017_R34_1,NFC_FRI1.1_WK1017_R34_2,NFC_FRI1.1_WK1023_R35_1 $ * */ #ifndef PHLLCNFC_DATATYPES_H #define PHLLCNFC_DATATYPES_H /** * \name LLC NFC frame creation, deletion and processing * * File: \ref phLlcNfc_DataTypes.h * */ /*@{*/ #define PH_LLCNFC_DATATYPES_FILEREVISION "$Revision: 1.43 $" /**< \ingroup grp_hal_nfc_llc */ #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 */ /*@}*/ /*************************** Includes *******************************/ #include /*********************** End of includes ****************************/ /***************************** Macros *******************************/ /* Trace buffer declaration */ #if defined (LLC_TRACE) #include #include extern char phOsalNfc_DbgTraceBuffer[]; #define trace_buffer phOsalNfc_DbgTraceBuffer #define MAX_TRACE_BUFFER 150 #define PH_LLCNFC_PRINT( str ) phOsalNfc_DbgString(str) #define PH_LLCNFC_PRINT_DATA(buf,len) #define PH_LLCNFC_STRING( str ) #define PH_LLCNFC_DEBUG(str, arg) \ { \ snprintf(trace_buffer,MAX_TRACE_BUFFER,str,arg); \ phOsalNfc_DbgString(trace_buffer); \ } #define PH_LLCNFC_PRINT_BUFFER(buf,len) \ { \ /* uint16_t i = 0; \ char trace_buffer[MAX_TRACE_BUFFER]; \ snprintf(trace_buffer,MAX_TRACE_BUFFER,"\n\t %s:",msg); \ phOsalNfc_DbgString(trace); */\ phOsalNfc_DbgTrace(buf,len); \ phOsalNfc_DbgString("\r"); \ } #endif /* #if defined (LLC_TRACE) */ #if (!defined (LLC_TRACE) && defined (LLC_DATA_BYTES)) #include extern char phOsalNfc_DbgTraceBuffer[]; #define trace_buffer phOsalNfc_DbgTraceBuffer #define PH_LLCNFC_PRINT( str ) #define PH_LLCNFC_PRINT_BUFFER(buf, len) #define PH_LLCNFC_DEBUG(str, arg1) #define PH_LLCNFC_STRING( str ) phOsalNfc_DbgString(str) #define PH_LLCNFC_PRINT_DATA(buf,len) \ { \ /* uint16_t i = 0; \ char trace_buffer[MAX_TRACE_BUFFER]; \ snprintf(trace_buffer,MAX_TRACE_BUFFER,"\n\t %s:",msg); \ phOsalNfc_DbgString(trace_buffer); */\ phOsalNfc_DbgTrace(buf,len); \ } #endif /* #if (!defined (LLC_TRACE) && defined (LLC_DATA_BYTES)) */ #if (!defined (LLC_TRACE) && !defined (LLC_DATA_BYTES)) /** To disable prints */ #define PH_LLCNFC_PRINT(str) #define PH_LLCNFC_PRINT_BUFFER(buf, len) #define PH_LLCNFC_DEBUG(str, arg1) #define PH_LLCNFC_PRINT_DATA(buf,len) #define PH_LLCNFC_STRING( str ) #endif /* #if (!defined (LLC_TRACE) && !defined (LLC_DATA_BYTES)) */ /* If the below MACRO (RECV_NR_CHECK_ENABLE) is DEFINED : then check for the NR frame received from PN544 in the I frame is added. This shall be greater than sent NS from the HOST. This is used to stop the timer COMMENTED : dont check the N(R) frame received from the PN544 */ /* #define RECV_NR_CHECK_ENABLE */ /* If the below MACRO (LLC_UPP_LAYER_NTFY_WRITE_RSP_CB) is DEFINED : then if an I frame is received and the upper layer response callback (before another READ is pended) is called only after sending S frame and wait for the callback and then notify the upper layer COMMENTED : then if an I frame is received and the upper layer response callback (before another READ is pended) is called immediately after sending S frame (not waiting for the sent S frame callback) */ /* #define LLC_UPP_LAYER_NTFY_WRITE_RSP_CB */ /* PN544 continuously sends an incorrect I frames to the HOST, even after the REJ frame from HOST to PN544 If the below MACRO (LLC_RR_INSTEAD_OF_REJ) is DEFINED : then if the received NS = (expected NR - 1) then instead of REJ RR frame is sent COMMENTED : then REJ frame is sent */ // #define LLC_RR_INSTEAD_OF_REJ #define SEND_UFRAME /* If the below MACRO (CTRL_WIN_SIZE_COUNT) is DEFINED : then window size will be maximum COMMENTED : then window size is 1 */ #define CTRL_WIN_SIZE_COUNT /* If the below MACRO (LLC_URSET_NO_DELAY) is DEFINED : then after receiving the UA frame, then immediately this will be notified or further operation will be carried on. COMMENTED : then after receiving the UA frame, then a timer is started, to delay the notifiation or to carry on the next operation */ #define LLC_URSET_NO_DELAY /* If the below MACRO (LLC_RELEASE_FLAG) is DEFINED : then whenever LLC release is called the g_release_flag variable will be made TRUE. Also, NO notification is allowed to the upper layer. COMMENTED : g_release_flag is not declared and not used */ #define LLC_RELEASE_FLAG /* Actually, there is a send and receive error count, if either of them reaches limit, then exception is raised. If the below MACRO (LLC_RSET_INSTEAD_OF_EXCEPTION) is DEFINED : then exception is not raised, instead a U RSET command is sent. COMMENTED : then exception is raised */ /* #define LLC_RSET_INSTEAD_OF_EXCEPTION */ #ifndef LLC_UPP_LAYER_NTFY_WRITE_RSP_CB /* If the below MACRO (PIGGY_BACK) is DEFINED : After receiving I frame, wait till the ACK timer to expire to send an ACK to PN544. COMMENTED : immediately ACK the received I frame */ #define PIGGY_BACK #endif /* LLC_UPP_LAYER_NTFY_WRITE_RSP_CB */ #define LLC_SEND_ERROR_COUNT #define RECV_ERROR_FRAME_COUNT (0x50U) #define SENT_ERROR_FRAME_COUNT (0x50U) /** Initial bytes to read */ #define PH_LLCNFC_BYTES_INIT_READ (1) /** Maximum buffer that I frame can send */ #define PH_LLCNFC_MAX_IFRAME_BUFLEN (29) #define PH_LLCNFC_MAX_UFRAME_BUFLEN (4) #define PH_LLCNFC_CRC_LENGTH (2) #define PH_LLCNFC_MAX_LLC_PAYLOAD ((PH_LLCNFC_MAX_IFRAME_BUFLEN) + (4)) /** Maximum timer used in the Llc */ #define PH_LLCNFC_MAX_TIMER_USED (3) /** Maximum timer used in the Llc */ #define PH_LLCNFC_MAX_ACK_GUARD_TIMER (4) /** Maximum I frame that can be stored */ #define PH_LLCNFC_MAX_I_FRAME_STORE (8) /** Read pending for one byte */ #define PH_LLCNFC_READPEND_ONE_BYTE (0x01U) /** Read pending for remaining byte */ #define PH_LLCNFC_READPEND_REMAIN_BYTE (0x02U) /** Read pending not done */ #define PH_LLCNFC_READPEND_FLAG_OFF FALSE #define PH_LLCNFC_MAX_REJ_RETRY_COUNT (200) /**** Macros for state machine ****/ typedef enum phLlcNfc_State { /** This specifies that LLC is in uninitialise state */ phLlcNfc_Uninitialise_State = 0x00, /** This specifies that LLC initialise is in progress */ phLlcNfc_Initialising_State = 0x01, /** This specifies that LLC is in initialise is complete */ phLlcNfc_Initialised_State = 0x02, /** This specifies that LLC is send with the lower layer */ phLlcNfc_Sending_State = 0x03, /** This specifies that LLC is receive with the lower layer */ phLlcNfc_Receiving_State = 0x04, /** This specifies that LLC is receive wait with the lower layer */ phLlcNfc_ReceiveWait_State = 0x05, /** This specifies that LLC is resending the I frames */ phLlcNfc_Resend_State = 0x06 }phLlcNfc_State_t; /**** Macros for state machine end ****/ /************************ End of macros *****************************/ /********************** Callback functions **************************/ /******************* End of Callback functions **********************/ /********************* Structures and enums *************************/ /** * \ingroup grp_hal_nfc_llc * \brief Enum to get the baud rate * * This enum contains the baud rate information. * */ /*@{*/ typedef enum phLlcNfc_LlcBaudRate { /** Baud rate = 9600 */ phLlcNfc_e_9600 = 0x00, /** Baud rate = 19200 */ phLlcNfc_e_19200 = 0x01, /** Baud rate = 28800 */ phLlcNfc_e_28800 = 0x02, /** Baud rate = 38400 */ phLlcNfc_e_38400 = 0x03, /** Baud rate = 57600 */ phLlcNfc_e_57600 = 0x04, /** Baud rate = 115200 */ phLlcNfc_e_115200 = 0x05, /** Baud rate = 23400 */ phLlcNfc_e_234000 = 0x06, /** Baud rate = 46800 */ phLlcNfc_e_460800 = 0x07, /** Baud rate = 921600 */ phLlcNfc_e_921600 = 0x08, /** Baud rate = 1228000 */ phLlcNfc_e_1228000 = 0x09, /** Baud rate error */ phLlcNfc_e_bdrate_err = 0xFF }phLlcNfc_LlcBaudRate_t; /*@}*/ /** * \ingroup grp_hal_nfc_llc * \brief Enum to select the U or I or S frame * * This enum is to set the frames. * */ /*@{*/ typedef enum phLlcNfc_LlcCmd { /** This command is for I frame (no command) */ phLlcNfc_e_no_cmd = 0xFF, /** This command is for U frame */ phLlcNfc_e_rset = 0x19, /** This command is for U frame */ phLlcNfc_e_ua = 0x06, /** This is RR command for S frame */ phLlcNfc_e_rr = 0x00, /** This is REJ command for S frame */ phLlcNfc_e_rej = 0x08, /** This is RNR command for S frame */ phLlcNfc_e_rnr = 0x10, /** This is SREJ command for S frame */ phLlcNfc_e_srej = 0x18, /** Error command */ phLlcNfc_e_error = 0xFE }phLlcNfc_LlcCmd_t; /*@}*/ /** * \ingroup grp_hal_nfc_llc * \brief Enum to select the U or I or S frame * * This enum is to set the frames. * */ /*@{*/ typedef enum phLlcNfc_FrameType { /** U frame type */ phLlcNfc_eU_frame = 0x00, /** I frame type */ phLlcNfc_eI_frame = 0x01, /** S frame type */ phLlcNfc_eS_frame = 0x02, /** Error frame type */ phLlcNfc_eErr_frame = 0x03 }phLlcNfc_FrameType_t; /*@}*/ /** * \ingroup grp_hal_nfc_llc * \brief LLC sent frame type * * This enum values defines what are the frames sent to the PN544 * */ /*@{*/ typedef enum phLlcNfc_eSentFrameType { invalid_frame, /* During initialisation the U RSET is sent to PN544 */ init_u_rset_frame, /* During initialisation the UA is sent to PN544 */ init_u_a_frame, /* After unsuccessful retries of sending I frame to PN544, URSET is sent */ u_rset_frame, /* If PN544 sends the URSET frame in between any transaction, then the UA response shall be sent */ u_a_frame, /* S frame is sent to PN544, this will be sent only if an I frame is received from PN544 */ s_frame, /* User has sent an I frame, for that a write response callback shall be called */ user_i_frame, /* LLC, internally (means stored non acknowledged frames) has sent an I frame as it doesnt get a proper acknowledgement */ resend_i_frame, /* LLC, internally (means stored non acknowledged frames) has sent an I frame as it doesnt get a reject as acknowledgement */ rejected_i_frame, /* LLC has received a I frame for the re-sent I frames, so an S frame is sent */ resend_s_frame, /* LLC has received a I frame for the re-sent I frames, so an S frame is sent */ resend_rej_s_frame, /* PN544 has sent an I frame, which is wrong, so send a reject S frame */ reject_s_frame, #ifdef LLC_RR_INSTEAD_OF_REJ /* RR is sent instead of REJECT */ rej_rr_s_frame, #endif /* #ifdef LLC_RR_INSTEAD_OF_REJ */ /* For any of the above sent frames, the response shall be received */ write_resp_received }phLlcNfc_eSentFrameType_t; /*@}*/ /** * \ingroup grp_hal_nfc_llc * \brief LLC payload * * This structure contains both the header information and * the exact length of the buffer. * */ /*@{*/ typedef struct phLlcNfc_Payload { /** Llc header information */ uint8_t llcheader; /** User or received buffer */ uint8_t llcpayload[PH_LLCNFC_MAX_LLC_PAYLOAD]; }phLlcNfc_Payload_t; /*@}*/ /** * \ingroup grp_hal_nfc_llc * \brief Llc buffer * * This structure contains the information of the LLC length byte * and payload. * */ /*@{*/ typedef struct phLlcNfc_Buffer { /** Llc length */ uint8_t llc_length_byte; /** LLC data including the LLC header and CRC */ phLlcNfc_Payload_t sllcpayload; }phLlcNfc_Buffer_t; /*@}*/ /** * \ingroup grp_hal_nfc_llc * \brief Packet information * * This structure contains the length and buffer of the packet. * */ /*@{*/ typedef struct phLlcNfc_LlcPacket { /** Complete LLC buffer */ phLlcNfc_Buffer_t s_llcbuf; /** LLC buffer length */ uint8_t llcbuf_len; /** Stored frame needs completion callback, to be sent to HCI */ phLlcNfc_eSentFrameType_t frame_to_send; }phLlcNfc_LlcPacket_t; /*@}*/ /** * \ingroup grp_hal_nfc_llc_helper * \brief I frame details * * This structure stores the information of the I frame * (to support sliding window). * */ /*@{*/ typedef struct phLlcNfc_StoreIFrame { /** Complete LLC packet */ phLlcNfc_LlcPacket_t s_llcpacket[PH_LLCNFC_MAX_I_FRAME_STORE]; /** Window size count */ uint8_t winsize_cnt; /** Start position */ uint8_t start_pos; }phLlcNfc_StoreIFrame_t; /*@}*/ /** * \ingroup grp_hal_nfc_llc * \brief LLC timer information * * This structure contains the timer related information * */ /*@{*/ typedef struct phLlcNfc_Timerinfo { /** Store the timer id for each timer create */ uint32_t timer_id[PH_LLCNFC_MAX_TIMER_USED]; /** This will store the connection time out value */ uint16_t con_to_value; /** This will store the guard time out values */ uint16_t guard_to_value[PH_LLCNFC_MAX_ACK_GUARD_TIMER]; /** This will store the guard time out values */ uint16_t iframe_send_count[PH_LLCNFC_MAX_ACK_GUARD_TIMER]; /** This will store ns value for the sent N(S) */ uint8_t timer_ns_value[PH_LLCNFC_MAX_ACK_GUARD_TIMER]; /** Each frame stored needs to be */ uint8_t frame_type[PH_LLCNFC_MAX_ACK_GUARD_TIMER]; /** Index to re-send */ uint8_t index_to_send; /** This is a count for gaurd time out */ uint8_t guard_to_count; #ifdef PIGGY_BACK /** This will store the ack time out values */ uint16_t ack_to_value; #endif /* #ifdef PIGGY_BACK */ /** This is a timer flag Bit 0 = 1 means connection time out started else stopped Bit 1 = 1 means guard time out started else stopped Bit 2 = 1 means ack time out started else stopped */ uint8_t timer_flag; }phLlcNfc_Timerinfo_t; /*@}*/ /** * \ingroup grp_hal_nfc_llc * \brief LLC frame information * * This structure contains the information of the LLC frame. * */ /*@{*/ typedef struct phLlcNfc_Frame { /** N(S) - Number of information frame */ uint8_t n_s; /** N(R) - Number of next information frame to receive */ uint8_t n_r; /** Store the window size */ uint8_t window_size; /** SREJ is optional, so store the flag whether it is set or not */ uint8_t srej_on_off; /** Store the baud rate */ uint8_t baud_rate; /** Flag to find the rset_recvd */ uint8_t rset_recvd; /** Complete LLC packet information */ phLlcNfc_LlcPacket_t s_llcpacket; /** Store the I frames, that has been sent, Storage will be till the window size */ phLlcNfc_StoreIFrame_t s_send_store; #ifdef PIGGY_BACK /** Store the I frames, that has been received, Storage will be till the window size */ phLlcNfc_StoreIFrame_t s_recv_store; /** Response received count to send the ACK once it reaches the window size */ uint8_t resp_recvd_count; #endif /* #ifdef PIGGY_BACK */ /** To receive the packet sent by below layer */ phLlcNfc_LlcPacket_t s_recvpacket; /** Number of window I frames has to be sent again */ uint8_t rejected_ns; /** To store the count received error frames like wrong CRC, REJ and RNR frames */ uint8_t recv_error_count; /** Sending error frames like REJ frames to the PN544 */ uint8_t send_error_count; /** Send U frame count */ uint8_t retry_cnt; /** Read pending flag, to know that read is already pended or not. Use the below macros to ON and OFF the flag PH_LLCNFC_READPEND_FLAG_OFF PH_LLCNFC_READPEND_ONE_BYTE PH_LLCNFC_READPEND_REMAIN_BYTE */ uint8_t read_pending; /** Write pending */ uint8_t write_pending; /** Sent frame type */ phLlcNfc_eSentFrameType_t sent_frame_type; /** upper receive called */ uint8_t upper_recv_call; /** Status returned during DAL write */ NFCSTATUS write_status; /** Depending on the "write_status", write call has to be called */ phLlcNfc_eSentFrameType_t write_wait_call; }phLlcNfc_Frame_t; /*@}*/ /** * \ingroup grp_hal_nfc_llc * \brief LLC Component Context Structure * * This structure is used to store the current context information * of the instance. * */ /*@{*/ typedef struct phLlcNfc_Context { /** Information regarding all the LLC frame */ phLlcNfc_Frame_t s_frameinfo; /** Local send and receive */ phNfc_sLowerIF_t lower_if; /** Register attention, send and receive callback from the register functions of the upper layer */ phNfcIF_sCallBack_t cb_for_if; /** Store the length, which shall be sent later through the "send complete" callback */ uint32_t send_cb_len; /** Receive buffer provided by the upper layer */ uint8_t precv_buf[PH_LLCNFC_MAX_LLC_PAYLOAD]; /** Receive length provided by the upper layer */ uint32_t recvbuf_length; /** Llc state */ phLlcNfc_State_t state; /** Hardware information */ void *phwinfo; /** Timer information */ phLlcNfc_Timerinfo_t s_timerinfo; }phLlcNfc_Context_t; /*@}*/ /****************** End of structures and enums *********************/ /******************** Function declarations *************************/ /******************** Function declarations *************************/ #endif /* PHLLCNFC_DATATYPES_H */