Skip to content

Commit 00d2fea

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

File tree

1 file changed

+145
-111
lines changed

1 file changed

+145
-111
lines changed

services/stsafea/stsafea_frame_transfer.c

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

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

147147
if (ret != STSE_OK) {
148148
retry_count--;
@@ -164,7 +164,7 @@ stse_ReturnCode_t stsafea_frame_receive(stse_Handler_t *pSTSE, stse_frame_t *pFr
164164
STSE_RSP_FRAME_HEADER_SIZE);
165165

166166
/* - Get STSAFE Response Length */
167-
ret = pSTSE->io.BusRecvStop(
167+
ret = pSTSE->io.BusRecvContinue(
168168
pSTSE->io.busID,
169169
pSTSE->io.Devaddr,
170170
pSTSE->io.BusSpeed,
@@ -174,6 +174,17 @@ stse_ReturnCode_t stsafea_frame_receive(stse_Handler_t *pSTSE, stse_frame_t *pFr
174174
return ret;
175175
}
176176

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

@@ -188,101 +199,136 @@ stse_ReturnCode_t stsafea_frame_receive(stse_Handler_t *pSTSE, stse_frame_t *pFr
188199
}
189200
}
190201

191-
/* ======================================================= */
192-
/* ====== Format the frame to handle CRC and filler ====== */
202+
if (received_length == 1) {
203+
/* ====================================================== */
204+
/* ====== compute CRC for response without payload ====== */
193205

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

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

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

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

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

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

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

244-
if (ret != STSE_OK) {
245-
return ret;
246-
}
263+
/* - Verify correct reception*/
264+
if (ret != STSE_OK) {
265+
return ret;
266+
}
247267

248-
/* Substract response header already read in STSAFE-A */
249-
received_length -= STSE_RSP_FRAME_HEADER_SIZE;
268+
/* Receive response header */
269+
ret = pSTSE->io.BusRecvContinue(
270+
pSTSE->io.busID,
271+
pSTSE->io.Devaddr,
272+
pSTSE->io.BusSpeed,
273+
pFrame->first_element->pData,
274+
STSE_RSP_FRAME_HEADER_SIZE);
250275

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

262-
/* - Append CRC element to the RSP Frame (valid only in Receive Scope) */
263-
stse_frame_element_allocate_push(pFrame, eCRC, STSE_FRAME_CRC_SIZE, received_crc);
280+
/* Substract response header already read in STSAFE-A */
281+
received_length -= STSE_RSP_FRAME_HEADER_SIZE;
264282

265-
/* If first element is longer than just the header */
266-
if (pFrame->first_element->length > STSE_RSP_FRAME_HEADER_SIZE) {
267-
/* Receive missing bytes after discarding the 2 bytes length */
283+
/* Receive and discard length (already stored) */
268284
ret = pSTSE->io.BusRecvContinue(
269285
pSTSE->io.busID,
270286
pSTSE->io.Devaddr,
271287
pSTSE->io.BusSpeed,
272-
pFrame->first_element->pData + STSE_RSP_FRAME_HEADER_SIZE,
273-
pFrame->first_element->length - STSE_RSP_FRAME_HEADER_SIZE);
288+
NULL,
289+
STSE_FRAME_LENGTH_SIZE);
274290
if (ret != STSE_OK) {
275291
return ret;
276292
}
277-
}
278293

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

295-
received_length -= pCurrent_element->length;
296-
pCurrent_element = pCurrent_element->next;
297-
}
298-
ret = pSTSE->io.BusRecvStop(
299-
pSTSE->io.busID,
300-
pSTSE->io.Devaddr,
301-
pSTSE->io.BusSpeed,
302-
pCurrent_element->pData,
303-
pCurrent_element->length);
304-
if (ret != STSE_OK) {
305-
return ret;
306-
}
307-
308341
#ifdef STSE_FRAME_DEBUG_LOG
309-
printf("\n\r STSAFE Frame < ");
310-
stse_frame_debug_print(pFrame);
311-
printf("\n\r");
342+
printf("\n\r STSAFE Frame < ");
343+
stse_frame_debug_print(pFrame);
344+
printf("\n\r");
312345
#endif /* STSE_FRAME_DEBUG_LOG */
313346

314-
/* - Swap CRC */
315-
stse_frame_element_swap_byte_order(&eCRC);
347+
/* - Swap CRC */
348+
stse_frame_element_swap_byte_order(&eCRC);
316349

317-
/* - Pop CRC element from Frame*/
318-
stse_frame_pop_element(pFrame);
350+
/* - Pop CRC element from Frame*/
351+
stse_frame_pop_element(pFrame);
319352

320-
/* - Compute CRC */
321-
ret = stse_frame_crc16_compute(pFrame, &computed_crc);
322-
if (ret != STSE_OK) {
323-
return ret;
324-
}
353+
/* - Compute CRC */
354+
ret = stse_frame_crc16_compute(pFrame, &computed_crc);
355+
if (ret != STSE_OK) {
356+
return ret;
357+
}
325358

326-
/* - Pop Filler element from Frame*/
327-
if (filler_size > 0) {
328-
stse_frame_pop_element(pFrame);
329-
}
359+
/* - Pop Filler element from Frame*/
360+
if (filler_size > 0) {
361+
stse_frame_pop_element(pFrame);
362+
}
330363

331-
/* - Verify CRC */
332-
if (computed_crc != *(PLAT_UI16 *)received_crc) {
333-
return (STSE_SERVICE_FRAME_CRC_ERROR);
334-
}
364+
/* - Verify CRC */
365+
if (computed_crc != *(PLAT_UI16 *)received_crc) {
366+
return (STSE_SERVICE_FRAME_CRC_ERROR);
367+
}
335368

336-
ret = (stse_ReturnCode_t)(pFrame->first_element->pData[0] & STSE_STSAFEA_RSP_STATUS_MASK);
369+
ret = (stse_ReturnCode_t)(pFrame->first_element->pData[0] & STSE_STSAFEA_RSP_STATUS_MASK);
370+
}
337371

338372
return ret;
339373
}

0 commit comments

Comments
 (0)