Index: firmware/App/Services/Utilities.c =================================================================== diff -u -rdeef095c63fe86de42a7e052e1b9985b0118b02e -r84f337383202622f14cd6148e26bab8f68333847 --- firmware/App/Services/Utilities.c (.../Utilities.c) (revision deef095c63fe86de42a7e052e1b9985b0118b02e) +++ firmware/App/Services/Utilities.c (.../Utilities.c) (revision 84f337383202622f14cd6148e26bab8f68333847) @@ -5,6 +5,8 @@ * Author: fw */ +#include + #include "Utilities.h" #define SHIFT_8_BITS_FOR_BYTE_SHIFT 8 ///< Number of bits to shift in order to shift a byte @@ -62,4 +64,44 @@ return crc; } +BOOL runFWIntegrityTest( void ) +{ + U32 remainingSize = 0; + U32 currentRecord = 0; ///< Current CRC table record to check. + U32 currentProcessedSize = 0; ///< Current data size processed for CRC calculation. + U32 crcCalculated = 0; ///< The calculated CRC value. + CRC_TABLE const * const crcTablePtr = (CRC_TABLE *)FIRMWARE_CRC_TABLE_ADDRESS; + CRC_RECORD const * currentRecordPtr = &crcTablePtr->recs[ currentRecord ]; + BOOL integrityStatus = TRUE; + + do + { + currentRecordPtr = &crcTablePtr->recs[ currentRecord ]; + + if ( currentRecord < crcTablePtr->num_recs ) + { + remainingSize = currentRecordPtr->size - currentProcessedSize; + + if ( remainingSize > MAX_CRC_CALC_DATA_SIZE ) + { + crcCalculated = crc32( crcCalculated, (U08 *)( currentRecordPtr->addr + currentProcessedSize ), MAX_CRC_CALC_DATA_SIZE ); + currentProcessedSize += MAX_CRC_CALC_DATA_SIZE; + } + else + { + crcCalculated = crc32( crcCalculated, (U08 *)( currentRecordPtr->addr + currentProcessedSize ), remainingSize ); + integrityStatus &= ( ( (U32)currentRecordPtr->crc_value == crcCalculated ) ? TRUE : FALSE ); + crcCalculated = 0; + currentProcessedSize = 0; + currentRecord++; + } + } + } while ( ( currentRecord < crcTablePtr->num_recs ) && ( integrityStatus == TRUE ) ); + + integrityStatus &= (currentRecord == crcTablePtr->num_recs); + + return integrityStatus; +} + +