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; +} + + /**@}*/