uint8 NumberOfWriteFailed; // Current write retry cycle\r
} AdministrativeBlockType;\r
\r
-AdministrativeBlockType AdminBlock[NVM_NUM_OF_NVRAM_BLOCKS];\r
+static AdministrativeBlockType AdminBlock[NVM_NUM_OF_NVRAM_BLOCKS];\r
\r
typedef struct {\r
NvM_RequestResultType ErrorStatus; // Status from multi block requests i.e. Read/Write/CancelWrite-all\r
} AdministrativeMultiBlockType;\r
\r
-AdministrativeMultiBlockType AdminMultiBlock;\r
+static AdministrativeMultiBlockType AdminMultiBlock;\r
\r
+/*\r
+ * This function needs to be implemented!
+ */\r
static void CalcCrc(void)\r
{\r
// TODO: Calculate CRC\r
}\r
\r
typedef struct {\r
- boolean JobFinnished;\r
+ boolean JobFinished;\r
Std_ReturnType JobStatus;\r
MemIf_JobResultType JobResult;\r
const NvM_BlockDescriptorType *BlockDescriptor;\r
} MemIfJobAdminType;\r
\r
static MemIfJobAdminType MemIfJobAdmin = {\r
- .JobFinnished = TRUE,\r
+ .JobFinished = TRUE,\r
.JobStatus = E_OK,\r
.JobResult = MEMIF_JOB_OK,\r
.BlockDescriptor = NULL,\r
\r
static AdminMultiReqType AdminMultiReq;\r
\r
-\r
-static void SetFlsJobBusy()\r
+/*\r
+ * Set the MemIf job as busy
+ */\r
+static void SetMemifJobBusy()\r
{\r
- MemIfJobAdmin.JobFinnished = FALSE;\r
+ MemIfJobAdmin.JobFinished = FALSE;\r
}\r
\r
\r
#if (NVM_POLLING_MODE == STD_ON)\r
-static boolean CheckFlsJobFinnished(void)\r
+/*\r
+ * Check if the MemIf job is finished
+ */\r
+static boolean CheckMemIfJobFinished(void)\r
{\r
MemIf_JobResultType jobResult;\r
\r
- if (!MemIfJobAdmin.JobFinnished) {\r
+ if (!MemIfJobAdmin.JobFinished) {\r
jobResult = MemIf_GetJobResult();\r
\r
if (jobResult == MEMIF_JOB_OK) {\r
- MemIfJobAdmin.JobFinnished = TRUE;\r
+ MemIfJobAdmin.JobFinished = TRUE;\r
MemIfJobAdmin.JobStatus = E_OK;\r
MemIfJobAdmin.JobResult = jobResult;\r
} else if (jobResult != MEMIF_JOB_PENDING) {\r
- MemIfJobAdmin.JobFinnished = TRUE;\r
+ MemIfJobAdmin.JobFinished = TRUE;\r
MemIfJobAdmin.JobStatus = E_NOT_OK;\r
MemIfJobAdmin.JobResult = jobResult;\r
}\r
}\r
\r
- return MemIfJobAdmin.JobFinnished;\r
+ return MemIfJobAdmin.JobFinished;\r
}\r
#else\r
-static boolean CheckFlsJobFinnished(void)\r
-{\r
- return MemIfJobAdmin.JobFinnished;\r
-}\r
-\r
-void NvM_JobEndNotification(void)\r
-{\r
- MemIfJobAdmin.JobFinnished = TRUE;\r
- MemIfJobAdmin.JobStatus = E_OK;\r
- MemIfJobAdmin.JobResult = MemIf_GetJobResult();\r
-}\r
-\r
-void NvM_JobErrorNotification(void)\r
+/*\r
+ * Check if the MemIf job is finished\r
+ */\r
+static boolean CheckMemIfJobFinished(void)\r
{\r
- MemIfJobAdmin.JobFinnished = TRUE;\r
- MemIfJobAdmin.JobStatus = E_NOT_OK;\r
- MemIfJobAdmin.JobResult = MemIf_GetJobResult();\r
+ return MemIfJobAdmin.JobFinished;\r
}\r
#endif\r
\r
-static void AbortFlsJob(MemIf_JobResultType jobResult)\r
+\r
+/*\r
+ * Abort the MemIf job with E_NOT_OK\r
+ */\r
+static void AbortMemIfJob(MemIf_JobResultType jobResult)\r
{\r
- MemIfJobAdmin.JobFinnished = TRUE;\r
+ MemIfJobAdmin.JobFinished = TRUE;\r
MemIfJobAdmin.JobStatus = E_NOT_OK;\r
MemIfJobAdmin.JobResult = jobResult;\r
}\r
\r
+\r
+/*\r
+ * Request a read of a block from MemIf
+ */\r
static void ReadBlock(const NvM_BlockDescriptorType *blockDescriptor, AdministrativeBlockType *adminBlock, uint8 setNumber, uint8 *destAddress)\r
{\r
Std_ReturnType returnCode;\r
uint16 blockOffset = 0; // TODO: How to calculate this?\r
\r
if (setNumber < blockDescriptor->NvBlockNum) {\r
- SetFlsJobBusy();\r
+ SetMemifJobBusy();\r
MemIfJobAdmin.BlockAdmin = adminBlock;\r
MemIfJobAdmin.BlockDescriptor = blockDescriptor;\r
returnCode = MemIf_Read(blockDescriptor->NvramDeviceId, (blockDescriptor->NvBlockBaseNumber << NVM_DATASET_SELECTION_BITS) | setNumber, blockOffset, destAddress, blockDescriptor->NvBlockLength);\r
if (returnCode != E_OK) {\r
- AbortFlsJob(MEMIF_JOB_FAILED);\r
+ AbortMemIfJob(MEMIF_JOB_FAILED);\r
}\r
} else if (setNumber < blockDescriptor->NvBlockNum + blockDescriptor->RomBlockNum) {\r
// TODO: Read from ROM\r
}\r
\r
\r
-static void WriteBlock(const NvM_BlockDescriptorType *blockDescriptor, AdministrativeBlockType *adminBlock, uint8 setNumber, uint8 *sourceAddress)\r
-{\r
- Std_ReturnType returnCode;\r
-\r
- if (setNumber < blockDescriptor->NvBlockNum) {\r
- SetFlsJobBusy();\r
- MemIfJobAdmin.BlockAdmin = adminBlock;\r
- MemIfJobAdmin.BlockDescriptor = blockDescriptor;\r
- returnCode = MemIf_Write(blockDescriptor->NvramDeviceId, (blockDescriptor->NvBlockBaseNumber << NVM_DATASET_SELECTION_BITS) | setNumber, sourceAddress);\r
- if (returnCode != E_OK) {\r
- AbortFlsJob(MEMIF_JOB_FAILED);\r
- }\r
- } else {\r
- // Error: setNumber out of range\r
- DET_REPORTERROR(MODULE_ID_NVM, 0, NVM_LOC_WRITE_BLOCK_ID, NVM_PARAM_OUT_OF_RANGE);\r
- }\r
-}\r
-\r
-\r
-void NvM_Init(void)\r
-{\r
- /** @req NVM399 *//** @req NVM193 */\r
- const NvM_BlockDescriptorType *BlockDescriptorList = NvM_Config.BlockDescriptor;\r
- AdministrativeBlockType *AdminBlockTable = AdminBlock;\r
- uint16 i;\r
-\r
- // Initiate the administration blocks\r
- for (i = 0; i< NVM_NUM_OF_NVRAM_BLOCKS; i++) {\r
- if (BlockDescriptorList->BlockManagementType == NVM_BLOCK_DATASET) {\r
- AdminBlockTable->DataIndex = 0; /** @req NVM192 */\r
- }\r
- AdminBlockTable->BlockWriteProtected = BlockDescriptorList->BlockWriteProt;\r
- AdminBlockTable->ErrorStatus = NVM_REQ_NOT_OK;\r
- AdminBlockTable->BlockChanged = FALSE;\r
- AdminBlockTable->BlockValid = FALSE;\r
- AdminBlockTable->NumberOfWriteFailed = 0;\r
-\r
- AdminBlockTable++;\r
- BlockDescriptorList++;\r
- }\r
-\r
- AdminMultiBlock.ErrorStatus = NVM_REQ_NOT_OK;\r
-\r
- // Set status to initialized\r
- nvmState = NVM_IDLE; /** @req NVM399 */\r
-}\r
-\r
-\r
+/*\r
+ * Initiate the read all job
+ */\r
static void ReadAllInit(void)\r
{\r
/*\r
}\r
\r
\r
+/*\r
+ * Main function for the read all job
+ */\r
static void ReadAllMain(void)\r
{\r
const NvM_BlockDescriptorType *BlockDescriptorList = NvM_Config.BlockDescriptor;\r
}\r
\r
\r
-void ReadAllCheckReadResult(void)\r
+/*\r
+ * Handles the MemIf result of one block read
+ */\r
+static void ReadAllCheckReadResult(void)\r
{\r
if (MemIfJobAdmin.JobStatus == E_OK) {\r
if (MemIfJobAdmin.BlockDescriptor->BlockUseCrc) {\r
MemIfJobAdmin.BlockAdmin->BlockState = BLOCK_STATE_IDLE;\r
MemIfJobAdmin.BlockAdmin->BlockValid = FALSE;\r
MemIfJobAdmin.BlockAdmin->BlockChanged = FALSE;\r
+\r
switch (MemIfJobAdmin.JobResult ) {\r
case MEMIF_BLOCK_INVALID:\r
MemIfJobAdmin.BlockAdmin->ErrorStatus = NVM_REQ_NV_INVALIDATED; /** @req NVM342 */\r
break;\r
\r
- case MEMIF_BLOCK_INCONSISTENT:\r
- MemIfJobAdmin.BlockAdmin->ErrorStatus = NVM_REQ_INTEGRITY_FAILED; /** @req NVM360 */\r
+ case MEMIF_BLOCK_INCONSISTENT: /** @req NVM360 */\r
+ MemIfJobAdmin.BlockAdmin->ErrorStatus = NVM_REQ_INTEGRITY_FAILED;\r
+#if defined(USE_DEM)\r
+ Dem_ReportErrorStatus(NVM_E_INTEGRITY_FAILED,DEM_EVENT_STATUS_FAILED);\r
+#endif\r
+ break;\r
+\r
+ case MEMIF_JOB_FAILED: /** @req NVM361 */\r
+ MemIfJobAdmin.BlockAdmin->ErrorStatus = NVM_REQ_NOT_OK;\r
+#if defined(USE_DEM)\r
+ Dem_ReportErrorStatus(NVM_E_REQ_FAILED,DEM_EVENT_STATUS_FAILED);\r
+#endif\r
break;\r
\r
default:\r
}\r
\r
\r
-void NvM_ReadAll(void)\r
+/*\r
+ * Request writing of a block to MemIf
+ */\r
+static void WriteBlock(const NvM_BlockDescriptorType *blockDescriptor, AdministrativeBlockType *adminBlock, uint8 setNumber, uint8 *sourceAddress)\r
{\r
- AdministrativeBlockType *AdminBlockTable = AdminBlock;\r
- uint16 i;\r
-\r
- VALIDATE_NO_RV(nvmState != NVM_UNINITIALIZED, NVM_READ_ALL_ID, NVM_E_NOT_INITIALIZED);\r
- // Check queue\r
- // TODO: Check queue\r
-\r
- // Check state\r
- if (nvmState == NVM_IDLE) {\r
- nvmState = NVM_READ_ALL_REQUESTED; /** @req NVM243 */\r
-\r
- // Set status to pending in the administration blocks\r
- AdminMultiBlock.ErrorStatus = NVM_REQ_PENDING;\r
+ Std_ReturnType returnCode;\r
\r
- for (i = 0; i < NVM_NUM_OF_NVRAM_BLOCKS; i++) {\r
- AdminBlockTable->ErrorStatus = NVM_REQ_PENDING;\r
- AdminBlockTable++;\r
+ if (setNumber < blockDescriptor->NvBlockNum) {\r
+ SetMemifJobBusy();\r
+ MemIfJobAdmin.BlockAdmin = adminBlock;\r
+ MemIfJobAdmin.BlockDescriptor = blockDescriptor;\r
+ returnCode = MemIf_Write(blockDescriptor->NvramDeviceId, (blockDescriptor->NvBlockBaseNumber << NVM_DATASET_SELECTION_BITS) | setNumber, sourceAddress);\r
+ if (returnCode != E_OK) {\r
+ AbortMemIfJob(MEMIF_JOB_FAILED);\r
}\r
+ } else {\r
+ // Error: setNumber out of range\r
+ DET_REPORTERROR(MODULE_ID_NVM, 0, NVM_LOC_WRITE_BLOCK_ID, NVM_PARAM_OUT_OF_RANGE);\r
}\r
}\r
\r
\r
+/*\r
+ * Initiate the write all job\r
+ */\r
static void WriteAllInit(void)\r
{\r
- /*\r
- * Initiate the write all job\r
- */\r
const NvM_BlockDescriptorType *BlockDescriptorList = NvM_Config.BlockDescriptor;\r
AdministrativeBlockType *AdminBlockTable = AdminBlock;\r
uint16 i;\r
}\r
\r
\r
+/*\r
+ * Main function for the write all job\r
+ */\r
static void WriteAllMain(void)\r
{\r
const NvM_BlockDescriptorType *BlockDescriptorList = NvM_Config.BlockDescriptor;\r
}\r
\r
\r
-void WriteAllCheckWriteResult(void)\r
+/*\r
+ * Handles the result of one MemIf block write\r
+ */\r
+static void WriteAllCheckWriteResult(void)\r
{\r
if (MemIfJobAdmin.JobStatus == E_OK) {\r
// TODO: Check if redundant block shall be written NVM337\r
AdminMultiReq.PendingErrorStatus = NVM_REQ_NOT_OK;\r
\r
MemIfJobAdmin.BlockAdmin->BlockState = BLOCK_STATE_IDLE;\r
- MemIfJobAdmin.BlockAdmin->ErrorStatus = NVM_REQ_NOT_OK;\r
-// Dem_ReportErrorStatus(NVM_E_REQ_FAILED,DEM_EVENT_STATUS_FAILED); TODO: Add this!\r
+ MemIfJobAdmin.BlockAdmin->ErrorStatus = NVM_REQ_NOT_OK; /** @req NVM296 */\r
+#if defined(USE_DEM)\r
+ Dem_ReportErrorStatus(NVM_E_REQ_FAILED,DEM_EVENT_STATUS_FAILED);\r
+#endif\r
\r
if (MemIfJobAdmin.BlockDescriptor->SingleBlockCallback != NULL) {\r
MemIfJobAdmin.BlockDescriptor->SingleBlockCallback(NVM_SERVICE_ID, MemIfJobAdmin.BlockAdmin->ErrorStatus);\r
}\r
\r
\r
+/***************************************\r
+ * External accessible functions *\r
+ ***************************************/\r
+/*\r
+ * Procedure: NvM_Init\r
+ * Reentrant: No\r
+ */\r
+void NvM_Init(void)\r
+{\r
+ /** @req NVM399 *//** @req NVM193 */\r
+ const NvM_BlockDescriptorType *BlockDescriptorList = NvM_Config.BlockDescriptor;\r
+ AdministrativeBlockType *AdminBlockTable = AdminBlock;\r
+ uint16 i;\r
+\r
+ // Initiate the administration blocks\r
+ for (i = 0; i< NVM_NUM_OF_NVRAM_BLOCKS; i++) {\r
+ if (BlockDescriptorList->BlockManagementType == NVM_BLOCK_DATASET) {\r
+ AdminBlockTable->DataIndex = 0; /** @req NVM192 */\r
+ }\r
+ AdminBlockTable->BlockWriteProtected = BlockDescriptorList->BlockWriteProt;\r
+ AdminBlockTable->ErrorStatus = NVM_REQ_NOT_OK;\r
+ AdminBlockTable->BlockChanged = FALSE;\r
+ AdminBlockTable->BlockValid = FALSE;\r
+ AdminBlockTable->NumberOfWriteFailed = 0;\r
+\r
+ AdminBlockTable++;\r
+ BlockDescriptorList++;\r
+ }\r
+\r
+ AdminMultiBlock.ErrorStatus = NVM_REQ_NOT_OK;\r
+\r
+ // Set status to initialized\r
+ nvmState = NVM_IDLE; /** @req NVM399 */\r
+}\r
+\r
+\r
+/*\r
+ * Procedure: NvM_ReadAll\r
+ * Reentrant: No\r
+ */\r
+void NvM_ReadAll(void)\r
+{\r
+ AdministrativeBlockType *AdminBlockTable = AdminBlock;\r
+ uint16 i;\r
+\r
+ VALIDATE_NO_RV(nvmState != NVM_UNINITIALIZED, NVM_READ_ALL_ID, NVM_E_NOT_INITIALIZED);\r
+ // Check queue\r
+ // TODO: Check queue\r
+\r
+ // Check state\r
+ if (nvmState == NVM_IDLE) {\r
+ nvmState = NVM_READ_ALL_REQUESTED; /** @req NVM243 */\r
+\r
+ // Set status to pending in the administration blocks\r
+ AdminMultiBlock.ErrorStatus = NVM_REQ_PENDING;\r
+\r
+ for (i = 0; i < NVM_NUM_OF_NVRAM_BLOCKS; i++) {\r
+ AdminBlockTable->ErrorStatus = NVM_REQ_PENDING;\r
+ AdminBlockTable++;\r
+ }\r
+ }\r
+}\r
+\r
+\r
+/*\r
+ * Procedure: NvM_WriteAll\r
+ * Reentrant: No\r
+ */\r
void NvM_WriteAll(void)\r
{\r
AdministrativeBlockType *AdminBlockTable = AdminBlock;\r
}\r
\r
\r
+/*\r
+ * Procedure: NvM_CancelWriteAll\r
+ * Reentrant: No\r
+ */\r
void NvM_CancelWriteAll(void)\r
{\r
\r
}\r
\r
\r
+/*\r
+ * Procedure: NvM_GetErrorStatus\r
+ * Reentrant: Yes\r
+ */\r
void NvM_GetErrorStatus(NvM_BlockIdType blockId, uint8 *requestResultPtr)\r
{\r
VALIDATE_NO_RV(nvmState != NVM_UNINITIALIZED, NVM_GET_ERROR_STATUS_ID, NVM_E_NOT_INITIALIZED);\r
\r
\r
#if (NVM_SET_RAM_BLOCK_STATUS_API == STD_ON) /** @req NVM408 */\r
+/*\r
+ * Procedure: Nvm_SetRamBlockStatus\r
+ * Reentrant: Yes\r
+ */\r
void Nvm_SetRamBlockStatus(NvM_BlockIdType blockId, boolean blockChanged)\r
{\r
const NvM_BlockDescriptorType *BlockDescriptorList = NvM_Config.BlockDescriptor;\r
#endif\r
\r
\r
+/***************************************\r
+ * Scheduled functions *\r
+ ***************************************/\r
+/*\r
+ * Procedure: NvM_MainFunction\r
+ * Reentrant: No\r
+ */\r
void NvM_MainFunction(void)\r
{\r
switch (nvmState) {\r
break;\r
\r
case NVM_READ_ALL_PENDING:\r
- if (CheckFlsJobFinnished()) {\r
+ if (CheckMemIfJobFinished()) {\r
ReadAllCheckReadResult();\r
}\r
CalcCrc();\r
break;\r
\r
case NVM_WRITE_ALL_PENDING:\r
- if (CheckFlsJobFinnished()) {\r
+ if (CheckMemIfJobFinished()) {\r
WriteAllCheckWriteResult();\r
}\r
CalcCrc();\r
}\r
}\r
\r
+\r
+/***************************************\r
+ * Call-back notifications functions *\r
+ ***************************************/\r
+#if (NVM_POLLING_MODE == STD_OFF)\r
+/*\r
+ * Procedure: NvM_JobEndNotification\r
+ * Reentrant: No\r
+ */\r
+void NvM_JobEndNotification(void)\r
+{\r
+ MemIfJobAdmin.JobFinished = TRUE;\r
+ MemIfJobAdmin.JobStatus = E_OK;\r
+ MemIfJobAdmin.JobResult = MemIf_GetJobResult();\r
+}\r
+\r
+/*\r
+ * Procedure: NvM_JobErrorNotification\r
+ * Reentrant: No\r
+ */\r
+void NvM_JobErrorNotification(void)\r
+{\r
+ MemIfJobAdmin.JobFinished = TRUE;\r
+ MemIfJobAdmin.JobStatus = E_NOT_OK;\r
+ MemIfJobAdmin.JobResult = MemIf_GetJobResult();\r
+}\r
+#endif\r
+\r