diff options
author | Daniel Tomas <dtomas.nxp@gmail.com> | 2011-05-26 15:52:17 +0200 |
---|---|---|
committer | Nick Pelly <npelly@google.com> | 2011-06-28 14:30:24 -0700 |
commit | b313c3d09c64c31439332e88e0aca676ae1858b5 (patch) | |
tree | 0529b38fd67f61dfae286e968a9e81fa57f4da1d /src/phLlcNfc_Frame.c | |
parent | 8d4d6a13c4c3bf4e966d12297cc9a9f6cf9d42a8 (diff) | |
download | external_libnfc-nxp-b313c3d09c64c31439332e88e0aca676ae1858b5.zip external_libnfc-nxp-b313c3d09c64c31439332e88e0aca676ae1858b5.tar.gz external_libnfc-nxp-b313c3d09c64c31439332e88e0aca676ae1858b5.tar.bz2 |
Patch to add the windowing support in the libnfc
This patch enables windowing of LLC packets send from chipset to host.
The host will now wait for up to 4 LLC packets from the chipset before
sending an ACK (S-Frame RR).
Change-Id: I6a70e1d780847a104e3ec8e403593a69e222aec9
Diffstat (limited to 'src/phLlcNfc_Frame.c')
-rw-r--r-- | src/phLlcNfc_Frame.c | 200 |
1 files changed, 100 insertions, 100 deletions
diff --git a/src/phLlcNfc_Frame.c b/src/phLlcNfc_Frame.c index 946f67f..af61761 100644 --- a/src/phLlcNfc_Frame.c +++ b/src/phLlcNfc_Frame.c @@ -52,7 +52,6 @@ #ifdef LLC_RELEASE_FLAG extern uint8_t g_release_flag; #endif /* #ifdef LLC_RELEASE_FLAG */ - /************************ End of global variables *****************************/ /*********************** Local functions ****************************/ @@ -107,28 +106,6 @@ phLlcNfc_H_ProcessSFrame ( /** * \ingroup grp_hal_nfc_llc_helper * -* \brief LLC component <b>Create S frame</b> function -* -* \copydoc page_reg This is a helper function which, creates the S frame -* -* \param[in/out] psFrameInfo Generic frame information -* \param[in/out] cmdType Command type of S frame -* -* \retval NFCSTATUS_SUCCESS Operation successful. -* \retval NFCSTATUS_INVALID_PARAMETER At least one parameter of the function is invalid. -* -*/ -static -NFCSTATUS -phLlcNfc_H_CreateSFramePayload ( - phLlcNfc_Frame_t *psFrameInfo, - phLlcNfc_LlcCmd_t cmdType -); - - -/** -* \ingroup grp_hal_nfc_llc_helper -* * \brief LLC helper functions <b>Update I frame list</b> function * * \copydoc page_reg This function checks the nr value with the stored I frames @@ -433,10 +410,10 @@ phLlcNfc_H_CreateUFramePayload ( return result; } -static NFCSTATUS phLlcNfc_H_CreateSFramePayload ( phLlcNfc_Frame_t *psFrameInfo, + phLlcNfc_LlcPacket_t *psLlcPacket, phLlcNfc_LlcCmd_t cmdType ) { @@ -451,7 +428,7 @@ phLlcNfc_H_CreateSFramePayload ( phLlcNfc_Buffer_t *ps_llc_buf = NULL; uint8_t length = 0; - ps_llc_buf = &(psFrameInfo->s_llcpacket.s_llcbuf); + ps_llc_buf = &(psLlcPacket->s_llcbuf); /* Initial S frame header */ ps_llc_buf->sllcpayload.llcheader = PH_LLCNFC_S_HEADER_INIT; @@ -467,11 +444,10 @@ phLlcNfc_H_CreateSFramePayload ( (ps_llc_buf->sllcpayload.llcheader | (uint8_t)cmdType); /* Maximum S frame length */ - psFrameInfo->s_llcpacket.llcbuf_len = (uint8_t) - PH_LLCNFC_MAX_S_FRAME_LEN; + psLlcPacket->llcbuf_len = (uint8_t)PH_LLCNFC_MAX_S_FRAME_LEN; /* S frame length byte value */ ps_llc_buf->llc_length_byte = (uint8_t) - (psFrameInfo->s_llcpacket.llcbuf_len - 1); + (psLlcPacket->llcbuf_len - 1); /* psFrameInfo->s_llcpacket.s_llcbuf : @@ -493,7 +469,7 @@ phLlcNfc_H_CreateSFramePayload ( (psFrameInfo->s_llcpacket.llcbuf_len - 3) : is the array index of the second CRC byte to be calculated */ - length = psFrameInfo->s_llcpacket.llcbuf_len; + length = psLlcPacket->llcbuf_len; phLlcNfc_H_ComputeCrc( (uint8_t *)ps_llc_buf, (length - 2), &(ps_llc_buf->sllcpayload.llcpayload[(length - 4)]), @@ -760,7 +736,7 @@ phLlcNfc_H_SendUserIFrame ( { NFCSTATUS result = NFCSTATUS_SUCCESS; phLlcNfc_Frame_t *ps_frame_info = NULL; - phLlcNfc_LlcPacket_t *ps_create_packet = NULL; + phLlcNfc_LlcPacket_t s_create_packet; phLlcNfc_LlcPacket_t *ps_get_packet = NULL; phLlcNfc_Payload_t *ps_llc_payload = NULL; phLlcNfc_StoreIFrame_t *ps_store_frame = NULL; @@ -778,7 +754,6 @@ phLlcNfc_H_SendUserIFrame ( else { ps_frame_info = &(psLlcCtxt->s_frameinfo); - ps_create_packet = &(ps_frame_info->s_llcpacket); ps_store_frame = &(ps_frame_info->s_send_store); if ( @@ -788,7 +763,7 @@ phLlcNfc_H_SendUserIFrame ( { /* Get the stored I frame, only if the new frame is sent from the upper layer */ - result = phLlcNfc_H_IFrameList_Peek (psListInfo, &ps_get_packet, + result = phLlcNfc_H_IFrameList_Peek (psListInfo, &ps_get_packet, ps_frame_info->n_s); } @@ -800,25 +775,25 @@ phLlcNfc_H_SendUserIFrame ( llc_header = (uint8_t)(llc_header | ps_frame_info->n_r); /* Create the packet */ - (void)memcpy ((void *)ps_create_packet, (void *)ps_get_packet, + (void)memcpy ((void *)&(s_create_packet), (void *)ps_get_packet, sizeof (phLlcNfc_LlcPacket_t)); - ps_create_packet->s_llcbuf.sllcpayload.llcheader = llc_header; - ps_llc_payload = &(ps_create_packet->s_llcbuf.sllcpayload); + s_create_packet.s_llcbuf.sllcpayload.llcheader = llc_header; + ps_llc_payload = &(s_create_packet.s_llcbuf.sllcpayload); /* Length of the complete llc buffer, sent to PN544 */ - length = ps_create_packet->llcbuf_len; + length = s_create_packet.llcbuf_len; /* Compute CRC for the created packet */ - phLlcNfc_H_ComputeCrc ((uint8_t *)&(ps_create_packet->s_llcbuf), + phLlcNfc_H_ComputeCrc ((uint8_t *)&(s_create_packet.s_llcbuf), (length - 2), (uint8_t *)&(ps_llc_payload->llcpayload[(length - 4)]), (uint8_t *)&(ps_llc_payload->llcpayload[(length - 3)])); /* Send the i frame */ - result = phLlcNfc_Interface_Write (psLlcCtxt, - (uint8_t *)&(ps_create_packet->s_llcbuf), - (uint32_t)ps_create_packet->llcbuf_len); + result = phLlcNfc_Interface_Write (psLlcCtxt, + (uint8_t *)&(s_create_packet.s_llcbuf), + (uint32_t)s_create_packet.llcbuf_len); ps_frame_info->write_status = result; @@ -865,7 +840,7 @@ phLlcNfc_H_SendRejectedIFrame ( { NFCSTATUS result = NFCSTATUS_SUCCESS; phLlcNfc_Frame_t *ps_frame_info = NULL; - phLlcNfc_LlcPacket_t *ps_create_packet = NULL; + phLlcNfc_LlcPacket_t s_create_packet; phLlcNfc_LlcPacket_t *ps_get_packet = NULL; phLlcNfc_Payload_t *ps_llc_payload = NULL; phLlcNfc_StoreIFrame_t *ps_store_frame = NULL; @@ -883,7 +858,6 @@ phLlcNfc_H_SendRejectedIFrame ( else { ps_frame_info = &(psLlcCtxt->s_frameinfo); - ps_create_packet = &(ps_frame_info->s_llcpacket); ps_store_frame = &(ps_frame_info->s_send_store); @@ -898,7 +872,7 @@ phLlcNfc_H_SendRejectedIFrame ( ps_store_frame->s_llcpacket[ns_rejected].frame_to_send) { /* Above check is added to know only if */ - result = phLlcNfc_H_IFrameList_Peek (psListInfo, &ps_get_packet, + result = phLlcNfc_H_IFrameList_Peek (psListInfo, &ps_get_packet, ns_rejected); } else @@ -918,25 +892,25 @@ phLlcNfc_H_SendRejectedIFrame ( llc_header = (uint8_t)(llc_header | ps_frame_info->n_r); /* Create the packet */ - (void)memcpy ((void *)ps_create_packet, (void *)ps_get_packet, + (void)memcpy ((void *)&(s_create_packet), (void *)ps_get_packet, sizeof (phLlcNfc_LlcPacket_t)); - ps_create_packet->s_llcbuf.sllcpayload.llcheader = llc_header; - ps_llc_payload = &(ps_create_packet->s_llcbuf.sllcpayload); + s_create_packet.s_llcbuf.sllcpayload.llcheader = llc_header; + ps_llc_payload = &(s_create_packet.s_llcbuf.sllcpayload); /* Length of the complete llc buffer, sent to PN544 */ - length = ps_create_packet->llcbuf_len; + length = s_create_packet.llcbuf_len; /* Compute CRC for the created packet */ - phLlcNfc_H_ComputeCrc ((uint8_t *)&(ps_create_packet->s_llcbuf), + phLlcNfc_H_ComputeCrc ((uint8_t *)&(s_create_packet.s_llcbuf), (length - 2), (uint8_t *)&(ps_llc_payload->llcpayload[(length - 4)]), (uint8_t *)&(ps_llc_payload->llcpayload[(length - 3)])); /* Send the i frame */ result = phLlcNfc_Interface_Write (psLlcCtxt, - (uint8_t *)&(ps_create_packet->s_llcbuf), - (uint32_t)ps_create_packet->llcbuf_len); + (uint8_t *)&(s_create_packet.s_llcbuf), + (uint32_t)s_create_packet.llcbuf_len); ps_frame_info->write_status = result; @@ -946,7 +920,7 @@ phLlcNfc_H_SendRejectedIFrame ( so update the below variable */ ps_frame_info->write_wait_call = (phLlcNfc_eSentFrameType_t) (((ns_rejected != ps_store_frame->start_pos) && - (resend_i_frame != ps_frame_info->write_wait_call))? + (resend_i_frame != ps_frame_info->write_wait_call))? rejected_i_frame : ps_frame_info->write_wait_call); } else @@ -1009,7 +983,7 @@ phLlcNfc_H_SendTimedOutIFrame ( NFCSTATUS result = NFCSTATUS_SUCCESS; phLlcNfc_Frame_t *ps_frame_info = NULL; phLlcNfc_Timerinfo_t *ps_timer_info = NULL; - phLlcNfc_LlcPacket_t *ps_create_packet = NULL; + phLlcNfc_LlcPacket_t s_create_packet; phLlcNfc_LlcPacket_t *ps_get_packet = NULL; phLlcNfc_Payload_t *ps_llc_payload = NULL; phLlcNfc_StoreIFrame_t *ps_store_frame = NULL; @@ -1033,7 +1007,6 @@ phLlcNfc_H_SendTimedOutIFrame ( ps_frame_info = &(psLlcCtxt->s_frameinfo); ps_timer_info = &(psLlcCtxt->s_timerinfo); - ps_create_packet = &(ps_frame_info->s_llcpacket); ps_store_frame = &(ps_frame_info->s_send_store); timer_index = ps_timer_info->index_to_send; @@ -1043,12 +1016,13 @@ phLlcNfc_H_SendTimedOutIFrame ( PH_LLCNFC_DEBUG("SEND TIMEOUT CALL WIN SIZE CNT : 0x%02X\n", ps_store_frame->winsize_cnt); PH_LLCNFC_DEBUG("SEND TIMEOUT CALL START POS : 0x%02X\n", ps_store_frame->start_pos); PH_LLCNFC_DEBUG("SEND TIMEOUT CALL N S value : 0x%02X\n", ps_frame_info->n_s); + PH_LLCNFC_DEBUG("SEND TIMEOUT TIMER INDEX : 0x%02X\n", timer_index); PH_LLCNFC_DEBUG("SEND TIMEOUT CALL frame type : 0x%02X\n", ps_timer_info->frame_type[timer_index]); if (resend_i_frame == ps_timer_info->frame_type[timer_index]) { /* Get the stored I frame */ - result = phLlcNfc_H_IFrameList_Peek (psListInfo, &ps_get_packet, + result = phLlcNfc_H_IFrameList_Peek (psListInfo, &ps_get_packet, ns_index); } @@ -1061,25 +1035,25 @@ phLlcNfc_H_SendTimedOutIFrame ( llc_header = (uint8_t)(llc_header | ps_frame_info->n_r); /* create the packet */ - (void)memcpy ((void *)ps_create_packet, (void *)ps_get_packet, + (void)memcpy ((void *)&(s_create_packet), (void *)ps_get_packet, sizeof (phLlcNfc_LlcPacket_t)); - ps_create_packet->s_llcbuf.sllcpayload.llcheader = llc_header; - ps_llc_payload = &(ps_create_packet->s_llcbuf.sllcpayload); + s_create_packet.s_llcbuf.sllcpayload.llcheader = llc_header; + ps_llc_payload = &(s_create_packet.s_llcbuf.sllcpayload); /* Length of the complete llc buffer, sent to PN544 */ - length = ps_create_packet->llcbuf_len; + length = s_create_packet.llcbuf_len; /* Compute CRC */ - phLlcNfc_H_ComputeCrc((uint8_t *)&(ps_create_packet->s_llcbuf), + phLlcNfc_H_ComputeCrc((uint8_t *)&(s_create_packet.s_llcbuf), (length - 2), - (uint8_t *)&(ps_llc_payload->llcpayload[(length - 4)]), + (uint8_t *)&(ps_llc_payload->llcpayload[(length - 4)]), (uint8_t *)&(ps_llc_payload->llcpayload[(length - 3)])); /* Send the i frame */ result = phLlcNfc_Interface_Write (psLlcCtxt, - (uint8_t *)&(ps_create_packet->s_llcbuf), - (uint32_t)ps_create_packet->llcbuf_len); + (uint8_t *)&(s_create_packet.s_llcbuf), + (uint32_t)s_create_packet.llcbuf_len); ps_frame_info->write_status = result; PH_LLCNFC_DEBUG("SEND TIMEOUT CALL Write status : 0x%02X\n", result); @@ -1102,9 +1076,9 @@ phLlcNfc_H_SendTimedOutIFrame ( PH_LLCNFC_DEBUG("SEND TIMEOUT CALL timer index : 0x%02X\n", timer_index); - PH_LLCNFC_DEBUG("SEND TIMEOUT CALL GUARD TO VALUE : 0x%02X\n", ps_timer_info->guard_to_value[(timer_index - 1)]); if (timer_index > 0) { + PH_LLCNFC_DEBUG("SEND TIMEOUT CALL GUARD TO VALUE : 0x%02X\n", ps_timer_info->guard_to_value[(timer_index - 1)]); /* Copy the maximum time-out value. */ time_out_value = (uint16_t) ((ps_timer_info->guard_to_value[(timer_index - 1)] >= @@ -1212,12 +1186,6 @@ phLlcNfc_H_ProcessIFrame ( uint8_t recvd_nr = 0; #endif /* #ifdef RECV_NR_CHECK_ENABLE */ -#ifdef LLC_UPP_LAYER_NTFY_WRITE_RSP_CB - /* Nothing required in this define */ -#else - uint8_t prev_local_nr = 0; -#endif /* #ifdef LLC_UPP_LAYER_NTFY_WRITE_RSP_CB */ - ps_frame_info = &(psLlcCtxt->s_frameinfo); ps_store_frame = &(ps_frame_info->s_send_store); ps_recv_pkt = &(ps_frame_info->s_recvpacket); @@ -1259,12 +1227,6 @@ phLlcNfc_H_ProcessIFrame ( phLlcNfc_StopTimers (PH_LLCNFC_GUARDTIMER, no_of_del_frames); } -#ifdef LLC_UPP_LAYER_NTFY_WRITE_RSP_CB - /* Nothing required in this define */ -#else - prev_local_nr = ps_frame_info->n_r; -#endif /* #ifdef LLC_UPP_LAYER_NTFY_WRITE_RSP_CB */ - /* Received buffer, N(S) value = N(R) of host (our structure) then send RR type of s frame else send REJ type of s frame */ @@ -1290,7 +1252,6 @@ phLlcNfc_H_ProcessIFrame ( ps_recv_pkt->s_llcbuf.sllcpayload.llcpayload), psLlcCtxt->recvbuf_length); - #if defined (LLC_SEND_RR_ACK) if (((ns_index < ps_frame_info->n_r) && @@ -1309,6 +1270,11 @@ phLlcNfc_H_ProcessIFrame ( ps_frame_info->n_r = ((ps_frame_info->n_r + 1) % PH_LLCNFC_MOD_NS_NR); +#ifdef PIGGY_BACK + ps_frame_info->resp_recvd_count = (uint8_t) + (ps_frame_info->resp_recvd_count + 1); +#endif /* #ifdef PIGGY_BACK */ + } if (NFCSTATUS_BUSY == PHNFCSTATUS (ps_frame_info->write_status)) @@ -1334,9 +1300,7 @@ phLlcNfc_H_ProcessIFrame ( { dont_send_s_frame = TRUE; #ifdef LLC_UPP_LAYER_NTFY_WRITE_RSP_CB - phLlcNfc_H_SendInfo (psLlcCtxt); - #endif /* #ifdef LLC_UPP_LAYER_NTFY_WRITE_RSP_CB */ } else @@ -1349,15 +1313,10 @@ phLlcNfc_H_ProcessIFrame ( resend_s_frame : s_frame); } -#ifdef LLC_UPP_LAYER_NTFY_WRITE_RSP_CB - - /* Nothing required in this define */ - -#else /* #ifdef LLC_UPP_LAYER_NTFY_WRITE_RSP_CB */ - +#ifdef PIGGY_BACK phLlcNfc_H_SendInfo (psLlcCtxt); +#endif /* #ifdef PIGGY_BACK */ -#endif /* #ifdef LLC_UPP_LAYER_NTFY_WRITE_RSP_CB */ } else { @@ -1425,23 +1384,61 @@ phLlcNfc_H_ProcessIFrame ( #endif /* #ifdef LLC_RELEASE_FLAG */ { - result = phLlcNfc_Interface_Read(psLlcCtxt, + (void)phLlcNfc_Interface_Read(psLlcCtxt, PH_LLCNFC_READWAIT_OFF, &(ps_recv_pkt->s_llcbuf.llc_length_byte), (uint8_t)PH_LLCNFC_BYTES_INIT_READ); +#ifdef PIGGY_BACK + /* Check if any write call is performed or not */ + if (NFCSTATUS_PENDING != result) + { + /* No write is performed, So, now check */ + if (NFCSTATUS_BUSY == PHNFCSTATUS (ps_frame_info->write_status)) + { + /* Any how write cannot be done and some frame is ready to be sent + so this frame will act as the ACK */ + result = phLlcNfc_H_WriteWaitCall (psLlcCtxt); + } + } + + if (NFCSTATUS_PENDING != result) + { + if (ps_frame_info->window_size == ps_frame_info->resp_recvd_count) + { + phLlcNfc_LlcPacket_t s_packet_info; + /* Create S frame */ + (void)phLlcNfc_H_CreateSFramePayload (ps_frame_info, &(s_packet_info), cmdtype); + result = phLlcNfc_Interface_Write(psLlcCtxt, + (uint8_t *)&(s_packet_info.s_llcbuf), + (uint32_t)(s_packet_info.llcbuf_len)); + + + if (0 == ps_frame_info->send_error_count) + { + ps_frame_info->write_wait_call = invalid_frame; + } + ps_frame_info->sent_frame_type = eframe_type; + } + else + { + result = phLlcNfc_StartTimers (PH_LLCNFC_ACKTIMER, 0); + } + } +#else /* #ifdef PIGGY_BACK */ if ((TRUE != ps_frame_info->write_pending) && (PH_LLCNFC_READPEND_REMAIN_BYTE != ps_frame_info->read_pending) && (FALSE == dont_send_s_frame)) { + phLlcNfc_LlcPacket_t s_packet_info = {0}; /* Create S frame */ - (void)phLlcNfc_H_CreateSFramePayload (ps_frame_info, cmdtype); + (void)phLlcNfc_H_CreateSFramePayload (ps_frame_info, &(s_packet_info), cmdtype); result = phLlcNfc_Interface_Write(psLlcCtxt, - (uint8_t *)&(ps_frame_info->s_llcpacket.s_llcbuf), - (uint32_t)(ps_frame_info->s_llcpacket.llcbuf_len)); + (uint8_t *)&(s_packet_info.s_llcbuf), + (uint32_t)(s_packet_info.llcbuf_len)); if (0 == ps_frame_info->send_error_count) @@ -1450,6 +1447,7 @@ phLlcNfc_H_ProcessIFrame ( } ps_frame_info->sent_frame_type = eframe_type; } +#endif /* #ifdef PIGGY_BACK */ } return ; @@ -1962,13 +1960,16 @@ phLlcNfc_H_SendRejectFrame( ) { NFCSTATUS result = NFCSTATUS_SUCCESS; + phLlcNfc_LlcPacket_t s_packet_info = {0}; + result = phLlcNfc_H_CreateSFramePayload( - &(psLlcCtxt->s_frameinfo), + &(psLlcCtxt->s_frameinfo), + &(s_packet_info), phLlcNfc_e_rej); /* Send the "S" frame to the lower layer */ result = phLlcNfc_Interface_Write(psLlcCtxt, - (uint8_t *)&(psLlcCtxt->s_frameinfo.s_llcpacket.s_llcbuf), - (uint32_t)(psLlcCtxt->s_frameinfo.s_llcpacket.llcbuf_len)); + (uint8_t *)&(s_packet_info.s_llcbuf), + (uint32_t)(s_packet_info.llcbuf_len)); if (NFCSTATUS_PENDING == result) { @@ -2160,23 +2161,22 @@ phLlcNfc_H_SendRSETFrame ( ) { NFCSTATUS result = NFCSTATUS_SUCCESS; - phLlcNfc_LlcPacket_t *ps_packet_info = NULL; + phLlcNfc_LlcPacket_t s_packet_info; phLlcNfc_Frame_t *ps_frame_info = NULL; ps_frame_info = &(psLlcCtxt->s_frameinfo); - ps_packet_info = &(psLlcCtxt->s_frameinfo.s_llcpacket); - result = phLlcNfc_H_CreateUFramePayload(psLlcCtxt, - ps_packet_info, - &(ps_packet_info->llcbuf_len), + result = phLlcNfc_H_CreateUFramePayload(psLlcCtxt, + &(s_packet_info), + &(s_packet_info.llcbuf_len), phLlcNfc_e_rset); if (NFCSTATUS_SUCCESS == result) { /* Call DAL write */ - result = phLlcNfc_Interface_Write(psLlcCtxt, - (uint8_t*)&(ps_packet_info->s_llcbuf), - (uint32_t)ps_packet_info->llcbuf_len); + result = phLlcNfc_Interface_Write(psLlcCtxt, + (uint8_t*)&(s_packet_info.s_llcbuf), + (uint32_t)s_packet_info.llcbuf_len); } ps_frame_info->write_status = result; |