/************************************************************************** * * Copyright (c) 2019-2020 Diality Inc. - All Rights Reserved. * * THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN * WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. * * @file NVDataMgmt.c * * @date 11-FEB-2020 * @author D. Navaei * * @brief NVDataMgmt source file * **************************************************************************/ // Includes #include "F021.h" #include "NVDataMgmt.h" #include "RTC.h" #include "system.h" // Private defines #define MAX_QUEUE_SIZE 10U #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 #define BANK7_SECTOR0_START_ADDRESS 0xF0200000 #define BANK7_SECTOR0_END_ADDRESS 0xF0203FFF #define BANK7_SECTOR1_START_ADDRESS 0xF0204000 #define BANK7_SECTOR1_END_ADDRESS 0xF0207FFF #define BANK7_SECTOR2_START_ADDRESS 0xF0208000 #define BANK7_SECTOR2_END_ADDRESS 0xF020BFFF #define BANK7_SECTOR3_START_ADDRESS 0xF020FFFF #define BANK7_SECTOR3_END_ADDRESS 0xF020C000 typedef enum NVDataMgmt_Self_Test_States { NVDATAMGMT_SELF_TEST_STATE_START = 0, NVDATAMGMT_SELF_TEST_STATE_READ_MEMORY_DATA, NVDATAMGMT_SELF_TEST_STATE_CHECK_CRC, NVDATAMGMT_SELF_TEST_STATE_COMPLETE, NUM_OF_NVDATAMGMT_SELF_TEST_STATES } NVDATAMGMT_SELF_TEST_STATE_T; typedef enum NVDataMgmt_Exec_State { NVDATAMGMT_EXEC_STATE_WAIT_FOR_POST = 0, NVDATAMGMT_EXEC_STATE_IDLE, NVDATAMGMT_EXEC_STATE_WRITE, NVDATAMGMT_EXEC_STATE_READ, NVDATAMGMT_EXEC_STATE_FAULT, NUM_OF_NVDATAMGMT_EXEC_STATES } NVDATAMGMT_EXEC_STATE_T; typedef enum NVDataMgmt_Read_Write { NVDATAMGMT_WRITE = 0, NVDATAMGMT_READ } NVDATAMGMT_READ_WRITE_STATE_T; typedef enum NVDataMgmt_Location { NVDATAMGMT_EEPROM = 0, NVDATAMGMT_RTC } NVDATAMGMT_MEMORY_LOCATION_STATE_T; #pragma pack(push,4) struct memoryOps { NVDATAMGMT_READ_WRITE_STATE_T readWrite; NVDATAMGMT_MEMORY_LOCATION_STATE_T memoryLocation; U32 startAddress; U16* buffer; U32 length; }; #pragma pack(pop) // Private functions static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestStart( void ); static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestReadMemoryData( void ); static NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestCheckCRC( void ); static NVDATAMGMT_EXEC_STATE_T handleExecWaitForPost( void ); static NVDATAMGMT_EXEC_STATE_T handleExecIdle( void ); static NVDATAMGMT_EXEC_STATE_T handleExecWrite( void ); static NVDATAMGMT_EXEC_STATE_T handleExecRead( void ); // Private variables struct memoryOps jobQueue[ MAX_QUEUE_SIZE ]; 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 readBuffer[8] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; /************************************************************************* * @brief initNVDataMgmt * The initNVDataMgmt initializes EEPROM * @details * Inputs : none * Outputs : none * @param none * @return none *************************************************************************/ void initNVDataMgmt( void ) { // TODO: initialize all the necessary variables NVDataMgmtSelfTestState = NVDATAMGMT_SELF_TEST_STATE_START; EEPROMStatus = Fapi_initializeFlashBanks( ROUNDED_HCLK_FREQ ); EEPROMStatus = Fapi_setActiveFlashBank( Fapi_FlashBank7 ); } /************************************************************************* * @brief handleSelfTestStart * The handleSelfTestStart enables the EEPROM bank sectors * @details * Inputs : none * Outputs : NVDATAMGMT_SELF_TEST_STATE_T * @param none * @return NVDATAMGMT_SELF_TEST_STATE_T *************************************************************************/ NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestStart( void ) { NVDATAMGMT_SELF_TEST_STATE_T state = NVDATAMGMT_SELF_TEST_STATE_START; if ( isServiceOnEntry ) { EEPROMStatus = Fapi_enableEepromBankSectors( BANK7_SECTOR_0_31_ENABLE_BIT_MASK, BANK7_SECTOR_32_63_ENABLE_BIT_MASK ); isServiceOnEntry = FALSE; } else if ( EEPROMStatus == Fapi_Status_Success ) { state = NVDATAMGMT_SELF_TEST_STATE_READ_MEMORY_DATA; isServiceOnEntry = TRUE; } return state; } NVDATAMGMT_SELF_TEST_STATE_T handleSelfTestReadMemoryData( void ) { NVDATAMGMT_SELF_TEST_STATE_T state = NVDATAMGMT_SELF_TEST_STATE_READ_MEMORY_DATA; if ( isServiceOnEntry ) { EEPROMStatus = Fapi_doMarginRead((uint32_t*)BANK7_SECTOR0_START_ADDRESS, readBuffer, 8, Fapi_NormalRead); isServiceOnEntry = FALSE; } else if ( EEPROMStatus == Fapi_Status_Success ) { isServiceOnEntry = TRUE; } return state; } /************************************************************************* * @brief execNVDataMgmtSelfTest * The execNVDataMgmtSelfTest runs the NVDataMgmt POST during the self test * @details * Inputs : none * Outputs : SELF_TEST_STATUS_T * @param none * @return SELF_TEST_STATUS_T *************************************************************************/ SELF_TEST_STATUS_T execNVDataMgmtSelfTest ( void ) { switch( NVDataMgmtSelfTestState ) { case NVDATAMGMT_SELF_TEST_STATE_START: NVDataMgmtSelfTestState = handleSelfTestStart(); break; case NVDATAMGMT_SELF_TEST_STATE_READ_MEMORY_DATA: NVDataMgmtSelfTestState = handleSelfTestReadMemoryData(); break; case NVDATAMGMT_SELF_TEST_STATE_CHECK_CRC: break; case NVDATAMGMT_SELF_TEST_STATE_COMPLETE: break; default: //TODO: Alarm NVDataMgmtSelfTestResult = SELF_TEST_STATUS_FAILED; break; } return NVDataMgmtSelfTestResult; } void execNVDataMgmt( void ) { }