Skip to content

Commit 56758d6

Browse files
TofMassilia13320Grom-
authored andcommitted
[fix][services] optimize STSAFE-A frame reception (to fix emerging from hibernate state due polling)
1 parent b189706 commit 56758d6

1 file changed

Lines changed: 147 additions & 111 deletions

File tree

services/stsafea/stsafea_frame_transfer.c

Lines changed: 147 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,138 @@ 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+
PLAT_UI16 swapped_received_crc = (received_crc[0] << 8) + received_crc[1];
212209

213-
/* ======================================================= */
214-
/* ========= Receive the frame in frame elements ========= */
210+
#ifdef STSE_FRAME_DEBUG_LOG
211+
printf("\n\r STSAFE Frame < (%d-byte) : { 0x%02X } { 0x%02X 0x%02X }\n\r",
212+
received_length + STSE_FRAME_CRC_SIZE,
213+
received_header,
214+
received_crc[0],
215+
received_crc[1]);
216+
#endif /* STSE_FRAME_DEBUG_LOG */
215217

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);
218+
/* - Verify CRC */
219+
if (computed_crc != swapped_received_crc) {
220+
return (STSE_SERVICE_FRAME_CRC_ERROR);
221+
}
224222

225-
if (ret != STSE_OK) {
226-
retry_count--;
227-
stse_platform_Delay_ms(STSE_POLLING_RETRY_INTERVAL);
223+
ret = (stse_ReturnCode_t)(received_header & STSE_STSAFEA_RSP_STATUS_MASK);
224+
} else {
225+
/* ======================================================= */
226+
/* ====== Format the frame to handle CRC and filler ====== */
227+
228+
/* - Compare STSAFE Received frame length with local RSP Frame length */
229+
if (received_length > pFrame->length) {
230+
/* Calculate needed filler to match both length */
231+
filler_size = received_length - pFrame->length;
232+
}
233+
if (received_length < pFrame->length) {
234+
pFrame->length = received_length;
228235
}
229-
}
230236

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

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);
247+
/* ======================================================= */
248+
/* ========= Receive the frame in frame elements ========= */
249+
250+
ret = STSE_PLATFORM_BUS_ACK_ERROR;
251+
while ((retry_count != 0) && (ret == STSE_PLATFORM_BUS_ACK_ERROR)) {
252+
/* - Receive frame length from target STSAFE */
253+
ret = pSTSE->io.BusRecvStart(
254+
pSTSE->io.busID,
255+
pSTSE->io.Devaddr,
256+
pSTSE->io.BusSpeed,
257+
STSE_FRAME_LENGTH_SIZE + received_length + STSE_FRAME_CRC_SIZE);
258+
259+
if (ret != STSE_OK) {
260+
retry_count--;
261+
stse_platform_Delay_ms(STSE_POLLING_RETRY_INTERVAL);
262+
}
263+
}
243264

244-
if (ret != STSE_OK) {
245-
return ret;
246-
}
265+
/* - Verify correct reception*/
266+
if (ret != STSE_OK) {
267+
return ret;
268+
}
247269

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

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-
}
278+
if (ret != STSE_OK) {
279+
return ret;
280+
}
261281

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);
282+
/* Substract response header already read in STSAFE-A */
283+
received_length -= STSE_RSP_FRAME_HEADER_SIZE;
264284

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 */
285+
/* Receive and discard length (already stored) */
268286
ret = pSTSE->io.BusRecvContinue(
269287
pSTSE->io.busID,
270288
pSTSE->io.Devaddr,
271289
pSTSE->io.BusSpeed,
272-
pFrame->first_element->pData + STSE_RSP_FRAME_HEADER_SIZE,
273-
pFrame->first_element->length - STSE_RSP_FRAME_HEADER_SIZE);
290+
NULL,
291+
STSE_FRAME_LENGTH_SIZE);
274292
if (ret != STSE_OK) {
275293
return ret;
276294
}
277-
}
278295

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;
296+
/* - Append CRC element to the RSP Frame (valid only in Receive Scope) */
297+
stse_frame_element_allocate_push(pFrame, eCRC, STSE_FRAME_CRC_SIZE, received_crc);
298+
299+
/* If first element is longer than just the header */
300+
if (pFrame->first_element->length > STSE_RSP_FRAME_HEADER_SIZE) {
301+
/* Receive missing bytes after discarding the 2 bytes length */
302+
ret = pSTSE->io.BusRecvContinue(
303+
pSTSE->io.busID,
304+
pSTSE->io.Devaddr,
305+
pSTSE->io.BusSpeed,
306+
pFrame->first_element->pData + STSE_RSP_FRAME_HEADER_SIZE,
307+
pFrame->first_element->length - STSE_RSP_FRAME_HEADER_SIZE);
308+
if (ret != STSE_OK) {
309+
return ret;
310+
}
284311
}
285-
ret = pSTSE->io.BusRecvContinue(
312+
313+
/* - Perform frame element reception and populate local RSP Frame */
314+
pCurrent_element = pFrame->first_element->next;
315+
while (pCurrent_element != pFrame->last_element) {
316+
if (received_length < pCurrent_element->length) {
317+
pCurrent_element->length = received_length;
318+
}
319+
ret = pSTSE->io.BusRecvContinue(
320+
pSTSE->io.busID,
321+
pSTSE->io.Devaddr,
322+
pSTSE->io.BusSpeed,
323+
pCurrent_element->pData,
324+
pCurrent_element->length);
325+
if (ret != STSE_OK) {
326+
return ret;
327+
}
328+
329+
received_length -= pCurrent_element->length;
330+
pCurrent_element = pCurrent_element->next;
331+
}
332+
333+
ret = pSTSE->io.BusRecvStop(
286334
pSTSE->io.busID,
287335
pSTSE->io.Devaddr,
288336
pSTSE->io.BusSpeed,
@@ -292,48 +340,36 @@ stse_ReturnCode_t stsafea_frame_receive(stse_Handler_t *pSTSE, stse_frame_t *pFr
292340
return ret;
293341
}
294342

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-
308343
#ifdef STSE_FRAME_DEBUG_LOG
309-
printf("\n\r STSAFE Frame < ");
310-
stse_frame_debug_print(pFrame);
311-
printf("\n\r");
344+
printf("\n\r STSAFE Frame < ");
345+
stse_frame_debug_print(pFrame);
346+
printf("\n\r");
312347
#endif /* STSE_FRAME_DEBUG_LOG */
313348

314-
/* - Swap CRC */
315-
stse_frame_element_swap_byte_order(&eCRC);
349+
/* - Swap CRC */
350+
stse_frame_element_swap_byte_order(&eCRC);
316351

317-
/* - Pop CRC element from Frame*/
318-
stse_frame_pop_element(pFrame);
352+
/* - Pop CRC element from Frame*/
353+
stse_frame_pop_element(pFrame);
319354

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

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

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

336-
ret = (stse_ReturnCode_t)(pFrame->first_element->pData[0] & STSE_STSAFEA_RSP_STATUS_MASK);
371+
ret = (stse_ReturnCode_t)(pFrame->first_element->pData[0] & STSE_STSAFEA_RSP_STATUS_MASK);
372+
}
337373

338374
return ret;
339375
}

0 commit comments

Comments
 (0)