Index: firmware/App/BLCommon.h =================================================================== diff -u -r850f8042a02fd17ee53b8db24bc2e3d17bbb9c7f -rf2652e85c8676d0356fea2690cfd9cac716ca795 --- firmware/App/BLCommon.h (.../BLCommon.h) (revision 850f8042a02fd17ee53b8db24bc2e3d17bbb9c7f) +++ firmware/App/BLCommon.h (.../BLCommon.h) (revision f2652e85c8676d0356fea2690cfd9cac716ca795) @@ -10,6 +10,8 @@ #include "hal_stdtypes.h" +#include "Common.h" + // ********** version ********** /* @@ -24,18 +26,4 @@ #define BL_VERSION_MICRO 0 #define BL_VERIOSN_BUILD 0 -// **** Types **** - -typedef float F32; ///< 32-bit floating point type -typedef double F64; ///< 64-bit floating point type -typedef long long S64; ///< 64-bit signed integer type -typedef unsigned int U32; ///< 32-bit unsigned integer type -typedef int S32; ///< 32-bit signed integer type -typedef unsigned short U16; ///< 16-bit unsigned integer type -typedef short S16; ///< 16-bit signed integer type -typedef unsigned char U08; ///< 8-bit unsigned integer type -typedef unsigned int BOOL; ///< 32-bit boolean type -typedef unsigned char BYTE; ///< 8-bit byte type - - #endif Index: firmware/App/Common.h =================================================================== diff -u --- firmware/App/Common.h (revision 0) +++ firmware/App/Common.h (revision f2652e85c8676d0356fea2690cfd9cac716ca795) @@ -0,0 +1,99 @@ +/* + * Common.h + * + * Created on: Aug 5, 2024 + * Author: fw + */ + +#ifndef __COMMON_H__ +#define __COMMON_H__ + +#define SW_UPDATE_FLASH_BUFFER_SIZE 128 + +// **** Types **** + +typedef float F32; ///< 32-bit floating point type +typedef double F64; ///< 64-bit floating point type +typedef long long S64; ///< 64-bit signed integer type +typedef unsigned int U32; ///< 32-bit unsigned integer type +typedef int S32; ///< 32-bit signed integer type +typedef unsigned short U16; ///< 16-bit unsigned integer type +typedef short S16; ///< 16-bit signed integer type +typedef unsigned char U08; ///< 8-bit unsigned integer type +typedef unsigned int BOOL; ///< 32-bit boolean type +typedef unsigned char BYTE; ///< 8-bit byte type + + +typedef enum SW_Update_Destinations +{ + //UPDATE_NONE = 0, + UPDATE_FIRMWARE = 0, + UPDATE_FPGA, + NUM_OF_UPDAT_DESTS +} SW_UPDATE_DESINTATIONS_T; + +typedef enum SW_Update_CAN_Mail_Boxes +{ + SW_UPDATE_NOT_USED = 0, + SW_UPDATE_COMMAD, + SW_UPDATE_TD_UPDATE, + SW_UPDATE_DD_UPDATE, + SW_UPDATE_RO_UPDATE, + PLACE_HOLDER_TO_REMOVE_CAN, + SW_UPDATE_RESP, + NUM_OF_SW_UPDATE_MBOXES, +} SW_UPDATE_CAN_MAIL_BOXES_T; + + +/*! +Normal Protocol: + UI->FW: SwUpdateCommand[cmd=start] + FW->UI: Secure Ack/Nack + loop + UI->FW: Data + FW->UI: Secure Ack/Nack <- Also flow control. + end + + UI->FW: Verify + FW->UI: SwUpdateVerifyResponse + + UI->FW: Version + FW->UI: SwUpdateVerifyResponse + + UI->FW: Verified UI thinks things are good. + FW->UI: ACK/NACK FW has agreed or not and set the FLASH memory that the image is good or not. + + UI->FW: RunApp Launch the main app. + FW->UI: Secure Ack/Nack + + If streaming encounters problems we use a command with Resync + so that the FW will dump it's indexes and be ready for new data. +*/ +typedef enum SW_Update_Commands +{ + UPDATE_CMD_START = 0, + UPDATE_CMD_ABORT, + UPDATE_CMD_RUNAPP, // TODO is this needed? + UPDATE_CMD_VERIFY, + UPDATE_CMD_VERSION, // TODO is this needed? + UPDATE_CMD_VERIFIED, + UPDATE_CMD_RESYNC, + NUM_OF_UPDATE_CMDS +} SW_UPDATE_CMDS_T; + +typedef enum Ack_Nack +{ + NACK = 0, + ACK, + NUM_OF_ACK_NACK +} ACK_NACK_STATUS_T; + + +typedef struct +{ + BOOL isSWUpdateBufferReady; + SW_UPDATE_DESINTATIONS_T dest; +} SW_UPDATE_BUFFER_STATUS_T; + + +#endif Index: firmware/App/Services/CommBuffers.c =================================================================== diff -u -r850f8042a02fd17ee53b8db24bc2e3d17bbb9c7f -rf2652e85c8676d0356fea2690cfd9cac716ca795 --- firmware/App/Services/CommBuffers.c (.../CommBuffers.c) (revision 850f8042a02fd17ee53b8db24bc2e3d17bbb9c7f) +++ firmware/App/Services/CommBuffers.c (.../CommBuffers.c) (revision f2652e85c8676d0356fea2690cfd9cac716ca795) @@ -5,107 +5,253 @@ * Author: fw */ -#include "string.h" // For memset +#include "string.h" // For memcpy #include "can.h" #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 typedef struct { + U08 msgID; + U08 updateCmd; + U16 cyberRandom; + U32 msgCRC; +} SW_UPDATE_CMD_STATUS_T; + +typedef struct +{ U32 SWUpdateFrameCount; - BOOL isUpdateBufferReady; - U08 SWUpdateBuffer[ SW_UPDATE_BUFFER_SIZE ]; -} SW_UPDATE_STATUS_T; + U08 msgID; + U08 updateDest; + U16 cyberIndex; + U32 msgCRC; + U08 SWUpdateBuffer[ SW_UPDATE_FLASH_BUFFER_SIZE ]; +} SW_UPDATE_RCV_STATUS_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 const SW_UPDATE_CAN_MAIL_BOXES_T RECEIVE_MSG_ID[ NUM_OF_FW_STACKS ] = { SW_UPDATE_TD_UPDATE, SW_UPDATE_DD_UPDATE, SW_UPDATE_RO_UPDATE }; -static const U32 NUM_OF_CAN_FRAMES_TO_UPDATE = SW_UPDATE_BUFFER_SIZE / CAN_MESSAGE_PAYLOAD_SIZE; +static SW_UPDATE_CMD_STATUS_T SWUpdateCmdStatus; +static SW_UPDATE_RCV_STATUS_T SWUpdateRcvStatus; +static SW_UPDATE_BUFFER_STATUS_T SWUpdateBufferStatus; +static U32 FORTESTREMOVE = 0; -static SW_UPDATE_STATUS_T SWUpdateStatus; +static void consumeReceivedUpdateCANFrame( U08* data ); +static void processReceivedUpdateCANFrame( void ); +static void processRecievedCmdCANFrame( U08* data ); -static void resetSWUpdateVariables( void ); -static void consumeReceivedCANFrame( U08* data ); - void initCommBuffers( void ) { - resetSWUpdateVariables(); + clearSWUpdateBuffer( TRUE ); + clearSWUpdateBuffer( FALSE ); } -BOOL isSWUpdateBufferReady( void ) -{ - return SWUpdateStatus.isUpdateBufferReady; -} - - void handleCANMsgInterrupt( SW_UPDATE_CAN_MAIL_BOXES_T MailBox ) { // TODO do we need check the range of the messages? - if ( SW_UPDATE_RESP == MailBox ) + U08 data[ CAN_MESSAGE_PAYLOAD_SIZE ]; + + if ( SW_UPDATE_COMMAD == MailBox ) { - // transmit - } - else if ( SW_UPDATE_COMMAD == MailBox ) - { + if ( FALSE != canIsRxMessageArrived( canREG1, MailBox ) ) + { + U32 result = canGetData( canREG1, MailBox, data ); + if ( result != 0 ) + { + processRecievedCmdCANFrame( data ); + } + } } else { SW_UPDATE_CAN_MAIL_BOXES_T thisStackMailBox = RECEIVE_MSG_ID[ BL_STACK_ID ]; if ( thisStackMailBox == MailBox ) { - U08 data[ CAN_MESSAGE_PAYLOAD_SIZE ]; - if ( FALSE != canIsRxMessageArrived( canREG1, MailBox ) ) { U32 result = canGetData( canREG1, MailBox, data ); if ( result != 0 ) { - consumeReceivedCANFrame( data ); + consumeReceivedUpdateCANFrame( data ); } } } } } -static void resetSWUpdateVariables( void ) +void getSWUpdateBufferStatus( SW_UPDATE_BUFFER_STATUS_T* status ) { - SWUpdateStatus.SWUpdateFrameCount = 0; - SWUpdateStatus.SWUpdateFrameCount = FALSE; + memcpy( status, &SWUpdateBufferStatus, sizeof( SW_UPDATE_BUFFER_STATUS_T ) ); +} - memcpy( SWUpdateStatus.SWUpdateBuffer, 0x0, SW_UPDATE_BUFFER_SIZE ); + +void getSWUpdateBuffer( U08* data ) +{ + memcpy( data, &SWUpdateRcvStatus.SWUpdateBuffer, sizeof( SWUpdateRcvStatus.SWUpdateBuffer ) ); } -static void consumeReceivedCANFrame( U08* data ) +void sendAckNackStatusFromFirmware( ACK_NACK_STATUS_T status, BOOL cmd ) { - if ( SWUpdateStatus.SWUpdateFrameCount <= NUM_OF_CAN_FRAMES_TO_UPDATE ) + SW_UPDATE_RESP_STATUS_T resp; + + U32 calcCRC = 0; + + resp.msgID = ( TRUE == cmd ? 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 ) ) { - U32 currentBufferIndex = SWUpdateStatus.SWUpdateFrameCount * CAN_MESSAGE_PAYLOAD_SIZE; + clearSWUpdateBuffer( cmd ); + } +} - memcpy( SWUpdateStatus.SWUpdateBuffer + currentBufferIndex, data, CAN_MESSAGE_PAYLOAD_SIZE ); +void clearSWUpdateBuffer( BOOL cmd ) +{ + if ( FALSE == cmd ) + { + memset( &SWUpdateRcvStatus, 0x0, sizeof( SW_UPDATE_RCV_STATUS_T ) ); + memset( &SWUpdateBufferStatus, 0x0, sizeof( SW_UPDATE_BUFFER_STATUS_T ) ); + } + else + { + memset( &SWUpdateCmdStatus, 0x0, sizeof( SW_UPDATE_CMD_STATUS_T ) ); + } +} - SWUpdateStatus.isUpdateBufferReady = ( NUM_OF_CAN_FRAMES_TO_UPDATE == SWUpdateStatus.SWUpdateFrameCount ? TRUE : FALSE ); - // TODO test code remove - //if (TRUE == SWUpdateStatus.isUpdateBufferReady) - if ( NUM_OF_CAN_FRAMES_TO_UPDATE == SWUpdateStatus.SWUpdateFrameCount ) +// ********** private functions ********** + +static void consumeReceivedUpdateCANFrame( U08* data ) +{ + if ( SWUpdateRcvStatus.SWUpdateFrameCount <= NUM_OF_CAN_FRAMES_TO_UPDATE ) + { + if ( 0 == SWUpdateRcvStatus.SWUpdateFrameCount ) { - BOOL test = FALSE; + 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 ) ); } - // TODO remove + else + { + U32 currentBufferIndex = ( SWUpdateRcvStatus.SWUpdateFrameCount - 1 ) * CAN_MESSAGE_PAYLOAD_SIZE; - SWUpdateStatus.SWUpdateFrameCount++; + memcpy( SWUpdateRcvStatus.SWUpdateBuffer + currentBufferIndex, data, CAN_MESSAGE_PAYLOAD_SIZE ); + } + + SWUpdateRcvStatus.SWUpdateFrameCount++; + + //if ( NUM_OF_CAN_FRAMES_TO_UPDATE == SWUpdateRcvStatus.SWUpdateFrameCount ) + if ( SWUpdateRcvStatus.SWUpdateFrameCount % NUM_OF_CAN_FRAMES_TO_UPDATE == 0 ) + { + processReceivedUpdateCANFrame(); + + // TODO REmove + if ( FORTESTREMOVE == 1 ) + { + BOOL test = FALSE; + } + FORTESTREMOVE++; + //sendAckNackStatusFromFirmware( ACK, FALSE ); + //clearSWUpdateBuffer( FALSE ); + // TODO Remove + } + else + { + //SWUpdateRcvStatus.SWUpdateFrameCount++; + } } } +static void processReceivedUpdateCANFrame( void ) +{ + 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 ) + { + switch ( SWUpdateRcvStatus.updateDest ) + { + case UPDATE_FIRMWARE: + if ( SWUpdateRcvStatus.cyberIndex != SW_UPDATE_FINAL_MSG_INDEX ) + { + SWUpdateBufferStatus.isSWUpdateBufferReady = TRUE; + SWUpdateBufferStatus.dest = UPDATE_FIRMWARE; + } + else + { + sendAckNackStatusFromFirmware( ACK, FALSE ); + clearSWUpdateBuffer( FALSE ); + } + break; + + case UPDATE_FPGA: + SWUpdateBufferStatus.isSWUpdateBufferReady = TRUE; + SWUpdateBufferStatus.dest = UPDATE_FPGA; + break; + + default: + // Do nothing + break; + } + } +} + +static void processRecievedCmdCANFrame( U08* data ) +{ + ACK_NACK_STATUS_T ackStatus; + + U32 calcCRC = 0; + BOOL hasCRCPassed = FALSE; + + 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, TRUE ); +} + Index: firmware/App/Services/CommBuffers.h =================================================================== diff -u -r850f8042a02fd17ee53b8db24bc2e3d17bbb9c7f -rf2652e85c8676d0356fea2690cfd9cac716ca795 --- firmware/App/Services/CommBuffers.h (.../CommBuffers.h) (revision 850f8042a02fd17ee53b8db24bc2e3d17bbb9c7f) +++ firmware/App/Services/CommBuffers.h (.../CommBuffers.h) (revision f2652e85c8676d0356fea2690cfd9cac716ca795) @@ -10,24 +10,16 @@ #include "BLCommon.h" -#define SW_UPDATE_BUFFER_SIZE 136 +void initCommBuffers( void ); -typedef enum SW_Update_CAN_Mail_Boxes -{ - SW_UPDATE_NOT_USED = 0, - SW_UPDATE_COMMAD , - SW_UPDATE_TD_UPDATE , - SW_UPDATE_DD_UPDATE , - SW_UPDATE_RO_UPDATE , - SW_UPDATE_RESP , - NUM_OF_SW_UPDATE_MBOXES, -} SW_UPDATE_CAN_MAIL_BOXES_T; +void handleCANMsgInterrupt( SW_UPDATE_CAN_MAIL_BOXES_T MailBox ); +void getSWUpdateBufferStatus( SW_UPDATE_BUFFER_STATUS_T* status ); -void initCommBuffers( void ); +void getSWUpdateBuffer( U08* data ); -void handleCANMsgInterrupt( SW_UPDATE_CAN_MAIL_BOXES_T MailBox ); +void sendAckNackStatusFromFirmware( ACK_NACK_STATUS_T status, BOOL cmd ); -BOOL isSWUpdateBufferReady( void ); +void clearSWUpdateBuffer( BOOL cmd ); #endif Index: firmware/App/Services/Utilities.c =================================================================== diff -u --- firmware/App/Services/Utilities.c (revision 0) +++ firmware/App/Services/Utilities.c (revision f2652e85c8676d0356fea2690cfd9cac716ca795) @@ -0,0 +1,70 @@ +/* + * Utilities.c + * + * Created on: Aug 4, 2024 + * Author: fw + */ + +#include "Utilities.h" + +#define SHIFT_8_BITS_FOR_BYTE_SHIFT 8 ///< Number of bits to shift in order to shift a byte +#define SHIFT_24_BITS 24 ///< Number of bits to shift in order to shift 3 bytes + + +/// CRC-32 look-up table. +const U32 CRC32_TABLE[] = +{ + 0x00000000, 0x1EDC6F41, 0x3DB8DE82, 0x2364B1C3, 0x7B71BD04, 0x65ADD245, 0x46C96386, 0x58150CC7, + 0xF6E37A08, 0xE83F1549, 0xCB5BA48A, 0xD587CBCB, 0x8D92C70C, 0x934EA84D, 0xB02A198E, 0xAEF676CF, + 0xF31A9B51, 0xEDC6F410, 0xCEA245D3, 0xD07E2A92, 0x886B2655, 0x96B74914, 0xB5D3F8D7, 0xAB0F9796, + 0x05F9E159, 0x1B258E18, 0x38413FDB, 0x269D509A, 0x7E885C5D, 0x6054331C, 0x433082DF, 0x5DECED9E, + 0xF8E959E3, 0xE63536A2, 0xC5518761, 0xDB8DE820, 0x8398E4E7, 0x9D448BA6, 0xBE203A65, 0xA0FC5524, + 0x0E0A23EB, 0x10D64CAA, 0x33B2FD69, 0x2D6E9228, 0x757B9EEF, 0x6BA7F1AE, 0x48C3406D, 0x561F2F2C, + 0x0BF3C2B2, 0x152FADF3, 0x364B1C30, 0x28977371, 0x70827FB6, 0x6E5E10F7, 0x4D3AA134, 0x53E6CE75, + 0xFD10B8BA, 0xE3CCD7FB, 0xC0A86638, 0xDE740979, 0x866105BE, 0x98BD6AFF, 0xBBD9DB3C, 0xA505B47D, + 0xEF0EDC87, 0xF1D2B3C6, 0xD2B60205, 0xCC6A6D44, 0x947F6183, 0x8AA30EC2, 0xA9C7BF01, 0xB71BD040, + 0x19EDA68F, 0x0731C9CE, 0x2455780D, 0x3A89174C, 0x629C1B8B, 0x7C4074CA, 0x5F24C509, 0x41F8AA48, + 0x1C1447D6, 0x02C82897, 0x21AC9954, 0x3F70F615, 0x6765FAD2, 0x79B99593, 0x5ADD2450, 0x44014B11, + 0xEAF73DDE, 0xF42B529F, 0xD74FE35C, 0xC9938C1D, 0x918680DA, 0x8F5AEF9B, 0xAC3E5E58, 0xB2E23119, + 0x17E78564, 0x093BEA25, 0x2A5F5BE6, 0x348334A7, 0x6C963860, 0x724A5721, 0x512EE6E2, 0x4FF289A3, + 0xE104FF6C, 0xFFD8902D, 0xDCBC21EE, 0xC2604EAF, 0x9A754268, 0x84A92D29, 0xA7CD9CEA, 0xB911F3AB, + 0xE4FD1E35, 0xFA217174, 0xD945C0B7, 0xC799AFF6, 0x9F8CA331, 0x8150CC70, 0xA2347DB3, 0xBCE812F2, + 0x121E643D, 0x0CC20B7C, 0x2FA6BABF, 0x317AD5FE, 0x696FD939, 0x77B3B678, 0x54D707BB, 0x4A0B68FA, + 0xC0C1D64F, 0xDE1DB90E, 0xFD7908CD, 0xE3A5678C, 0xBBB06B4B, 0xA56C040A, 0x8608B5C9, 0x98D4DA88, + 0x3622AC47, 0x28FEC306, 0x0B9A72C5, 0x15461D84, 0x4D531143, 0x538F7E02, 0x70EBCFC1, 0x6E37A080, + 0x33DB4D1E, 0x2D07225F, 0x0E63939C, 0x10BFFCDD, 0x48AAF01A, 0x56769F5B, 0x75122E98, 0x6BCE41D9, + 0xC5383716, 0xDBE45857, 0xF880E994, 0xE65C86D5, 0xBE498A12, 0xA095E553, 0x83F15490, 0x9D2D3BD1, + 0x38288FAC, 0x26F4E0ED, 0x0590512E, 0x1B4C3E6F, 0x435932A8, 0x5D855DE9, 0x7EE1EC2A, 0x603D836B, + 0xCECBF5A4, 0xD0179AE5, 0xF3732B26, 0xEDAF4467, 0xB5BA48A0, 0xAB6627E1, 0x88029622, 0x96DEF963, + 0xCB3214FD, 0xD5EE7BBC, 0xF68ACA7F, 0xE856A53E, 0xB043A9F9, 0xAE9FC6B8, 0x8DFB777B, 0x9327183A, + 0x3DD16EF5, 0x230D01B4, 0x0069B077, 0x1EB5DF36, 0x46A0D3F1, 0x587CBCB0, 0x7B180D73, 0x65C46232, + 0x2FCF0AC8, 0x31136589, 0x1277D44A, 0x0CABBB0B, 0x54BEB7CC, 0x4A62D88D, 0x6906694E, 0x77DA060F, + 0xD92C70C0, 0xC7F01F81, 0xE494AE42, 0xFA48C103, 0xA25DCDC4, 0xBC81A285, 0x9FE51346, 0x81397C07, + 0xDCD59199, 0xC209FED8, 0xE16D4F1B, 0xFFB1205A, 0xA7A42C9D, 0xB97843DC, 0x9A1CF21F, 0x84C09D5E, + 0x2A36EB91, 0x34EA84D0, 0x178E3513, 0x09525A52, 0x51475695, 0x4F9B39D4, 0x6CFF8817, 0x7223E756, + 0xD726532B, 0xC9FA3C6A, 0xEA9E8DA9, 0xF442E2E8, 0xAC57EE2F, 0xB28B816E, 0x91EF30AD, 0x8F335FEC, + 0x21C52923, 0x3F194662, 0x1C7DF7A1, 0x02A198E0, 0x5AB49427, 0x4468FB66, 0x670C4AA5, 0x79D025E4, + 0x243CC87A, 0x3AE0A73B, 0x198416F8, 0x075879B9, 0x5F4D757E, 0x41911A3F, 0x62F5ABFC, 0x7C29C4BD, + 0xD2DFB272, 0xCC03DD33, 0xEF676CF0, 0xF1BB03B1, 0xA9AE0F76, 0xB7726037, 0x9416D1F4, 0x8ACABEB5, +}; + + +U32 crc32( U32 initialValue, U08 *address, U32 len ) +{ + U32 crc = initialValue; + + while ( len-- > 0 ) + { + crc = ( crc << SHIFT_8_BITS_FOR_BYTE_SHIFT ) ^ CRC32_TABLE[ *address ^ ( crc >> SHIFT_24_BITS ) ]; + address++; + } + + return crc; +} + +BOOL isCRCValid( U32 msgCRC, U32 calcCRC ) +{ + return ( msgCRC == calcCRC ? TRUE : FALSE ); +} + + Index: firmware/App/Services/Utilities.h =================================================================== diff -u --- firmware/App/Services/Utilities.h (revision 0) +++ firmware/App/Services/Utilities.h (revision f2652e85c8676d0356fea2690cfd9cac716ca795) @@ -0,0 +1,20 @@ +/* + * Utilities.h + * + * Created on: Aug 4, 2024 + * Author: fw + */ + +#ifndef __UTILITIES_H__ +#define __UTILITIES_H__ + +#include "BLCommon.h" + +#define MAX_CRC_CALC_DATA_SIZE 0x8000 ///< The maximum size of data for each CRC calculation. + + +U32 crc32( U32 initialValue, U08 *address, U32 len ); + +BOOL isCRCValid( U32 msgCRC, U32 calcCRC ); // TODO remove + +#endif Index: firmware/App/Tasks/TaskBG.c =================================================================== diff -u -rabb9687e52d9db5df1abe7626ba04a6d431ba823 -rf2652e85c8676d0356fea2690cfd9cac716ca795 --- firmware/App/Tasks/TaskBG.c (.../TaskBG.c) (revision abb9687e52d9db5df1abe7626ba04a6d431ba823) +++ firmware/App/Tasks/TaskBG.c (.../TaskBG.c) (revision f2652e85c8676d0356fea2690cfd9cac716ca795) @@ -5,13 +5,32 @@ * Author: fw */ +#include "CommBuffers.h" + +static SW_UPDATE_BUFFER_STATUS_T bufferStatus; + void taskBackground( void ) { #ifndef _VECTORCAST_ // Cannot have infinite loop in unit test tool while ( 1 ) #endif { + getSWUpdateBufferStatus( &bufferStatus ); + if ( ( TRUE == bufferStatus.isSWUpdateBufferReady ) && ( UPDATE_FIRMWARE == bufferStatus.dest ) ) + { + U08 dataToWriteToFlash[ SW_UPDATE_FLASH_BUFFER_SIZE ]; + + getSWUpdateBuffer( dataToWriteToFlash ); + + // TODO prepare for a write to NV + // TODO Disable/enable irq and fiq + // TODO get ack/nack from NV data + sendAckNackStatusFromFirmware( ACK, FALSE ); + clearSWUpdateBuffer( FALSE ); + //_disable_FIQ(); + //_enable_FIQ(); + } } } Index: firmware/App/Tasks/TaskPriority.c =================================================================== diff -u -r850f8042a02fd17ee53b8db24bc2e3d17bbb9c7f -rf2652e85c8676d0356fea2690cfd9cac716ca795 --- firmware/App/Tasks/TaskPriority.c (.../TaskPriority.c) (revision 850f8042a02fd17ee53b8db24bc2e3d17bbb9c7f) +++ firmware/App/Tasks/TaskPriority.c (.../TaskPriority.c) (revision f2652e85c8676d0356fea2690cfd9cac716ca795) @@ -6,6 +6,7 @@ */ #include "BLCommon.h" +#include "CommBuffers.h" #include "TaskPriority.h" void taskPriority( void ) Index: firmware/BL.dil =================================================================== diff -u -r850f8042a02fd17ee53b8db24bc2e3d17bbb9c7f -rf2652e85c8676d0356fea2690cfd9cac716ca795 --- firmware/BL.dil (.../BL.dil) (revision 850f8042a02fd17ee53b8db24bc2e3d17bbb9c7f) +++ firmware/BL.dil (.../BL.dil) (revision f2652e85c8676d0356fea2690cfd9cac716ca795) @@ -1,4 +1,4 @@ -# RM46L852PGE 08/02/24 13:47:04 +# RM46L852PGE 08/05/24 16:54:30 # 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=0x00000000 +DRIVER.CAN.VAR.CAN_1_MESSAGE_6_INT_ENA.VALUE=0x00000800 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 @@ -3445,7 +3445,7 @@ DRIVER.CAN.VAR.CAN_2_MESSAGE_10_DIR.VALUE=0x20000000 DRIVER.CAN.VAR.CAN_2_MESSAGE_5_EOB.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_2_MESSAGE_5_DIR.VALUE=0x20000000 -DRIVER.CAN.VAR.CAN_1_MESSAGE_6_INT_ENA_REF.VALUE=0x00000000 +DRIVER.CAN.VAR.CAN_1_MESSAGE_6_INT_ENA_REF.VALUE=0x00000001 DRIVER.CAN.VAR.CAN_3_MESSAGE_8_MASK.VALUE=0x000007FF DRIVER.CAN.VAR.CAN_3_MESSAGE_3_INT_ENA.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_2_MESSAGE_3_BOOL_ENA.VALUE=0 @@ -4382,7 +4382,7 @@ DRIVER.CAN.VAR.CAN_1_MESSAGE_30_MASK.VALUE=0x000007FF DRIVER.CAN.VAR.CAN_1_MESSAGE_22_MASK.VALUE=0x000007FF DRIVER.CAN.VAR.CAN_1_MESSAGE_14_MASK.VALUE=0x000007FF -DRIVER.CAN.VAR.CAN_1_MESSAGE_6_ENA.VALUE=0x00000000 +DRIVER.CAN.VAR.CAN_1_MESSAGE_6_ENA.VALUE=0x80000000 DRIVER.CAN.VAR.CAN_1_MESSAGE_1_RTR.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_1_MESSAGE_1_ID.VALUE=0x601 DRIVER.CAN.VAR.CAN_1_MESSAGE_63_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=0x00000000 +DRIVER.CAN.VAR.CAN_1_MESSAGE_6_DIR.VALUE=0x20000000 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 @@ -4537,7 +4537,7 @@ DRIVER.CAN.VAR.CAN_1_MESSAGE_56_MASK.VALUE=0x000007FF DRIVER.CAN.VAR.CAN_1_MESSAGE_48_MASK.VALUE=0x000007FF DRIVER.CAN.VAR.CAN_1_MESSAGE_9_INT_ENA.VALUE=0x00000000 -DRIVER.CAN.VAR.CAN_1_MESSAGE_6_BOOL_ENA.VALUE=0 +DRIVER.CAN.VAR.CAN_1_MESSAGE_6_BOOL_ENA.VALUE=1 DRIVER.CAN.VAR.CAN_2_MESSAGE_21_INT_LEVEL.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_2_MESSAGE_13_INT_LEVEL.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_2_MESSAGE_4_INT_LEVEL.VALUE=0x00000000 @@ -4645,7 +4645,7 @@ DRIVER.CAN.VAR.CAN_1_MESSAGE_23_MASK.VALUE=0x000007FF DRIVER.CAN.VAR.CAN_1_MESSAGE_15_INT_ENA.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_1_MESSAGE_15_MASK.VALUE=0x000007FF -DRIVER.CAN.VAR.CAN_1_MESSAGE_8_ENA.VALUE=0x80000000 +DRIVER.CAN.VAR.CAN_1_MESSAGE_8_ENA.VALUE=0x00000000 DRIVER.CAN.VAR.CAN_3_MESSAGE_21_ID.VALUE=21 DRIVER.CAN.VAR.CAN_3_MESSAGE_13_ID.VALUE=13 DRIVER.CAN.VAR.CAN_3_MESSAGE_11_RTR.VALUE=0x00000000 @@ -5498,7 +5498,7 @@ DRIVER.CAN.VAR.CAN_3_MESSAGE_24_BOOL_ENA.VALUE=0 DRIVER.CAN.VAR.CAN_3_MESSAGE_16_BOOL_ENA.VALUE=0 DRIVER.CAN.VAR.CAN_3_MESSAGE_10_MASK.VALUE=0x000007FF -DRIVER.CAN.VAR.CAN_1_MESSAGE_8_BOOL_ENA.VALUE=1 +DRIVER.CAN.VAR.CAN_1_MESSAGE_8_BOOL_ENA.VALUE=0 DRIVER.CAN.VAR.CAN_1_MESSAGE_2_MASK.VALUE=0x000007FF DRIVER.CAN.VAR.CAN_3_MESSAGE_59_ID.VALUE=59 DRIVER.CAN.VAR.CAN_3_MESSAGE_50_RTR.VALUE=0x00000000 Index: firmware/source/can.c =================================================================== diff -u -r850f8042a02fd17ee53b8db24bc2e3d17bbb9c7f -rf2652e85c8676d0356fea2690cfd9cac716ca795 --- firmware/source/can.c (.../can.c) (revision 850f8042a02fd17ee53b8db24bc2e3d17bbb9c7f) +++ firmware/source/can.c (.../can.c) (revision f2652e85c8676d0356fea2690cfd9cac716ca795) @@ -278,7 +278,7 @@ canREG1->IF1CMD = (uint8) 0xF8U; canREG1->IF1NO = 5U; - /** - Initialize message 8 + /** - Initialize message 6 * - Wait until IF2 is ready for use * - Set message mask * - Set message control word @@ -292,10 +292,10 @@ } /* Wait */ canREG1->IF2MSK = 0xC0000000U | (uint32)((uint32)((uint32)0x000007FFU & (uint32)0x000007FFU) << (uint32)18U); - canREG1->IF2ARB = (uint32)0x80000000U | (uint32)0x00000000U | (uint32)0x20000000U | (uint32)((uint32)((uint32)8U & (uint32)0x000007FFU) << (uint32)18U); - canREG1->IF2MCTL = 0x00001000U | (uint32)0x00000000U | (uint32)0x00000000U | (uint32)0x00000080U | (uint32)8U; + 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->IF2CMD = (uint8) 0xF8U; - canREG1->IF2NO = 8U; + canREG1->IF2NO = 6U; /** - Setup IF1 for data transmission * - Wait until IF1 is ready for use