C++程序  |  220行  |  8.79 KB

/*
 * Copyright (C) 2010-2014 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.
 */

/*
 * 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                 \
  (0x100U) /* DL Host Frame Buffer Size for all CMD/RSP \
                except pipelined WRITE */
#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 */
} phDnldNfc_RspTimerInfo_t;

/*
 * Read/Write Processing Info
 */
typedef struct phDnldNfc_RWInfo {
  uint32_t dwAddr;    /* current Addr updated for read/write */
  uint16_t wOffset;   /* current offset within the user buffer to read/write */
  uint16_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 */
  uint16_t nxp_nfc_fwp_len; /* Length of firmware image length */
  uint16_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;     /* Defualt 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 */