blob: b84cd3ee01f6259c530b0edb95e023117dd8dd58 [file] [log] [blame]
/*
* 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 <phNfcCompId.h>
/*********************** End of includes ****************************/
/***************************** Macros *******************************/
/* Trace buffer declaration */
#if defined (LLC_TRACE)
#include <phOsalNfc.h>
#include <stdio.h>
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 <phOsalNfc.h>
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 */