You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

223 lines
9.0 KiB

/*
* Copyright 2010-2021 NXP
*
* 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.
*/
/*
* Internal Primitives (Functions + Variables) used for Firmware Download
*/
#ifndef PHDNLDNFC_INTERNAL_H
#define PHDNLDNFC_INTERNAL_H
#include <phDnldNfc.h>
#include <phDnldNfc_Cmd.h>
#include <phDnldNfc_Status.h>
#define PHDNLDNFC_CMDRESP_MAX_BUFF_SIZE \
(0x22AU) /* DL Host Frame Buffer Size for all CMD/RSP \
except pipelined WRITE \
Host can be configured to support both 256(0x100) & 554(0x22A) \
frame size*/
#if (PHDNLDNFC_CMDRESP_MAX_BUFF_SIZE > PHNFC_I2C_FRAGMENT_SIZE)
#undef PHDNLDNFC_CMDRESP_MAX_BUFF_SIZE
#define PHDNLDNFC_CMDRESP_MAX_BUFF_SIZE (PHNFC_I2C_FRAGMENT_SIZE)
#endif
/* DL Host Short Frame Buffer Size for pipelined WRITE RSP */
#define PHDNLDNFC_WRITERSP_BUFF_SIZE (0x08U)
/* DL Host Frame Buffer Header Length */
#define PHDNLDNFC_FRAME_HDR_LEN (0x02U)
/* DL Host Frame Buffer CRC Length */
#define PHDNLDNFC_FRAME_CRC_LEN (PHDNLDNFC_FRAME_HDR_LEN)
#define PHDNLDNFC_FRAME_ID_LEN (0x01U) /* Length of Cmd Id */
/* size of EEPROM/Flash address */
#define PHDNLDNFC_EEFL_ADDR_SIZE (0x03U)
/* 2 Byte size of data */
#define PHDNLDNFC_DATA_SIZE (PHDNLDNFC_FRAME_HDR_LEN)
/* Start of EEPROM address for log */
#define PHDNLDNFC_EEPROM_LOG_START_ADDR (0x201F80U)
/* End of EEPROM address for log */
#define PHDNLDNFC_EEPROM_LOG_END_ADDR (0x201FBFU)
#define PHDNLDNFC_MAX_LOG_SIZE \
((PHDNLDNFC_EEPROM_LOG_END_ADDR - PHDNLDNFC_EEPROM_LOG_START_ADDR) + 1)
/* DL Max Payload Size */
#define PHDNLDNFC_CMDRESP_MAX_PLD_SIZE \
((PHDNLDNFC_CMDRESP_MAX_BUFF_SIZE) - \
(PHDNLDNFC_FRAME_HDR_LEN + PHDNLDNFC_FRAME_CRC_LEN))
/*
* Enum definition contains Download Event Types
*/
typedef enum phDnldNfc_Event {
phDnldNfc_EventInvalid = 0x00, /*Invalid Event Value*/
phDnldNfc_EventReset, /* Reset event */
phDnldNfc_EventGetVer, /* Get Version event*/
phDnldNfc_EventWrite, /* Write event*/
phDnldNfc_EventRead, /* Read event*/
phDnldNfc_EventIntegChk, /* Integrity Check event*/
phDnldNfc_EventGetSesnSt, /* Get Session State event*/
phDnldNfc_EventLog, /* Log event*/
phDnldNfc_EventForce, /* Force event*/
phDnldNfc_EventRaw, /* Raw Req/Rsp event,used currently for sending NCI RESET
cmd */
phDnldNfc_EVENT_INT_MAX /* Max Event Count*/
} phDnldNfc_Event_t;
/*
* Enum definition contains Download Handler states for each event requested
*/
typedef enum phDnldNfc_State {
phDnldNfc_StateInit = 0x00, /* Handler init state */
phDnldNfc_StateSend, /* Send frame to NFCC state */
phDnldNfc_StateRecv, /* Recv Send complete State */
phDnldNfc_StateTimer, /* State to stop prev set timer on Recv or handle timed
out scenario */
phDnldNfc_StateResponse, /* Process response from NFCC state */
phDnldNfc_StatePipelined, /* Write requests to be pipelined state */
phDnldNfc_StateInvalid /* Invalid Handler state */
} phDnldNfc_State_t;
/*
* Enum definition contains Download Handler Transition
*/
typedef enum phDnldNfc_Transition {
phDnldNfc_TransitionIdle =
0x00, /* Handler in Idle state - No Download in progress */
phDnldNfc_TransitionBusy, /* Handler is busy processing download request */
phDnldNfc_TransitionInvalid /* Invalid Handler Transition */
} phDnldNfc_Transition_t;
/*
* Enum definition contains the Frame input type for CmdId in process
*/
typedef enum {
phDnldNfc_FTNone = 0, /* input type None */
phDnldNfc_ChkIntg, /* user eeprom offset & len to be added for Check Integrity
Request */
phDnldNfc_FTWrite, /* Frame inputs for Write request */
phDnldNfc_FTLog, /* Frame inputs for Log request */
phDnldNfc_FTForce, /* Frame input for Force cmd request */
phDnldNfc_FTRead, /* Addr input required for read request */
phDnldNfc_FTRaw /* Raw Req/Rsp type */
} phDnldNfc_FrameInputType_t;
/*
* Enum definition contains Firmware file format
*/
typedef enum phDnldNfc_FwFormat {
FW_FORMAT_UNKNOWN = 0x00,
FW_FORMAT_SO = 0x01,
FW_FORMAT_BIN = 0x02,
} phDnldNfc_FwFormat_t;
/*
* Contains Host Frame Buffer information.
*/
typedef struct phDnldNfc_FrameInfo {
uint16_t dwSendlength; /* length of the payload */
uint8_t
aFrameBuff[PHDNLDNFC_CMDRESP_MAX_BUFF_SIZE]; /* Buffer to store command
that needs to be sent*/
} phDnldNfc_FrameInfo_t,
*pphDnldNfc_FrameInfo_t; /* pointer to #phDnldNfc_FrameInfo_t */
/*
* Frame Input Type & Value for CmdId in Process
*/
typedef struct phDnldNfc_FrameInput {
phDnldNfc_FrameInputType_t
Type; /* Type of frame input required for current cmd in process */
uint32_t dwAddr; /* Address value required for Read/Write Cmd*/
} phDnldNfc_FrameInput_t,
*pphDnldNfc_FrameInput_t; /* pointer to #phDnldNfc_FrameInput_t */
/*
* Context for the response timeout
*/
typedef struct phDnldNfc_RspTimerInfo {
uint32_t dwRspTimerId; /* Timer for Core to handle response */
uint8_t TimerStatus; /* 0 = Timer not running 1 = timer running*/
NFCSTATUS wTimerExpStatus; /* Holds the status code on timer expiry */
uint16_t rspTimeout; /*FW download rsp timeout value*/
} phDnldNfc_RspTimerInfo_t;
/*
* Read/Write Processing Info
*/
typedef struct phDnldNfc_RWInfo {
uint32_t dwAddr; /* current Addr updated for read/write */
uint32_t wOffset; /* current offset within the user buffer to read/write */
uint32_t wRemBytes; /* Remaining bytes to read/write */
uint16_t wRemChunkBytes; /* Remaining bytes within the chunked frame */
uint16_t wRWPldSize; /* Size of the read/write payload per transaction */
uint16_t wBytesToSendRecv; /* Num of Bytes being written/read currently */
uint16_t wBytesRead; /* Bytes read from read cmd currently */
bool_t bFramesSegmented; /* Flag to indicate if Read/Write frames are
segmented */
bool_t bFirstWrReq; /* Flag to indicate if this is the first write frame being
sent */
bool_t
bFirstChunkResp; /* Flag to indicate if we got the first chunk response */
} phDnldNfc_RWInfo_t, *pphDnldNfc_RWInfo_t; /* pointer to #phDnldNfc_RWInfo_t */
/*
* Download context structure
*/
typedef struct phDnldNfc_DlContext {
const uint8_t* nxp_nfc_fw; /* Pointer to firmware version from image */
const uint8_t*
nxp_nfc_fwp; /* Pointer to firmware version from get_version cmd */
uint32_t nxp_nfc_fwp_len; /* Length of firmware image length */
uint32_t nxp_nfc_fw_len; /* Firmware image length */
bool_t bResendLastFrame; /* Flag to resend the last write frame after MEM_BSY
status */
phDnldNfc_Transition_t
tDnldInProgress; /* Flag to indicate if download request is ongoing */
phDnldNfc_Event_t tCurrEvent; /* Current event being processed */
phDnldNfc_State_t tCurrState; /* Current state being processed */
pphDnldNfc_RspCb_t UserCb; /* Upper layer call back function */
void* UserCtxt; /* Pointer to upper layer context */
phDnldNfc_Buff_t tUserData; /* Data buffer provided by caller */
phDnldNfc_Buff_t
tRspBuffInfo; /* Buffer to store payload field of the received response*/
phDnldNfc_FrameInfo_t tCmdRspFrameInfo; /* Buffer to hold the cmd/resp frame
except pipeline write */
phDnldNfc_FrameInfo_t
tPipeLineWrFrameInfo; /* Buffer to hold the pipelined write frame */
NFCSTATUS
wCmdSendStatus; /* Holds the status of cmd request made to cmd handler */
phDnldNfc_CmdId_t tCmdId; /* Cmd Id of the currently processed cmd */
phDnldNfc_FrameInput_t
FrameInp; /* input value required for current cmd in process */
phDnldNfc_RspTimerInfo_t
TimerInfo; /* Timer context handled into download context*/
phDnldNfc_Buff_t tTKey; /* Default Transport Key provided by caller */
phDnldNfc_RWInfo_t tRWInfo; /* Read/Write segmented frame info */
phDnldNfc_Status_t tLastStatus; /* saved status to distinguish signature or
pltform recovery */
phDnldNfc_FwFormat_t FwFormat; /*FW file format either lib or bin*/
} phDnldNfc_DlContext_t,
*pphDnldNfc_DlContext_t; /* pointer to #phDnldNfc_DlContext_t structure */
/* The phDnldNfc_CmdHandler function declaration */
extern NFCSTATUS phDnldNfc_CmdHandler(void* pContext,
phDnldNfc_Event_t TrigEvent);
#endif /* PHDNLDNFC_INTERNAL_H */