]> rtime.felk.cvut.cz Git - arc.git/blobdiff - memory/NvM/NvM.c
Updated Nvm
[arc.git] / memory / NvM / NvM.c
index 599b729a5a501c385a7eb2142a9bedcf798954f7..fc68384d1a37a317a477013e104ba93873d16f6e 100644 (file)
@@ -109,21 +109,24 @@ typedef struct {
        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
@@ -131,7 +134,7 @@ typedef struct {
 } 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
@@ -145,74 +148,76 @@ typedef struct {
 \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
@@ -223,54 +228,9 @@ static void ReadBlock(const NvM_BlockDescriptorType *blockDescriptor, Administra
 }\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
@@ -309,6 +269,9 @@ static void ReadAllInit(void)
 }\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
@@ -359,7 +322,10 @@ static void ReadAllMain(void)
 }\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
@@ -384,13 +350,24 @@ void ReadAllCheckReadResult(void)
                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
@@ -406,35 +383,33 @@ void ReadAllCheckReadResult(void)
 }\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
@@ -466,6 +441,9 @@ static void WriteAllInit(void)
 }\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
@@ -516,7 +494,10 @@ static void WriteAllMain(void)
 }\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
@@ -539,8 +520,10 @@ void WriteAllCheckWriteResult(void)
                        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
@@ -551,6 +534,74 @@ void WriteAllCheckWriteResult(void)
 }\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
@@ -575,12 +626,20 @@ void NvM_WriteAll(void)
 }\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
@@ -597,6 +656,10 @@ void NvM_GetErrorStatus(NvM_BlockIdType blockId, uint8 *requestResultPtr)
 \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
@@ -621,6 +684,13 @@ void Nvm_SetRamBlockStatus(NvM_BlockIdType blockId, boolean blockChanged)
 #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
@@ -643,7 +713,7 @@ void NvM_MainFunction(void)
                break;\r
 \r
        case NVM_READ_ALL_PENDING:\r
-               if (CheckFlsJobFinnished()) {\r
+               if (CheckMemIfJobFinished()) {\r
                        ReadAllCheckReadResult();\r
                }\r
                CalcCrc();\r
@@ -661,7 +731,7 @@ void NvM_MainFunction(void)
                break;\r
 \r
        case NVM_WRITE_ALL_PENDING:\r
-               if (CheckFlsJobFinnished()) {\r
+               if (CheckMemIfJobFinished()) {\r
                        WriteAllCheckWriteResult();\r
                }\r
                CalcCrc();\r
@@ -673,3 +743,31 @@ void NvM_MainFunction(void)
        }\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