Index: firmware/App/Common.h =================================================================== diff -u -rdeef095c63fe86de42a7e052e1b9985b0118b02e -r9af6fc3e5afc442a877bd5e23ecfa6872a3ad5a4 --- firmware/App/Common.h (.../Common.h) (revision deef095c63fe86de42a7e052e1b9985b0118b02e) +++ firmware/App/Common.h (.../Common.h) (revision 9af6fc3e5afc442a877bd5e23ecfa6872a3ad5a4) @@ -8,7 +8,8 @@ #ifndef __COMMON_H__ #define __COMMON_H__ -#define SW_UPDATE_FLASH_BUFFER_SIZE 128 +#define FIRMWARE_START_ADDRESS 0x00010000 +#define SW_UPDATE_FLASH_BUFFER_SIZE 128 // **** Types **** @@ -23,28 +24,35 @@ typedef unsigned int BOOL; ///< 32-bit boolean type typedef unsigned char BYTE; ///< 8-bit byte type -typedef enum SW_Mode_POST_States +typedef enum BL_Op_Modes { - MODE_POST_CHECK_FOR_UPDATE = 0, - MODE_POST_VERIFY_IMAGE, - NUM_OF_MODE_POST_STATES -} MODE_POST_STATE_T; + MODE_STAND = 0, + MODE_UPDATE, + NUM_OF_MODES +} BL_OP_MODE_T; +typedef enum SW_Mode_Standby_States +{ + STANDBY_CHECK_FOR_UPDATE_STATE = 0, + STANDBY_CHECK_FW_AND_FPGA_IMAGES_STATE, + STANDBY_IDLE_STATE, + NUM_OF_MODE_STANDBY_STATES +} MODE_STANDBY_STATE_T; + typedef enum SW_Mode_Update_States { - MODE_SW_UPDATE_START = 0, - MODE_SW_UPDATE_UPDATE, - MODE_SW_UPDATE_RESYNC, - MODE_SW_UPDATE_VERIFY, + SW_UPDATE_UPDATE_STATE = 0, + SW_UPDATE_VERIFY_STATE, + SW_UPDATE_ABORT_STATE, NUM_OF_MODE_SW_UPDATE_STATES } MODE_SW_UPDATE_STATE_T; typedef enum SW_Update_Destinations { UPDATE_FIRMWARE = 0, UPDATE_FPGA, - NUM_OF_UPDAT_DESTS -} SW_UPDATE_DESINTATIONS_T; + NUM_OF_UPDATE_DESTS +} SW_UPDATE_DESINTATION_T; typedef enum SW_Update_CAN_Mail_Boxes { @@ -56,9 +64,8 @@ PLACE_HOLDER_TO_REMOVE_CAN, SW_UPDATE_RESP, NUM_OF_SW_UPDATE_MBOXES, -} SW_UPDATE_CAN_MAIL_BOXES_T; +} SW_UPDATE_CAN_MAIL_BOX_T; - /*! Normal Protocol: UI->FW: SwUpdateCommand[cmd=start] @@ -92,8 +99,9 @@ UPDATE_CMD_VERSION, // TODO is this needed? UPDATE_CMD_VERIFIED, UPDATE_CMD_RESYNC, + UPDATE_CMD_IDLE, NUM_OF_UPDATE_CMDS -} SW_UPDATE_CMDS_T; +} SW_UPDATE_CMD_T; typedef enum Ack_Nack { @@ -106,8 +114,15 @@ typedef struct { BOOL isSWUpdateBufferReady; - SW_UPDATE_DESINTATIONS_T dest; + SW_UPDATE_DESINTATION_T dest; } SW_UPDATE_BUFFER_STATUS_T; +typedef struct +{ + U08 msgID; + U08 updateCmd; + U16 cyberRandom; + U32 msgCRC; +} SW_UPDATE_CMD_STATUS_T; #endif Fisheye: Tag 9af6fc3e5afc442a877bd5e23ecfa6872a3ad5a4 refers to a dead (removed) revision in file `firmware/App/Modes/ModeInitPOST.c'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 9af6fc3e5afc442a877bd5e23ecfa6872a3ad5a4 refers to a dead (removed) revision in file `firmware/App/Modes/ModeInitPOST.h'. Fisheye: No comparison available. Pass `N' to diff? Index: firmware/App/Modes/ModeStandby.c =================================================================== diff -u -rdeef095c63fe86de42a7e052e1b9985b0118b02e -r9af6fc3e5afc442a877bd5e23ecfa6872a3ad5a4 --- firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision deef095c63fe86de42a7e052e1b9985b0118b02e) +++ firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 9af6fc3e5afc442a877bd5e23ecfa6872a3ad5a4) @@ -5,4 +5,159 @@ * Author: fw */ +#include "string.h" // for memset +#include "sys_core.h" // To disable RAM and Flash ECC +#include "sys_mpu.h" // To disable MPU +#include "CommBuffers.h" +#include "ModeStandby.h" +#include "OperationModes.h" +#include "Timers.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 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 ); + +static void jumpToApplication( void ); + + +void initStandbyMode( void ) +{ + standbyCurrentState = STANDBY_CHECK_FOR_UPDATE_STATE; + waitForUpdateMsgStarTimeMS = getMSTimerCount(); + + memset( &SWUpdateCmdStatus, 0x0, sizeof( SW_UPDATE_CMD_STATUS_T ) ); +} + +U32 transitionToStandbyMode( void ) +{ + initStandbyMode(); + + return 0; +} + +U32 execStandbyMode( void ) +{ + getSWUpdateCmdStatus( &SWUpdateCmdStatus ); + + // If the bootloader is the standby mode and and update request is received at any time, request a transition to update mode + // TODO what if we are in the check image process, should we transition to update upon the request? + if ( ( UPDATE_CMD_START == (SW_UPDATE_CMD_T)SWUpdateCmdStatus.updateCmd ) /*|| ( TRUE ) This is FPGA update register for later */ ) + { + // TODO check for the FPGA update request register + // TODO if we are here because of the FPGA register, clear it so it won't be called again. + requestNewOperationMode( MODE_UPDATE ); + } + + switch( standbyCurrentState ) + { + case STANDBY_CHECK_FOR_UPDATE_STATE: + standbyCurrentState = handleStandbyModeCheckForUpdateState(); + break; + + case STANDBY_CHECK_FW_AND_FPGA_IMAGES_STATE: + standbyCurrentState = handleStandbyModeCheckFWAndFPGAImages(); + break; + + case STANDBY_IDLE_STATE: + standbyCurrentState = handleStandbyModeIdleState(); + break; + + default: + // Do nothing + break; + } + + return standbyCurrentState; +} + + +static MODE_STANDBY_STATE_T handleStandbyModeCheckForUpdateState( void ) +{ + MODE_STANDBY_STATE_T state = STANDBY_CHECK_FOR_UPDATE_STATE; + + switch ( SWUpdateCmdStatus.updateCmd ) + { + case UPDATE_CMD_ABORT: + state = STANDBY_IDLE_STATE; + break; + + case UPDATE_CMD_VERIFY: + state = STANDBY_CHECK_FW_AND_FPGA_IMAGES_STATE; + break; + + default: + // Do nothing + break; + } + + clearSWUpdateBuffer( SW_UPDATE_COMMAD ); + + if ( TRUE == didTimeout( waitForUpdateMsgStarTimeMS, 20000 /*WAIT_FOR_UPDATE_FROM_UI_MS*/ ) ) // TODO a high number if timeout for development + { + state = STANDBY_CHECK_FW_AND_FPGA_IMAGES_STATE; + } + + return state; +} + +static MODE_STANDBY_STATE_T handleStandbyModeCheckFWAndFPGAImages( void ) +{ + MODE_STANDBY_STATE_T state = STANDBY_CHECK_FW_AND_FPGA_IMAGES_STATE; + BOOL areImagesOk = FALSE; + + // TODO check the FW integrity and FPGA version or something else + // TODO for testing only + areImagesOk = TRUE; + // TODO for testing only remove + + if ( TRUE == areImagesOk ) + { + // All good, jump to application + jumpToApplication(); + } + else + { + // If either of the images (firmware or FPGA) failed, go to the idle state until another update request is received + state = STANDBY_IDLE_STATE; + } + + return state; +} + +static MODE_STANDBY_STATE_T handleStandbyModeIdleState( void ) +{ + MODE_STANDBY_STATE_T state = STANDBY_IDLE_STATE; + + // This state does nothing and waits until another update request is received. This could be because the update was aborted or + // the firmware or FPGA have bad images. So we cannot jump to the application. + + return state; +} + +static void jumpToApplication( void ) +{ + // TODO uncomment + // Disable various memory protections + _coreDisableRamEcc_(); + _coreDisableFlashEcc_(); + _mpuDisable_(); + + // Disable all interrupts + _disable_interrupt_(); + _disable_IRQ_interrupt_(); + _disable_FIQ_interrupt_(); + + ((void (*)(void))jumpAd)(); + while(1); +} + Index: firmware/App/Modes/ModeStandby.h =================================================================== diff -u -rdeef095c63fe86de42a7e052e1b9985b0118b02e -r9af6fc3e5afc442a877bd5e23ecfa6872a3ad5a4 --- firmware/App/Modes/ModeStandby.h (.../ModeStandby.h) (revision deef095c63fe86de42a7e052e1b9985b0118b02e) +++ firmware/App/Modes/ModeStandby.h (.../ModeStandby.h) (revision 9af6fc3e5afc442a877bd5e23ecfa6872a3ad5a4) @@ -8,6 +8,12 @@ #ifndef __MODESTANDBY_H__ #define __MODESTANDBY_H__ +#include "BLCommon.h" +void initStandbyMode( void ); +U32 transitionToStandbyMode( void ); + +U32 execStandbyMode( void ); + #endif Index: firmware/App/Modes/ModeUpdate.c =================================================================== diff -u -rabb9687e52d9db5df1abe7626ba04a6d431ba823 -r9af6fc3e5afc442a877bd5e23ecfa6872a3ad5a4 --- firmware/App/Modes/ModeUpdate.c (.../ModeUpdate.c) (revision abb9687e52d9db5df1abe7626ba04a6d431ba823) +++ firmware/App/Modes/ModeUpdate.c (.../ModeUpdate.c) (revision 9af6fc3e5afc442a877bd5e23ecfa6872a3ad5a4) @@ -5,4 +5,107 @@ * Author: fw */ +#include "CommBuffers.h" #include "ModeUpdate.h" +#include "NVDataMgmt.h" +#include "OperationModes.h" + +static MODE_SW_UPDATE_STATE_T updateCurrentState; + +static MODE_SW_UPDATE_STATE_T handleUpdateModeUpdateState( void ); +static MODE_SW_UPDATE_STATE_T handleUpdateModeVerifyState( void ); +static MODE_SW_UPDATE_STATE_T handleUpdateModeAbortState( void ); + +void initUpdateMode( void ) +{ + updateCurrentState = SW_UPDATE_UPDATE_STATE; +} + +U32 transitionToUpdateMode( void ) +{ + initUpdateMode(); + // Clear the NV status to start from the start address of the firmware + clearSWUpdateNVStatus(); + // TODO clear FPGA clear stuff here + // Clear the command CAN buffer after it got the mode changed to update mode + clearSWUpdateBuffer( SW_UPDATE_COMMAD ); + + return 0; +} + +U32 execUpdateMode( void ) +{ + switch( updateCurrentState ) + { + case SW_UPDATE_UPDATE_STATE: + updateCurrentState = handleUpdateModeUpdateState(); + break; + + case SW_UPDATE_ABORT_STATE: + updateCurrentState = handleUpdateModeAbortState(); + break; + + case SW_UPDATE_VERIFY_STATE: + updateCurrentState = handleUpdateModeVerifyState(); + break; + + default: + // Do nothing + break; + } + + return 0; +} + + +static MODE_SW_UPDATE_STATE_T handleUpdateModeUpdateState( void ) +{ + SW_UPDATE_CMD_STATUS_T SWUpdateCmdStatus; + + MODE_SW_UPDATE_STATE_T state = SW_UPDATE_UPDATE_STATE; + + getSWUpdateCmdStatus( &SWUpdateCmdStatus ); + + switch( SWUpdateCmdStatus.updateCmd ) + { + case UPDATE_CMD_VERIFY: + state = SW_UPDATE_VERIFY_STATE; + break; + + case UPDATE_CMD_ABORT: + state = SW_UPDATE_ABORT_STATE; + break; + + default: + // Do nothing, keep updating + break; + } + + return state; +} + + +static MODE_SW_UPDATE_STATE_T handleUpdateModeVerifyState( void ) +{ + MODE_SW_UPDATE_STATE_T state = SW_UPDATE_VERIFY_STATE; + + requestNewOperationMode( MODE_STAND ); + + return state; +} + +static MODE_SW_UPDATE_STATE_T handleUpdateModeAbortState( void ) +{ + MODE_SW_UPDATE_STATE_T state = SW_UPDATE_ABORT_STATE; + + requestNewOperationMode( MODE_STAND ); + + return state; +} + + + + + + + Index: firmware/App/Modes/ModeUpdate.h =================================================================== diff -u -rabb9687e52d9db5df1abe7626ba04a6d431ba823 -r9af6fc3e5afc442a877bd5e23ecfa6872a3ad5a4 --- firmware/App/Modes/ModeUpdate.h (.../ModeUpdate.h) (revision abb9687e52d9db5df1abe7626ba04a6d431ba823) +++ firmware/App/Modes/ModeUpdate.h (.../ModeUpdate.h) (revision 9af6fc3e5afc442a877bd5e23ecfa6872a3ad5a4) @@ -8,6 +8,12 @@ #ifndef _MODEUPDATE_H__ #define _MODEUPDATE_H__ +#include "BLCommon.h" +void initUpdateMode( void ); +U32 transitionToUpdateMode( void ); + +U32 execUpdateMode( void ); + #endif Index: firmware/App/Modes/OperationModes.c =================================================================== diff -u --- firmware/App/Modes/OperationModes.c (revision 0) +++ firmware/App/Modes/OperationModes.c (revision 9af6fc3e5afc442a877bd5e23ecfa6872a3ad5a4) @@ -0,0 +1,89 @@ +/* + * OperationModes.c + * + * Created on: Aug 9, 2024 + * Author: fw + */ + +#include "ModeStandby.h" +#include "ModeUpdate.h" +#include "OperationModes.h" + + +static BL_OP_MODE_T currentMode; ///< The currently active state of the active mode. +static BL_OP_MODE_T previousMode; +static BL_OP_MODE_T requestedMode; + +static void transitionToNewOperationMode( BL_OP_MODE_T newMode ); + +void initOperationModes( void ) +{ + currentMode = MODE_STAND; + previousMode = MODE_STAND; + requestedMode = MODE_STAND; + + initStandbyMode(); + initUpdateMode(); +} + +void execOperationModes( void ) +{ + if ( requestedMode != currentMode ) + { + previousMode = currentMode; + currentMode = requestedMode; + + transitionToNewOperationMode( currentMode ); + } + + switch ( currentMode ) + { + case MODE_STAND: + execStandbyMode(); + break; + + case MODE_UPDATE: + execUpdateMode(); + break; + + default: + // Do nothing + break; + } +} + +void requestNewOperationMode( BL_OP_MODE_T newMode ) +{ + if ( newMode < NUM_OF_MODES ) + { + requestedMode = newMode; + } +} + + +static void transitionToNewOperationMode( BL_OP_MODE_T newMode ) +{ + switch ( newMode ) + { + case MODE_STAND: + transitionToStandbyMode(); + break; + + case MODE_UPDATE: + transitionToUpdateMode(); + break; + + default: + // Do nothing for now + break; + } +} + + + + + + + + + Index: firmware/App/Modes/OperationModes.h =================================================================== diff -u --- firmware/App/Modes/OperationModes.h (revision 0) +++ firmware/App/Modes/OperationModes.h (revision 9af6fc3e5afc442a877bd5e23ecfa6872a3ad5a4) @@ -0,0 +1,19 @@ +/* + * OperationModes.h + * + * Created on: Aug 9, 2024 + * Author: fw + */ + +#ifndef __OPERATIONMODES_H__ +#define __OPERATIONMODES_H__ + +#include "BLCommon.h" + +void initOperationModes( void ); + +void execOperationModes( void ); + +void requestNewOperationMode( BL_OP_MODE_T newMode ); + +#endif Index: firmware/App/Services/CommBuffers.c =================================================================== diff -u -rdeef095c63fe86de42a7e052e1b9985b0118b02e -r9af6fc3e5afc442a877bd5e23ecfa6872a3ad5a4 --- firmware/App/Services/CommBuffers.c (.../CommBuffers.c) (revision deef095c63fe86de42a7e052e1b9985b0118b02e) +++ firmware/App/Services/CommBuffers.c (.../CommBuffers.c) (revision 9af6fc3e5afc442a877bd5e23ecfa6872a3ad5a4) @@ -11,20 +11,12 @@ #include "CommBuffers.h" #include "Utilities.h" -#define NUM_OF_FW_STACKS 3 -#define CAN_MESSAGE_PAYLOAD_SIZE 8 -#define SW_UPDATE_FINAL_MSG_INDEX 0xFFFF +#define NUM_OF_FW_STACKS 3 +#define CAN_MESSAGE_PAYLOAD_SIZE 8 +#define SW_UPDATE_FINAL_MSG_INDEX 0xFFFF typedef struct { - U08 msgID; - U08 updateCmd; - U16 cyberRandom; - U32 msgCRC; -} SW_UPDATE_CMD_STATUS_T; - -typedef struct -{ U32 SWUpdateFrameCount; U08 msgID; U08 updateDest; @@ -43,7 +35,7 @@ static const U32 NUM_OF_CAN_FRAMES_TO_UPDATE = ( SW_UPDATE_FLASH_BUFFER_SIZE + CAN_MESSAGE_PAYLOAD_SIZE ) / CAN_MESSAGE_PAYLOAD_SIZE; -static const SW_UPDATE_CAN_MAIL_BOXES_T RECEIVE_MSG_ID[ NUM_OF_FW_STACKS ] = +static const SW_UPDATE_CAN_MAIL_BOX_T RECEIVE_MSG_ID[ NUM_OF_FW_STACKS ] = { SW_UPDATE_TD_UPDATE, SW_UPDATE_DD_UPDATE, @@ -53,18 +45,21 @@ static SW_UPDATE_CMD_STATUS_T SWUpdateCmdStatus; static SW_UPDATE_RCV_STATUS_T SWUpdateRcvStatus; static SW_UPDATE_BUFFER_STATUS_T SWUpdateBufferStatus; +static SW_UPDATE_CAN_MAIL_BOX_T thisStackMailBox; static void consumeReceivedUpdateCANFrame( U08* data ); static void processReceivedUpdateCANFrame( void ); static void processRecievedCmdCANFrame( U08* data ); void initCommBuffers( void ) { - clearSWUpdateBuffer( TRUE ); - clearSWUpdateBuffer( FALSE ); + thisStackMailBox = RECEIVE_MSG_ID[ BL_STACK_ID ]; + + clearSWUpdateBuffer( SW_UPDATE_COMMAD ); + clearSWUpdateBuffer( thisStackMailBox ); } -void handleCANMsgInterrupt( SW_UPDATE_CAN_MAIL_BOXES_T MailBox ) +void handleCANMsgInterrupt( SW_UPDATE_CAN_MAIL_BOX_T MailBox ) { // TODO do we need check the range of the messages? @@ -84,8 +79,6 @@ } else { - SW_UPDATE_CAN_MAIL_BOXES_T thisStackMailBox = RECEIVE_MSG_ID[ BL_STACK_ID ]; - if ( thisStackMailBox == MailBox ) { if ( FALSE != canIsRxMessageArrived( canREG1, MailBox ) ) @@ -109,37 +102,52 @@ void getSWUpdateBuffer( U08* data ) { - memcpy( data, &SWUpdateRcvStatus.SWUpdateBuffer, sizeof( SWUpdateRcvStatus.SWUpdateBuffer ) ); + memcpy( data, SWUpdateRcvStatus.SWUpdateBuffer, sizeof( SWUpdateRcvStatus.SWUpdateBuffer ) ); } -void sendAckNackStatusFromFirmware( ACK_NACK_STATUS_T status, BOOL cmd ) +void getSWUpdateCmdStatus( SW_UPDATE_CMD_STATUS_T* status ) { + memcpy( status, &SWUpdateCmdStatus, sizeof( SW_UPDATE_CMD_STATUS_T ) ); +} + +void sendAckNackStatusFromFirmware( ACK_NACK_STATUS_T status, SW_UPDATE_CAN_MAIL_BOX_T mailBox ) +{ SW_UPDATE_RESP_STATUS_T resp; U32 calcCRC = 0; - resp.msgID = ( TRUE == cmd ? SWUpdateCmdStatus.msgID : SWUpdateRcvStatus.msgID ); + resp.msgID = ( SW_UPDATE_COMMAD == mailBox ? SWUpdateCmdStatus.msgID : SWUpdateRcvStatus.msgID ); resp.msgAckNackStatus = status; resp.cyberRandom = 0; resp.msgCRC = crc32( calcCRC, (U08*)&resp, sizeof( SW_UPDATE_RESP_STATUS_T ) - sizeof( U32 ) ); if ( 0 != canTransmit( canREG1, (U32)SW_UPDATE_RESP, (U08*)&resp ) ) { - clearSWUpdateBuffer( cmd ); + //clearSWUpdateBuffer( mailBox ); } } -void clearSWUpdateBuffer( BOOL cmd ) +void clearSWUpdateBuffer( SW_UPDATE_CAN_MAIL_BOX_T mailBox ) { - if ( FALSE == cmd ) + switch ( mailBox ) { - memset( &SWUpdateRcvStatus, 0x0, sizeof( SW_UPDATE_RCV_STATUS_T ) ); - memset( &SWUpdateBufferStatus, 0x0, sizeof( SW_UPDATE_BUFFER_STATUS_T ) ); + case SW_UPDATE_COMMAD: + memset( &SWUpdateCmdStatus, 0x0, sizeof( SW_UPDATE_CMD_STATUS_T ) ); + // After setting the buffer to 0 set the command status to idle since the 0 is start, so the standby mode does not transition to update mode + SWUpdateCmdStatus.updateCmd = UPDATE_CMD_IDLE; + break; + + case SW_UPDATE_TD_UPDATE: + case SW_UPDATE_DD_UPDATE: + case SW_UPDATE_RO_UPDATE: + memset( &SWUpdateRcvStatus, 0x0, sizeof( SW_UPDATE_RCV_STATUS_T ) ); + memset( &SWUpdateBufferStatus, 0x0, sizeof( SW_UPDATE_BUFFER_STATUS_T ) ); + break; + + default: + // Do nothing, no other buffers need to be cleared + break; } - else - { - memset( &SWUpdateCmdStatus, 0x0, sizeof( SW_UPDATE_CMD_STATUS_T ) ); - } } @@ -199,8 +207,8 @@ } else { - sendAckNackStatusFromFirmware( ACK, FALSE ); - clearSWUpdateBuffer( FALSE ); + sendAckNackStatusFromFirmware( ACK, thisStackMailBox ); + clearSWUpdateBuffer( thisStackMailBox ); } break; @@ -235,6 +243,6 @@ hasCRCPassed = ( SWUpdateRcvStatus.msgCRC == calcCRC ? TRUE : FALSE ); ackStatus = ( TRUE == hasCRCPassed ? ACK : NACK ); - sendAckNackStatusFromFirmware( ackStatus, TRUE ); + sendAckNackStatusFromFirmware( ackStatus, SW_UPDATE_COMMAD ); } Index: firmware/App/Services/CommBuffers.h =================================================================== diff -u -rf2652e85c8676d0356fea2690cfd9cac716ca795 -r9af6fc3e5afc442a877bd5e23ecfa6872a3ad5a4 --- firmware/App/Services/CommBuffers.h (.../CommBuffers.h) (revision f2652e85c8676d0356fea2690cfd9cac716ca795) +++ firmware/App/Services/CommBuffers.h (.../CommBuffers.h) (revision 9af6fc3e5afc442a877bd5e23ecfa6872a3ad5a4) @@ -12,14 +12,16 @@ void initCommBuffers( void ); -void handleCANMsgInterrupt( SW_UPDATE_CAN_MAIL_BOXES_T MailBox ); +void handleCANMsgInterrupt( SW_UPDATE_CAN_MAIL_BOX_T MailBox ); void getSWUpdateBufferStatus( SW_UPDATE_BUFFER_STATUS_T* status ); void getSWUpdateBuffer( U08* data ); -void sendAckNackStatusFromFirmware( ACK_NACK_STATUS_T status, BOOL cmd ); +void getSWUpdateCmdStatus( SW_UPDATE_CMD_STATUS_T* status ); -void clearSWUpdateBuffer( BOOL cmd ); +void sendAckNackStatusFromFirmware( ACK_NACK_STATUS_T status, SW_UPDATE_CAN_MAIL_BOX_T mailBox ); +void clearSWUpdateBuffer( SW_UPDATE_CAN_MAIL_BOX_T mailBox ); + #endif Index: firmware/App/Services/Interrupts.c =================================================================== diff -u -r850f8042a02fd17ee53b8db24bc2e3d17bbb9c7f -r9af6fc3e5afc442a877bd5e23ecfa6872a3ad5a4 --- firmware/App/Services/Interrupts.c (.../Interrupts.c) (revision 850f8042a02fd17ee53b8db24bc2e3d17bbb9c7f) +++ firmware/App/Services/Interrupts.c (.../Interrupts.c) (revision 9af6fc3e5afc442a877bd5e23ecfa6872a3ad5a4) @@ -50,6 +50,6 @@ { if ( node == canREG1 ) { - handleCANMsgInterrupt( (SW_UPDATE_CAN_MAIL_BOXES_T)messageBox ); + handleCANMsgInterrupt( (SW_UPDATE_CAN_MAIL_BOX_T)messageBox ); } } Index: firmware/App/Services/Interrupts.h =================================================================== diff -u -rabb9687e52d9db5df1abe7626ba04a6d431ba823 -r9af6fc3e5afc442a877bd5e23ecfa6872a3ad5a4 --- firmware/App/Services/Interrupts.h (.../Interrupts.h) (revision abb9687e52d9db5df1abe7626ba04a6d431ba823) +++ firmware/App/Services/Interrupts.h (.../Interrupts.h) (revision 9af6fc3e5afc442a877bd5e23ecfa6872a3ad5a4) @@ -10,5 +10,4 @@ void initInterrupts( void ); - #endif Index: firmware/App/Services/NVDataMgmt.c =================================================================== diff -u -rda12d1065b9bc93d30500255d8b986f00d1bdd69 -r9af6fc3e5afc442a877bd5e23ecfa6872a3ad5a4 --- firmware/App/Services/NVDataMgmt.c (.../NVDataMgmt.c) (revision da12d1065b9bc93d30500255d8b986f00d1bdd69) +++ firmware/App/Services/NVDataMgmt.c (.../NVDataMgmt.c) (revision 9af6fc3e5afc442a877bd5e23ecfa6872a3ad5a4) @@ -11,15 +11,18 @@ #include "NVDataMgmt.h" +/* + * TODO + * 1. Clean up the flash with the bad data packets + * 2. Reset the counter to start the write from 0x10000 + */ + #define BANK0_NUM_OF_SECTORS 16 #define FLOAT_TO_INT_ROUNDUP_OFFSET 0.5F ///< Offset to add to a floating point value for rounding rounding when converting to integer #define ROUNDED_HCLK_FREQ ((HCLK_FREQ) < 0.0F ? (S32)((HCLK_FREQ) - FLOAT_TO_INT_ROUNDUP_OFFSET) : \ (S32)((HCLK_FREQ) + FLOAT_TO_INT_ROUNDUP_OFFSET)) ///< Rounded HCLK for flash clock. -#define FIRMWARE_START_ADDRESS 0x00010000 -#define MAX_FALSH_WRITE_BUFFER_BYTES 16U // TODO remove ///< Max allowed bytes for an EEPROM write (16 bytes). - /// EEPROM functions use the buffer length as the size of U32. So before send the length to any of FAPI functions, it should be divided by 4. #define EEPROM_OPS_SIZE_OF_CONVERTER 4 @@ -70,12 +73,16 @@ { Fapi_initializeFlashBanks( ROUNDED_HCLK_FREQ ); Fapi_setActiveFlashBank( Fapi_FlashBank0 ); - Fapi_enableMainBankSectors(0xFFFF); /* used for API 2.01*/ + Fapi_enableMainBankSectors( 0xFFFF ); /* used for API 2.01*/ while( FAPI_CHECK_FSM_READY_BUSY != Fapi_Status_FsmReady ); + clearSWUpdateNVStatus(); +} + +void clearSWUpdateNVStatus( void ) +{ SWUpdateFlashStatus.hasFlashBeenErased = FALSE; SWUpdateFlashStatus.currentWriteAddress = FIRMWARE_START_ADDRESS; - } BOOL handleUpdatingFlash( U08* dataToWrite ) @@ -84,16 +91,17 @@ if ( FALSE == SWUpdateFlashStatus.hasFlashBeenErased ) { - BOOL eraseStatus = FALSE; + // TODO what should we do if the erase failed? try again? + SWUpdateFlashStatus.hasFlashBeenErased = eraseFlashSectors(); - eraseStatus = eraseFlashSectors(); - SWUpdateFlashStatus.hasFlashBeenErased = ( TRUE == eraseStatus ? TRUE : FALSE ); - - writeFlashSectors( dataToWrite ); + if ( TRUE == SWUpdateFlashStatus.hasFlashBeenErased ) + { + status = writeFlashSectors( dataToWrite ); + } } else { - writeFlashSectors( dataToWrite ); + status = writeFlashSectors( dataToWrite ); } return status; @@ -154,7 +162,7 @@ writeVerifyStatus = Fapi_doVerify( (U32*)startAddress, ( SW_UPDATE_FLASH_BUFFER_SIZE / SW_UPDATE_FLASH_BUFFER_SIZE ), (U32*)&dataRead2Verify, &writeVerifyReason ); - while( FAPI_CHECK_FSM_READY_BUSY == Fapi_Status_FsmBusy ); + 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 -rda12d1065b9bc93d30500255d8b986f00d1bdd69 -r9af6fc3e5afc442a877bd5e23ecfa6872a3ad5a4 --- firmware/App/Services/NVDataMgmt.h (.../NVDataMgmt.h) (revision da12d1065b9bc93d30500255d8b986f00d1bdd69) +++ firmware/App/Services/NVDataMgmt.h (.../NVDataMgmt.h) (revision 9af6fc3e5afc442a877bd5e23ecfa6872a3ad5a4) @@ -12,6 +12,8 @@ void initNVDataMgmt( void ); +void clearSWUpdateNVStatus( void ); + BOOL handleUpdatingFlash( U08* dataToWrite ); #endif Index: firmware/App/Tasks/TaskBG.c =================================================================== diff -u -rda12d1065b9bc93d30500255d8b986f00d1bdd69 -r9af6fc3e5afc442a877bd5e23ecfa6872a3ad5a4 --- firmware/App/Tasks/TaskBG.c (.../TaskBG.c) (revision da12d1065b9bc93d30500255d8b986f00d1bdd69) +++ firmware/App/Tasks/TaskBG.c (.../TaskBG.c) (revision 9af6fc3e5afc442a877bd5e23ecfa6872a3ad5a4) @@ -8,29 +8,33 @@ #include "CommBuffers.h" #include "NVDataMgmt.h" -static SW_UPDATE_BUFFER_STATUS_T bufferStatus; - void taskBackground( void ) { #ifndef _VECTORCAST_ // Cannot have infinite loop in unit test tool while ( 1 ) #endif { + SW_UPDATE_BUFFER_STATUS_T bufferStatus; + getSWUpdateBufferStatus( &bufferStatus ); if ( ( TRUE == bufferStatus.isSWUpdateBufferReady ) && ( UPDATE_FIRMWARE == bufferStatus.dest ) ) { _disable_IRQ(); U08 dataToWriteToFlash[ SW_UPDATE_FLASH_BUFFER_SIZE ]; + ACK_NACK_STATUS_T ackNackStatus; + BOOL status = FALSE; + getSWUpdateBuffer( dataToWriteToFlash ); - handleUpdatingFlash( dataToWriteToFlash ); + status = handleUpdatingFlash( dataToWriteToFlash ); _enable_IRQ(); - sendAckNackStatusFromFirmware( ACK, FALSE ); - clearSWUpdateBuffer( FALSE ); + ackNackStatus = ( TRUE == status ? ACK : NACK ); + sendAckNackStatusFromFirmware( ackNackStatus, SW_UPDATE_TD_UPDATE ); + clearSWUpdateBuffer( SW_UPDATE_TD_UPDATE ); } } } Index: firmware/App/Tasks/TaskGeneral.c =================================================================== diff -u -r850f8042a02fd17ee53b8db24bc2e3d17bbb9c7f -r9af6fc3e5afc442a877bd5e23ecfa6872a3ad5a4 --- firmware/App/Tasks/TaskGeneral.c (.../TaskGeneral.c) (revision 850f8042a02fd17ee53b8db24bc2e3d17bbb9c7f) +++ firmware/App/Tasks/TaskGeneral.c (.../TaskGeneral.c) (revision 9af6fc3e5afc442a877bd5e23ecfa6872a3ad5a4) @@ -6,9 +6,10 @@ */ #include "BLCommon.h" +#include "OperationModes.h" #include "TaskGeneral.h" void taskGeneral( void ) { - BOOL test; + execOperationModes(); } Index: firmware/App/Tasks/TaskTimer.c =================================================================== diff -u -r850f8042a02fd17ee53b8db24bc2e3d17bbb9c7f -r9af6fc3e5afc442a877bd5e23ecfa6872a3ad5a4 --- firmware/App/Tasks/TaskTimer.c (.../TaskTimer.c) (revision 850f8042a02fd17ee53b8db24bc2e3d17bbb9c7f) +++ firmware/App/Tasks/TaskTimer.c (.../TaskTimer.c) (revision 9af6fc3e5afc442a877bd5e23ecfa6872a3ad5a4) @@ -7,10 +7,11 @@ #include "BLCommon.h" #include "TaskTimer.h" +#include "Timers.h" void taskTimer( void ) { - BOOL tst; + incMSTimerCount(); } Index: firmware/source/sys_main.c =================================================================== diff -u -rda12d1065b9bc93d30500255d8b986f00d1bdd69 -r9af6fc3e5afc442a877bd5e23ecfa6872a3ad5a4 --- firmware/source/sys_main.c (.../sys_main.c) (revision da12d1065b9bc93d30500255d8b986f00d1bdd69) +++ firmware/source/sys_main.c (.../sys_main.c) (revision 9af6fc3e5afc442a877bd5e23ecfa6872a3ad5a4) @@ -64,6 +64,7 @@ #include "CommBuffers.h" #include "Interrupts.h" #include "NVDataMgmt.h" +#include "OperationModes.h" #include "TaskBG.h" #include "Timers.h" /* USER CODE END */ @@ -106,6 +107,7 @@ initCommBuffers(); initInterrupts(); initNVDataMgmt(); + initOperationModes(); initTimers(); } @@ -115,8 +117,6 @@ rtiInit(); rtiEnableNotification( rtiNOTIFICATION_COMPARE0 | rtiNOTIFICATION_COMPARE1 | rtiNOTIFICATION_COMPARE3 ); rtiStartCounter( rtiCOUNTER_BLOCK0 ); - // The timer task requires FIQ enabled - _enable_FIQ(); // The general and priority tasks require IRQ enabled _enable_IRQ(); }