Index: firmware/App/Common.h =================================================================== diff -u -r3a0dc476f0f42bb7ebadc7d6109a0b5b6581cce4 -r893caf9f58a08a2bd31068806e09603041d64add --- firmware/App/Common.h (.../Common.h) (revision 3a0dc476f0f42bb7ebadc7d6109a0b5b6581cce4) +++ firmware/App/Common.h (.../Common.h) (revision 893caf9f58a08a2bd31068806e09603041d64add) @@ -8,7 +8,10 @@ #ifndef __COMMON_H__ #define __COMMON_H__ +#include "BLCommon.h" + #define NUM_OF_FW_STACKS 3 +#define CAN_MESSAGE_PAYLOAD_SIZE 8 #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 @@ -17,13 +20,14 @@ #define SHIFT_8_BITS_FOR_BYTE_SHIFT 8 ///< Number of bits to shift in order to shift a byte #define MASK_OFF_NIBBLE_MSB 0x0F ///< Bits to mask off the most significant nibble of a byte +#define NUM_OF_CMD_CAN_FRAMES 1 + #define GET_LSB_OF_WORD(w) ((U08)((w) & MASK_OFF_MSB)) ///< Macro returns the least signficant byte of a 2-byte word #define GET_MSB_OF_WORD(w) ((U08)(((w) >> SHIFT_8_BITS_FOR_BYTE_SHIFT) & MASK_OFF_MSB)) ///< Macro returns the most signficant byte of a 2-byte word #define MAKE_WORD_OF_BYTES(h, l) ((((U16)(h) << SHIFT_8_BITS_FOR_BYTE_SHIFT) & MASK_OFF_LSB) | ((U16)(l) & MASK_OFF_MSB)) ///< Macro merges two bytes into a 2-byte word #define INC_WRAP(v, l, u) ((v) >= (u) ? (l) : ((v) + 1)) ///< Macro increments a value and wraps to a minimum when a maximum is reached - // **** Types **** typedef float F32; ///< 32-bit floating point type @@ -69,11 +73,11 @@ typedef enum SW_Update_CAN_Mail_Boxes { - SW_UPDATE_NOT_USED = 0, // 0 - SW_UPDATE_COMMAD, // 0x601 - SW_UPDATE_TD_UPDATE, // 0x602 - SW_UPDATE_DD_UPDATE, // 0x603 - SW_UPDATE_RO_UPDATE, // 0x604 + SW_UPDATE_NOT_USED = 0, // 0 + SW_UPDATE_COMMAD, // 0x601 + SW_UPDATE_TD_UPDATE, // 0x602 + SW_UPDATE_DD_UPDATE, // 0x603 + SW_UPDATE_RO_UPDATE, // 0x604 PLACE_HOLDER_TO_REMOVE_CAN, // 0x606 SW_UPDATE_RESP, // 0x607 NUM_OF_SW_UPDATE_MBOXES, @@ -123,19 +127,11 @@ NUM_OF_ACK_NACK } ACK_NACK_STATUS_T; - -typedef struct +static const SW_UPDATE_CAN_MAIL_BOX_T RECEIVE_MSG_ID[ NUM_OF_FW_STACKS ] = { - BOOL isSWUpdateBufferReady; - SW_UPDATE_DESINTATION_T dest; -} SW_UPDATE_BUFFER_STATUS_T; + SW_UPDATE_TD_UPDATE, + SW_UPDATE_DD_UPDATE, + SW_UPDATE_RO_UPDATE +}; -typedef struct -{ - U08 msgID; - U08 updateCmd; - U16 cyberRandom; - U32 msgCRC; -} SW_UPDATE_CMD_STATUS_T; - #endif Index: firmware/App/Modes/ModeStandby.c =================================================================== diff -u -rfc4f469fe234371e8f2b9a0625acc66faa6899de -r893caf9f58a08a2bd31068806e09603041d64add --- firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision fc4f469fe234371e8f2b9a0625acc66faa6899de) +++ firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 893caf9f58a08a2bd31068806e09603041d64add) @@ -10,7 +10,7 @@ #include "sys_core.h" // To disable RAM and Flash ECC #include "sys_mpu.h" // To disable MPU -#include "CommBuffers.h" +#include "Download.h" #include "FPGA.h" #include "ModeStandby.h" #include "NVDataMgmt.h" @@ -21,7 +21,6 @@ #define WAIT_FOR_UPDATE_FROM_UI_MS 1000 -static SW_UPDATE_CMD_STATUS_T SWUpdateCmdStatus; static MODE_STANDBY_STATE_T standbyCurrentState; static U32 waitForUpdateMsgStartTimeMS; @@ -34,26 +33,23 @@ void initStandbyMode( void ) { - standbyCurrentState = STANDBY_CHECK_FOR_UPDATE_STATE; + standbyCurrentState = STANDBY_CHECK_FOR_UPDATE_STATE; waitForUpdateMsgStartTimeMS = getMSTimerCount(); - - memset( &SWUpdateCmdStatus, 0x0, sizeof( SW_UPDATE_CMD_STATUS_T ) ); } U32 transitionToStandbyMode( void ) { initStandbyMode(); + clearCommBuffersForNextUpdate(); 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 == hasUpdateBeenRequested() ) ) + if ( ( UPDATE_CMD_START == getSWUpdateCommandState() ) || ( TRUE == hasUpdateBeenRequested() ) ) { // TODO if we are here because of the FPGA register, clear it so it won't be called again. requestNewOperationMode( MODE_UPDATE ); @@ -86,7 +82,7 @@ { MODE_STANDBY_STATE_T state = STANDBY_CHECK_FOR_UPDATE_STATE; - switch ( SWUpdateCmdStatus.updateCmd ) + switch ( getSWUpdateCommandState() ) { case UPDATE_CMD_ABORT: state = STANDBY_IDLE_STATE; @@ -101,8 +97,6 @@ break; } - clearSWUpdateBuffer( SW_UPDATE_COMMAD ); - if ( TRUE == didTimeout( waitForUpdateMsgStartTimeMS, 3000000 /*WAIT_FOR_UPDATE_FROM_UI_MS*/ ) ) // TODO a high number if timeout for development { state = STANDBY_CHECK_FW_AND_FPGA_IMAGES_STATE; Index: firmware/App/Modes/ModeUpdate.c =================================================================== diff -u -r3a0dc476f0f42bb7ebadc7d6109a0b5b6581cce4 -r893caf9f58a08a2bd31068806e09603041d64add --- firmware/App/Modes/ModeUpdate.c (.../ModeUpdate.c) (revision 3a0dc476f0f42bb7ebadc7d6109a0b5b6581cce4) +++ firmware/App/Modes/ModeUpdate.c (.../ModeUpdate.c) (revision 893caf9f58a08a2bd31068806e09603041d64add) @@ -6,6 +6,7 @@ */ #include "CommBuffers.h" +#include "Download.h" #include "ModeUpdate.h" #include "NVDataMgmt.h" #include "OperationModes.h" @@ -27,8 +28,8 @@ // 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 ); + // Got the update command so we are in the update mode. Clear the command + clearSWUpdateCommandState(); return 0; } @@ -60,13 +61,9 @@ 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 ) + switch( getSWUpdateCommandState() ) { case UPDATE_CMD_VERIFY: state = SW_UPDATE_VERIFY_STATE; Index: firmware/App/Services/CommBuffers.c =================================================================== diff -u -r3a0dc476f0f42bb7ebadc7d6109a0b5b6581cce4 -r893caf9f58a08a2bd31068806e09603041d64add --- firmware/App/Services/CommBuffers.c (.../CommBuffers.c) (revision 3a0dc476f0f42bb7ebadc7d6109a0b5b6581cce4) +++ firmware/App/Services/CommBuffers.c (.../CommBuffers.c) (revision 893caf9f58a08a2bd31068806e09603041d64add) @@ -7,243 +7,91 @@ #include // For memcpy -#include "can.h" - #include "CommBuffers.h" #include "Utilities.h" -#define CAN_MESSAGE_PAYLOAD_SIZE 8 -#define SW_UPDATE_FINAL_MSG_INDEX 0xFFFF -#define SHIFT_BITS_TO_GET_TARGET 4 +#define MAX_NUM_OF_CAN_BYTES ( SW_UPDATE_FLASH_BUFFER_SIZE + CAN_MESSAGE_PAYLOAD_SIZE ) - typedef struct { U32 SWUpdateFrameCount; - U08 msgID; - U08 updateDest; - U16 cyberIndex; - U32 msgCRC; - U08 SWUpdateBuffer[ SW_UPDATE_FLASH_BUFFER_SIZE ]; -} SW_UPDATE_RCV_STATUS_T; + U08 SWUpdateBuffer[ MAX_NUM_OF_CAN_BYTES ]; +} SW_UPDATE_BUFFER_T; -typedef struct -{ - U08 msgID; - U08 msgAckNackStatus; - U16 cyberRandom; - U32 msgCRC; -} SW_UPDATE_RESP_STATUS_T; -static const U32 NUM_OF_CAN_FRAMES_TO_UPDATE = ( SW_UPDATE_FLASH_BUFFER_SIZE + CAN_MESSAGE_PAYLOAD_SIZE ) / CAN_MESSAGE_PAYLOAD_SIZE; +static SW_UPDATE_BUFFER_T SWUpdateBuffer[ NUM_OF_SW_UPDATE_MBOXES ]; -static const SW_UPDATE_CAN_MAIL_BOX_T RECEIVE_MSG_ID[ NUM_OF_FW_STACKS ] = -{ - SW_UPDATE_TD_UPDATE, - SW_UPDATE_DD_UPDATE, - SW_UPDATE_RO_UPDATE -}; -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 ) { - thisStackMailBox = RECEIVE_MSG_ID[ BL_STACK_ID ]; + SW_UPDATE_CAN_MAIL_BOX_T mailBox; - clearSWUpdateBuffer( SW_UPDATE_COMMAD ); - clearSWUpdateBuffer( thisStackMailBox ); + for ( mailBox = SW_UPDATE_NOT_USED; mailBox < NUM_OF_SW_UPDATE_MBOXES; mailBox++ ) + { + clearCommBuffer( mailBox ); + } } -void handleCANMsgInterrupt( SW_UPDATE_CAN_MAIL_BOX_T MailBox ) +BOOL addToCommBuffer( SW_UPDATE_CAN_MAIL_BOX_T mailBox, U08* data, U32 len ) { - // TODO do we need check the range of the messages? + BOOL status = FALSE; - U08 data[ CAN_MESSAGE_PAYLOAD_SIZE ]; - - if ( SW_UPDATE_COMMAD == MailBox ) + if ( mailBox < NUM_OF_SW_UPDATE_MBOXES ) { - if ( FALSE != canIsRxMessageArrived( canREG1, MailBox ) ) - { - U32 result = canGetData( canREG1, MailBox, data ); + U32 currentFrameCount = SWUpdateBuffer[ mailBox ].SWUpdateFrameCount; - if ( result != 0 ) - { - processRecievedCmdCANFrame( data ); - } - } - } - else - { - if ( thisStackMailBox == MailBox ) + if ( currentFrameCount <= MAX_NUM_OF_CAN_BYTES ) { - if ( FALSE != canIsRxMessageArrived( canREG1, MailBox ) ) - { - U32 result = canGetData( canREG1, MailBox, data ); + _disable_IRQ(); + U32 currentBufferIndex = currentFrameCount * len; - if ( result != 0 ) - { - consumeReceivedUpdateCANFrame( data ); - } - } + memcpy( SWUpdateBuffer[ mailBox ].SWUpdateBuffer + currentBufferIndex, data, len ); + SWUpdateBuffer[ mailBox ].SWUpdateFrameCount += 1; + status = TRUE; + _enable_IRQ(); } } -} -void getSWUpdateBufferStatus( SW_UPDATE_BUFFER_STATUS_T* status ) -{ - memcpy( status, &SWUpdateBufferStatus, sizeof( SW_UPDATE_BUFFER_STATUS_T ) ); + return status; } -void getSWUpdateBuffer( U08* data ) +BOOL getCommBuffer( SW_UPDATE_CAN_MAIL_BOX_T mailBox, U08* data, U32 len ) { - memcpy( data, SWUpdateRcvStatus.SWUpdateBuffer, sizeof( SWUpdateRcvStatus.SWUpdateBuffer ) ); -} + BOOL status = FALSE; -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 = ( 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 ) ) + if ( ( mailBox <= NUM_OF_SW_UPDATE_MBOXES ) && ( len <= MAX_NUM_OF_CAN_BYTES ) ) { - //clearSWUpdateBuffer( mailBox ); + _disable_IRQ(); + memcpy( data, SWUpdateBuffer[ mailBox ].SWUpdateBuffer, len ); + status = TRUE; + _enable_IRQ(); } -} -void clearSWUpdateBuffer( SW_UPDATE_CAN_MAIL_BOX_T mailBox ) -{ - switch ( mailBox ) - { - 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; - } + return status; } - -// ********** private functions ********** - -static void consumeReceivedUpdateCANFrame( U08* data ) +S32 getNumberOfBytesInBuffer( SW_UPDATE_CAN_MAIL_BOX_T mailBox ) { - if ( SWUpdateRcvStatus.SWUpdateFrameCount <= NUM_OF_CAN_FRAMES_TO_UPDATE ) - { - if ( 0 == SWUpdateRcvStatus.SWUpdateFrameCount ) - { - memcpy( &SWUpdateRcvStatus.msgID, data, sizeof( U08 ) ); - data += sizeof( U08 ); - memcpy( &SWUpdateRcvStatus.updateDest, data, sizeof( U08 ) ); - data += sizeof( U08 ); - memcpy( &SWUpdateRcvStatus.cyberIndex, data, sizeof( U16 ) ); - data += sizeof( U16 ); - memcpy( &SWUpdateRcvStatus.msgCRC, data, sizeof( U32 ) ); - } - else - { - U32 currentBufferIndex = ( SWUpdateRcvStatus.SWUpdateFrameCount - 1 ) * CAN_MESSAGE_PAYLOAD_SIZE; + S32 bytes = -1; - memcpy( SWUpdateRcvStatus.SWUpdateBuffer + currentBufferIndex, data, CAN_MESSAGE_PAYLOAD_SIZE ); - } - - SWUpdateRcvStatus.SWUpdateFrameCount++; - - if ( SWUpdateRcvStatus.SWUpdateFrameCount % NUM_OF_CAN_FRAMES_TO_UPDATE == 0 ) - { - processReceivedUpdateCANFrame(); - } + if ( mailBox < NUM_OF_SW_UPDATE_MBOXES ) + { + bytes = SWUpdateBuffer[ mailBox ].SWUpdateFrameCount * CAN_MESSAGE_PAYLOAD_SIZE; } + + return bytes; } -static void processReceivedUpdateCANFrame( void ) +void clearCommBuffer( SW_UPDATE_CAN_MAIL_BOX_T mailBox ) { - U32 calcCRC = 0; - BOOL hasCRCPassed = FALSE; - - calcCRC = crc32( calcCRC, SWUpdateRcvStatus.SWUpdateBuffer, MAX_CRC_CALC_DATA_SIZE ); - hasCRCPassed = ( SWUpdateRcvStatus.msgCRC == calcCRC ? TRUE : FALSE ); - - // TODO remove - hasCRCPassed = TRUE; - // TODO remove - - if ( TRUE == hasCRCPassed ) + if ( mailBox < NUM_OF_SW_UPDATE_MBOXES ) { - switch ( SWUpdateRcvStatus.updateDest ) - { - case UPDATE_FIRMWARE: - if ( SWUpdateRcvStatus.cyberIndex != SW_UPDATE_FINAL_MSG_INDEX ) - { - SWUpdateBufferStatus.isSWUpdateBufferReady = TRUE; - SWUpdateBufferStatus.dest = UPDATE_FIRMWARE; - } - else - { - sendAckNackStatusFromFirmware( ACK, thisStackMailBox ); - clearSWUpdateBuffer( thisStackMailBox ); - } - break; - - case UPDATE_FPGA: - SWUpdateBufferStatus.isSWUpdateBufferReady = TRUE; - SWUpdateBufferStatus.dest = UPDATE_FPGA; - break; - - default: - // Do nothing - break; - } + memset( &SWUpdateBuffer[ mailBox ], 0x0, sizeof( SW_UPDATE_BUFFER_T ) ); } } -static void processRecievedCmdCANFrame( U08* data ) -{ - ACK_NACK_STATUS_T ackStatus; - U32 calcCRC = 0; - BOOL hasCRCPassed = FALSE; +// ********** private functions ********** - memcpy( &SWUpdateCmdStatus.msgID, data, sizeof( U08 ) ); - data += sizeof( U08 ); - memcpy( &SWUpdateCmdStatus.updateCmd, data, sizeof( U08 ) ); - data += sizeof( U08 ); - memcpy( &SWUpdateCmdStatus.cyberRandom, data, sizeof( U16 ) ); - data += sizeof( U16 ); - memcpy( &SWUpdateCmdStatus.msgCRC, data, sizeof( U32 ) ); - calcCRC = crc32( calcCRC, (U08*)&SWUpdateCmdStatus, sizeof( SW_UPDATE_CMD_STATUS_T ) - sizeof( U32 ) ); - hasCRCPassed = ( SWUpdateRcvStatus.msgCRC == calcCRC ? TRUE : FALSE ); - ackStatus = ( TRUE == hasCRCPassed ? ACK : NACK ); - sendAckNackStatusFromFirmware( ackStatus, SW_UPDATE_COMMAD ); -} - Index: firmware/App/Services/CommBuffers.h =================================================================== diff -u -r9af6fc3e5afc442a877bd5e23ecfa6872a3ad5a4 -r893caf9f58a08a2bd31068806e09603041d64add --- firmware/App/Services/CommBuffers.h (.../CommBuffers.h) (revision 9af6fc3e5afc442a877bd5e23ecfa6872a3ad5a4) +++ firmware/App/Services/CommBuffers.h (.../CommBuffers.h) (revision 893caf9f58a08a2bd31068806e09603041d64add) @@ -12,16 +12,12 @@ void initCommBuffers( void ); -void handleCANMsgInterrupt( SW_UPDATE_CAN_MAIL_BOX_T MailBox ); +BOOL addToCommBuffer( SW_UPDATE_CAN_MAIL_BOX_T mailBox, U08* data, U32 len ); -void getSWUpdateBufferStatus( SW_UPDATE_BUFFER_STATUS_T* status ); +BOOL getCommBuffer( SW_UPDATE_CAN_MAIL_BOX_T mailBox, U08* data, U32 len ); -void getSWUpdateBuffer( U08* data ); +S32 getNumberOfBytesInBuffer( SW_UPDATE_CAN_MAIL_BOX_T mailBox ); -void getSWUpdateCmdStatus( SW_UPDATE_CMD_STATUS_T* status ); +void clearCommBuffer( SW_UPDATE_CAN_MAIL_BOX_T mailBox ); -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/Download.c =================================================================== diff -u --- firmware/App/Services/Download.c (revision 0) +++ firmware/App/Services/Download.c (revision 893caf9f58a08a2bd31068806e09603041d64add) @@ -0,0 +1,208 @@ +/* + * Download.c + * + * Created on: Aug 21, 2024 + * Author: fw + */ + +#include // For memcpy and memset + +#include "CommBuffers.h" +#include "Download.h" +#include "NVDataMgmt.h" +#include "SystemComm.h" +#include "Utilities.h" + +#define SW_UPDATE_FINAL_MSG_INDEX 0xFFFF +#define SHIFT_BITS_TO_GET_TARGET 4 + +static const U32 NUM_OF_CAN_BYTES_FOR_UPDATE = SW_UPDATE_FLASH_BUFFER_SIZE + CAN_MESSAGE_PAYLOAD_SIZE; + +typedef struct +{ + U08 msgID; + U08 msgAckNackStatus; + U16 cyberRandom; + U32 msgCRC; +} SW_UPDATE_RESP_STATUS_T; + +typedef struct +{ + U08 msgID; + U08 updateCmd; + U16 cyberRandom; + U32 msgCRC; +} SW_UPDATE_CMD_STATUS_T; + +typedef struct +{ + U08 msgID; + U08 updateDest; + U16 cyberIndex; + U32 msgCRC; + U08 SWUpdateBuffer[ SW_UPDATE_FLASH_BUFFER_SIZE ]; +} SW_UPDATE_RCV_STATUS_T; + +static SW_UPDATE_RCV_STATUS_T SWUpdateRCVStatus; +static SW_UPDATE_CMD_T SWUpdateCommandState; +static SW_UPDATE_CAN_MAIL_BOX_T thisStackMailBox; + +static void processIncomingCmdMessage( SW_UPDATE_CAN_MAIL_BOX_T mailBox ); +static void processIncomingUpdateMessage( SW_UPDATE_CAN_MAIL_BOX_T mailBox ); +static void prepareResponseMessage( U08 respOfMsgID, ACK_NACK_STATUS_T ackNack, SW_UPDATE_RESP_STATUS_T* respBuffer ); +static void clearSWUpdateBuffer( void ); + + +void initDownload( void ) +{ + thisStackMailBox = RECEIVE_MSG_ID[ BL_STACK_ID ]; + + clearSWUpdateBuffer(); + clearSWUpdateCommandState(); +} + +void execDownload( void ) +{ + processIncomingCmdMessage( SW_UPDATE_COMMAD ); + processIncomingUpdateMessage( thisStackMailBox ); +} + +SW_UPDATE_CMD_T getSWUpdateCommandState( void ) +{ + return SWUpdateCommandState; +} + +void clearSWUpdateCommandState( void ) +{ + SWUpdateCommandState = UPDATE_CMD_IDLE; +} + +void clearCommBuffersForNextUpdate( void ) +{ + clearCommBuffer( SW_UPDATE_COMMAD ); + clearCommBuffer( thisStackMailBox ); +} + +// ********** private functions ********** + +static void processIncomingCmdMessage( SW_UPDATE_CAN_MAIL_BOX_T mailBox ) +{ + SW_UPDATE_CMD_STATUS_T SWUpdateCmdStatus; + + BOOL status = getCommBuffer( mailBox, (U08*)&SWUpdateCmdStatus, sizeof( SW_UPDATE_CMD_STATUS_T ) ); + + if ( ( TRUE == status ) && ( getNumberOfBytesInBuffer( mailBox ) >= CAN_MESSAGE_PAYLOAD_SIZE ) ) + { + SW_UPDATE_RESP_STATUS_T resp; + + BOOL hasCRCPassed = FALSE; + ACK_NACK_STATUS_T ackStatus = NACK; + U32 calcCRC = 0; + U08 msgID = SWUpdateCmdStatus.msgID; + SW_UPDATE_DESINTATION_T dest = (SW_UPDATE_DESINTATION_T)( SWUpdateCmdStatus.updateCmd >> SHIFT_BITS_TO_GET_TARGET ); + + calcCRC = crc32( calcCRC, (U08*)&SWUpdateCmdStatus, MAX_CRC_CALC_DATA_SIZE ); + hasCRCPassed = ( SWUpdateCmdStatus.msgCRC == calcCRC ? TRUE : FALSE ); + + // TODO remove + hasCRCPassed = TRUE; + // TODO remove + + if ( TRUE == hasCRCPassed ) + { + ackStatus = ACK; + SWUpdateCommandState = (SW_UPDATE_CMD_T)( SWUpdateCmdStatus.updateCmd & MASK_OFF_NIBBLE_MSB ); + + if ( UPDATE_FPGA == dest ) + { + // signal FPGA to get ready in parallel + } + } + + prepareResponseMessage( msgID, ackStatus, &resp ); + status = sendAckNackStatusFromFirmware( mailBox, (U08*)&resp ); + + if ( TRUE == status ) + { + clearCommBuffer( mailBox ); + } + } +} + +static void processIncomingUpdateMessage( SW_UPDATE_CAN_MAIL_BOX_T mailBox ) +{ + S32 bytesInBuffer = getNumberOfBytesInBuffer( mailBox ); + + if ( bytesInBuffer >= NUM_OF_CAN_BYTES_FOR_UPDATE ) + { + U32 calcCRC = 0; + BOOL hasCRCPassed = FALSE; + ACK_NACK_STATUS_T ackStatus = NACK; + + getCommBuffer( mailBox, (U08*)&SWUpdateRCVStatus, NUM_OF_CAN_BYTES_FOR_UPDATE ); + + calcCRC = crc32( calcCRC, SWUpdateRCVStatus.SWUpdateBuffer, MAX_CRC_CALC_DATA_SIZE ); + hasCRCPassed = ( SWUpdateRCVStatus.msgCRC == calcCRC ? TRUE : FALSE ); + + // TODO remove + hasCRCPassed = TRUE; + // TODO remove + + if ( TRUE == hasCRCPassed ) + { + SW_UPDATE_RESP_STATUS_T resp; + + BOOL status = FALSE; + + switch ( SWUpdateRCVStatus.updateDest ) + { + case UPDATE_FIRMWARE: + if ( SWUpdateRCVStatus.cyberIndex != SW_UPDATE_FINAL_MSG_INDEX ) + { + _disable_IRQ(); + status = handleUpdatingFlash( SWUpdateRCVStatus.SWUpdateBuffer ); + ackStatus = ( TRUE == status ? ACK : NACK ); + _enable_IRQ(); + } + break; + + case UPDATE_FPGA: + // TODO update FPGA + // TODo FPGA last page done + break; + + default: + // Do nothing + break; + } + + prepareResponseMessage( SWUpdateRCVStatus.msgID, ackStatus, &resp ); + status = sendAckNackStatusFromFirmware( mailBox, (U08*)&resp ); // TODO do we have to retry if send failed? + + if ( TRUE == status ) + { + clearCommBuffer( mailBox ); + } + } + + clearSWUpdateBuffer(); + } +} + +static void prepareResponseMessage( U08 respOfMsgID, ACK_NACK_STATUS_T ackNack, SW_UPDATE_RESP_STATUS_T* respBuffer ) +{ + U32 calcCRC = 0; + + respBuffer->msgID = respOfMsgID; + respBuffer->msgAckNackStatus = ackNack; + respBuffer->cyberRandom = 0; + respBuffer->msgCRC = crc32( calcCRC, (U08*)&respBuffer, sizeof( SW_UPDATE_RESP_STATUS_T ) - sizeof( U32 ) ); +} + +static void clearSWUpdateBuffer( void ) +{ + memset( &SWUpdateRCVStatus, 0x0, sizeof( SW_UPDATE_RCV_STATUS_T ) ); +} + + + Index: firmware/App/Services/Download.h =================================================================== diff -u --- firmware/App/Services/Download.h (revision 0) +++ firmware/App/Services/Download.h (revision 893caf9f58a08a2bd31068806e09603041d64add) @@ -0,0 +1,23 @@ +/* + * Download.h + * + * Created on: Aug 21, 2024 + * Author: fw + */ + +#ifndef __DOWNLOAD_H__ +#define __DOWNLOAD_H__ + +#include "BLCommon.h" + +void initDownload( void ); + +void execDownload( void ); + +SW_UPDATE_CMD_T getSWUpdateCommandState( void ); + +void clearSWUpdateCommandState( void ); + +void clearCommBuffersForNextUpdate( void ); + +#endif Index: firmware/App/Services/Interrupts.c =================================================================== diff -u -rba60692a9ecaf59cb5cb8490f4276917f43bcd01 -r893caf9f58a08a2bd31068806e09603041d64add --- firmware/App/Services/Interrupts.c (.../Interrupts.c) (revision ba60692a9ecaf59cb5cb8490f4276917f43bcd01) +++ firmware/App/Services/Interrupts.c (.../Interrupts.c) (revision 893caf9f58a08a2bd31068806e09603041d64add) @@ -12,8 +12,8 @@ #include "BLCommon.h" #include "Comm.h" -#include "CommBuffers.h" #include "FPGA.h" +#include "SystemComm.h" #include "TaskGeneral.h" #include "TaskPriority.h" #include "TaskTimer.h" Index: firmware/App/Services/SystemComm.c =================================================================== diff -u --- firmware/App/Services/SystemComm.c (revision 0) +++ firmware/App/Services/SystemComm.c (revision 893caf9f58a08a2bd31068806e09603041d64add) @@ -0,0 +1,66 @@ +/* + * SysComm.c + * + * Created on: Aug 20, 2024 + * Author: fw + */ + +#include "can.h" + +#include "CommBuffers.h" +#include "SystemComm.h" + + +void initSystemComm( void ) +{ + +} + +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_PAYLOAD_SIZE ]; + + if ( SW_UPDATE_COMMAD == mailBox ) + { + if ( FALSE != canIsRxMessageArrived( canREG1, mailBox ) ) + { + U32 result = canGetData( canREG1, mailBox, data ); + + if ( result != 0 ) + { + addToCommBuffer( mailBox, data, CAN_MESSAGE_PAYLOAD_SIZE ); + } + } + } + else + { + if ( RECEIVE_MSG_ID[ BL_STACK_ID ] == mailBox ) + { + if ( FALSE != canIsRxMessageArrived( canREG1, mailBox ) ) + { + U32 result = canGetData( canREG1, mailBox, data ); + + if ( result != 0 ) + { + addToCommBuffer( mailBox, data, CAN_MESSAGE_PAYLOAD_SIZE ); + } + } + } + } +} + +BOOL sendAckNackStatusFromFirmware( SW_UPDATE_CAN_MAIL_BOX_T mailBox, U08* data ) +{ + BOOL status = FALSE; + + if ( 0 != canTransmit( canREG1, (U32)SW_UPDATE_RESP, data ) ) + { + status = TRUE; + } + + return status; +} + Index: firmware/App/Services/SystemComm.h =================================================================== diff -u --- firmware/App/Services/SystemComm.h (revision 0) +++ firmware/App/Services/SystemComm.h (revision 893caf9f58a08a2bd31068806e09603041d64add) @@ -0,0 +1,19 @@ +/* + * SysComm.h + * + * Created on: Aug 20, 2024 + * Author: fw + */ + +#ifndef __SYSCOMM_H__ +#define __SYSCOMM_H__ + +#include "BLCommon.h" + +void initSystemComm( void ); + +void handleCANMsgInterrupt( SW_UPDATE_CAN_MAIL_BOX_T mailBox ); + +BOOL sendAckNackStatusFromFirmware( SW_UPDATE_CAN_MAIL_BOX_T mailBox, U08* data ); + +#endif Index: firmware/App/Tasks/TaskBG.c =================================================================== diff -u -r84f337383202622f14cd6148e26bab8f68333847 -r893caf9f58a08a2bd31068806e09603041d64add --- firmware/App/Tasks/TaskBG.c (.../TaskBG.c) (revision 84f337383202622f14cd6148e26bab8f68333847) +++ firmware/App/Tasks/TaskBG.c (.../TaskBG.c) (revision 893caf9f58a08a2bd31068806e09603041d64add) @@ -5,36 +5,16 @@ * Author: fw */ -#include "CommBuffers.h" -#include "NVDataMgmt.h" +#include "Download.h" +#include "TaskBG.h" 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 ); - - status = handleUpdatingFlash( dataToWriteToFlash ); - _enable_IRQ(); - - ackNackStatus = ( TRUE == status ? ACK : NACK ); - sendAckNackStatusFromFirmware( ackNackStatus, SW_UPDATE_TD_UPDATE ); - clearSWUpdateBuffer( SW_UPDATE_TD_UPDATE ); - } + execDownload(); } } Index: firmware/source/sys_main.c =================================================================== diff -u -rf100557efc2f7916054a63bbafb187d8017914d0 -r893caf9f58a08a2bd31068806e09603041d64add --- firmware/source/sys_main.c (.../sys_main.c) (revision f100557efc2f7916054a63bbafb187d8017914d0) +++ firmware/source/sys_main.c (.../sys_main.c) (revision 893caf9f58a08a2bd31068806e09603041d64add) @@ -61,10 +61,12 @@ #include "BLCommon.h" #include "CommBuffers.h" +#include "Download.h" #include "FPGA.h" #include "Interrupts.h" #include "NVDataMgmt.h" #include "OperationModes.h" +#include "SystemComm.h" #include "TaskBG.h" #include "Timers.h" /* USER CODE END */ @@ -105,10 +107,12 @@ static void initSoftware( void ) { initCommBuffers(); + initDownload(); initFPGA(); initInterrupts(); initNVDataMgmt(); initOperationModes(); + initSystemComm(); initTimers(); }