Home | History | Annotate | Download | only in dnld
      1 /*
      2  * Copyright (C) 2010-2014 NXP Semiconductors
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 /*
     18  * Internal Primitives (Functions + Variables) used for Firmware Download
     19  */
     20 #ifndef PHDNLDNFC_INTERNAL_H
     21 #define PHDNLDNFC_INTERNAL_H
     22 
     23 #include <phDnldNfc.h>
     24 #include <phDnldNfc_Cmd.h>
     25 #include <phDnldNfc_Status.h>
     26 
     27 #define PHDNLDNFC_CMDRESP_MAX_BUFF_SIZE   (0x100U)  /* DL Host Frame Buffer Size for all CMD/RSP
     28                                                          except pipelined WRITE */
     29 #if ( PHDNLDNFC_CMDRESP_MAX_BUFF_SIZE > PHNFC_I2C_FRAGMENT_SIZE )
     30 #undef PHDNLDNFC_CMDRESP_MAX_BUFF_SIZE
     31 #define PHDNLDNFC_CMDRESP_MAX_BUFF_SIZE   (PHNFC_I2C_FRAGMENT_SIZE)
     32 #endif
     33 
     34 #define PHDNLDNFC_WRITERSP_BUFF_SIZE  (0x08U)   /* DL Host Short Frame Buffer Size for pipelined WRITE RSP */
     35 
     36 #define PHDNLDNFC_FRAME_HDR_LEN  (0x02U)   /* DL Host Frame Buffer Header Length */
     37 #define PHDNLDNFC_FRAME_CRC_LEN  (PHDNLDNFC_FRAME_HDR_LEN)   /* DL Host Frame Buffer CRC Length */
     38 #define PHDNLDNFC_FRAME_ID_LEN   (0x01U)    /* Length of Cmd Id */
     39 
     40 #define PHDNLDNFC_EEFL_ADDR_SIZE          (0x03U)      /* size of EEPROM/Flash address */
     41 #define PHDNLDNFC_DATA_SIZE               (PHDNLDNFC_FRAME_HDR_LEN)      /* 2 Byte size of data */
     42 
     43 #define PHDNLDNFC_EEPROM_LOG_START_ADDR   (0x201F80U)   /* Start of EEPROM address for log */
     44 #define PHDNLDNFC_EEPROM_LOG_END_ADDR     (0x201FBFU)   /* End of EEPROM address for log */
     45 
     46 #define PHDNLDNFC_MAX_LOG_SIZE        ((PHDNLDNFC_EEPROM_LOG_END_ADDR - PHDNLDNFC_EEPROM_LOG_START_ADDR) + 1)
     47 
     48 /* DL Max Payload Size */
     49 #define PHDNLDNFC_CMDRESP_MAX_PLD_SIZE    ((PHDNLDNFC_CMDRESP_MAX_BUFF_SIZE) - \
     50                                           (PHDNLDNFC_FRAME_HDR_LEN + PHDNLDNFC_FRAME_CRC_LEN))
     51 
     52 /*
     53  * Enum definition contains Download Event Types
     54  */
     55 typedef enum phDnldNfc_Event{
     56     phDnldNfc_EventInvalid = 0x00,   /*Invalid Event Value*/
     57     phDnldNfc_EventReset,            /* Reset event */
     58     phDnldNfc_EventGetVer,           /* Get Version event*/
     59     phDnldNfc_EventWrite,            /* Write event*/
     60     phDnldNfc_EventRead,             /* Read event*/
     61     phDnldNfc_EventIntegChk,         /* Integrity Check event*/
     62     phDnldNfc_EventGetSesnSt,        /* Get Session State event*/
     63     phDnldNfc_EventLog,              /* Log event*/
     64     phDnldNfc_EventForce,            /* Force event*/
     65     phDnldNfc_EventRaw,              /* Raw Req/Rsp event,used currently for sending NCI RESET cmd */
     66     phDnldNfc_EVENT_INT_MAX          /* Max Event Count*/
     67 }phDnldNfc_Event_t;
     68 
     69 /*
     70  * Enum definition contains Download Handler states for each event requested
     71  */
     72 typedef enum phDnldNfc_State{
     73     phDnldNfc_StateInit=0x00,        /* Handler init state */
     74     phDnldNfc_StateSend,             /* Send frame to NFCC state */
     75     phDnldNfc_StateRecv,             /* Recv Send complete State */
     76     phDnldNfc_StateTimer,            /* State to stop prev set timer on Recv or handle timed out scenario */
     77     phDnldNfc_StateResponse,         /* Process response from NFCC state */
     78     phDnldNfc_StatePipelined,        /* Write requests to be pipelined state */
     79     phDnldNfc_StateInvalid           /* Invalid Handler state */
     80 }phDnldNfc_State_t;
     81 
     82 /*
     83  * Enum definition contains Download Handler Transition
     84  */
     85 typedef enum phDnldNfc_Transition{
     86     phDnldNfc_TransitionIdle = 0x00,      /* Handler in Idle state - No Download in progress */
     87     phDnldNfc_TransitionBusy,             /* Handler is busy processing download request */
     88     phDnldNfc_TransitionInvalid           /* Invalid Handler Transition */
     89 }phDnldNfc_Transition_t;
     90 
     91 /*
     92  * Enum definition contains the Frame input type for CmdId in process
     93  */
     94  typedef enum
     95  {
     96      phDnldNfc_FTNone = 0,     /* input type None */
     97      phDnldNfc_ChkIntg,        /* user eeprom offset & len to be added for Check Integrity Request */
     98      phDnldNfc_FTWrite,        /* Frame inputs for Write request */
     99      phDnldNfc_FTLog,          /* Frame inputs for Log request */
    100      phDnldNfc_FTForce,        /* Frame input for Force cmd request */
    101      phDnldNfc_FTRead,         /* Addr input required for read request */
    102      phDnldNfc_FTRaw           /* Raw Req/Rsp type */
    103 }phDnldNfc_FrameInputType_t;
    104 
    105 /*
    106  * Contains Host Frame Buffer information.
    107  */
    108 typedef struct phDnldNfc_FrameInfo
    109 {
    110     uint16_t dwSendlength;                                  /* length of the payload  */
    111     uint8_t aFrameBuff[PHDNLDNFC_CMDRESP_MAX_BUFF_SIZE];    /* Buffer to store command that needs to be sent*/
    112 }phDnldNfc_FrameInfo_t,*pphDnldNfc_FrameInfo_t; /* pointer to #phDnldNfc_FrameInfo_t */
    113 
    114 /*
    115  * Frame Input Type & Value for CmdId in Process
    116  */
    117 typedef struct phDnldNfc_FrameInput
    118 {
    119     phDnldNfc_FrameInputType_t Type;   /* Type of frame input required for current cmd in process */
    120     uint32_t  dwAddr;       /* Address value required for Read/Write Cmd*/
    121 }phDnldNfc_FrameInput_t, *pphDnldNfc_FrameInput_t;/* pointer to #phDnldNfc_FrameInput_t */
    122 
    123 /*
    124  * Context for the response timeout
    125  */
    126 typedef struct phDnldNfc_RspTimerInfo
    127 {
    128     uint32_t   dwRspTimerId;                  /* Timer for Core to handle response */
    129     uint8_t    TimerStatus;                   /* 0 = Timer not running 1 = timer running*/
    130     NFCSTATUS  wTimerExpStatus;               /* Holds the status code on timer expiry */
    131 }phDnldNfc_RspTimerInfo_t;
    132 
    133 /*
    134  * Read/Write Processing Info
    135  */
    136 typedef struct phDnldNfc_RWInfo
    137 {
    138     uint32_t  dwAddr;                /* current Addr updated for read/write */
    139     uint16_t  wOffset;               /* current offset within the user buffer to read/write */
    140     uint16_t  wRemBytes;             /* Remaining bytes to read/write */
    141     uint16_t  wRemChunkBytes;        /* Remaining bytes within the chunked frame */
    142     uint16_t  wRWPldSize;            /* Size of the read/write payload per transaction */
    143     uint16_t  wBytesToSendRecv;      /* Num of Bytes being written/read currently */
    144     uint16_t  wBytesRead;            /* Bytes read from read cmd currently */
    145     bool_t    bFramesSegmented;      /* Flag to indicate if Read/Write frames are segmented */
    146     bool_t    bFirstWrReq;           /* Flag to indicate if this is the first write frame being sent */
    147     bool_t    bFirstChunkResp;       /* Flag to indicate if we got the first chunk response */
    148 }phDnldNfc_RWInfo_t, *pphDnldNfc_RWInfo_t;/* pointer to #phDnldNfc_RWInfo_t */
    149 
    150 /*
    151  * Download context structure
    152  */
    153 typedef struct phDnldNfc_DlContext
    154 {
    155     const uint8_t           *nxp_nfc_fw;           /* Pointer to firmware version from image */
    156     const uint8_t           *nxp_nfc_fwp;          /* Pointer to firmware version from get_version cmd */
    157     uint16_t                nxp_nfc_fwp_len;       /* Length of firmware image length */
    158     uint16_t                nxp_nfc_fw_len;        /* Firmware image length */
    159     bool_t                  bResendLastFrame;      /* Flag to resend the last write frame after MEM_BSY status */
    160     phDnldNfc_Transition_t  tDnldInProgress;       /* Flag to indicate if download request is ongoing */
    161     phDnldNfc_Event_t       tCurrEvent;            /* Current event being processed */
    162     phDnldNfc_State_t       tCurrState;            /* Current state being processed */
    163     pphDnldNfc_RspCb_t      UserCb    ;            /* Upper layer call back function */
    164     void*                   UserCtxt  ;            /* Pointer to upper layer context */
    165     phDnldNfc_Buff_t        tUserData;             /* Data buffer provided by caller */
    166     phDnldNfc_Buff_t        tRspBuffInfo;          /* Buffer to store payload field of the received response*/
    167     phDnldNfc_FrameInfo_t   tCmdRspFrameInfo;      /* Buffer to hold the cmd/resp frame except pipeline write */
    168     phDnldNfc_FrameInfo_t   tPipeLineWrFrameInfo;  /* Buffer to hold the pipelined write frame */
    169     NFCSTATUS  wCmdSendStatus;                     /* Holds the status of cmd request made to cmd handler */
    170     phDnldNfc_CmdId_t       tCmdId;                /* Cmd Id of the currently processed cmd */
    171     phDnldNfc_FrameInput_t  FrameInp;              /* input value required for current cmd in process */
    172     phDnldNfc_RspTimerInfo_t TimerInfo;            /* Timer context handled into download context*/
    173     phDnldNfc_Buff_t        tTKey;                 /* Defualt Transport Key provided by caller */
    174     phDnldNfc_RWInfo_t      tRWInfo;               /* Read/Write segmented frame info */
    175     phDnldNfc_Status_t      tLastStatus;           /* saved status to distinguish signature or pltform recovery */
    176 }phDnldNfc_DlContext_t,*pphDnldNfc_DlContext_t; /* pointer to #phDnldNfc_DlContext_t structure */
    177 
    178 /* The phDnldNfc_CmdHandler function declaration */
    179 extern NFCSTATUS phDnldNfc_CmdHandler(void *pContext, phDnldNfc_Event_t TrigEvent);
    180 
    181 #endif /* PHDNLDNFC_INTERNAL_H */
    182