Index: NVDataMgmt.c =================================================================== diff -u -rd7988c07f520940859b019645f7bb29d3202197d -r091b7a5c623590a204a790d6e899110ca91ebb26 --- NVDataMgmt.c (.../NVDataMgmt.c) (revision d7988c07f520940859b019645f7bb29d3202197d) +++ NVDataMgmt.c (.../NVDataMgmt.c) (revision 091b7a5c623590a204a790d6e899110ca91ebb26) @@ -15,16 +15,22 @@ **************************************************************************/ // Includes +#include #include "F021.h" #include "NVDataMgmt.h" #include "RTC.h" -#include "Utilities.h" #include "system.h" +#include "Utilities.h" +#include "Timers.h" // Private defines -#define MAX_QUEUE_SIZE 10U +#define QUEUE_MAX_SIZE 10U #define QUEUE_FRONT_INDEX 0U +#define QUEUE_EMPTY_INDEX -1 + +#define MEMORY_OPS_BUFFER_LENGTH 32U + #define ROUNDED_HCLK_FREQ FLOAT_TO_INT_WITH_ROUND(HCLK_FREQ) #define BANK7_SECTOR_0_31_ENABLE_BIT_MASK 0x0000000F #define BANK7_SECTOR_32_63_ENABLE_BIT_MASK 0x00000000 @@ -50,7 +56,6 @@ #define LOG_RECORDS_START_ADDRESS 0x0014 #define LOG_RECORDS_LENGTH_BYTES 6U -#define READ_BUFFER_SIZE 64U #define BUFFER_INDEX_0 0U #define BUFFER_INDEX_1 1U #define BUFFER_INDEX_2 2U @@ -63,7 +68,9 @@ #define MAX_MFG_DATE_CHARACTERS 10U #define MAX_CRC_LENGTH_BYTES 2U +#define IDLE_TIME 20 // ms + typedef enum NVDataMgmt_Self_Test_States { NVDATAMGMT_SELF_TEST_STATE_START = 0, @@ -82,21 +89,25 @@ NVDATAMGMT_EXEC_STATE_WRITE, NVDATAMGMT_EXEC_STATE_READ, NVDATAMGMT_EXEC_STATE_ERASE, + NVDATAMGMT_EXEC_STATE_WAIT, NVDATAMGMT_EXEC_STATE_FAULT, NUM_OF_NVDATAMGMT_EXEC_STATES } NVDATAMGMT_EXEC_STATE_T; typedef enum NVDataMgmt_Operation { - NVDATAMGMT_WRITE = 0, + NVDATAMGMT_NONE = 0, + NVDATAMGMT_WRITE, NVDATAMGMT_READ, - NVDATAMGMT_ERASE + NVDATAMGMT_ERASE, + NUM_OF_NVDATAMGMT_OPS_STATES } NVDATAMGMT_OPERATION_STATE_T; typedef enum NVDataMgmt_Location { NVDATAMGMT_EEPROM = 0, - NVDATAMGMT_RTC + NVDATAMGMT_RTC, + NUM_OF_NVDATAMGMT_LOC_STATES } NVDATAMGMT_LOCATION_STATE_T; // Private functions @@ -110,10 +121,12 @@ static NVDATAMGMT_EXEC_STATE_T handleExecWaitForPostState( void ); static NVDATAMGMT_EXEC_STATE_T handleExecIdleState( void ); static NVDATAMGMT_EXEC_STATE_T handleExecWriteState( void ); +static NVDATAMGMT_EXEC_STATE_T handleExecEraseState( void ); static NVDATAMGMT_EXEC_STATE_T handleExecReadState( void ); // Queue functions -static void enqueue( void ); +static void enqueue( NVDATAMGMT_OPERATION_STATE_T ops, NVDATAMGMT_LOCATION_STATE_T location, + U32 startAddress, U08* data, U32 length ); static void dequeue( void ); static BOOL isQueueEmpty ( void ); static U08 getQueueSize( void ); @@ -126,7 +139,7 @@ NVDATAMGMT_OPERATION_STATE_T memoryOperation; NVDATAMGMT_LOCATION_STATE_T memoryLocation; U32* startAddress; - U08* buffer; + U08 buffer [ MEMORY_OPS_BUFFER_LENGTH ]; U32 length; }; @@ -151,21 +164,23 @@ } MFG_RECORD_T; #pragma pack(pop) -struct MEMORY_OPS_T jobQueue[ MAX_QUEUE_SIZE ]; -static S16 queueRearIndex = -1; +struct MEMORY_OPS_T jobQueue [ QUEUE_MAX_SIZE ]; +static U08 readBuffer [ MEMORY_OPS_BUFFER_LENGTH ]; static LOG_RECORD_T logRecord; static MFG_RECORD_T mfgRecord; +static S16 queueRearIndex = QUEUE_EMPTY_INDEX; +static S16 queueFrontIndex = QUEUE_EMPTY_INDEX; static Fapi_StatusType EEPROMStatus = Fapi_Status_Success; static NVDATAMGMT_SELF_TEST_STATE_T NVDataMgmtSelfTestState = NVDATAMGMT_SELF_TEST_STATE_START; static NVDATAMGMT_EXEC_STATE_T NVDataMgmtExecState = NVDATAMGMT_EXEC_STATE_WAIT_FOR_POST; static SELF_TEST_STATUS_T NVDataMgmtSelfTestResult = SELF_TEST_STATUS_IN_PROGRESS; static BOOL isServiceOnEntry = TRUE; static U32 bootloaderFlag = 0; -static U08 readBuffer[ READ_BUFFER_SIZE ]; +static U32 waitTimer = 0; - // REMOVE THIS CODE -static U08 tempBufferForTest[5] = {'A', 0x2, 0x45, 'X', 0x78}; +static U08 tempBufferForTest[5] = {'0', '8', 0x15, 'r', 'k'}; +static U32 tempBufferLogTest[8] = {1582583436, NVDATAMGMT_MODE_CHANGE, 14587, 'c', 0x38}; // REMOVE THIS CODE /************************************************************************* @@ -185,9 +200,10 @@ NVDataMgmtExecState = NVDATAMGMT_EXEC_STATE_WAIT_FOR_POST; NVDataMgmtSelfTestResult = SELF_TEST_STATUS_IN_PROGRESS; isServiceOnEntry = TRUE; - queueRearIndex = -1; - EEPROMStatus = Fapi_initializeFlashBanks( ROUNDED_HCLK_FREQ ); - EEPROMStatus = Fapi_setActiveFlashBank( Fapi_FlashBank7 ); + queueRearIndex = QUEUE_EMPTY_INDEX; + queueFrontIndex = QUEUE_EMPTY_INDEX; + EEPROMStatus = Fapi_initializeFlashBanks( ROUNDED_HCLK_FREQ ); + EEPROMStatus = Fapi_setActiveFlashBank( Fapi_FlashBank7 ); } /************************************************************************* @@ -199,7 +215,7 @@ * @param none * @return NVDATAMGMT_SELF_TEST_STATE_T *************************************************************************/ -NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestStart( void ) +static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestStart( void ) { NVDATAMGMT_SELF_TEST_STATE_T state = NVDATAMGMT_SELF_TEST_STATE_START; if ( isServiceOnEntry ) @@ -226,7 +242,7 @@ * @param none * @return NVDATAMGMT_SELF_TEST_STATE_T *************************************************************************/ -NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestReadBootloaderFlag( void ) +static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestReadBootloaderFlag( void ) { NVDATAMGMT_SELF_TEST_STATE_T state = NVDATAMGMT_SELF_TEST_STATE_READ_BOOTLOADER_FLAG; if ( isServiceOnEntry && getRTCRAMState() == RTC_RAM_STATE_READY ) @@ -259,7 +275,7 @@ * @param none * @return NVDATAMGMT_SELF_TEST_STATE_T *************************************************************************/ -NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestReadLogRecord ( void ) +static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestReadLogRecord ( void ) { NVDATAMGMT_SELF_TEST_STATE_T state = NVDATAMGMT_SELF_TEST_STATE_READ_LOG_RECORD; if ( isServiceOnEntry && getRTCRAMState() == RTC_RAM_STATE_READY ) @@ -292,7 +308,7 @@ * @param none * @return NVDATAMGMT_SELF_TEST_STATE_T *************************************************************************/ -NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestReadMfgRecord( void ) +static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestReadMfgRecord( void ) { NVDATAMGMT_SELF_TEST_STATE_T state = NVDATAMGMT_SELF_TEST_STATE_READ_MFG_RECORDS; if ( isServiceOnEntry ) @@ -336,7 +352,7 @@ * @param none * @return NVDATAMGMT_SELF_TEST_STATE_T *************************************************************************/ -NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestCheckCRC( void ) +static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestCheckCRC( void ) { NVDATAMGMT_SELF_TEST_STATE_T state = NVDATAMGMT_SELF_TEST_STATE_COMPLETE; U16 calculatedCRC; @@ -434,6 +450,11 @@ NVDataMgmtExecState = handleExecWriteState(); break; + case NVDATAMGMT_EXEC_STATE_ERASE: + + NVDataMgmtExecState = handleExecEraseState(); + break; + case NVDATAMGMT_EXEC_STATE_READ: NVDataMgmtExecState = handleExecReadState(); @@ -452,32 +473,41 @@ } } -NVDATAMGMT_EXEC_STATE_T handleExecWaitForPostState( void ) +static NVDATAMGMT_EXEC_STATE_T handleExecWaitForPostState( void ) { NVDATAMGMT_EXEC_STATE_T state = NVDATAMGMT_EXEC_STATE_WAIT_FOR_POST; if ( NVDataMgmtSelfTestState == NVDATAMGMT_SELF_TEST_STATE_COMPLETE && NVDataMgmtSelfTestResult == SELF_TEST_STATUS_PASSED ) { // TODO: REMOVE THIS CODE - enqueue(); + enqueue(NVDATAMGMT_WRITE, NVDATAMGMT_EEPROM, BANK7_SECTOR1_START_ADDRESS, + tempBufferForTest, sizeof(tempBufferForTest)); + enqueue(NVDATAMGMT_READ, NVDATAMGMT_EEPROM, BANK7_SECTOR1_START_ADDRESS, + readBuffer, 16); // TODO: REMOVE THIS CODE state = NVDATAMGMT_EXEC_STATE_IDLE; } else if ( NVDataMgmtSelfTestState == NVDATAMGMT_SELF_TEST_STATE_COMPLETE ) { // TODO: Check this state, do we have to go to FAULT if POST failed? - state = NVDATAMGMT_EXEC_STATE_FAULT; + //state = NVDATAMGMT_EXEC_STATE_FAULT; + state = NVDATAMGMT_EXEC_STATE_IDLE; } return state; } static NVDATAMGMT_EXEC_STATE_T handleExecIdleState( void ) { NVDATAMGMT_EXEC_STATE_T state = NVDATAMGMT_EXEC_STATE_IDLE; - if ( !isQueueEmpty() ) + if ( isServiceOnEntry ) { - NVDATAMGMT_OPERATION_STATE_T ops = jobQueue [ QUEUE_FRONT_INDEX ].memoryOperation; + waitTimer = getMSTimerCount(); + isServiceOnEntry = FALSE; + } + if ( !isQueueEmpty() && didTimeout( waitTimer, IDLE_TIME ) ) + { + NVDATAMGMT_OPERATION_STATE_T ops = jobQueue [ queueFrontIndex ].memoryOperation; if ( ops == NVDATAMGMT_WRITE ) { state = NVDATAMGMT_EXEC_STATE_WRITE; @@ -486,6 +516,11 @@ { state = NVDATAMGMT_EXEC_STATE_READ; } + else if ( ops == NVDATAMGMT_ERASE ) + { + state = NVDATAMGMT_EXEC_STATE_ERASE; + } + isServiceOnEntry = TRUE; } return state; } @@ -494,12 +529,10 @@ NVDATAMGMT_EXEC_STATE_T state = NVDATAMGMT_EXEC_STATE_WRITE; if ( isServiceOnEntry ) { - EEPROMStatus = Fapi_issueAsyncCommandWithAddress(Fapi_EraseSector, jobQueue [ QUEUE_FRONT_INDEX ].startAddress); - while ( EEPROMStatus != Fapi_Status_Success) {} // TODO: Convert the buffer to U08* - EEPROMStatus = Fapi_issueProgrammingCommand ( jobQueue [ QUEUE_FRONT_INDEX ].startAddress, - jobQueue [ QUEUE_FRONT_INDEX ].buffer, - jobQueue [ QUEUE_FRONT_INDEX ].length, + EEPROMStatus = Fapi_issueProgrammingCommand ( jobQueue [ queueFrontIndex ].startAddress, + jobQueue [ queueFrontIndex ].buffer, + jobQueue [ queueFrontIndex ].length, 0x00, 0, Fapi_DataOnly ); isServiceOnEntry = FALSE; } @@ -516,52 +549,76 @@ NVDATAMGMT_EXEC_STATE_T state = NVDATAMGMT_EXEC_STATE_READ; if ( isServiceOnEntry ) { - EEPROMStatus = Fapi_doMarginRead ( jobQueue [ QUEUE_FRONT_INDEX ].startAddress, - (U32*)jobQueue [ QUEUE_FRONT_INDEX ].buffer, - jobQueue [ QUEUE_FRONT_INDEX ].length, Fapi_NormalRead ); + EEPROMStatus = Fapi_doMarginRead ( jobQueue [ queueFrontIndex ].startAddress, + (U32*)jobQueue [ queueFrontIndex ].buffer, + jobQueue [ queueFrontIndex ].length, Fapi_NormalRead ); isServiceOnEntry = FALSE; } else if ( EEPROMStatus == Fapi_Status_Success ) { state = NVDATAMGMT_EXEC_STATE_IDLE; + // REMOVE THIS CODE + //memcpy ( readBuffer, jobQueue [ queueRearIndex ].buffer, 16 ); + // REMVOE THIS CODE dequeue(); isServiceOnEntry = TRUE; } return state; } -static void enqueue( void ) +static NVDATAMGMT_EXEC_STATE_T handleExecEraseState( void ) { - // REMOVE THIS CODE. FOR TESTING ONLY - queueRearIndex++; - jobQueue[queueRearIndex].memoryOperation = NVDATAMGMT_WRITE; - jobQueue[queueRearIndex].memoryLocation = NVDATAMGMT_EEPROM; - jobQueue[queueRearIndex].startAddress = (U32*)BANK7_SECTOR1_START_ADDRESS; - jobQueue[queueRearIndex].buffer = tempBufferForTest; - jobQueue[queueRearIndex].length = sizeof(tempBufferForTest); + NVDATAMGMT_EXEC_STATE_T state = NVDATAMGMT_EXEC_STATE_ERASE; + if ( isServiceOnEntry ) + { + EEPROMStatus = Fapi_issueAsyncCommandWithAddress( Fapi_EraseSector, jobQueue [ queueFrontIndex ].startAddress ); + isServiceOnEntry = FALSE; + } + else if ( EEPROMStatus == Fapi_Status_Success ) + { + state = NVDATAMGMT_EXEC_STATE_IDLE; + dequeue(); + isServiceOnEntry = TRUE; + } + return state; +} +static void enqueue( NVDATAMGMT_OPERATION_STATE_T ops, NVDATAMGMT_LOCATION_STATE_T location, + U32 startAddress, U08* data, U32 length ) +{ + // If the start address is at the beginning of any of the sectors and the ops is write to + // EEPROM, first erase the sector + if ( ( startAddress == BANK7_SECTOR0_START_ADDRESS || startAddress == BANK7_SECTOR1_START_ADDRESS || + startAddress == BANK7_SECTOR2_START_ADDRESS || startAddress == BANK7_SECTOR3_START_ADDRESS ) && + ops == NVDATAMGMT_WRITE ) + { + queueRearIndex++; + jobQueue [ queueRearIndex ].memoryOperation = NVDATAMGMT_ERASE; + jobQueue [ queueRearIndex ].memoryLocation = NVDATAMGMT_EEPROM; + jobQueue [ queueRearIndex ].startAddress = (U32*)startAddress; + memcpy ( jobQueue[ queueRearIndex + 1 ].buffer, 0, MEMORY_OPS_BUFFER_LENGTH ); + jobQueue[ queueRearIndex + 1 ].length = MEMORY_OPS_BUFFER_LENGTH; + } queueRearIndex++; - jobQueue[queueRearIndex].memoryOperation = NVDATAMGMT_READ; - jobQueue[queueRearIndex].memoryLocation = NVDATAMGMT_EEPROM; - jobQueue[queueRearIndex].startAddress = (U32*)BANK7_SECTOR1_START_ADDRESS; - jobQueue[queueRearIndex].buffer = readBuffer; - jobQueue[queueRearIndex].length = 8; - // REMOVE THIS CODE. FOR TESTING ONLY + jobQueue [ queueRearIndex ].memoryOperation = ops; + jobQueue [ queueRearIndex ].memoryLocation = location; + jobQueue [ queueRearIndex ].startAddress = (U32*)startAddress; + memcpy ( jobQueue [ queueRearIndex ].buffer, data, length ); + jobQueue [ queueRearIndex ].length = length; + if ( queueFrontIndex == QUEUE_EMPTY_INDEX ) + { + queueFrontIndex++; + } } static void dequeue( void ) { - U08 i; - for ( i = 0; i < queueRearIndex; i++ ) - { - jobQueue [ i ] = jobQueue [ i + 1 ]; - } - queueRearIndex--; + queueFrontIndex++; } static BOOL isQueueEmpty ( void ) { BOOL isEmpty = TRUE; - if ( queueRearIndex >= QUEUE_FRONT_INDEX ) + if ( queueRearIndex >= QUEUE_EMPTY_INDEX + 1 ) { isEmpty = FALSE; }