*/\r
\r
//lint -esym(522,CalcCrc) // 522 PC-Lint exception for empty functions\r
-//lint -emacro(904,VALIDATE_RV,VALIDATE_NO_RV) //904 PC-Lint exception to MISRA 14.7 (validate macros).\r
+//lint -emacro(904,DET_VALIDATE_RV,DET_VALIDATE_NO_RV) //904 PC-Lint exception to MISRA 14.7 (validate macros).\r
\r
// Exception made as a result of that NVM_DATASET_SELECTION_BITS can be zero\r
//lint -emacro(835, BLOCK_BASE_AND_SET_TO_BLOCKNR) // 835 PC-lint: A zero has been given as right argument to operator '<<' or '>>'\r
\r
#if ( NVM_DEV_ERROR_DETECT == STD_ON )\r
#include "Det.h"\r
-#define VALIDATE(_exp,_api,_err ) \\r
+#define DET_VALIDATE(_exp,_api,_err ) \\r
if( !(_exp) ) { \\r
Det_ReportError(MODULE_ID_NVM, 0, _api, _err); \\r
}\r
\r
\r
-#define VALIDATE_RV(_exp,_api,_err,_rv ) \\r
+#define DET_VALIDATE_RV(_exp,_api,_err,_rv ) \\r
if( !(_exp) ) { \\r
Det_ReportError(MODULE_ID_NVM, 0, _api, _err); \\r
return _rv; \\r
}\r
\r
-#define VALIDATE_NO_RV(_exp,_api,_err ) \\r
+#define DET_VALIDATE_NO_RV(_exp,_api,_err ) \\r
if( !(_exp) ) { \\r
Det_ReportError(MODULE_ID_NVM, 0, _api, _err); \\r
return; \\r
#define DET_REPORTERROR(_module,_instance,_api,_err) Det_ReportError(_module,_instance,_api,_err)\r
\r
#else\r
-#define VALIDATE(_exp,_api,_err )\r
-#define VALIDATE_RV(_exp,_api,_err,_rv )\r
-#define VALIDATE_NO_RV(_exp,_api,_err )\r
+#define DET_VALIDATE(_exp,_api,_err )\r
+#define DET_VALIDATE_RV(_exp,_api,_err,_rv )\r
+#define DET_VALIDATE_NO_RV(_exp,_api,_err )\r
#define DET_REPORTERROR(_module,_instance,_api,_err)\r
#endif\r
\r
\r
/* ----------------------------[private functions]---------------------------*/\r
\r
-static void WriteBlock( const NvM_BlockDescriptorType *blockDescriptor,\r
- AdministrativeBlockType *adminBlock,\r
- uint8 setNumber,\r
- uint8 *sourceAddress);\r
\r
static void setRamBlockStatus( const NvM_BlockDescriptorType *bPtr,\r
AdministrativeBlockType *admPtr,\r
#endif\r
) {\r
NVM_ASSERT(BlockDescriptorList->RamBlockDataAddress != NULL);\r
- VALIDATE_RV(BlockDescriptorList->RamBlockDataAddress != NULL, NVM_READ_ALL_ID, NVM_E_WRONG_CONFIG, FALSE );\r
+ DET_VALIDATE_RV(BlockDescriptorList->RamBlockDataAddress != NULL, NVM_READ_ALL_ID, NVM_E_WRONG_CONFIG, FALSE );\r
/* 3.1.5/NVM245 */\r
NVM_ASSERT(BlockDescriptorList->BlockManagementType != NVM_BLOCK_DATASET);\r
- VALIDATE_RV(BlockDescriptorList->BlockManagementType != NVM_BLOCK_DATASET, NVM_READ_ALL_ID, NVM_E_WRONG_CONFIG, FALSE );\r
+ DET_VALIDATE_RV(BlockDescriptorList->BlockManagementType != NVM_BLOCK_DATASET, NVM_READ_ALL_ID, NVM_E_WRONG_CONFIG, FALSE );\r
\r
AdminBlockTable->ErrorStatus = NVM_REQ_PENDING;\r
AdminBlockTable->BlockState = BLOCK_STATE_MEMIF_REQ;\r
switch (admPtr->BlockState) {\r
case BLOCK_STATE_MEMIF_REQ:\r
{\r
+ boolean fail = FALSE;\r
+ Std_ReturnType rv;\r
void *ramData = (dataPtr != NULL) ? dataPtr : bPtr->RamBlockDataAddress;\r
\r
admPtr->savedDataPtr = ramData;\r
memcpy( Nvm_WorkBuffer, ramData, bPtr->NvBlockLength );\r
/* Add the CRC to write */\r
writeCrcToBuffer(Nvm_WorkBuffer, bPtr, admPtr );\r
- WriteBlock(bPtr, admPtr, admPtr->DataIndex, Nvm_WorkBuffer);\r
+\r
+ /*\r
+ * Write the block\r
+ */\r
+ if (admPtr->DataIndex < bPtr->NvBlockNum) {\r
+ imask_t state;\r
+ SetMemifJobBusy();\r
+ MemIfJobAdmin.BlockAdmin = admPtr;\r
+ MemIfJobAdmin.BlockDescriptor = bPtr;\r
+\r
+ Irq_Save(state);\r
+\r
+ rv = MemIf_Write(bPtr->NvramDeviceId, BLOCK_BASE_AND_SET_TO_BLOCKNR(bPtr->NvBlockBaseNumber, admPtr->DataIndex), Nvm_WorkBuffer);\r
+\r
+ if (rv != E_OK) {\r
+ if ( MemIf_GetStatus(FIXME) == MEMIF_IDLE ) {\r
+ AbortMemIfJob(MEMIF_JOB_FAILED);\r
+ fail = TRUE;\r
+ } else {\r
+ /* Do nothing. For MEMIF_UNINIT, MEMIF_BUSY and MEMIF_BUSY_INTERNAL we just stay in the\r
+ * same state. Better in the next run */\r
+ Irq_Restore(state);\r
+ break; /* Do NOT advance to next state */\r
+ }\r
+ }\r
+ Irq_Restore(state);\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
+ fail = TRUE;\r
+ }\r
+\r
+ if (fail) {\r
+ /* Fail the job */\r
+ admPtr->ErrorStatus = NVM_REQ_NOT_OK;\r
+ blockDone = 1;\r
+ break; /* Do NOT advance to next state */\r
+ }\r
+\r
} else {\r
uint8 crcLen = 0;\r
/* Read to workbuffer */\r
} else {\r
uint8 setNumber = admPtr->DataIndex;\r
uint16 length = bPtr->NvBlockLength+crcLen;\r
- Std_ReturnType rv;\r
- boolean fail = FALSE;\r
\r
/*\r
* Read the Block\r
ramData = bPtr->RamBlockDataAddress;\r
}\r
\r
- admPtr->savedDataPtr = ramData;\r
+// admPtr->savedDataPtr = ramData;\r
\r
/* Calculate RAM CRC checksum */\r
if( bPtr->BlockCRCType == NVM_CRC16 ) {\r
}\r
}\r
\r
-/*\r
- * Request writing of a block to MemIf
- */\r
-static void WriteBlock( const NvM_BlockDescriptorType *blockDescriptor,\r
- AdministrativeBlockType *adminBlock,\r
- uint8 setNumber,\r
- uint8 *sourceAddress)\r
-{\r
- Std_ReturnType returnCode;\r
-\r
- if (setNumber < blockDescriptor->NvBlockNum) {\r
- SetMemifJobBusy();\r
- MemIfJobAdmin.BlockAdmin = adminBlock;\r
- MemIfJobAdmin.BlockDescriptor = blockDescriptor;\r
- returnCode = MemIf_Write(blockDescriptor->NvramDeviceId, BLOCK_BASE_AND_SET_TO_BLOCKNR(blockDescriptor->NvBlockBaseNumber, 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
/*\r
* Initiate the write all job\r
void NvM_ReadAll(void)\r
{\r
imask_t state;\r
- VALIDATE_NO_RV(nvmState != NVM_UNINITIALIZED, NVM_READ_ALL_ID, NVM_E_NOT_INITIALIZED);\r
+ DET_VALIDATE_NO_RV(nvmState != NVM_UNINITIALIZED, NVM_READ_ALL_ID, NVM_E_NOT_INITIALIZED);\r
\r
NVM_ASSERT(nvmState == NVM_IDLE);\r
\r
void NvM_WriteAll(void)\r
{\r
imask_t state;\r
- VALIDATE_NO_RV(nvmState != NVM_UNINITIALIZED, NVM_READ_ALL_ID, NVM_E_NOT_INITIALIZED);\r
+ DET_VALIDATE_NO_RV(nvmState != NVM_UNINITIALIZED, NVM_READ_ALL_ID, NVM_E_NOT_INITIALIZED);\r
\r
NVM_ASSERT(nvmState == NVM_IDLE);\r
\r
*/\r
Std_ReturnType NvM_GetErrorStatus(NvM_BlockIdType blockId, NvM_RequestResultType *requestResultPtr)\r
{\r
- VALIDATE_RV(nvmState != NVM_UNINITIALIZED, NVM_GET_ERROR_STATUS_ID, NVM_E_NOT_INITIALIZED, E_NOT_OK );\r
- VALIDATE_RV(blockId < NVM_NUM_OF_NVRAM_BLOCKS+1, NVM_GET_ERROR_STATUS_ID, NVM_E_PARAM_BLOCK_ID, E_NOT_OK );\r
+ DET_VALIDATE_RV(nvmState != NVM_UNINITIALIZED, NVM_GET_ERROR_STATUS_ID, NVM_E_NOT_INITIALIZED, E_NOT_OK );\r
+ DET_VALIDATE_RV(blockId < NVM_NUM_OF_NVRAM_BLOCKS+1, NVM_GET_ERROR_STATUS_ID, NVM_E_PARAM_BLOCK_ID, E_NOT_OK );\r
\r
if (blockId == 0) {\r
// Multiblock ID\r
Nvm_QueueType qEntry;\r
int rv;\r
\r
- VALIDATE_RV(blockId < NVM_NUM_OF_NVRAM_BLOCKS+1, NVM_SET_RAM_BLOCK_STATUS_ID, NVM_E_PARAM_BLOCK_ID, E_NOT_OK);\r
+ DET_VALIDATE_RV(blockId < NVM_NUM_OF_NVRAM_BLOCKS+1, NVM_SET_RAM_BLOCK_STATUS_ID, NVM_E_PARAM_BLOCK_ID, E_NOT_OK);\r
\r
admPtr = &AdminBlock[blockId-1];\r
\r
- VALIDATE_RV(nvmState != NVM_UNINITIALIZED, NVM_SET_RAM_BLOCK_STATUS_ID, NVM_E_NOT_INITIALIZED, E_NOT_OK); /** @req NVM497 */\r
- VALIDATE_RV(blockId > 1, NVM_SET_RAM_BLOCK_STATUS_ID, NVM_E_PARAM_BLOCK_ID, E_NOT_OK );\r
- VALIDATE_RV( (admPtr->ErrorStatus != NVM_REQ_PENDING), 0, NVM_E_BLOCK_PENDING , E_NOT_OK );\r
+ DET_VALIDATE_RV(nvmState != NVM_UNINITIALIZED, NVM_SET_RAM_BLOCK_STATUS_ID, NVM_E_NOT_INITIALIZED, E_NOT_OK); /** @req NVM497 */\r
+ DET_VALIDATE_RV(blockId > 1, NVM_SET_RAM_BLOCK_STATUS_ID, NVM_E_PARAM_BLOCK_ID, E_NOT_OK );\r
+ DET_VALIDATE_RV( (admPtr->ErrorStatus != NVM_REQ_PENDING), 0, NVM_E_BLOCK_PENDING , E_NOT_OK );\r
\r
qEntry.blockId = blockId;\r
qEntry.op = NVM_SETRAMBLOCKSTATUS;\r
NVM_ASSERT( blockId >= 2 ); /* No support for lower numbers, yet */\r
\r
/* @req 3.1.5/NVM618 */\r
- VALIDATE_RV( blockId <= NVM_NUM_OF_NVRAM_BLOCKS,\r
+ DET_VALIDATE_RV( blockId <= NVM_NUM_OF_NVRAM_BLOCKS,\r
NVM_WRITE_BLOCK_ID,NVM_E_PARAM_BLOCK_ID,E_NOT_OK );\r
\r
bPtr = &NvM_Config.BlockDescriptor[blockId-1];\r
\r
/** @req 3.1.5/NVM196 */ /** @req 3.1.5/NVM278 */ /** @req 3.1.5/NVM210 */\r
/* It must be a permanent RAM block but no RamBlockDataAddress -> error */\r
- VALIDATE_RV( !((NvM_DestPtr == NULL) && ( bPtr->RamBlockDataAddress == NULL )),\r
+ DET_VALIDATE_RV( !((NvM_DestPtr == NULL) && ( bPtr->RamBlockDataAddress == NULL )),\r
NVM_WRITE_BLOCK_ID,NVM_E_PARAM_BLOCK_ID,E_NOT_OK );\r
\r
- VALIDATE_RV( (admPtr->ErrorStatus != NVM_REQ_PENDING), 0, NVM_E_BLOCK_PENDING , E_NOT_OK );\r
+ DET_VALIDATE_RV( (admPtr->ErrorStatus != NVM_REQ_PENDING), 0, NVM_E_BLOCK_PENDING , E_NOT_OK );\r
\r
/* @req 3.1.5/NVM195 */\r
qEntry.blockId = blockId;\r
int rv;\r
\r
/** @req 3.1.5/NVM196 */ /** @req 3.1.5/NVM278 */\r
- VALIDATE_RV( !(( NvM_DstPtr == NULL) &&\r
+ DET_VALIDATE_RV( !(( NvM_DstPtr == NULL) &&\r
( NvM_Config.BlockDescriptor[blockId-1].RamBlockDataAddress == NULL )),\r
0, NVM_E_PARAM_ADDRESS , E_NOT_OK );\r
- VALIDATE_RV( (AdminBlock[blockId-1].ErrorStatus != NVM_REQ_PENDING), 0, NVM_E_BLOCK_PENDING , E_NOT_OK );\r
+ DET_VALIDATE_RV( (AdminBlock[blockId-1].ErrorStatus != NVM_REQ_PENDING), 0, NVM_E_BLOCK_PENDING , E_NOT_OK );\r
\r
/* @req 3.1.5/NVM195 */\r
qEntry.blockId = blockId;\r
NVM_ASSERT( blockId >= 2 ); /* No support for lower numbers, yet */\r
\r
/* @req 3.1.5/NVM618 */\r
- VALIDATE_RV( blockId <= NVM_NUM_OF_NVRAM_BLOCKS,\r
+ DET_VALIDATE_RV( blockId <= NVM_NUM_OF_NVRAM_BLOCKS,\r
NVM_WRITE_BLOCK_ID,NVM_E_PARAM_BLOCK_ID,E_NOT_OK );\r
\r
bPtr = &NvM_Config.BlockDescriptor[blockId-1];\r
admPtr = &AdminBlock[blockId-1];\r
\r
/** @req 3.1.5/NVM196 */ /** @req 3.1.5/NVM278 */\r
- VALIDATE_RV( !((NvM_SrcPtr == NULL) && ( bPtr->RamBlockDataAddress == NULL )),\r
+ DET_VALIDATE_RV( !((NvM_SrcPtr == NULL) && ( bPtr->RamBlockDataAddress == NULL )),\r
0, NVM_E_PARAM_ADDRESS, E_NOT_OK );\r
- VALIDATE_RV( (admPtr->ErrorStatus != NVM_REQ_PENDING), 0, NVM_E_BLOCK_PENDING , E_NOT_OK );\r
+ DET_VALIDATE_RV( (admPtr->ErrorStatus != NVM_REQ_PENDING), 0, NVM_E_BLOCK_PENDING , E_NOT_OK );\r
\r
/* @req 3.1.5/NVM195 */\r
qEntry.blockId = blockId;\r
\r
NVM_ASSERT( blockId >= 2 ); /* No support for lower numbers, yet */\r
\r
- VALIDATE_RV(nvmState != NVM_UNINITIALIZED, NVM_SET_DATA_INDEX_ID, NVM_E_NOT_INITIALIZED, E_NOT_OK);\r
- VALIDATE_RV(blockId < NVM_NUM_OF_NVRAM_BLOCKS+1, NVM_SET_DATA_INDEX_ID, NVM_E_PARAM_BLOCK_ID, E_NOT_OK);\r
- VALIDATE_RV(bPtr->BlockManagementType != NVM_BLOCK_NATIVE , NVM_SET_DATA_INDEX_ID, NVM_E_PARAM_BLOCK_TYPE , E_NOT_OK);\r
- VALIDATE_RV(dataIndex < bPtr->NvBlockNum + bPtr->RomBlockNum , NVM_SET_DATA_INDEX_ID, NVM_E_PARAM_BLOCK_DATA_IDX ,E_NOT_OK);\r
- VALIDATE_RV( (admPtr->ErrorStatus != NVM_REQ_PENDING), NVM_SET_DATA_INDEX_ID, NVM_E_BLOCK_PENDING , E_NOT_OK);\r
+ DET_VALIDATE_RV(nvmState != NVM_UNINITIALIZED, NVM_SET_DATA_INDEX_ID, NVM_E_NOT_INITIALIZED, E_NOT_OK);\r
+ DET_VALIDATE_RV(blockId < NVM_NUM_OF_NVRAM_BLOCKS+1, NVM_SET_DATA_INDEX_ID, NVM_E_PARAM_BLOCK_ID, E_NOT_OK);\r
+ DET_VALIDATE_RV(bPtr->BlockManagementType != NVM_BLOCK_NATIVE , NVM_SET_DATA_INDEX_ID, NVM_E_PARAM_BLOCK_TYPE , E_NOT_OK);\r
+ DET_VALIDATE_RV(dataIndex < bPtr->NvBlockNum + bPtr->RomBlockNum , NVM_SET_DATA_INDEX_ID, NVM_E_PARAM_BLOCK_DATA_IDX ,E_NOT_OK);\r
+ DET_VALIDATE_RV( (admPtr->ErrorStatus != NVM_REQ_PENDING), NVM_SET_DATA_INDEX_ID, NVM_E_BLOCK_PENDING , E_NOT_OK);\r
\r
qEntry.blockId = blockId;\r
qEntry.op = NVM_SETDATAINDEX;\r
\r
NVM_ASSERT( blockId >= 2 ); /* No support for lower numbers, yet */\r
\r
- VALIDATE_RV(nvmState != NVM_UNINITIALIZED, NVM_GET_DATA_INDEX_ID, NVM_E_NOT_INITIALIZED, E_NOT_OK);\r
- VALIDATE_RV(blockId < NVM_NUM_OF_NVRAM_BLOCKS+1, NVM_GET_DATA_INDEX_ID, NVM_E_PARAM_BLOCK_ID, E_NOT_OK);\r
- VALIDATE_RV(bPtr->BlockManagementType != NVM_BLOCK_NATIVE , NVM_GET_DATA_INDEX_ID, NVM_E_PARAM_BLOCK_TYPE , E_NOT_OK);\r
- VALIDATE_RV( (dataIndexPtr != NULL) , NVM_GET_DATA_INDEX_ID, NVM_E_PARAM_DATA ,E_NOT_OK);\r
- VALIDATE_RV( (admPtr->ErrorStatus != NVM_REQ_PENDING), NVM_GET_DATA_INDEX_ID, NVM_E_BLOCK_PENDING , E_NOT_OK);\r
+ DET_VALIDATE_RV(nvmState != NVM_UNINITIALIZED, NVM_GET_DATA_INDEX_ID, NVM_E_NOT_INITIALIZED, E_NOT_OK);\r
+ DET_VALIDATE_RV(blockId < NVM_NUM_OF_NVRAM_BLOCKS+1, NVM_GET_DATA_INDEX_ID, NVM_E_PARAM_BLOCK_ID, E_NOT_OK);\r
+ DET_VALIDATE_RV(bPtr->BlockManagementType != NVM_BLOCK_NATIVE , NVM_GET_DATA_INDEX_ID, NVM_E_PARAM_BLOCK_TYPE , E_NOT_OK);\r
+ DET_VALIDATE_RV( (dataIndexPtr != NULL) , NVM_GET_DATA_INDEX_ID, NVM_E_PARAM_DATA ,E_NOT_OK);\r
+ DET_VALIDATE_RV( (admPtr->ErrorStatus != NVM_REQ_PENDING), NVM_GET_DATA_INDEX_ID, NVM_E_BLOCK_PENDING , E_NOT_OK);\r
\r
qEntry.blockId = blockId;\r
qEntry.op = NVM_GETDATAINDEX;\r