1 /*
2  * Copyright 2010-2021 NXP
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                                        \
28   (0x22AU) /* DL Host Frame Buffer Size for all CMD/RSP                        \
29                 except pipelined WRITE                                         \
30                 Host can be configured to support both 256(0x100) & 554(0x22A) \
31                 frame size*/
32 #if (PHDNLDNFC_CMDRESP_MAX_BUFF_SIZE > PHNFC_I2C_FRAGMENT_SIZE)
33 #undef PHDNLDNFC_CMDRESP_MAX_BUFF_SIZE
34 #define PHDNLDNFC_CMDRESP_MAX_BUFF_SIZE (PHNFC_I2C_FRAGMENT_SIZE)
35 #endif
36 
37 /* DL Host Short Frame Buffer Size for pipelined WRITE RSP */
38 #define PHDNLDNFC_WRITERSP_BUFF_SIZE (0x08U)
39 
40 /* DL Host Frame Buffer Header Length */
41 #define PHDNLDNFC_FRAME_HDR_LEN (0x02U)
42 /* DL Host Frame Buffer CRC Length */
43 #define PHDNLDNFC_FRAME_CRC_LEN (PHDNLDNFC_FRAME_HDR_LEN)
44 #define PHDNLDNFC_FRAME_ID_LEN (0x01U) /* Length of Cmd Id */
45 
46 /* size of EEPROM/Flash address */
47 #define PHDNLDNFC_EEFL_ADDR_SIZE (0x03U)
48 /* 2 Byte size of data */
49 #define PHDNLDNFC_DATA_SIZE (PHDNLDNFC_FRAME_HDR_LEN)
50 
51 /* Start of EEPROM address for log */
52 #define PHDNLDNFC_EEPROM_LOG_START_ADDR (0x201F80U)
53 /* End of EEPROM address for log */
54 #define PHDNLDNFC_EEPROM_LOG_END_ADDR (0x201FBFU)
55 
56 #define PHDNLDNFC_MAX_LOG_SIZE \
57   ((PHDNLDNFC_EEPROM_LOG_END_ADDR - PHDNLDNFC_EEPROM_LOG_START_ADDR) + 1)
58 
59 /* DL Max Payload Size */
60 #define PHDNLDNFC_CMDRESP_MAX_PLD_SIZE \
61   ((PHDNLDNFC_CMDRESP_MAX_BUFF_SIZE) - \
62    (PHDNLDNFC_FRAME_HDR_LEN + PHDNLDNFC_FRAME_CRC_LEN))
63 
64 /*
65  * Enum definition contains Download Event Types
66  */
67 typedef enum phDnldNfc_Event {
68   phDnldNfc_EventInvalid = 0x00, /*Invalid Event Value*/
69   phDnldNfc_EventReset,          /* Reset event */
70   phDnldNfc_EventGetVer,         /* Get Version event*/
71   phDnldNfc_EventWrite,          /* Write event*/
72   phDnldNfc_EventRead,           /* Read event*/
73   phDnldNfc_EventIntegChk,       /* Integrity Check event*/
74   phDnldNfc_EventGetSesnSt,      /* Get Session State event*/
75   phDnldNfc_EventLog,            /* Log event*/
76   phDnldNfc_EventForce,          /* Force event*/
77   phDnldNfc_EventRaw, /* Raw Req/Rsp event,used currently for sending NCI RESET
78                          cmd */
79   phDnldNfc_EVENT_INT_MAX /* Max Event Count*/
80 } phDnldNfc_Event_t;
81 
82 /*
83  * Enum definition contains Download Handler states for each event requested
84  */
85 typedef enum phDnldNfc_State {
86   phDnldNfc_StateInit = 0x00, /* Handler init state */
87   phDnldNfc_StateSend,        /* Send frame to NFCC state */
88   phDnldNfc_StateRecv,        /* Recv Send complete State */
89   phDnldNfc_StateTimer, /* State to stop prev set timer on Recv or handle timed
90                            out scenario */
91   phDnldNfc_StateResponse,  /* Process response from NFCC state */
92   phDnldNfc_StatePipelined, /* Write requests to be pipelined state */
93   phDnldNfc_StateInvalid    /* Invalid Handler state */
94 } phDnldNfc_State_t;
95 
96 /*
97  * Enum definition contains Download Handler Transition
98  */
99 typedef enum phDnldNfc_Transition {
100   phDnldNfc_TransitionIdle =
101       0x00, /* Handler in Idle state - No Download in progress */
102   phDnldNfc_TransitionBusy,   /* Handler is busy processing download request */
103   phDnldNfc_TransitionInvalid /* Invalid Handler Transition */
104 } phDnldNfc_Transition_t;
105 
106 /*
107  * Enum definition contains the Frame input type for CmdId in process
108  */
109 typedef enum {
110   phDnldNfc_FTNone = 0, /* input type None */
111   phDnldNfc_ChkIntg, /* user eeprom offset & len to be added for Check Integrity
112                         Request */
113   phDnldNfc_FTWrite, /* Frame inputs for Write request */
114   phDnldNfc_FTLog,   /* Frame inputs for Log request */
115   phDnldNfc_FTForce, /* Frame input for Force cmd request */
116   phDnldNfc_FTRead,  /* Addr input required for read request */
117   phDnldNfc_FTRaw    /* Raw Req/Rsp type */
118 } phDnldNfc_FrameInputType_t;
119 
120 /*
121  * Enum definition contains Firmware file format
122  */
123 typedef enum phDnldNfc_FwFormat {
124   FW_FORMAT_UNKNOWN = 0x00,
125   FW_FORMAT_SO = 0x01,
126   FW_FORMAT_BIN = 0x02,
127 } phDnldNfc_FwFormat_t;
128 
129 /*
130  * Contains Host Frame Buffer information.
131  */
132 typedef struct phDnldNfc_FrameInfo {
133   uint16_t dwSendlength; /* length of the payload  */
134   uint8_t
135       aFrameBuff[PHDNLDNFC_CMDRESP_MAX_BUFF_SIZE]; /* Buffer to store command
136                                                       that needs to be sent*/
137 } phDnldNfc_FrameInfo_t,
138     *pphDnldNfc_FrameInfo_t; /* pointer to #phDnldNfc_FrameInfo_t */
139 
140 /*
141  * Frame Input Type & Value for CmdId in Process
142  */
143 typedef struct phDnldNfc_FrameInput {
144   phDnldNfc_FrameInputType_t
145       Type;        /* Type of frame input required for current cmd in process */
146   uint32_t dwAddr; /* Address value required for Read/Write Cmd*/
147 } phDnldNfc_FrameInput_t,
148     *pphDnldNfc_FrameInput_t; /* pointer to #phDnldNfc_FrameInput_t */
149 
150 /*
151  * Context for the response timeout
152  */
153 typedef struct phDnldNfc_RspTimerInfo {
154   uint32_t dwRspTimerId;     /* Timer for Core to handle response */
155   uint8_t TimerStatus;       /* 0 = Timer not running 1 = timer running*/
156   NFCSTATUS wTimerExpStatus; /* Holds the status code on timer expiry */
157   uint16_t rspTimeout;       /*FW download rsp timeout value*/
158 } phDnldNfc_RspTimerInfo_t;
159 
160 /*
161  * Read/Write Processing Info
162  */
163 typedef struct phDnldNfc_RWInfo {
164   uint32_t dwAddr;    /* current Addr updated for read/write */
165   uint32_t wOffset;   /* current offset within the user buffer to read/write */
166   uint32_t wRemBytes; /* Remaining bytes to read/write */
167   uint16_t wRemChunkBytes; /* Remaining bytes within the chunked frame */
168   uint16_t wRWPldSize;     /* Size of the read/write payload per transaction */
169   uint16_t wBytesToSendRecv; /* Num of Bytes being written/read currently */
170   uint16_t wBytesRead;       /* Bytes read from read cmd currently */
171   bool_t bFramesSegmented;   /* Flag to indicate if Read/Write frames are
172                                 segmented */
173   bool_t bFirstWrReq; /* Flag to indicate if this is the first write frame being
174                          sent */
175   bool_t
176       bFirstChunkResp; /* Flag to indicate if we got the first chunk response */
177 } phDnldNfc_RWInfo_t, *pphDnldNfc_RWInfo_t; /* pointer to #phDnldNfc_RWInfo_t */
178 
179 /*
180  * Download context structure
181  */
182 typedef struct phDnldNfc_DlContext {
183   const uint8_t* nxp_nfc_fw; /* Pointer to firmware version from image */
184   const uint8_t*
185       nxp_nfc_fwp; /* Pointer to firmware version from get_version cmd */
186   uint32_t nxp_nfc_fwp_len; /* Length of firmware image length */
187   uint32_t nxp_nfc_fw_len;  /* Firmware image length */
188   bool_t bResendLastFrame;  /* Flag to resend the last write frame after MEM_BSY
189                                status */
190   phDnldNfc_Transition_t
191       tDnldInProgress; /* Flag to indicate if download request is ongoing */
192   phDnldNfc_Event_t tCurrEvent; /* Current event being processed */
193   phDnldNfc_State_t tCurrState; /* Current state being processed */
194   pphDnldNfc_RspCb_t UserCb;    /* Upper layer call back function */
195   void* UserCtxt;               /* Pointer to upper layer context */
196   phDnldNfc_Buff_t tUserData;   /* Data buffer provided by caller */
197   phDnldNfc_Buff_t
198       tRspBuffInfo; /* Buffer to store payload field of the received response*/
199   phDnldNfc_FrameInfo_t tCmdRspFrameInfo; /* Buffer to hold the cmd/resp frame
200                                              except pipeline write */
201   phDnldNfc_FrameInfo_t
202       tPipeLineWrFrameInfo; /* Buffer to hold the pipelined write frame */
203   NFCSTATUS
204   wCmdSendStatus; /* Holds the status of cmd request made to cmd handler */
205   phDnldNfc_CmdId_t tCmdId; /* Cmd Id of the currently processed cmd */
206   phDnldNfc_FrameInput_t
207       FrameInp; /* input value required for current cmd in process */
208   phDnldNfc_RspTimerInfo_t
209       TimerInfo;              /* Timer context handled into download context*/
210   phDnldNfc_Buff_t tTKey;     /* Default Transport Key provided by caller */
211   phDnldNfc_RWInfo_t tRWInfo; /* Read/Write segmented frame info */
212   phDnldNfc_Status_t tLastStatus; /* saved status to distinguish signature or
213                                      pltform recovery */
214   phDnldNfc_FwFormat_t FwFormat;  /*FW file format either lib or bin*/
215 } phDnldNfc_DlContext_t,
216     *pphDnldNfc_DlContext_t; /* pointer to #phDnldNfc_DlContext_t structure */
217 
218 /* The phDnldNfc_CmdHandler function declaration */
219 extern NFCSTATUS phDnldNfc_CmdHandler(void* pContext,
220                                       phDnldNfc_Event_t TrigEvent);
221 
222 #endif /* PHDNLDNFC_INTERNAL_H */
223