Index: firmware/App/Common.h =================================================================== diff -u -r5a58fd72ededee8a718098b53448a2c921c57f49 -r5645305f9349c5c64be5560982bdf1abd5edb0fb --- firmware/App/Common.h (.../Common.h) (revision 5a58fd72ededee8a718098b53448a2c921c57f49) +++ firmware/App/Common.h (.../Common.h) (revision 5645305f9349c5c64be5560982bdf1abd5edb0fb) @@ -17,7 +17,8 @@ #define NUM_OF_FW_STACKS 2 ///< Number of firmware stacks (TD, DD). #define FW_STACKS_RCV_MAIL_BOX_INDEX 0 ///< Firmware stacks table receive mail box index. #define FW_STACKS_RESP_MAIL_BOX_INDEX 1 ///< Firmware stacks table response mail box index. -#define CAN_MESSAGE_FRAME_SIZE 8 ///< CAN message frame size in bytes. +#define CAN_MESSAGE_FRAME_SIZE_BYTES 8 ///< CAN message frame size in bytes. +#define CAN_MESSAGE_FRAME_NIBBLE_BYTES 4 ///< CAN message frame nibble in bytes. #define FIRMWARE_START_ADDRESS 0x00010000 ///< Firmware start address. #define FIRMWARE_CRC_TABLE_ADDRESS 0x10020 ///< The starting address of CRC table for firmware image. #define SW_UPDATE_FLASH_BUFFER_SIZE 256 ///< Software update flash buffer bytes. @@ -100,7 +101,8 @@ SW_UPDATE_TD_UPDATE, // 0x603 ///< Software update TD update mailbox. SW_UPDATE_DD_RESP, // 0x604 ///< Software update DD respond mailbox. SW_UPDATE_DD_UPDATE, // 0x605 ///< Software update DD update mailbox. - SW_UPDATE_TD_BROADCAST, // 0x606 ///< Software update TD broadcast mailbox. + SW_UPDATE_FFU_BROADCAST, // 0x606 ///< Software update Firmware FPGA Updater (FFU) broadcast mailbox. + SW_UPDATE_TD_BROADCAST, // 0x607 ///< Software update TD broadcast mailbox. NUM_OF_SW_UPDATE_MBOXES, ///< Number of software update mailboxes. } SW_UPDATE_CAN_MAIL_BOX_T; Index: firmware/App/Modes/ModeStandby.c =================================================================== diff -u -r5a58fd72ededee8a718098b53448a2c921c57f49 -r5645305f9349c5c64be5560982bdf1abd5edb0fb --- firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 5a58fd72ededee8a718098b53448a2c921c57f49) +++ firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 5645305f9349c5c64be5560982bdf1abd5edb0fb) @@ -19,12 +19,11 @@ // ********** private definitions ********** -#define WAIT_FOR_UPDATE_FROM_UI_MS 1000 ///< Wait for update timeout in milliseconds. +#define WAIT_FOR_UPDATE_FROM_UI_MS 3000 ///< Wait for update timeout in milliseconds. // ********** private data ********** static MODE_STANDBY_STATE_T standbyCurrentState; ///< Standby current state. -static U32 waitForUpdateMsgStartTimeMS; ///< Wait for update start time in milliseconds. // ********** private function prototypes ********** @@ -38,13 +37,12 @@ * @brief * The initStandbyMode function initializes the standby mode. * @details \b Inputs: none - * @details \b Outputs: standbyCurrentState, waitForUpdateMsgStartTimeMS + * @details \b Outputs: standbyCurrentState * @return none *************************************************************************/ void initStandbyMode( void ) { - standbyCurrentState = STANDBY_CHECK_FOR_UPDATE_STATE; - waitForUpdateMsgStartTimeMS = getMSTimerCount(); + standbyCurrentState = STANDBY_CHECK_FOR_UPDATE_STATE; } /*********************************************************************//** @@ -129,7 +127,7 @@ break; } - if ( TRUE == didTimeout( waitForUpdateMsgStartTimeMS, WAIT_FOR_UPDATE_FROM_UI_MS ) ) + if ( TRUE == didTimeout( getLastBroadcastMessageTimeStampMS(), WAIT_FOR_UPDATE_FROM_UI_MS ) ) { state = STANDBY_CHECK_FW_AND_FPGA_IMAGES_STATE; } Index: firmware/App/Modes/ModeUpdate.c =================================================================== diff -u -r5a58fd72ededee8a718098b53448a2c921c57f49 -r5645305f9349c5c64be5560982bdf1abd5edb0fb --- firmware/App/Modes/ModeUpdate.c (.../ModeUpdate.c) (revision 5a58fd72ededee8a718098b53448a2c921c57f49) +++ firmware/App/Modes/ModeUpdate.c (.../ModeUpdate.c) (revision 5645305f9349c5c64be5560982bdf1abd5edb0fb) @@ -134,6 +134,8 @@ switch( dest ) { + // TODO check the image in firmware and then both cases reset the bootloader. + // Come back and wait for the update broadcast for 3 seconds and if not, jump case UPDATE_FPGA: if ( TRUE == isFPGAFlashComplete() ) { Index: firmware/App/Services/CommBuffers.c =================================================================== diff -u -rfc9a9244cf4288ff0623c3e02455ac565bf60cdd -r5645305f9349c5c64be5560982bdf1abd5edb0fb --- firmware/App/Services/CommBuffers.c (.../CommBuffers.c) (revision fc9a9244cf4288ff0623c3e02455ac565bf60cdd) +++ firmware/App/Services/CommBuffers.c (.../CommBuffers.c) (revision 5645305f9349c5c64be5560982bdf1abd5edb0fb) @@ -11,19 +11,19 @@ // ********** private definitions ********** -#define UPDATE_PACKET_SIZE_BYTES ( SW_UPDATE_FLASH_BUFFER_SIZE + CAN_MESSAGE_FRAME_SIZE ) ///< Software update packet size in bytes. +#define UPDATE_PACKET_SIZE_BYTES ( SW_UPDATE_FLASH_BUFFER_SIZE + CAN_MESSAGE_FRAME_SIZE_BYTES ) ///< Software update packet size in bytes. /// Software update buffer structure typedef struct { - U32 SWUpdateNumOfFramesCount; ///< Software update number of frame count. - U32 SWUpdateFrameCount; ///< Software update frame count. - U08 SWUpdateBuffer[ UPDATE_PACKET_SIZE_BYTES ]; ///< Software update buffer. + U32 SWUpdateNumOfFramesCount; ///< Software update number of frame count. + U32 SWUpdateFrameCount; ///< Software update frame count. + U08 SWUpdateBuffer[ UPDATE_PACKET_SIZE_BYTES ]; ///< Software update buffer. } SW_UPDATE_BUFFER_T; // ********** private data ********** -static SW_UPDATE_BUFFER_T SWUpdateBuffer[ NUM_OF_SW_UPDATE_MBOXES ]; ///< Software update buffer array. +static SW_UPDATE_BUFFER_T SWUpdateBuffer[ NUM_OF_SW_UPDATE_MBOXES ]; ///< Software update buffer array. // ********** private function prototypes ******** @@ -67,7 +67,7 @@ U32 currentFrameCount = SWUpdateBuffer[ mailBox ].SWUpdateFrameCount; // Check if the number of bytes is less than the allowed bytes in the mailbox buffer. - if ( ( currentFrameCount * CAN_MESSAGE_FRAME_SIZE ) <= UPDATE_PACKET_SIZE_BYTES ) + if ( ( currentFrameCount * CAN_MESSAGE_FRAME_SIZE_BYTES ) <= UPDATE_PACKET_SIZE_BYTES ) { U32 currentBufferIndex = currentFrameCount * len; @@ -77,6 +77,7 @@ switch ( mailBox ) { case SW_UPDATE_COMMAD: + case SW_UPDATE_FFU_BROADCAST: // A command is only 1 frame of 8 bytes. SWUpdateBuffer[ mailBox ].SWUpdateNumOfFramesCount = NUM_OF_CMD_CAN_FRAMES; break; @@ -93,7 +94,7 @@ // Per the payload length, calculate the number of frames of 8 bytes that are needed to receive the entire update message. // Round up the number of frames with (payload length + 1 can frame (8 bytes) - 1) / 1 can frame (8 bytes) // After calculating the number of frames needed to receive the entire update payload add one more frame for the overhead frame. - SWUpdateBuffer[ mailBox ].SWUpdateNumOfFramesCount = ( updatePayloadLength + CAN_MESSAGE_FRAME_SIZE - 1 ) / CAN_MESSAGE_FRAME_SIZE; + SWUpdateBuffer[ mailBox ].SWUpdateNumOfFramesCount = ( updatePayloadLength + CAN_MESSAGE_FRAME_SIZE_BYTES - 1 ) / CAN_MESSAGE_FRAME_SIZE_BYTES; SWUpdateBuffer[ mailBox ].SWUpdateNumOfFramesCount += 1; } break; @@ -161,6 +162,7 @@ switch ( mailBox ) { case SW_UPDATE_COMMAD: + case SW_UPDATE_FFU_BROADCAST: frameCnt = SWUpdateBuffer[ mailBox ].SWUpdateFrameCount; numOfFramesCnt = SWUpdateBuffer[ mailBox ].SWUpdateNumOfFramesCount; break; Index: firmware/App/Services/Download.c =================================================================== diff -u -r5a58fd72ededee8a718098b53448a2c921c57f49 -r5645305f9349c5c64be5560982bdf1abd5edb0fb --- firmware/App/Services/Download.c (.../Download.c) (revision 5a58fd72ededee8a718098b53448a2c921c57f49) +++ firmware/App/Services/Download.c (.../Download.c) (revision 5645305f9349c5c64be5560982bdf1abd5edb0fb) @@ -9,6 +9,7 @@ #include "NVDataMgmt.h" #include "OperationModes.h" #include "SystemComm.h" +#include "Timers.h" #include "Utilities.h" /** @@ -18,7 +19,7 @@ // ********** private definitions ********** -static const U32 NUM_OF_CAN_BYTES_FOR_UPDATE = SW_UPDATE_FLASH_BUFFER_SIZE + CAN_MESSAGE_FRAME_SIZE; ///< Number of CAN bytes for update. +static const U32 NUM_OF_CAN_BYTES_FOR_UPDATE = SW_UPDATE_FLASH_BUFFER_SIZE + CAN_MESSAGE_FRAME_SIZE_BYTES; ///< Number of CAN bytes for update. // ********** private data ********** @@ -57,16 +58,26 @@ SW_UPDATE_CMD_T cmd; ///< Software update command (e.g. update, verify) } SW_UPDATE_SPECS_T; +/// Software update firmware FPGA broadcast status structure +typedef struct +{ + U16 msgID; ///< Message ID. + U16 reserved; ///< Reserved space. + U32 msgCRC; ///< Message CRC. +} SW_UPDATE_FFU_BROADCAST_STATUS_T; + static SW_UPDATE_RCV_STATUS_T SWUpdateRCVStatus; ///< Software update receive status. -static U32 fpgaPayloadLengthBytes; ///< FPGA payload lenght in bytes. +static U32 fpgaPayloadLengthBytes; ///< FPGA payload length in bytes. static SW_UPDATE_SPECS_T SWUpdateSpecs; ///< Software update specifications. +static U32 SWUpdateLastBroadcastTimeMS; ///< Software update last broadcast time stamp in milliseconds. static U32 REMOVETHEVAR = 0; // TODO remove // ********** private function prototypes ********** static void handleIncomingCmdMessage( SW_UPDATE_CAN_MAIL_BOX_T mailBox ); static void handleIncomingUpdateMessage( SW_UPDATE_CAN_MAIL_BOX_T mailBox ); +static void handleIncomingBroadcastMessage( SW_UPDATE_CAN_MAIL_BOX_T mailBox ); static void prepareAndSendFWResponseMessage( U16 respOfMsgID, ACK_NACK_STATUS_T ackNack ); static void clearSWUpdateBuffer( void ); static ACK_NACK_STATUS_T handleFirmwareUpdate( void ); @@ -83,6 +94,8 @@ { clearSWUpdateBuffer(); clearSWUpdateSpecs(); + // Initialize the last broadcast to a value to make sure it does not timeout immediately. + SWUpdateLastBroadcastTimeMS = getMSTimerCount(); } /*********************************************************************//** @@ -98,6 +111,7 @@ handleIncomingCmdMessage( SW_UPDATE_COMMAD ); handleIncomingUpdateMessage( thisStackMailBox ); + handleIncomingBroadcastMessage( SW_UPDATE_FFU_BROADCAST ); } /*********************************************************************//** @@ -158,6 +172,19 @@ clearCommBuffer( thisStackMailBox ); } +/*********************************************************************//** + * @brief + * The getLastBroadcastMessageTimeStampMS function returns the last software + * update message broadcast in milliseconds. + * @details \b Inputs: SWUpdateLastBroadcastTimeMS + * @details \b Outputs: none + * @return last software update last broadcast time in milliseconds + *************************************************************************/ +U32 getLastBroadcastMessageTimeStampMS( void ) +{ + return SWUpdateLastBroadcastTimeMS; +} + U08 getTempRemoveMSGID() { return SWUpdateRCVStatus.msgID; @@ -281,6 +308,39 @@ /*********************************************************************//** * @brief + * The handleIncomingBroadcastMessage function handles the incoming broadcast + * message from the CAN bus. Once the update message is received and the CRC + * has passed the software update last broadcast time is updated. + * @details \b Inputs: none + * @details \b Outputs: SWUpdateLastBroadcastTimeMS + * @param mailbox of the buffer that has been received + * @return none + *************************************************************************/ +static void handleIncomingBroadcastMessage( SW_UPDATE_CAN_MAIL_BOX_T mailBox ) +{ + if ( TRUE == isMessageComplete( mailBox ) ) + { + SW_UPDATE_FFU_BROADCAST_STATUS_T SWUpdateFFUBroadcastStatus; + + getCommBuffer( mailBox, (U08*)&SWUpdateFFUBroadcastStatus, sizeof( SW_UPDATE_FFU_BROADCAST_STATUS_T ) ); + + BOOL hasCRCPassed = FALSE; + U32 calcCRC = 0; + + calcCRC = crc32( calcCRC, (U08*)&SWUpdateFFUBroadcastStatus, sizeof( SW_UPDATE_FFU_BROADCAST_STATUS_T ) - sizeof( U32 ) ); + hasCRCPassed = ( SWUpdateFFUBroadcastStatus.msgCRC == calcCRC ? TRUE : FALSE ); + + if ( TRUE == hasCRCPassed ) + { + SWUpdateLastBroadcastTimeMS = getMSTimerCount(); + } + + clearCommBuffer( mailBox ); + } +} + +/*********************************************************************//** + * @brief * The prepareAndSendFWResponseMessage function prepares the message body that is * used to respond to the updater app and sends it. * @details \b Inputs: none Index: firmware/App/Services/Download.h =================================================================== diff -u -r5a58fd72ededee8a718098b53448a2c921c57f49 -r5645305f9349c5c64be5560982bdf1abd5edb0fb --- firmware/App/Services/Download.h (.../Download.h) (revision 5a58fd72ededee8a718098b53448a2c921c57f49) +++ firmware/App/Services/Download.h (.../Download.h) (revision 5645305f9349c5c64be5560982bdf1abd5edb0fb) @@ -29,6 +29,8 @@ void sendFPGAAckNackStatus( ACK_NACK_STATUS_T ackNackStatus ); +U32 getLastBroadcastMessageTimeStampMS( void ); + U08 getTempRemoveMSGID(); // TODO remove or make is permanent /**@}*/ Index: firmware/App/Services/SystemComm.c =================================================================== diff -u -r09e6320e3f3c3c973de0b66e5799d710db8cc427 -r5645305f9349c5c64be5560982bdf1abd5edb0fb --- firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 09e6320e3f3c3c973de0b66e5799d710db8cc427) +++ firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 5645305f9349c5c64be5560982bdf1abd5edb0fb) @@ -37,37 +37,40 @@ *************************************************************************/ void handleCANMsgInterrupt( SW_UPDATE_CAN_MAIL_BOX_T mailBox ) { - // TODO do we need check the range of the messages? - // TODO retry? + U08 data[ CAN_MESSAGE_FRAME_SIZE_BYTES ]; - U08 data[ CAN_MESSAGE_FRAME_SIZE ]; - - if ( SW_UPDATE_COMMAD == mailBox ) + switch ( mailBox ) { - if ( FALSE != canIsRxMessageArrived( canREG1, mailBox ) ) - { - U32 result = canGetData( canREG1, mailBox, data ); - - if ( result != 0 ) - { - addToCommBuffer( mailBox, data, CAN_MESSAGE_FRAME_SIZE ); - } - } - } - else - { - if ( RECEIVE_MSG_ID[ BL_STACK_ID ][ FW_STACKS_RCV_MAIL_BOX_INDEX ] == mailBox ) - { + case SW_UPDATE_COMMAD: + case SW_UPDATE_FFU_BROADCAST: + // Check for the command and broadcast messages if ( FALSE != canIsRxMessageArrived( canREG1, mailBox ) ) { U32 result = canGetData( canREG1, mailBox, data ); if ( result != 0 ) { - addToCommBuffer( mailBox, data, CAN_MESSAGE_FRAME_SIZE ); + addToCommBuffer( mailBox, data, CAN_MESSAGE_FRAME_SIZE_BYTES ); } } - } + break; + + default: + // If the update message is received and the update mail box is the mail box for this stack + // then process the message. The rest of the messages are ignored. + if ( RECEIVE_MSG_ID[ BL_STACK_ID ][ FW_STACKS_RCV_MAIL_BOX_INDEX ] == mailBox ) + { + if ( FALSE != canIsRxMessageArrived( canREG1, mailBox ) ) + { + U32 result = canGetData( canREG1, mailBox, data ); + + if ( result != 0 ) + { + addToCommBuffer( mailBox, data, CAN_MESSAGE_FRAME_SIZE_BYTES ); + } + } + } + break; } } Index: firmware/BL.dil =================================================================== diff -u -rfc9a9244cf4288ff0623c3e02455ac565bf60cdd -r5645305f9349c5c64be5560982bdf1abd5edb0fb --- firmware/BL.dil (.../BL.dil) (revision fc9a9244cf4288ff0623c3e02455ac565bf60cdd) +++ firmware/BL.dil (.../BL.dil) (revision 5645305f9349c5c64be5560982bdf1abd5edb0fb) @@ -1,4 +1,4 @@ -# RM46L852PGE 02/07/26 15:26:24 +# RM46L852PGE 03/05/26 15:51:39 # ARCH=RM46L852PGE # @@ -3310,7 +3310,7 @@ DRIVER.CAN.VAR.CAN_1_MESSAGE_45_BOOL_ENA.VALUE=0 DRIVER.CAN.VAR.CAN_1_MESSAGE_37_BOOL_ENA.VALUE=0 DRIVER.CAN.VAR.CAN_1_MESSAGE_29_BOOL_ENA.VALUE=0 -DRIVER.CAN.VAR.CAN_1_MESSAGE_6_INT_ENA.VALUE=0x00000800 +DRIVER.CAN.VAR.CAN_1_MESSAGE_6_INT_ENA.VALUE=0x00000400 DRIVER.CAN.VAR.CAN_1_RAM_PARITY_ENA.VALUE=0x0000000A DRIVER.CAN.VAR.CAN_1_MESSAGE_59_RTR.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_3_MESSAGE_64_DLC.VALUE=8 @@ -4396,7 +4396,7 @@ DRIVER.CAN.VAR.CAN_3_MESSAGE_14_EOB.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_3_MESSAGE_14_DIR.VALUE=0x20000000 DRIVER.CAN.VAR.CAN_1_MESSAGE_6_EOB.VALUE=0x00000080 -DRIVER.CAN.VAR.CAN_1_MESSAGE_6_DIR.VALUE=0x20000000 +DRIVER.CAN.VAR.CAN_1_MESSAGE_6_DIR.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_3_PORT_TX_PULDIS.VALUE=0 DRIVER.CAN.VAR.CAN_3_MESSAGE_61_BOOL_ENA.VALUE=0 DRIVER.CAN.VAR.CAN_3_MESSAGE_53_BOOL_ENA.VALUE=0 Index: firmware/source/can.c =================================================================== diff -u -rfc9a9244cf4288ff0623c3e02455ac565bf60cdd -r5645305f9349c5c64be5560982bdf1abd5edb0fb --- firmware/source/can.c (.../can.c) (revision fc9a9244cf4288ff0623c3e02455ac565bf60cdd) +++ firmware/source/can.c (.../can.c) (revision 5645305f9349c5c64be5560982bdf1abd5edb0fb) @@ -292,8 +292,8 @@ } /* Wait */ canREG1->IF2MSK = 0xC0000000U | (uint32)((uint32)((uint32)0x000007FFU & (uint32)0x000007FFU) << (uint32)18U); - canREG1->IF2ARB = (uint32)0x80000000U | (uint32)0x00000000U | (uint32)0x20000000U | (uint32)((uint32)((uint32)0x606U & (uint32)0x000007FFU) << (uint32)18U); - canREG1->IF2MCTL = 0x00001000U | (uint32)0x00000800U | (uint32)0x00000000U | (uint32)0x00000080U | (uint32)8U; + canREG1->IF2ARB = (uint32)0x80000000U | (uint32)0x00000000U | (uint32)0x00000000U | (uint32)((uint32)((uint32)0x606U & (uint32)0x000007FFU) << (uint32)18U); + canREG1->IF2MCTL = 0x00001000U | (uint32)0x00000400U | (uint32)0x00000000U | (uint32)0x00000080U | (uint32)8U; canREG1->IF2CMD = (uint8) 0xF8U; canREG1->IF2NO = 6U;