@@ -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+
279314static 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