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 ); -} -