Index: NVDataMgmt.c =================================================================== diff -u -r1dca03388e2ccf64fc0bbee3e77080462a17097f -r1e84982f9bd335d3fe5ecd1fc98ce4aab67ae133 --- NVDataMgmt.c (.../NVDataMgmt.c) (revision 1dca03388e2ccf64fc0bbee3e77080462a17097f) +++ NVDataMgmt.c (.../NVDataMgmt.c) (revision 1e84982f9bd335d3fe5ecd1fc98ce4aab67ae133) @@ -149,40 +149,41 @@ /// NVDataMgmt process records states typedef enum NVDataMgmt_Process_Records_States { - NVDATAMGMT_PROCESS_RECORD_STATE_IDLE = 0, ///< NVDataMgmt process record idle state. - NVDATAMGMT_PROCESS_RECORD_STATE_SEND_RECORD, ///< NVDataMgmt process record send record state. - NUM_OF_NVDATAMGMT_PROCESS_RECORD_STATES ///< Number of NVDataMgmt process records state. + NVDATAMGMT_PROCESS_RECORD_STATE_IDLE = 0, ///< NVDataMgmt process record idle state. + NVDATAMGMT_PROCESS_RECORD_STATE_SEND_RECORD, ///< NVDataMgmt process record send record state. + NUM_OF_NVDATAMGMT_PROCESS_RECORD_STATES ///< Number of NVDataMgmt process records state. } PROCESS_RECORD_STATE_T; /// NVDataMgmt receive records states typedef enum NVDataMgmt_Receive_Records_States { - NVDATAMGMT_RECEIVE_RECORD_IDLE = 0, ///< NVDataMgmt receive record idle. - NVDATAMGMT_RECEIVE_RECORD_RECEIVE, ///< NVDataMgmt receive record receive. - NUM_OF_NVDATAMGMT_RECEIVE_RECORD_STATES ///< Number of NVDataMgmt receive record. + NVDATAMGMT_RECEIVE_RECORD_IDLE = 0, ///< NVDataMgmt receive record idle. + NVDATAMGMT_RECEIVE_RECORD_RECEIVE, ///< NVDataMgmt receive record receive. + NUM_OF_NVDATAMGMT_RECEIVE_RECORD_STATES ///< Number of NVDataMgmt receive record. } RECEIVE_RECORD_STATE_T; /// NVDataMgmt records' jobs states typedef enum NVDataMgmt_Records_Jobs { - NVDATAMGMT_PROCESS_SECTOR_0_RECORDS = 0, ///< NVDataMgmt process sector 0 records (read/write). - NVDATAMGMT_PROCESS_SCHEDULING_RECORD, + NVDATAMGMT_PROCESS_CALIBRATION_RECORD = 0, ///< NVDataMgmt process calibration record (read/write). + NVDATAMGMT_PROCESS_MANUFACTURING_RECORD, + NVDATAMGMT_PROCESS_DG_SCHEDULER_RECORD, NUM_OF_NVDATMGMT_RECORDS_JOBS } RECORD_JOBS_STATE_T; #pragma pack(push, 1) typedef struct { U32 startAddress; - U32 numberOfBytes; - U32 writeSize; + U32 sizeofJob; + U08 maxBufferSize; } PROCESS_RECORD_SPECS_T; typedef struct { NVDATAMGMT_OPERATION_STATE_T memoryOperation; ///< Memory operation. NVDATAMGMT_LOCATION_STATE_T memoryLocation; ///< Memory location. - RECORD_JOBS_STATE_T recordJob; ///< Record job (i.e sector 0) + RECORD_JOBS_STATE_T recordJob; ///< Record job (i.e sector 0). } PROCESS_RECORD_JOB_T; /// Memory operations structure. @@ -321,14 +322,6 @@ U16 crc; ///< CRC for the DG cal record structure } DG_CALIBRATION_RECORD_T; -/// Sector 0 records structure -typedef struct -{ - DG_CALIBRATION_RECORD_T test; - // TODO padding - -} SECTOR_0_RECORDS_T; - /// DG scheduler record structure typedef struct { @@ -338,7 +331,7 @@ // TODO change the const PROCESS_RECORD_SPECS_T RECORDS_SPECS [ NUM_OF_NVDATMGMT_RECORDS_JOBS ] = { - {BANK7_SECTOR0_START_ADDRESS, sizeof(DG_CALIBRATION_RECORD_T), MAX_EEPROM_WRITE_BUFFER_BYTES}, //NVDATAMGMT_PROCESS_SECTOR_0_RECORDS + {BANK7_SECTOR0_START_ADDRESS, sizeof(DG_CALIBRATION_RECORD_T), MAX_EEPROM_WRITE_BUFFER_BYTES}, //NVDATAMGMT_PROCESS_CALIBRATION_RECORD {DG_SCHEDULER_ADDRESS, sizeof(DG_SCHEDULER_RECORD_T), 11 /*TODO can we increase this to 16?*/}}; //NVDATAMGMT_PROCESS_SCHEDULING_RECORD}; // Calibration variables @@ -355,6 +348,9 @@ static PROCESS_RECORD_JOB_T recordJobQueue[ QUEUE_MAX_SIZE ]; ///< Record queue jobs. static U08 recordQueueRearIndex; ///< Record queue rear index. static U08 recordQueueFrontIndex; ///< Record queue front index. +static U08 recordQueueCount; ///< Record queue count. +static PROCESS_RECORD_JOB_T recordCurrentJob; ///< Record queue current job. +static U32 recordAddressOffset; ///< Record address offset. // Private variables static MEMORY_LOG_OPS_T jobQueue [ QUEUE_MAX_SIZE ]; ///< Job queue buffer @@ -406,8 +402,7 @@ static PROCESS_RECORD_STATE_T handleExecProcessRecordIdleState( void ); static PROCESS_RECORD_STATE_T handleExecProcessRecordSendRecordState( void ); -// Queue functions - +// Log queue functions static void setMemoryOpsStruct ( NVDATAMGMT_OPERATION_STATE_T ops, NVDATAMGMT_LOCATION_STATE_T location, U32 startAddress, U08* data, READ_DATA_T* extAddress, U32 length ); static void enqueue ( NVDATAMGMT_OPERATION_STATE_T ops, NVDATAMGMT_LOCATION_STATE_T location, @@ -421,10 +416,14 @@ static BOOL enqueueBank7Sector0Records ( void ); // Helper functions - static BOOL didCommandTimeout ( ALARM_ID_T alarm, U08* state ); static BOOL eraseDataLogSectors ( void ); +// Record operations queue functions +static void enqueueRecordJob( NVDATAMGMT_OPERATION_STATE_T ops, NVDATAMGMT_LOCATION_STATE_T location, RECORD_JOBS_STATE_T job ); +static void dequeueRecordJob( void ); +static BOOL isRecordQueueEmpty( void ); + /*********************************************************************//** * @brief * The initNVDataMgmt function initializes the module. @@ -436,20 +435,23 @@ *************************************************************************/ void initNVDataMgmt( void ) { - NVDataMgmtSelfTestState = NVDATAMGMT_SELF_TEST_STATE_START; - NVDataMgmtExecState = NVDATAMGMT_EXEC_STATE_WAIT_FOR_POST; - NVDataMgmtSelfTestResult = SELF_TEST_STATUS_IN_PROGRESS; - NVDataMgmtExecProcessRecordState = NVDATAMGMT_PROCESS_RECORD_STATE_IDLE; + NVDataMgmtSelfTestState = NVDATAMGMT_SELF_TEST_STATE_START; + NVDataMgmtExecState = NVDATAMGMT_EXEC_STATE_WAIT_FOR_POST; + NVDataMgmtSelfTestResult = SELF_TEST_STATUS_IN_PROGRESS; + NVDataMgmtExecProcessRecordState = NVDATAMGMT_PROCESS_RECORD_STATE_IDLE; NVDataMgmtExecReceiveRecordState = NVDATAMGMT_RECEIVE_RECORD_IDLE; - queueRearIndex = QUEUE_START_INDEX; - queueFrontIndex = QUEUE_START_INDEX; - queueCount = 0; - dgCalRecordUpdateAddress = 0; - recordQueueRearIndex = QUEUE_START_INDEX; - recordQueueFrontIndex = QUEUE_START_INDEX; + queueRearIndex = QUEUE_START_INDEX; + queueFrontIndex = QUEUE_START_INDEX; + queueCount = 0; + dgCalRecordUpdateAddress = 0; + recordQueueRearIndex = QUEUE_START_INDEX; + recordQueueFrontIndex = QUEUE_START_INDEX; + recordQueueCount = 0; + recordAddressOffset = 0; Fapi_initializeFlashBanks( ROUNDED_HCLK_FREQ ); Fapi_setActiveFlashBank( Fapi_FlashBank7 ); + Fapi_enableEepromBankSectors( BANK7_SECTOR_0_31_ENABLE_BIT_MASK, BANK7_SECTOR_32_63_ENABLE_BIT_MASK ); // TODO FOR TESTING ONLY, REMOVE dgCalibrationRecord.presSensorsCalRecord.pressureSensors[0].offset = 5.69; @@ -751,17 +753,19 @@ U16 calcCRC = crc16 ( (U08*)&dgCalibrationRecord, sizeof(DG_CALIBRATION_RECORD_T) - sizeof(U16) ); U16 recordCRC = dgCalibrationRecord.crc; - if ( calcCRC != recordCRC ) + /*if ( calcCRC != recordCRC ) { // TODO schedule a read // CRC failed, request a read to read the data back from NV memory NVDataMgmtExecReceiveRecordState = NVDATAMGMT_RECEIVE_RECORD_IDLE; status = FALSE; } - else + else*/ { - // TODO schedule a write - // CRC passed, request a write to write the data to NV memory + // CRC passed, request an erase sector + enqueueRecordJob( NVDATAMGMT_ERASE_SECTOR, NVDATAMGMT_EEPROM, NVDATAMGMT_PROCESS_CALIBRATION_RECORD ); + enqueueRecordJob( NVDATAMGMT_WRITE, NVDATAMGMT_EEPROM, NVDATAMGMT_PROCESS_CALIBRATION_RECORD ); + NVDataMgmtExecReceiveRecordState = NVDATAMGMT_RECEIVE_RECORD_IDLE; } } @@ -1557,7 +1561,7 @@ { NVDATAMGMT_EXEC_STATE_T state = NVDATAMGMT_EXEC_STATE_WAIT_FOR_POST; - if ( NVDataMgmtSelfTestState == NVDATAMGMT_SELF_TEST_STATE_COMPLETE ) + //if ( NVDataMgmtSelfTestState == NVDATAMGMT_SELF_TEST_STATE_COMPLETE ) { state = NVDATAMGMT_EXEC_STATE_IDLE; } @@ -1577,10 +1581,31 @@ { NVDATAMGMT_EXEC_STATE_T state = NVDATAMGMT_EXEC_STATE_IDLE; - // If cal status is not none, process it - //if ( NVDataMgmtCalStatus != NVDATAMGMT_RECEIVE_READY ) + // If the record processing queue is not empty, process the queues + if ( !isRecordQueueEmpty() ) { + dequeueRecordJob(); + NVDATAMGMT_OPERATION_STATE_T ops = recordCurrentJob.memoryOperation; + NVDATAMGMT_LOCATION_STATE_T location = recordCurrentJob.memoryLocation; + RECORD_JOBS_STATE_T job = recordCurrentJob.recordJob; + PROCESS_RECORD_SPECS_T jobSpecs = RECORDS_SPECS [ job ]; + if ( ops == NVDATAMGMT_ERASE_SECTOR ) + { + currentTime = getMSTimerCount(); + Fapi_issueAsyncCommandWithAddress ( Fapi_EraseSector, (U32*)jobSpecs.startAddress ); + state = NVDATAMGMT_EXEC_STATE_ERASE_EEPROM; + } + else if ( ops == NVDATAMGMT_WRITE && location == NVDATAMGMT_EEPROM ) + { + currentTime = getMSTimerCount(); + U32* memoryPtr = (U32*)jobSpecs.startAddress + recordAddressOffset; + U08* structPtr = (U08*)&dgCalibrationRecord + recordAddressOffset; + + Fapi_issueProgrammingCommand ( memoryPtr, structPtr, jobSpecs.maxBufferSize, 0x00, 0, Fapi_DataOnly ); + recordAddressOffset += jobSpecs.maxBufferSize; + state = NVDATAMGMT_EXEC_STATE_WRITE_TO_EEPROM; + } } // Check if the queue is not empty and the calibration/service status is none // Processing calibration and service status have priority @@ -1595,8 +1620,7 @@ if ( ops == NVDATAMGMT_WRITE && location == NVDATAMGMT_EEPROM ) { currentTime = getMSTimerCount(); - Fapi_issueProgrammingCommand ( (U32*)startAddress, currentJob.buffer, length, - 0x00, 0, Fapi_DataOnly ); + Fapi_issueProgrammingCommand ( (U32*)startAddress, currentJob.buffer, length, 0x00, 0, Fapi_DataOnly ); state = NVDATAMGMT_EXEC_STATE_WRITE_TO_EEPROM; } else if ( ops == NVDATAMGMT_READ && location == NVDATAMGMT_EEPROM ) @@ -1650,12 +1674,26 @@ { NVDATAMGMT_EXEC_STATE_T state = NVDATAMGMT_EXEC_STATE_WRITE_TO_EEPROM; BOOL timeoutStatus = didCommandTimeout ( ALARM_ID_NVDATA_EEPROM_OPS_FAILURE, (U08*)&state ); + RECORD_JOBS_STATE_T job = recordCurrentJob.recordJob; + PROCESS_RECORD_SPECS_T jobSpecs = RECORDS_SPECS [ job ]; - if ( FAPI_CHECK_FSM_READY_BUSY == Fapi_Status_FsmReady || timeoutStatus == TRUE ) + if ( jobSpecs.sizeofJob == recordAddressOffset ) { - state = NVDATAMGMT_EXEC_STATE_IDLE; + if ( FAPI_CHECK_FSM_READY_BUSY == Fapi_Status_FsmReady || timeoutStatus == TRUE ) + { + state = NVDATAMGMT_EXEC_STATE_IDLE; + } } + else + { + currentTime = getMSTimerCount(); + U32* memoryPtr = (U32*)( jobSpecs.startAddress + recordAddressOffset ); + U08* structPtr = (U08*)&dgCalibrationRecord + recordAddressOffset; + Fapi_issueProgrammingCommand ( memoryPtr, structPtr, jobSpecs.maxBufferSize, 0x00, 0, Fapi_DataOnly ); + recordAddressOffset += jobSpecs.maxBufferSize; + } + return state; } @@ -2201,4 +2239,49 @@ return status; } +static void enqueueRecordJob( NVDATAMGMT_OPERATION_STATE_T ops, NVDATAMGMT_LOCATION_STATE_T location, RECORD_JOBS_STATE_T job ) +{ + PROCESS_RECORD_JOB_T currentJob; + + currentJob.memoryLocation = location; + currentJob.memoryOperation = ops; + currentJob.recordJob = job; + + recordJobQueue[ recordQueueRearIndex ] = currentJob; + + recordQueueCount++; + recordQueueRearIndex++; +} + +static void dequeueRecordJob( void ) +{ + U32 tempIndex; + + _disable_IRQ(); + tempIndex = recordQueueFrontIndex; + + if ( !isRecordQueueEmpty() ) + { + recordQueueFrontIndex = INC_WRAP( recordQueueFrontIndex, 0, QUEUE_MAX_SIZE - 1 ); + recordCurrentJob = recordJobQueue[ tempIndex ]; + } + if ( recordQueueCount > 0 ) + { + recordQueueCount--; + } + _enable_IRQ(); +} + +static BOOL isRecordQueueEmpty( void ) +{ + BOOL isEmpty = TRUE; + + if ( recordQueueCount > 0 ) + { + isEmpty = FALSE; + } + + return isEmpty; +} + /**@}*/