• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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