1 /* -------------------------------- Arctic Core ------------------------------
\r
2 * Arctic Core - the open source AUTOSAR platform http://arccore.com
\r
4 * Copyright (C) 2009 ArcCore AB <contact@arccore.com>
\r
6 * This source code is free software; you can redistribute it and/or modify it
\r
7 * under the terms of the GNU General Public License version 2 as published by the
\r
8 * Free Software Foundation; See <http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt>.
\r
10 * This program is distributed in the hope that it will be useful, but
\r
11 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
\r
12 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
\r
14 * -------------------------------- Arctic Core ------------------------------*/
\r
25 #include "Fee_Cbk.h"
\r
28 #include "Rte.h" // ???
\r
29 #if defined(USE_DEM)
\r
32 //#include "SchM_NvM.h"
\r
38 #if ( FEE_DEV_ERROR_DETECT == STD_ON )
\r
40 #define VALIDATE(_exp,_api,_err ) \
\r
42 Det_ReportError(MODULE_ID_FEE, 0, _api, _err); \
\r
45 #define VALIDATE_RV(_exp,_api,_err,_rv ) \
\r
47 Det_ReportError(MODULE_ID_FEE, 0, _api, _err); \
\r
51 #define VALIDATE_NO_RV(_exp,_api,_err ) \
\r
53 Det_ReportError(MODULE_ID_FEE, 0, _api, _err); \
\r
56 #define DET_REPORTERROR(_module,_instance,_api,_err) Det_ReportError(_module,_instance,_api,_err)
\r
59 #define VALIDATE(_exp,_api,_err )
\r
60 #define VALIDATE_RV(_exp,_api,_err,_rv )
\r
61 #define VALIDATE_NO_RV(_exp,_api,_err )
\r
62 #define DET_REPORTERROR(_module,_instance,_api,_err)
\r
66 #define GET_BLOCK_INDEX_FROM_BLOCK_NUMBER(blocknr) ((blocknr >> NVM_DATASET_SELECTION_BITS) - 1)
\r
67 #define GET_DATASET_FROM_BLOCK_NUMBER(blocknr) (blocknr & ((1 << NVM_DATASET_SELECTION_BITS) - 1))
\r
70 // Variables for quick reporting of status and job result
\r
71 static MemIf_StatusType ModuleStatus = MEMIF_UNINIT;
\r
72 static MemIf_JobResultType JobResult = MEMIF_JOB_OK;
\r
75 FEE_UNINITIALIZED = 0,
\r
81 // Variables holding state of Fee.
\r
82 static FeeStateType FeeState = FEE_UNINITIALIZED;
\r
88 FEE_JOB_TYPE_CANCEL,
\r
89 FEE_JOB_TYPE_INVALIDATE,
\r
90 FEE_JOB_TYPE_ERASE_IMMEDIATE_BLOCK
\r
91 } CurrentJobTypeType;
\r
95 FEE_FLS_STATE_PENDING,
\r
100 FlsStateType State;
\r
101 Std_ReturnType ErrorStatus;
\r
102 MemIf_JobResultType JobResult;
\r
105 static FlsAdminType FlsAdmin = {
\r
106 .State = FEE_FLS_STATE_IDLE,
\r
107 .ErrorStatus = E_OK,
\r
108 .JobResult = MEMIF_JOB_OK
\r
112 boolean Consistant;
\r
115 static BlockAdminType BlockAdminList[FEE_NUM_OF_BLOCKS];
\r
118 CurrentJobTypeType Type;
\r
119 const Fee_BlockConfigType *BlockConfigPtr;
\r
120 BlockAdminType *BlockAdminPtr;
\r
122 uint32 FlsAddr; // Flash source/Dest depending of operation
\r
123 uint8 *RamPtr; // RAM source/Dest depending of operation
\r
126 static CurrentJobType CurrentJob = {
\r
127 .Type = FEE_JOB_TYPE_NONE,
\r
130 void Fee_Init(void)
\r
132 // Reporting information
\r
133 ModuleStatus = MEMIF_IDLE;
\r
134 JobResult = MEMIF_JOB_OK;
\r
137 FeeState = FEE_IDLE;
\r
138 FlsAdmin.State = FEE_FLS_STATE_IDLE;
\r
139 FlsAdmin.ErrorStatus = E_OK;
\r
140 FlsAdmin.JobResult = MEMIF_JOB_OK;
\r
144 void Fee_SetMode(MemIf_ModeType mode)
\r
146 #if ( FLS_SET_MODE_API == STD_ON )
\r
149 DET_REPORTERROR(MODULE_ID_FEE, 0, FEE_SET_MODE_ID, FEE_E_NOT_SUPPORTED);
\r
154 Std_ReturnType Fee_Read(uint16 blockNumber, uint16 blockOffset, uint8* dataBufferPtr, uint16 length)
\r
158 VALIDATE_RV(ModuleStatus != MEMIF_UNINIT, FEE_READ_ID, FEE_E_UNINIT, E_NOT_OK);
\r
159 VALIDATE_RV(ModuleStatus == MEMIF_IDLE, FEE_READ_ID, FEE_E_BUSY, E_NOT_OK);
\r
161 VALIDATE_RV(blockNumber >= (1 << NVM_DATASET_SELECTION_BITS), FEE_READ_ID, FEE_E_INVALID_BLOCK_NO, E_NOT_OK);
\r
162 blockIndex = GET_BLOCK_INDEX_FROM_BLOCK_NUMBER(blockNumber);
\r
163 VALIDATE_RV(blockIndex < FEE_NUM_OF_BLOCKS, FEE_READ_ID, FEE_E_INVALID_BLOCK_NO, E_NOT_OK);
\r
164 VALIDATE_RV(dataBufferPtr != NULL, FEE_READ_ID, FEE_E_INVALID_DATA_PTR, E_NOT_OK);
\r
165 VALIDATE_RV(blockOffset < Fee_Config.BlockConfig[blockIndex].BlockSize, FEE_READ_ID, FEE_E_INVALID_BLOCK_OFS, E_NOT_OK);
\r
166 VALIDATE_RV(blockOffset + length <= Fee_Config.BlockConfig[blockIndex].BlockSize, FEE_READ_ID, FEE_E_INVALID_BLOCK_LEN, E_NOT_OK);
\r
170 ModuleStatus = MEMIF_BUSY;
\r
171 JobResult = MEMIF_JOB_PENDING;
\r
173 CurrentJob.Type = FEE_JOB_TYPE_READ;
\r
174 CurrentJob.BlockConfigPtr = &Fee_Config.BlockConfig[blockIndex];
\r
175 CurrentJob.BlockAdminPtr = &BlockAdminList[blockIndex];
\r
176 CurrentJob.Length = length;
\r
177 CurrentJob.FlsAddr = CurrentJob.BlockConfigPtr->PhysBaseAddress + GET_DATASET_FROM_BLOCK_NUMBER(blockNumber) * CurrentJob.BlockConfigPtr->BlockSize + blockOffset; /** @req FEE021 */
\r
178 CurrentJob.RamPtr = dataBufferPtr;
\r
180 FeeState = FEE_JOB_REQUESTED;
\r
186 Std_ReturnType Fee_Write(uint16 blockNumber, uint8* dataBufferPtr)
\r
190 VALIDATE_RV(ModuleStatus != MEMIF_UNINIT, FEE_WRITE_ID, FEE_E_UNINIT, E_NOT_OK);
\r
191 VALIDATE_RV(ModuleStatus == MEMIF_IDLE, FEE_WRITE_ID, FEE_E_BUSY, E_NOT_OK);
\r
193 VALIDATE_RV(blockNumber >= (1 << NVM_DATASET_SELECTION_BITS), FEE_WRITE_ID, FEE_E_INVALID_BLOCK_NO, E_NOT_OK);
\r
194 blockIndex = GET_BLOCK_INDEX_FROM_BLOCK_NUMBER(blockNumber);
\r
195 VALIDATE_RV(blockIndex < FEE_NUM_OF_BLOCKS, FEE_WRITE_ID, FEE_E_INVALID_BLOCK_NO, E_NOT_OK);
\r
196 VALIDATE_RV(dataBufferPtr != NULL, FEE_WRITE_ID, FEE_E_INVALID_DATA_PTR, E_NOT_OK);
\r
200 ModuleStatus = MEMIF_BUSY;
\r
201 JobResult = MEMIF_JOB_PENDING;
\r
203 CurrentJob.Type = FEE_JOB_TYPE_WRITE;
\r
204 CurrentJob.BlockConfigPtr = &Fee_Config.BlockConfig[blockIndex];
\r
205 CurrentJob.BlockAdminPtr = &BlockAdminList[blockIndex];
\r
206 CurrentJob.Length = CurrentJob.BlockConfigPtr->BlockSize;
\r
207 CurrentJob.FlsAddr = CurrentJob.BlockConfigPtr->PhysBaseAddress + GET_DATASET_FROM_BLOCK_NUMBER(blockNumber) * CurrentJob.BlockConfigPtr->BlockSize; /** @req FEE024 */
\r
208 CurrentJob.RamPtr = dataBufferPtr;
\r
210 FeeState = FEE_JOB_REQUESTED;
\r
216 void Fee_Cancel(void)
\r
222 MemIf_StatusType Fee_GetStatus(void)
\r
224 return ModuleStatus;
\r
228 MemIf_JobResultType Fee_GetJobResult(void)
\r
234 Std_ReturnType Fee_InvalidateBlock(uint16 blockNumber)
\r
236 VALIDATE_RV(blockNumber < FEE_NUM_OF_BLOCKS, FEE_INVALIDATE_BLOCK_ID, FEE_E_INVALID_BLOCK_NO, E_NOT_OK);
\r
238 ModuleStatus = MEMIF_BUSY;
\r
239 JobResult = MEMIF_JOB_PENDING;
\r
241 CurrentJob.Type = FEE_JOB_TYPE_INVALIDATE;
\r
243 FeeState = FEE_JOB_REQUESTED;
\r
249 Std_ReturnType Fee_EraseImmediateBlock(uint16 blockNumber)
\r
251 VALIDATE_RV(blockNumber < FEE_NUM_OF_BLOCKS, FEE_ERASE_IMMEDIATE_ID, FEE_E_INVALID_BLOCK_NO, E_NOT_OK);
\r
252 VALIDATE_RV(Fee_Config.BlockConfig[blockNumber].ImmediateData, FEE_ERASE_IMMEDIATE_ID, FEE_E_INVALID_BLOCK_NO, E_NOT_OK);
\r
254 ModuleStatus = MEMIF_BUSY;
\r
255 JobResult = MEMIF_JOB_PENDING;
\r
256 CurrentJob.Type = FEE_JOB_TYPE_ERASE_IMMEDIATE_BLOCK;
\r
258 FeeState = FEE_JOB_REQUESTED;
\r
263 void StartJob(void)
\r
265 if (FlsAdmin.State == FEE_FLS_STATE_IDLE) {
\r
266 switch (CurrentJob.Type) {
\r
267 case FEE_JOB_TYPE_READ:
\r
268 FlsAdmin.State = FEE_FLS_STATE_PENDING;
\r
269 FeeState = FEE_JOB_PENDING;
\r
270 if (Fls_Read(CurrentJob.FlsAddr, CurrentJob.RamPtr, CurrentJob.Length) != E_OK) {
\r
271 FlsAdmin.State = FEE_FLS_STATE_READY;
\r
272 FlsAdmin.ErrorStatus = E_NOT_OK;
\r
273 FlsAdmin.JobResult = Fls_GetJobResult();
\r
277 case FEE_JOB_TYPE_WRITE:
\r
278 FlsAdmin.State = FEE_FLS_STATE_PENDING;
\r
279 FeeState = FEE_JOB_PENDING;
\r
280 if (Fls_Write(CurrentJob.FlsAddr, CurrentJob.RamPtr, CurrentJob.Length) != E_OK) {
\r
281 FlsAdmin.State = FEE_FLS_STATE_READY;
\r
282 FlsAdmin.ErrorStatus = E_NOT_OK;
\r
283 FlsAdmin.JobResult = Fls_GetJobResult();
\r
287 case FEE_JOB_TYPE_CANCEL:
\r
290 case FEE_JOB_TYPE_INVALIDATE:
\r
293 case FEE_JOB_TYPE_ERASE_IMMEDIATE_BLOCK:
\r
299 } // if FEE_FLSH_STATE_IDLE
\r
303 #if (FEE_POLLING_MODE == STD_ON)
\r
304 void PollFlsJobResult(void)
\r
306 MemIf_JobResultType jobResult;
\r
308 FlsAdmin.State = FEE_FLS_STATE_READY;
\r
309 jobResult = Fls_GetJobResult();
\r
311 if (jobResult == MEMIF_JOB_OK) {
\r
312 FlsAdmin.ErrorStatus = E_OK;
\r
313 FlsAdmin.JobResult = jobResult;
\r
314 } else if (jobResult != MEMIF_JOB_PENDING) {
\r
315 FlsAdmin.ErrorStatus = E_NOT_OK;
\r
316 FlsAdmin.JobResult = jobResult;
\r
321 void Fee_JobEndNotification(void)
\r
323 FlsAdmin.State = FEE_FLS_STATE_READY;
\r
324 FlsAdmin.ErrorStatus = E_OK;
\r
325 FlsAdmin.JobResult = Fls_GetJobResult();
\r
328 void Fee_JobErrorNotification(void)
\r
330 FlsAdmin.State = FEE_FLS_STATE_READY;
\r
331 FlsAdmin.ErrorStatus = E_NOT_OK;
\r
332 FlsAdmin.JobResult = Fls_GetJobResult();
\r
336 void CheckFlsResult(void)
\r
338 FlsAdmin.State = FEE_FLS_STATE_IDLE;
\r
339 FeeState = FEE_IDLE;
\r
341 ModuleStatus = MEMIF_IDLE;
\r
342 JobResult = FlsAdmin.JobResult;
\r
344 if (FlsAdmin.ErrorStatus == E_OK) {
\r
345 if (Fee_Config.General.NvmJobEndCallbackNotificationCallback != NULL) {
\r
346 Fee_Config.General.NvmJobEndCallbackNotificationCallback();
\r
349 if (Fee_Config.General.NvmJobErrorCallbackNotificationCallback != NULL) {
\r
350 Fee_Config.General.NvmJobErrorCallbackNotificationCallback();
\r
356 void Fee_MainFunction(void)
\r
358 switch (FeeState) {
\r
359 case FEE_UNINITIALIZED:
\r
363 case FEE_JOB_REQUESTED:
\r
367 case FEE_JOB_PENDING:
\r
368 #if (FEE_POLLING_MODE == STD_ON)
\r
369 PollFlsJobResult();
\r
371 if (FlsAdmin.State == FEE_FLS_STATE_READY) {
\r