Skip to content

Commit 8216e32

Browse files
Klaus H. SorensenMaureenHelm
authored andcommitted
canbus: canopen: program: read flash in 32 byte chunks
Add routine to calculate crc of flash region. Read 32 bytes at a time from flash instead of 4 bytes, for a significant speed up of the flash image crc calculation. Signed-off-by: Klaus H. Sorensen <[email protected]>
1 parent cb24e3c commit 8216e32

File tree

1 file changed

+44
-18
lines changed

1 file changed

+44
-18
lines changed

subsys/canbus/canopen/canopen_program.c

Lines changed: 44 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -276,15 +276,48 @@ static CO_SDO_abortCode_t canopen_odf_1f51(CO_ODF_arg_t *odf_arg)
276276
}
277277

278278
#ifdef CONFIG_BOOTLOADER_MCUBOOT
279+
/** @brief Calculate crc for region in flash
280+
*
281+
* @param flash_area Flash area to read from, must be open
282+
* @offset Offset to read from
283+
* @size Number of bytes to include in calculation
284+
* @pcrc Pointer to uint32_t where crc will be written if return value is 0
285+
*
286+
* @return 0 if successful, negative errno on failure
287+
*/
288+
static int flash_crc(const struct flash_area *flash_area,
289+
off_t offset, size_t size, uint32_t *pcrc)
290+
{
291+
uint32_t crc = 0;
292+
uint8_t buffer[32];
293+
294+
while (size > 0) {
295+
size_t len = MIN(size, sizeof(buffer));
296+
297+
int err = flash_area_read(flash_area, offset, buffer, len);
298+
299+
if (err) {
300+
return err;
301+
}
302+
303+
crc = crc32_ieee_update(crc, buffer, len);
304+
305+
offset += len;
306+
size -= len;
307+
}
308+
309+
*pcrc = crc;
310+
311+
return 0;
312+
}
313+
279314
static CO_SDO_abortCode_t canopen_odf_1f56(CO_ODF_arg_t *odf_arg)
280315
{
281316
const struct flash_area *flash_area;
282317
struct mcuboot_img_header header;
283318
off_t offset = 0;
284319
uint32_t crc = 0;
285-
size_t size;
286320
uint8_t fa_id;
287-
uint32_t data;
288321
uint32_t len;
289322
int err;
290323

@@ -345,25 +378,18 @@ static CO_SDO_abortCode_t canopen_odf_1f56(CO_ODF_arg_t *odf_arg)
345378
return CO_SDO_AB_HW;
346379
}
347380

348-
while (len) {
349-
size = (len >= sizeof(data)) ? sizeof(data) : len;
350-
err = flash_area_read(flash_area, offset, &data, size);
351-
if (err) {
352-
LOG_ERR("failed to read flash (err %d)", err);
353-
CO_errorReport(ctx.em, CO_EM_NON_VOLATILE_MEMORY,
354-
CO_EMC_HARDWARE, err);
355-
flash_area_close(flash_area);
381+
err = flash_crc(flash_area, offset, len, &crc);
356382

357-
CO_LOCK_OD();
358-
return CO_SDO_AB_HW;
359-
}
383+
flash_area_close(flash_area);
360384

361-
crc = crc32_ieee_update(crc, (uint8_t *)&data, size);
362-
len -= size;
363-
offset += size;
364-
}
385+
if (err) {
386+
LOG_ERR("failed to read flash (err %d)", err);
387+
CO_errorReport(ctx.em, CO_EM_NON_VOLATILE_MEMORY,
388+
CO_EMC_HARDWARE, err);
365389

366-
flash_area_close(flash_area);
390+
CO_LOCK_OD();
391+
return CO_SDO_AB_HW;
392+
}
367393

368394
CO_setUint32(odf_arg->data, crc);
369395

0 commit comments

Comments
 (0)