Skip to content

Commit 8e1c098

Browse files
[fix][services] optimize STSAFE-A frame reception (to fix emerging from hibernate state due polling)
1 parent e806d74 commit 8e1c098

1 file changed

Lines changed: 145 additions & 111 deletions

File tree

services/stsafea/stsafea_frame_transfer.c

Lines changed: 145 additions & 111 deletions
Original file line numberDiff line numberDiff line change
@@ -132,15 +132,15 @@ stse_ReturnCode_t stsafea_frame_receive(stse_Handler_t *pSTSE, stse_frame_t *pFr
132132
return (STSE_SERVICE_INVALID_PARAMETER);
133133
}
134134

135-
/* ======================================================= */
136-
/* ============== Get the total frame length ============= */
135+
/* ================================================================================= */
136+
/* ============== Get the total frame length + 2 bytes (potential CRC) ============= */
137137
while ((retry_count != 0) && (ret == STSE_PLATFORM_BUS_ACK_ERROR)) {
138138
/* - Receive frame length from target STSAFE */
139139
ret = pSTSE->io.BusRecvStart(
140140
pSTSE->io.busID,
141141
pSTSE->io.Devaddr,
142142
pSTSE->io.BusSpeed,
143-
STSE_FRAME_LENGTH_SIZE + STSE_RSP_FRAME_HEADER_SIZE);
143+
STSE_FRAME_LENGTH_SIZE + STSE_RSP_FRAME_HEADER_SIZE + STSE_FRAME_CRC_SIZE);
144144

145145
if (ret != STSE_OK) {
146146
retry_count--;
@@ -162,7 +162,7 @@ stse_ReturnCode_t stsafea_frame_receive(stse_Handler_t *pSTSE, stse_frame_t *pFr
162162
STSE_RSP_FRAME_HEADER_SIZE);
163163

164164
/* - Get STSAFE Response Length */
165-
ret = pSTSE->io.BusRecvStop(
165+
ret = pSTSE->io.BusRecvContinue(
166166
pSTSE->io.busID,
167167
pSTSE->io.Devaddr,
168168
pSTSE->io.BusSpeed,
@@ -172,6 +172,17 @@ stse_ReturnCode_t stsafea_frame_receive(stse_Handler_t *pSTSE, stse_frame_t *pFr
172172
return ret;
173173
}
174174

175+
/* - Get STSAFE Response Potential CRC */
176+
ret = pSTSE->io.BusRecvStop(
177+
pSTSE->io.busID,
178+
pSTSE->io.Devaddr,
179+
pSTSE->io.BusSpeed,
180+
received_crc,
181+
STSE_FRAME_CRC_SIZE);
182+
if (ret != STSE_OK) {
183+
return ret;
184+
}
185+
175186
/* - Store response Length */
176187
received_length = ((length_value[0] << 8) + length_value[1]) - STSE_FRAME_CRC_SIZE + STSE_RSP_FRAME_HEADER_SIZE;
177188

@@ -186,101 +197,136 @@ stse_ReturnCode_t stsafea_frame_receive(stse_Handler_t *pSTSE, stse_frame_t *pFr
186197
}
187198
}
188199

189-
/* ======================================================= */
190-
/* ====== Format the frame to handle CRC and filler ====== */
200+
if (received_length == 1) {
201+
/* ====================================================== */
202+
/* ====== compute CRC for response without payload ====== */
191203

192-
/* - Compare STSAFE Received frame length with local RSP Frame length */
193-
if (received_length > pFrame->length) {
194-
/* Calculate needed filler to match both length */
195-
filler_size = received_length - pFrame->length;
196-
}
197-
if (received_length < pFrame->length) {
198-
pFrame->length = received_length;
199-
}
204+
computed_crc = stse_platform_Crc16_Calculate(&received_header, STSE_RSP_FRAME_HEADER_SIZE);
200205

201-
/* Append filler frame element even if its length equal 0 */
202-
PLAT_UI8 filler[filler_size];
203-
stse_frame_element_allocate(eFiller,
204-
filler_size,
205-
filler);
206-
if (filler_size > 0) {
207-
stse_frame_push_element(pFrame,
208-
&eFiller);
209-
}
206+
#ifdef STSE_FRAME_DEBUG_LOG
207+
printf("\n\r STSAFE Frame < (%d-byte) : { 0x%02X } { 0x%02X 0x%02X }\n\r",
208+
received_length + STSE_FRAME_CRC_SIZE,
209+
received_header,
210+
received_crc[0],
211+
received_crc[1]);
212+
#endif /* STSE_FRAME_DEBUG_LOG */
210213

211-
/* ======================================================= */
212-
/* ========= Receive the frame in frame elements ========= */
214+
/* - Verify CRC */
215+
if (computed_crc != ((received_crc[0] << 8) + received_crc[1])) {
216+
return (STSE_SERVICE_FRAME_CRC_ERROR);
217+
}
213218

214-
ret = STSE_PLATFORM_BUS_ACK_ERROR;
215-
while ((retry_count != 0) && (ret == STSE_PLATFORM_BUS_ACK_ERROR)) {
216-
/* - Receive frame length from target STSAFE */
217-
ret = pSTSE->io.BusRecvStart(
218-
pSTSE->io.busID,
219-
pSTSE->io.Devaddr,
220-
pSTSE->io.BusSpeed,
221-
STSE_FRAME_LENGTH_SIZE + received_length + STSE_FRAME_CRC_SIZE);
219+
ret = (stse_ReturnCode_t)(received_header & STSE_STSAFEA_RSP_STATUS_MASK);
220+
} else {
221+
/* ======================================================= */
222+
/* ====== Format the frame to handle CRC and filler ====== */
222223

223-
if (ret != STSE_OK) {
224-
retry_count--;
225-
stse_platform_Delay_ms(STSE_POLLING_RETRY_INTERVAL);
224+
/* - Compare STSAFE Received frame length with local RSP Frame length */
225+
if (received_length > pFrame->length) {
226+
/* Calculate needed filler to match both length */
227+
filler_size = received_length - pFrame->length;
228+
}
229+
if (received_length < pFrame->length) {
230+
pFrame->length = received_length;
226231
}
227-
}
228232

229-
/* - Verify correct reception*/
230-
if (ret != STSE_OK) {
231-
return ret;
232-
}
233+
/* Append filler frame element even if its length equal 0 */
234+
PLAT_UI8 filler[filler_size];
235+
stse_frame_element_allocate(eFiller,
236+
filler_size,
237+
filler);
238+
if (filler_size > 0) {
239+
stse_frame_push_element(pFrame,
240+
&eFiller);
241+
}
233242

234-
/* Receive response header */
235-
ret = pSTSE->io.BusRecvContinue(
236-
pSTSE->io.busID,
237-
pSTSE->io.Devaddr,
238-
pSTSE->io.BusSpeed,
239-
pFrame->first_element->pData,
240-
STSE_RSP_FRAME_HEADER_SIZE);
243+
/* ======================================================= */
244+
/* ========= Receive the frame in frame elements ========= */
245+
246+
ret = STSE_PLATFORM_BUS_ACK_ERROR;
247+
while ((retry_count != 0) && (ret == STSE_PLATFORM_BUS_ACK_ERROR)) {
248+
/* - Receive frame length from target STSAFE */
249+
ret = pSTSE->io.BusRecvStart(
250+
pSTSE->io.busID,
251+
pSTSE->io.Devaddr,
252+
pSTSE->io.BusSpeed,
253+
STSE_FRAME_LENGTH_SIZE + received_length + STSE_FRAME_CRC_SIZE);
254+
255+
if (ret != STSE_OK) {
256+
retry_count--;
257+
stse_platform_Delay_ms(STSE_POLLING_RETRY_INTERVAL);
258+
}
259+
}
241260

242-
if (ret != STSE_OK) {
243-
return ret;
244-
}
261+
/* - Verify correct reception*/
262+
if (ret != STSE_OK) {
263+
return ret;
264+
}
245265

246-
/* Substract response header already read in STSAFE-A */
247-
received_length -= STSE_RSP_FRAME_HEADER_SIZE;
266+
/* Receive response header */
267+
ret = pSTSE->io.BusRecvContinue(
268+
pSTSE->io.busID,
269+
pSTSE->io.Devaddr,
270+
pSTSE->io.BusSpeed,
271+
pFrame->first_element->pData,
272+
STSE_RSP_FRAME_HEADER_SIZE);
248273

249-
/* Receive and discard length (already stored) */
250-
ret = pSTSE->io.BusRecvContinue(
251-
pSTSE->io.busID,
252-
pSTSE->io.Devaddr,
253-
pSTSE->io.BusSpeed,
254-
NULL,
255-
STSE_FRAME_LENGTH_SIZE);
256-
if (ret != STSE_OK) {
257-
return ret;
258-
}
274+
if (ret != STSE_OK) {
275+
return ret;
276+
}
259277

260-
/* - Append CRC element to the RSP Frame (valid only in Receive Scope) */
261-
stse_frame_element_allocate_push(pFrame, eCRC, STSE_FRAME_CRC_SIZE, received_crc);
278+
/* Substract response header already read in STSAFE-A */
279+
received_length -= STSE_RSP_FRAME_HEADER_SIZE;
262280

263-
/* If first element is longer than just the header */
264-
if (pFrame->first_element->length > STSE_RSP_FRAME_HEADER_SIZE) {
265-
/* Receive missing bytes after discarding the 2 bytes length */
281+
/* Receive and discard length (already stored) */
266282
ret = pSTSE->io.BusRecvContinue(
267283
pSTSE->io.busID,
268284
pSTSE->io.Devaddr,
269285
pSTSE->io.BusSpeed,
270-
pFrame->first_element->pData + STSE_RSP_FRAME_HEADER_SIZE,
271-
pFrame->first_element->length - STSE_RSP_FRAME_HEADER_SIZE);
286+
NULL,
287+
STSE_FRAME_LENGTH_SIZE);
272288
if (ret != STSE_OK) {
273289
return ret;
274290
}
275-
}
276291

277-
/* - Perform frame element reception and populate local RSP Frame */
278-
pCurrent_element = pFrame->first_element->next;
279-
while (pCurrent_element != pFrame->last_element) {
280-
if (received_length < pCurrent_element->length) {
281-
pCurrent_element->length = received_length;
292+
/* - Append CRC element to the RSP Frame (valid only in Receive Scope) */
293+
stse_frame_element_allocate_push(pFrame, eCRC, STSE_FRAME_CRC_SIZE, received_crc);
294+
295+
/* If first element is longer than just the header */
296+
if (pFrame->first_element->length > STSE_RSP_FRAME_HEADER_SIZE) {
297+
/* Receive missing bytes after discarding the 2 bytes length */
298+
ret = pSTSE->io.BusRecvContinue(
299+
pSTSE->io.busID,
300+
pSTSE->io.Devaddr,
301+
pSTSE->io.BusSpeed,
302+
pFrame->first_element->pData + STSE_RSP_FRAME_HEADER_SIZE,
303+
pFrame->first_element->length - STSE_RSP_FRAME_HEADER_SIZE);
304+
if (ret != STSE_OK) {
305+
return ret;
306+
}
282307
}
283-
ret = pSTSE->io.BusRecvContinue(
308+
309+
/* - Perform frame element reception and populate local RSP Frame */
310+
pCurrent_element = pFrame->first_element->next;
311+
while (pCurrent_element != pFrame->last_element) {
312+
if (received_length < pCurrent_element->length) {
313+
pCurrent_element->length = received_length;
314+
}
315+
ret = pSTSE->io.BusRecvContinue(
316+
pSTSE->io.busID,
317+
pSTSE->io.Devaddr,
318+
pSTSE->io.BusSpeed,
319+
pCurrent_element->pData,
320+
pCurrent_element->length);
321+
if (ret != STSE_OK) {
322+
return ret;
323+
}
324+
325+
received_length -= pCurrent_element->length;
326+
pCurrent_element = pCurrent_element->next;
327+
}
328+
329+
ret = pSTSE->io.BusRecvStop(
284330
pSTSE->io.busID,
285331
pSTSE->io.Devaddr,
286332
pSTSE->io.BusSpeed,
@@ -290,48 +336,36 @@ stse_ReturnCode_t stsafea_frame_receive(stse_Handler_t *pSTSE, stse_frame_t *pFr
290336
return ret;
291337
}
292338

293-
received_length -= pCurrent_element->length;
294-
pCurrent_element = pCurrent_element->next;
295-
}
296-
ret = pSTSE->io.BusRecvStop(
297-
pSTSE->io.busID,
298-
pSTSE->io.Devaddr,
299-
pSTSE->io.BusSpeed,
300-
pCurrent_element->pData,
301-
pCurrent_element->length);
302-
if (ret != STSE_OK) {
303-
return ret;
304-
}
305-
306339
#ifdef STSE_FRAME_DEBUG_LOG
307-
printf("\n\r STSAFE Frame < ");
308-
stse_frame_debug_print(pFrame);
309-
printf("\n\r");
340+
printf("\n\r STSAFE Frame < ");
341+
stse_frame_debug_print(pFrame);
342+
printf("\n\r");
310343
#endif /* STSE_FRAME_DEBUG_LOG */
311344

312-
/* - Swap CRC */
313-
stse_frame_element_swap_byte_order(&eCRC);
345+
/* - Swap CRC */
346+
stse_frame_element_swap_byte_order(&eCRC);
314347

315-
/* - Pop CRC element from Frame*/
316-
stse_frame_pop_element(pFrame);
348+
/* - Pop CRC element from Frame*/
349+
stse_frame_pop_element(pFrame);
317350

318-
/* - Compute CRC */
319-
ret = stse_frame_crc16_compute(pFrame, &computed_crc);
320-
if (ret != STSE_OK) {
321-
return ret;
322-
}
351+
/* - Compute CRC */
352+
ret = stse_frame_crc16_compute(pFrame, &computed_crc);
353+
if (ret != STSE_OK) {
354+
return ret;
355+
}
323356

324-
/* - Pop Filler element from Frame*/
325-
if (filler_size > 0) {
326-
stse_frame_pop_element(pFrame);
327-
}
357+
/* - Pop Filler element from Frame*/
358+
if (filler_size > 0) {
359+
stse_frame_pop_element(pFrame);
360+
}
328361

329-
/* - Verify CRC */
330-
if (computed_crc != *(PLAT_UI16 *)received_crc) {
331-
return (STSE_SERVICE_FRAME_CRC_ERROR);
332-
}
362+
/* - Verify CRC */
363+
if (computed_crc != *(PLAT_UI16 *)received_crc) {
364+
return (STSE_SERVICE_FRAME_CRC_ERROR);
365+
}
333366

334-
ret = (stse_ReturnCode_t)(pFrame->first_element->pData[0] & STSE_STSAFEA_RSP_STATUS_MASK);
367+
ret = (stse_ReturnCode_t)(pFrame->first_element->pData[0] & STSE_STSAFEA_RSP_STATUS_MASK);
368+
}
335369

336370
return ret;
337371
}

0 commit comments

Comments
 (0)