Index: firmware/App/Common.h =================================================================== diff -u -r9af6fc3e5afc442a877bd5e23ecfa6872a3ad5a4 -r84f337383202622f14cd6148e26bab8f68333847 --- firmware/App/Common.h (.../Common.h) (revision 9af6fc3e5afc442a877bd5e23ecfa6872a3ad5a4) +++ firmware/App/Common.h (.../Common.h) (revision 84f337383202622f14cd6148e26bab8f68333847) @@ -8,8 +8,9 @@ #ifndef __COMMON_H__ #define __COMMON_H__ -#define FIRMWARE_START_ADDRESS 0x00010000 -#define SW_UPDATE_FLASH_BUFFER_SIZE 128 +#define FIRMWARE_START_ADDRESS 0x00010000 +#define FIRMWARE_CRC_TABLE_ADDRESS 0x10020 ///< The starting address of CRC table for firmware image. +#define SW_UPDATE_FLASH_BUFFER_SIZE 128 // **** Types **** Index: firmware/App/Modes/ModeStandby.c =================================================================== diff -u -r9af6fc3e5afc442a877bd5e23ecfa6872a3ad5a4 -r84f337383202622f14cd6148e26bab8f68333847 --- firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 9af6fc3e5afc442a877bd5e23ecfa6872a3ad5a4) +++ firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 84f337383202622f14cd6148e26bab8f68333847) @@ -11,18 +11,18 @@ #include "CommBuffers.h" #include "ModeStandby.h" +#include "NVDataMgmt.h" #include "OperationModes.h" #include "Timers.h" +#include "Utilities.h" #define WAIT_FOR_UPDATE_FROM_UI_MS 1000 static SW_UPDATE_CMD_STATUS_T SWUpdateCmdStatus; static MODE_STANDBY_STATE_T standbyCurrentState; -static U32 waitForUpdateMsgStarTimeMS; +static U32 waitForUpdateMsgStartTimeMS; -static const U32 jumpAd = (U32)FIRMWARE_START_ADDRESS; - static MODE_STANDBY_STATE_T handleStandbyModeCheckForUpdateState( void ); static MODE_STANDBY_STATE_T handleStandbyModeCheckFWAndFPGAImages( void ); static MODE_STANDBY_STATE_T handleStandbyModeIdleState( void ); @@ -33,7 +33,7 @@ void initStandbyMode( void ) { standbyCurrentState = STANDBY_CHECK_FOR_UPDATE_STATE; - waitForUpdateMsgStarTimeMS = getMSTimerCount(); + waitForUpdateMsgStartTimeMS = getMSTimerCount(); memset( &SWUpdateCmdStatus, 0x0, sizeof( SW_UPDATE_CMD_STATUS_T ) ); } @@ -102,7 +102,7 @@ clearSWUpdateBuffer( SW_UPDATE_COMMAD ); - if ( TRUE == didTimeout( waitForUpdateMsgStarTimeMS, 20000 /*WAIT_FOR_UPDATE_FROM_UI_MS*/ ) ) // TODO a high number if timeout for development + if ( TRUE == didTimeout( waitForUpdateMsgStartTimeMS, 3000 /*WAIT_FOR_UPDATE_FROM_UI_MS*/ ) ) // TODO a high number if timeout for development { state = STANDBY_CHECK_FW_AND_FPGA_IMAGES_STATE; } @@ -113,14 +113,17 @@ static MODE_STANDBY_STATE_T handleStandbyModeCheckFWAndFPGAImages( void ) { MODE_STANDBY_STATE_T state = STANDBY_CHECK_FW_AND_FPGA_IMAGES_STATE; - BOOL areImagesOk = FALSE; + BOOL isFirmwareImageValid = FALSE; + BOOL isFPGAImageValid = TRUE; // TODO check this later with FPGA stuff - // TODO check the FW integrity and FPGA version or something else - // TODO for testing only - areImagesOk = TRUE; - // TODO for testing only remove + _disable_IRQ(); + if ( TRUE == isFWCRCTableValid() ) + { + isFirmwareImageValid = runFWIntegrityTest(); + } + _enable_IRQ(); - if ( TRUE == areImagesOk ) + if ( ( TRUE == isFirmwareImageValid ) && ( TRUE == isFPGAImageValid ) ) { // All good, jump to application jumpToApplication(); @@ -146,6 +149,8 @@ static void jumpToApplication( void ) { + U32 jumpAddress = (U32)FIRMWARE_START_ADDRESS; + // TODO uncomment // Disable various memory protections _coreDisableRamEcc_(); @@ -157,7 +162,7 @@ _disable_IRQ_interrupt_(); _disable_FIQ_interrupt_(); - ((void (*)(void))jumpAd)(); + ((void (*)(void))jumpAddress)(); while(1); } Index: firmware/App/Services/NVDataMgmt.c =================================================================== diff -u -r9af6fc3e5afc442a877bd5e23ecfa6872a3ad5a4 -r84f337383202622f14cd6148e26bab8f68333847 --- firmware/App/Services/NVDataMgmt.c (.../NVDataMgmt.c) (revision 9af6fc3e5afc442a877bd5e23ecfa6872a3ad5a4) +++ firmware/App/Services/NVDataMgmt.c (.../NVDataMgmt.c) (revision 84f337383202622f14cd6148e26bab8f68333847) @@ -28,6 +28,9 @@ #define NUM_OF_BYTES_WRITE_TO_FALSH 16 +#define NUM_OF_FIRMWARE_CRC_TABLE_BYTES 1 +#define VALUE_OF_AN_ERASED_FLASH 0xFFFFFFFF + typedef struct Flash_Write_Status { BOOL hasFlashBeenErased; @@ -107,6 +110,24 @@ return status; } +BOOL isFWCRCTableValid( void ) +{ + Fapi_FlashStatusWordType crcVerifyReason; + U32 erasedFlashedValue[ NUM_OF_FIRMWARE_CRC_TABLE_BYTES ]; + + BOOL crcVerifyStatus = FALSE; + + memset( erasedFlashedValue, VALUE_OF_AN_ERASED_FLASH, sizeof( erasedFlashedValue ) ); + + crcVerifyStatus = Fapi_doVerify( (U32*)FIRMWARE_CRC_TABLE_ADDRESS, NUM_OF_FIRMWARE_CRC_TABLE_BYTES, + (U32*)&erasedFlashedValue, &crcVerifyReason ); + while( FAPI_CHECK_FSM_READY_BUSY == Fapi_Status_FsmBusy ); // TODO timeout or count so we wont get stuck here for ever + + crcVerifyStatus = ( Fapi_Status_Success == crcVerifyStatus ? FALSE : TRUE ); + + return crcVerifyStatus; +} + // ********** private functions ********** static BOOL eraseFlashSectors( void ) @@ -161,7 +182,7 @@ } writeVerifyStatus = Fapi_doVerify( (U32*)startAddress, ( SW_UPDATE_FLASH_BUFFER_SIZE / SW_UPDATE_FLASH_BUFFER_SIZE ), - (U32*)&dataRead2Verify, &writeVerifyReason ); + (U32*)&dataRead2Verify, &writeVerifyReason ); while( FAPI_CHECK_FSM_READY_BUSY == Fapi_Status_FsmBusy ); // TODO timeout or count so we wont get stuck here for ever status = ( Fapi_Status_Success == writeVerifyStatus ? TRUE : FALSE ); Index: firmware/App/Services/NVDataMgmt.h =================================================================== diff -u -r9af6fc3e5afc442a877bd5e23ecfa6872a3ad5a4 -r84f337383202622f14cd6148e26bab8f68333847 --- firmware/App/Services/NVDataMgmt.h (.../NVDataMgmt.h) (revision 9af6fc3e5afc442a877bd5e23ecfa6872a3ad5a4) +++ firmware/App/Services/NVDataMgmt.h (.../NVDataMgmt.h) (revision 84f337383202622f14cd6148e26bab8f68333847) @@ -16,4 +16,6 @@ BOOL handleUpdatingFlash( U08* dataToWrite ); +BOOL isFWCRCTableValid( void ); + #endif 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; +} + + Index: firmware/App/Services/Utilities.h =================================================================== diff -u -rdeef095c63fe86de42a7e052e1b9985b0118b02e -r84f337383202622f14cd6148e26bab8f68333847 --- firmware/App/Services/Utilities.h (.../Utilities.h) (revision deef095c63fe86de42a7e052e1b9985b0118b02e) +++ firmware/App/Services/Utilities.h (.../Utilities.h) (revision 84f337383202622f14cd6148e26bab8f68333847) @@ -15,4 +15,6 @@ U32 crc32( U32 initialValue, U08 *address, U32 len ); +BOOL runFWIntegrityTest( void ); + #endif Index: firmware/App/Tasks/TaskBG.c =================================================================== diff -u -r9af6fc3e5afc442a877bd5e23ecfa6872a3ad5a4 -r84f337383202622f14cd6148e26bab8f68333847 --- firmware/App/Tasks/TaskBG.c (.../TaskBG.c) (revision 9af6fc3e5afc442a877bd5e23ecfa6872a3ad5a4) +++ firmware/App/Tasks/TaskBG.c (.../TaskBG.c) (revision 84f337383202622f14cd6148e26bab8f68333847) @@ -29,7 +29,6 @@ getSWUpdateBuffer( dataToWriteToFlash ); status = handleUpdatingFlash( dataToWriteToFlash ); - _enable_IRQ(); ackNackStatus = ( TRUE == status ? ACK : NACK );