Index: firmware/App/Drivers/NVDriver.c =================================================================== diff -u -r1be7dc9ec7ae5a6576a4c841e3b22ac77aea8db8 -ra68c7679e493224bd41df72321d4c2537207234f --- firmware/App/Drivers/NVDriver.c (.../NVDriver.c) (revision 1be7dc9ec7ae5a6576a4c841e3b22ac77aea8db8) +++ firmware/App/Drivers/NVDriver.c (.../NVDriver.c) (revision a68c7679e493224bd41df72321d4c2537207234f) @@ -29,6 +29,8 @@ #define BANK7_SECTOR_0_31_ENABLE_BIT_MASK 0x0000000F ///< Bank7 sector 0 t0 31 enable mask. #define BANK7_SECTOR_32_63_ENABLE_BIT_MASK 0x00000000 ///< Bank7 sector 32 to 63 enable mask. +static BOOL getSectorStartAddress( U32* recordFlashAddress ); + void initNVDriver( void ) { // Initialize and activate flash bank 7 @@ -37,25 +39,80 @@ Fapi_enableEepromBankSectors( BANK7_SECTOR_0_31_ENABLE_BIT_MASK, BANK7_SECTOR_32_63_ENABLE_BIT_MASK ); } -void eraseSector( U32* startAddress ) +void eraseSector( U32* recordFlashAddress ) { - Fapi_issueAsyncCommandWithAddress( Fapi_EraseSector, startAddress ); + BOOL isFlashAddressValid = getSectorStartAddress( recordFlashAddress ); + + if ( TRUE == isFlashAddressValid) + { + Fapi_issueAsyncCommandWithAddress( Fapi_EraseSector, recordFlashAddress ); + } } -void writeSector( U32* startAddress, U08* bufferAddress, U32 bufferSize ) +void writeSector( U32* recordFlashAddress, U08* bufferAddress, U32 bufferSize ) { - Fapi_issueProgrammingCommand( startAddress, bufferAddress, bufferSize, 0x00, 0, Fapi_DataOnly ); + BOOL isFlashAddressValid = getSectorStartAddress( recordFlashAddress ); + + if ( ( TRUE == isFlashAddressValid ) && ( NULL != bufferAddress ) && ( bufferSize > 0 ) ) + { + Fapi_issueProgrammingCommand( recordFlashAddress, bufferAddress, bufferSize, 0x00, 0, Fapi_DataOnly ); + } } -void readSector( U32* startAddress, U32* bufferAddress, U32 bufferSize ) +void readSector( U32* recordFlashAddress, U32* bufferAddress, U32 bufferSize ) { - Fapi_doMarginRead( startAddress, bufferAddress, bufferSize, Fapi_NormalRead ); + // Create a copy only for validation + U32 sectorStartAddress = *recordFlashAddress; + BOOL isFlashAddressValid = getSectorStartAddress( §orStartAddress ); + + if ( ( TRUE == isFlashAddressValid ) && ( NULL != bufferAddress ) && ( bufferSize > 0 ) ) + { + Fapi_doMarginRead( recordFlashAddress, bufferAddress, bufferSize, Fapi_NormalRead ); + } } BOOL isFlashReady( void ) { return (Fapi_Status_FsmReady == FAPI_CHECK_FSM_READY_BUSY); } +static BOOL getSectorStartAddress( U32* recordFlashAddress ) +{ + BOOL isFlashAddressValid = TRUE; + + if ( NULL == recordFlashAddress ) + { + return FALSE; + } + + if ( ( BANK7_SECTOR0_START_ADDRESS <= *recordFlashAddress ) && + ( BANK7_SECTOR0_END_ADDRESS >= *recordFlashAddress ) ) + { + *recordFlashAddress = BANK7_SECTOR0_START_ADDRESS; + } + else if ( ( BANK7_SECTOR1_START_ADDRESS <= *recordFlashAddress ) && + ( BANK7_SECTOR1_END_ADDRESS >= *recordFlashAddress ) ) + { + *recordFlashAddress = BANK7_SECTOR1_START_ADDRESS; + } + else if ( ( BANK7_SECTOR2_START_ADDRESS <= *recordFlashAddress ) && + ( BANK7_SECTOR2_END_ADDRESS >= *recordFlashAddress ) ) + { + *recordFlashAddress = BANK7_SECTOR2_START_ADDRESS; + } + else if ( ( BANK7_SECTOR3_START_ADDRESS <= *recordFlashAddress ) && + ( BANK7_SECTOR3_END_ADDRESS >= *recordFlashAddress ) ) + { + *recordFlashAddress = BANK7_SECTOR3_START_ADDRESS; + } + else + { + isFlashAddressValid = FALSE; + } + + return isFlashAddressValid; +} + + /**@}*/ Index: firmware/App/Drivers/NVDriver.h =================================================================== diff -u -r1be7dc9ec7ae5a6576a4c841e3b22ac77aea8db8 -ra68c7679e493224bd41df72321d4c2537207234f --- firmware/App/Drivers/NVDriver.h (.../NVDriver.h) (revision 1be7dc9ec7ae5a6576a4c841e3b22ac77aea8db8) +++ firmware/App/Drivers/NVDriver.h (.../NVDriver.h) (revision a68c7679e493224bd41df72321d4c2537207234f) @@ -73,9 +73,9 @@ // ********** public function prototypes ********** void initNVDriver( void ); -void eraseSector( U32* startAddress ); -void writeSector( U32* startAddress, U08* bufferAddress, U32 bufferSize ); -void readSector( U32* startAddress, U32* bufferAddress, U32 bufferSize ); +void eraseSector( U32* recordFlashAddress ); +void writeSector( U32* recordFlashAddress, U08* bufferAddress, U32 bufferSize ); +void readSector( U32* recordFlashAddress, U32* bufferAddress, U32 bufferSize ); BOOL isFlashReady( void ); /**@}*/ Index: firmware/App/Services/NVMgmtDD.c =================================================================== diff -u -r43e60a63eae841e599ff9106f43177a8f63d22be -ra68c7679e493224bd41df72321d4c2537207234f --- firmware/App/Services/NVMgmtDD.c (.../NVMgmtDD.c) (revision 43e60a63eae841e599ff9106f43177a8f63d22be) +++ firmware/App/Services/NVMgmtDD.c (.../NVMgmtDD.c) (revision a68c7679e493224bd41df72321d4c2537207234f) @@ -152,7 +152,7 @@ NVDATAMGMT_EXEC_STATE_T state = NVDATAMGMT_EXEC_STATE_IDLE; BOOL areQueuesNotEmpty = FALSE; NVDATAMGMT_OPERATION_STATE_T ops; - U32 startAddress; + U32 recordFlashAddress; U08* bufferAddress; PROCESS_RECORD_JOB_T recordCurrentJob; RECORD_JOBS_STATE_T job; @@ -173,7 +173,7 @@ areQueuesNotEmpty = TRUE; ops = recordCurrentJob.memoryOperation; currentTime = getMSTimerCount(); - startAddress = jobSpecs.startAddress + recordAddressOffset; + recordFlashAddress = jobSpecs.recordFlashAddress + recordAddressOffset; bufferAddress = jobSpecs.structAddressPtr + recordAddressOffset; } } @@ -184,18 +184,18 @@ switch ( ops ) { case NVDATAMGMT_ERASE_SECTOR: - eraseSector( (U32*)startAddress ); + eraseSector( (U32*)recordFlashAddress ); state = NVDATAMGMT_EXEC_STATE_ERASE_EEPROM; break; case NVDATAMGMT_WRITE: - writeSector( (U32*)startAddress, (U08*)bufferAddress, jobSpecs.maxWriteBufferSize ); + writeSector( (U32*)recordFlashAddress, (U08*)bufferAddress, jobSpecs.maxWriteBufferSize ); currentTime = getMSTimerCount(); state = NVDATAMGMT_EXEC_STATE_WRITE_TO_EEPROM; break; case NVDATAMGMT_READ: - readSector( (U32*)startAddress, (U32*)bufferAddress, ( jobSpecs.maxReadBufferSize / EEPROM_OPS_SIZE_OF_CONVERTER ) ); + readSector( (U32*)recordFlashAddress, (U32*)bufferAddress, ( jobSpecs.maxReadBufferSize / EEPROM_OPS_SIZE_OF_CONVERTER ) ); currentTime = getMSTimerCount(); state = NVDATAMGMT_EXEC_STATE_READ_FROM_EEPROM; break; @@ -265,14 +265,14 @@ if ( writtenRecordStatus == NVDATAMGMT_RECORD_NOT_CHECKED ) { currentTime = getMSTimerCount(); - U32 startAddress = jobSpecs.startAddress + recordAddressOffset; + U32 recordFlashAddress = jobSpecs.recordFlashAddress + recordAddressOffset; U32 maxBufferLength = jobSpecs.maxWriteBufferSize / EEPROM_OPS_SIZE_OF_CONVERTER; // Clear the buffer from the previous content memset( writtenRecordCheckBuffer, 0, sizeof( writtenRecordCheckBuffer ) ); // Issue a FAPI read command but only the bytes that were written, so use maxWriteBufferSize - readSector( (U32*)startAddress, (U32*)writtenRecordCheckBuffer, maxBufferLength ); + readSector( (U32*)recordFlashAddress, (U32*)writtenRecordCheckBuffer, maxBufferLength ); state = NVDATAMGMT_EXEC_STATE_VERIFY_EEPROM_WRITE; } @@ -288,7 +288,7 @@ // Update the variables and issue the next write command currentTime = getMSTimerCount(); recordAddressOffset += jobSpecs.maxWriteBufferSize; - U32 memoryPtr = jobSpecs.startAddress + recordAddressOffset; + U32 memoryPtr = jobSpecs.recordFlashAddress + recordAddressOffset; U08* structPtr = jobSpecs.structAddressPtr + recordAddressOffset; writtenRecordStatus = NVDATAMGMT_RECORD_NOT_CHECKED; Index: firmware/App/Services/NVMsgQ.c =================================================================== diff -u -r1be7dc9ec7ae5a6576a4c841e3b22ac77aea8db8 -ra68c7679e493224bd41df72321d4c2537207234f --- firmware/App/Services/NVMsgQ.c (.../NVMsgQ.c) (revision 1be7dc9ec7ae5a6576a4c841e3b22ac77aea8db8) +++ firmware/App/Services/NVMsgQ.c (.../NVMsgQ.c) (revision a68c7679e493224bd41df72321d4c2537207234f) @@ -30,7 +30,7 @@ // ********** private definitions ********** -#define QUEUE_MAX_SIZE 20U ///< Max queue size. +#define QUEUE_MAX_SIZE 50U ///< Max queue size. #define QUEUE_START_INDEX 0U ///< Queue start index. #define MAX_JOB_DATA_SIZE_BYTES 32U ///< Max bytes per job (32 bytes). #define NUM_OF_BYTES_PER_RECORD_PAYLOAD ( MAX_MSG_PAYLOAD_SIZE - ( sizeof( U32 ) * 3 ) ) ///< Number of bytes per calibration payload. @@ -62,7 +62,7 @@ typedef struct { NVDATAMGMT_OPERATION_STATE_T memoryOperation; ///< Memory operation. - U32 startAddress; ///< Operation start address. + U32 recordFlashAddress; ///< Operation start address. U08 buffer[ MAX_JOB_DATA_SIZE_BYTES ]; ///< Buffer. U32 length; ///< Length of a buffer. } MEMORY_OPS_T; Index: firmware/App/Services/NVRecordsDD.c =================================================================== diff -u -r1be7dc9ec7ae5a6576a4c841e3b22ac77aea8db8 -ra68c7679e493224bd41df72321d4c2537207234f --- firmware/App/Services/NVRecordsDD.c (.../NVRecordsDD.c) (revision 1be7dc9ec7ae5a6576a4c841e3b22ac77aea8db8) +++ firmware/App/Services/NVRecordsDD.c (.../NVRecordsDD.c) (revision a68c7679e493224bd41df72321d4c2537207234f) @@ -183,6 +183,7 @@ static BOOL isPolynomialRecordValid( POLYNOMIAL_CAL_PAYLOAD_T* record ); static BOOL isDDSystemRecordValid( void ); static BOOL isDDServiceRecordValid( void ); +static BOOL isDDInstitutionalRecordValid( void ); static BOOL isDDUsageRecordValid( void ); static BOOL isDDCalibrationRecordValid( void ); static BOOL isDDDrainPumpRecordValid( DD_DRAIN_PUMP_CAL_RECORD_T* record ); @@ -448,13 +449,13 @@ /*********************************************************************//** * @brief - * The isddInstitutionalRecordValid function checks the validity of the HD + * The isDDInstitutionalRecordValid function checks the validity of the HD * institutional record. * @details Inputs: ddInstitutionalGroup.ddInstitutionalRecord * @details Outputs: none * @return TRUE if the HD institutional record is valid otherwise FALSE *************************************************************************/ -static BOOL isddInstitutionalRecordValid( void ) +static BOOL isDDInstitutionalRecordValid( void ) { BOOL status = TRUE; U16 calcCRC = crc16( (U08*)&ddInstitutionalGroup.ddInstitutionalRecord, sizeof( DD_INSTITUTIONAL_RECORD_T ) - sizeof( U16 ) ); Index: firmware/App/Services/NVRecordsDD.h =================================================================== diff -u -r1be7dc9ec7ae5a6576a4c841e3b22ac77aea8db8 -ra68c7679e493224bd41df72321d4c2537207234f --- firmware/App/Services/NVRecordsDD.h (.../NVRecordsDD.h) (revision 1be7dc9ec7ae5a6576a4c841e3b22ac77aea8db8) +++ firmware/App/Services/NVRecordsDD.h (.../NVRecordsDD.h) (revision a68c7679e493224bd41df72321d4c2537207234f) @@ -50,7 +50,7 @@ /// Process records specifications structure typedef struct { - U32 startAddress; ///< Jobs spec start address. + U32 recordFlashAddress; ///< Jobs spec start address. U32 sizeofJob; ///< Jobs spec size of job. U32 maxWriteBufferSize; ///< Jobs max write allowed processing buffer size. U32 maxReadBufferSize; ///< Jobs max read allowed processing buffer size.