/** * Read from flash memory * * @param SourceAddress * @param TargetAddressPtr * @param Length * @return */ Std_ReturnType Fls_Read( Fls_AddressType SourceAddress, uint8 *TargetAddressPtr, Fls_LengthType Length) { #if FLS_BASE_ADDRESS > 0 /* Avoid compiler warning */ SourceAddress += FLS_BASE_ADDRESS; #endif /** @req SWS_Fls_00236 */ /** @req SWS_Fls_00239 */ /** @req SWS_Fls_00099 */ VALIDATE_W_RV(Fls_Global.status != MEMIF_UNINIT,FLS_READ_ID, FLS_E_UNINIT,E_NOT_OK ); /** @req SWS_Fls_00100 */ VALIDATE_W_RV( Fls_Global.status != MEMIF_BUSY, FLS_READ_ID, FLS_E_BUSY, E_NOT_OK ); /** @req SWS_Fls_00158 */ VALIDATE_W_RV( TargetAddressPtr != NULL , FLS_READ_ID, FLS_E_PARAM_DATA, E_NOT_OK ); /** @req SWS_Fls_00097 */ VALIDATE_W_RV( E_OK == checkValidAddress(SourceAddress), FLS_READ_ID, FLS_E_PARAM_ADDRESS, E_NOT_OK ); /** @req SWS_Fls_00098 */ VALIDATE_W_RV( (Length != 0) && (E_OK == checkValidAddress(SourceAddress + Length -1)), FLS_READ_ID, FLS_E_PARAM_LENGTH, E_NOT_OK ); #if defined(CFG_MPC5777M) VALIDATE_W_RV((E_OK == checkValidChunk(SourceAddress, SourceAddress + Length - 1)), FLS_READ_ID, FLS_E_INVALID_AREA, E_NOT_OK); #endif // Always check if status is not busy if (Fls_Global.status == MEMIF_BUSY) { return E_NOT_OK; } Fls_Global.status = MEMIF_BUSY; Fls_Global.jobResultType = MEMIF_JOB_PENDING; Fls_Global.jobType = FLS_JOB_READ; LOG_HEX2("Fls_Read() ",(uint32)TargetAddressPtr," ", Length); /** @req SWS_Fls_00337 */ Fls_Global.flashAddr = SourceAddress; Fls_Global.ramAddr = TargetAddressPtr; Fls_Global.length = Length; if( Fls_Global.mode == MEMIF_MODE_FAST ) { Fls_Global.readChunkSize = Fls_Global.config->FlsMaxReadFastMode; } else { Fls_Global.readChunkSize = Fls_Global.config->FlsMaxReadNormalMode; } return E_OK; }
/** * Read from flash memory * * @param SourceAddress * @param TargetAddressPtr * @param Length * @return */ Std_ReturnType Fls_Read( Fls_AddressType SourceAddress, uint8 *TargetAddressPtr, Fls_LengthType Length) { SourceAddress += FLS_BASE_ADDRESS; /** @req FLS256 */ /** @req FLS236 */ /** !req FLS239 TODO */ /** !req FLS240 Have no idea what the requirement means*/ /** @req FLS099 */ VALIDATE_W_RV(Fls_Global.status != MEMIF_UNINIT,FLS_READ_ID, FLS_E_UNINIT,E_NOT_OK ); /** @req FLS100 */ VALIDATE_W_RV( Fls_Global.status != MEMIF_BUSY, FLS_READ_ID, FLS_E_BUSY, E_NOT_OK ); /** @req FLS158 */ VALIDATE_W_RV( TargetAddressPtr != NULL , FLS_READ_ID, FLS_E_PARAM_DATA, E_NOT_OK ); /** @req FLS097 */ VALIDATE_W_RV( E_OK == fls_CheckValidAddress(SourceAddress), FLS_READ_ID, FLS_E_PARAM_ADDRESS, E_NOT_OK ); /** @req FLS098 */ VALIDATE_W_RV( (Length != 0) && (E_OK == fls_CheckValidAddress(SourceAddress + Length)), FLS_READ_ID, FLS_E_PARAM_LENGTH, E_NOT_OK ); // Always check if status is not busy if (Fls_Global.status == MEMIF_BUSY) return E_NOT_OK; Fls_Global.status = MEMIF_BUSY; Fls_Global.jobResultType = MEMIF_JOB_PENDING; Fls_Global.jobType = FLS_JOB_READ; LOG_HEX2("Fls_Read() ",(uint32)TargetAddressPtr," ", Length); /** @req FLS237 */ Fls_Global.flashAddr = SourceAddress; Fls_Global.ramAddr = TargetAddressPtr; Fls_Global.length = Length; if( Fls_Global.mode == MEMIF_MODE_FAST ) { Fls_Global.readChunkSize = Fls_Global.config->FlsMaxReadFastMode; } else { Fls_Global.readChunkSize = Fls_Global.config->FlsMaxReadNormalMode; } return E_OK; }
/** * Erase flash sectors * * @param TargetAddress Always from 0 to FLS_TOTAL_SIZE * @param Length * @return */ Std_ReturnType Fls_Erase(Fls_AddressType TargetAddress, Fls_LengthType Length) { #if FLS_BASE_ADDRESS > 0 /* Avoid compiler warning */ TargetAddress += FLS_BASE_ADDRESS; #endif /** @req SWS_Fls_00218 */ /** @req SWS_Fls_00220 */ /** @req SWS_Fls_00327 */ /** @req SWS_Fls_00065 */ VALIDATE_W_RV( Fls_Global.status != MEMIF_UNINIT, FLS_ERASE_ID, FLS_E_UNINIT, E_NOT_OK ); /** @req SWS_Fls_00023 */ VALIDATE_W_RV( Fls_Global.status != MEMIF_BUSY, FLS_ERASE_ID, FLS_E_BUSY, E_NOT_OK ); /** @req SWS_Fls_00020 */ VALIDATE_W_RV( E_OK == sectorAligned( TargetAddress ), FLS_ERASE_ID, FLS_E_PARAM_ADDRESS, E_NOT_OK ); /** @req SWS_Fls_00021 */ VALIDATE_W_RV( (Length != 0) && (EE_OK == sectorAligned( TargetAddress + Length)), FLS_ERASE_ID, FLS_E_PARAM_LENGTH, E_NOT_OK ); #if defined(CFG_MPC5777M) VALIDATE_W_RV((E_OK == checkValidChunk(TargetAddress, TargetAddress + Length - 1)), FLS_ERASE_ID, FLS_E_INVALID_AREA, E_NOT_OK); #endif Fls_Global.status = MEMIF_BUSY; /** @req SWS_Fls_00328 */ Fls_Global.jobResultType = MEMIF_JOB_PENDING; /** @req SWS_Fls_00329 */ Fls_Global.jobType = FLS_JOB_ERASE; Fls_Global.flashAddr = TargetAddress; Fls_Global.length = Length; LOG_HEX2("Fls_Erase() ",TargetAddress," ", Length); /* Unlock */ Flash_Lock(Fls_Global.config->FlsInfo,FLASH_OP_UNLOCK,TargetAddress, Length ); /** @req SWS_Fls_00145 */ if (EE_OK != Flash_Erase(Fls_Global.config->FlsInfo,TargetAddress, Length, NULL )) { return E_NOT_OK; } return E_OK; /** @req SWS_Fls_00330 */ }
/** * Erase flash sectors * * @param TargetAddress Always from 0 to FLS_TOTAL_SIZE * @param Length * @return */ Std_ReturnType Fls_Erase(Fls_AddressType TargetAddress, Fls_LengthType Length) { TargetAddress += FLS_BASE_ADDRESS; /** @req FLS250 3.0/4.0 */ /** @req FLS218 3.0/4.0 */ /** @req FLS220 3.0/4.0 */ /** @req FLS327 4.0 */ /** @req FLS065 */ VALIDATE_W_RV( Fls_Global.status != MEMIF_UNINIT, FLS_ERASE_ID, FLS_E_UNINIT, E_NOT_OK ); /** @req FLS023 */ VALIDATE_W_RV( Fls_Global.status != MEMIF_BUSY, FLS_ERASE_ID, FLS_E_BUSY, E_NOT_OK ); /** @req FLS020 3.0/4.0 */ VALIDATE_W_RV( E_OK == fls_SectorAligned( TargetAddress ), FLS_ERASE_ID, FLS_E_PARAM_ADDRESS, E_NOT_OK ); /** @req FLS021 3.0/4.0 */ VALIDATE_W_RV( (Length != 0) && (EE_OK == fls_SectorAligned( TargetAddress + Length)), FLS_ERASE_ID, FLS_E_PARAM_LENGTH, E_NOT_OK ); // Check if we trying to erase a partition that we are executing in #if 0 pc = fls_GetPc(); #endif Fls_Global.status = MEMIF_BUSY; /** @req FLS219 3.0 */ /** @req FLS328 4.0 */ Fls_Global.jobResultType = MEMIF_JOB_PENDING; /** @req FLS329 4.0 */ Fls_Global.jobType = FLS_JOB_ERASE; Fls_Global.flashAddr = TargetAddress; Fls_Global.length = Length; LOG_HEX2("Fls_Erase() ",TargetAddress," ", Length); /* Unlock */ Flash_Lock(Fls_Global.config->FlsInfo,FLASH_OP_UNLOCK,TargetAddress, Length ); /** @req FLS145 */ Flash_Erase(Fls_Global.config->FlsInfo,TargetAddress, Length, NULL ); return E_OK; /** @req FLS330 4.0 */ }
void Fls_MainFunction(void) { /** @req SWS_Fls_00038 */ static uint32 progressCntr = 0; uint32 flashStatus; sint32 result; uint8 eccError = 0; uint32 chunkSize; /** @req SWS_Fls_117 */ VALIDATE_NO_RV(Fls_Global.status != MEMIF_UNINIT,FLS_MAIN_FUNCTION_ID, FLS_E_UNINIT ); /** @req SWS_Fls_00039 */ if ( Fls_Global.jobResultType == MEMIF_JOB_PENDING) { switch (Fls_Global.jobType) { case FLS_JOB_COMPARE: /** @req SWS_Fls_00243 */ // !req SWS_Fls_00154 Hardware error = FLS_E_COMPARE_FAILED // ( we are reading directly from flash so it makes no sense ) // Read ECC-error to clear it Mcu_Arc_GetECCError(&eccError); /*lint !e934 Only used in this function */ chunkSize = MIN( Fls_Global.length, Fls_Global.readChunkSize ); /** @req SWS_Fls_00244 */ /*lint -e{923} flashAddr set by AUTOSAR and it is justified to cast in this case */ result = (sint32)memcmp((void *)Fls_Global.ramAddr, (void *)Fls_Global.flashAddr, (size_t)chunkSize ); Fls_Global.ramAddr = &Fls_Global.ramAddr[chunkSize]; Fls_Global.flashAddr += chunkSize; Fls_Global.length -= chunkSize; Mcu_Arc_GetECCError(&eccError); /*lint !e934 Only used in this function */ if( eccError > 0u ){ readFail(); } else { if( 0 != Fls_Global.length ) { if (result == 0) { Fls_Global.jobResultType = MEMIF_JOB_OK; } else { /* @req SWS_Fls_00200 */ Fls_Global.jobResultType = MEMIF_BLOCK_INCONSISTENT; } Fls_Global.status = MEMIF_IDLE; Fls_Global.jobType = FLS_JOB_NONE; } else { /* Do nothing, wait for next loop */ } } break; case FLS_JOB_ERASE: { flashStatus = Flash_CheckStatus(Fls_Global.config->FlsInfo, (uint32*)Fls_Global.flashAddr, Fls_Global.length ); /*lint !e923 Intended */ if (flashStatus == EE_OK ) { Fls_Global.jobResultType = MEMIF_JOB_OK; Fls_Global.jobType = FLS_JOB_NONE; Fls_Global.status = MEMIF_IDLE; FEE_JOB_END_NOTIFICATION(); } else if (flashStatus == EE_INFO_HVOP_INPROGRESS) { /* Busy, Do nothing */ } else { // Error eraseFail(); } break; } case FLS_JOB_READ: /** @req SWS_Fls_00238 */ /** @req SWS_Fls_00239 */ // NOT implemented. Hardware error = FLS_E_READ_FAILED // ( we are reading directly from flash so it makes no sense ) // Read ECC-error to clear it Mcu_Arc_GetECCError(&eccError); /*lint !e934 Only used in this function */ chunkSize = MIN( Fls_Global.length, Fls_Global.readChunkSize ); memcpy( (void *)Fls_Global.ramAddr, (void *) Fls_Global.flashAddr, (size_t)chunkSize ); /*lint !e923 Inteded use */ Fls_Global.ramAddr += chunkSize; /*lint !e9016 Intended use */ Fls_Global.flashAddr += chunkSize; Fls_Global.length -= chunkSize; Mcu_Arc_GetECCError(&eccError); /*lint !e934 Only used in this function */ if( eccError > 0u ){ readFail(); } else { if( 0 == Fls_Global.length ) { Fls_Global.jobResultType = MEMIF_JOB_OK; Fls_Global.status = MEMIF_IDLE; Fls_Global.jobType = FLS_JOB_NONE; FEE_JOB_END_NOTIFICATION(); LOG_STR("Fls_RP() OK\n"); } } break; case FLS_JOB_WRITE: { /* We are writing in chunks. If we want to write 6 chunks in total but * only 2 at a time: * * Call * #1 The Fls_Write * #2 Wait for Flash_CheckStatus(), Flash_ProgramPageStart().. function return * -> 1 verified write, 1 pending * #3 Wait for Flash_CheckStatus(), Flash_ProgramPageStart() * Wait for Flash_CheckStatus(), Flash_ProgramPageStart() .. function return * -> 3 verified writes, 1 pending * #4 Wait for Flash_CheckStatus(), Flash_ProgramPageStart() * Wait for Flash_CheckStatus(), Flash_ProgramPageStart() .. function return * -> 5 verified writes, 1 pending * #5 Wait for Flash_CheckStatus(), ...function return * -> 6 verified writes, */ uint32 bytesLeftToBeWritten = MIN(Fls_Global.flashWriteInfo.chunkSize, Fls_Global.flashWriteInfo.left); do { flashStatus = Flash_CheckStatus( Fls_Global.config->FlsInfo, (uint32 *) Fls_Global.flashWriteInfo.pDest, /*lint !e923 Intended use */ Fls_Global.flashWriteInfo.pLeft - Fls_Global.flashWriteInfo.left); if (flashStatus == EE_OK) { progressCntr = 0; LOG_HEX1("Fls_CS() OK ",Fls_Global.flashWriteInfo.pDest); if (Fls_Global.flashWriteInfo.left == 0) { /* Done! */ Fls_Global.jobResultType = MEMIF_JOB_OK; Fls_Global.status = MEMIF_IDLE; Fls_Global.jobType = FLS_JOB_NONE; FEE_JOB_END_NOTIFICATION(); break; } /* Write more */ Fls_Global.flashWriteInfo.pDest = Fls_Global.flashWriteInfo.dest; Fls_Global.flashWriteInfo.pLeft = Fls_Global.flashWriteInfo.left; /* Double word programming */ LOG_HEX2("Fls_PP() ",Fls_Global.flashWriteInfo.dest," ", Fls_Global.flashWriteInfo.left); flashStatus = Flash_ProgramPageStart( Fls_Global.config->FlsInfo, &Fls_Global.flashWriteInfo.dest, &Fls_Global.flashWriteInfo.source, &Fls_Global.flashWriteInfo.left, NULL); if (flashStatus != EE_OK) { writeFail(); break; /*lint !e9011 Better readability this way */ } else { uint32 bytesWritten = Fls_Global.flashWriteInfo.pLeft - Fls_Global.flashWriteInfo.left; bytesLeftToBeWritten = (bytesWritten > bytesLeftToBeWritten) ? 0u : (bytesLeftToBeWritten - bytesWritten); } } else if (flashStatus == EE_INFO_HVOP_INPROGRESS) { /* Wait for it */ // One return cycle takes approx ~130 instructions. if (MAX_PROGRESS_CNTR < progressCntr) { progressCntr = 0; writeFail(); break; /*lint !e9011 Better readability this way */ } progressCntr++; } else { progressCntr = 0; writeFail(); /* Nothing to do, quit loop */ break; /*lint !e9011 Better readability this way */ } } while (bytesLeftToBeWritten > 0 ); break; } case FLS_JOB_NONE: assert(FALSE); break; default: break; } /* switch */ } /* if */ }
Std_ReturnType Fls_Write(Fls_AddressType TargetAddress, const uint8 *SourceAddressPtr, Fls_LengthType Length) { #if FLS_BASE_ADDRESS > 0 /* Avoid compiler warning */ TargetAddress += FLS_BASE_ADDRESS; #endif /** @req SWS_Fls_00223 */ /** @req SWS_Fls_00225 */ /** @req SWS_Fls_00226 */ /** @req SWS_Fls_00066 */ VALIDATE_W_RV(Fls_Global.status != MEMIF_UNINIT,FLS_WRITE_ID, FLS_E_UNINIT,E_NOT_OK ); /** @req SWS_Fls_00030 */ VALIDATE_W_RV(Fls_Global.status != MEMIF_BUSY,FLS_WRITE_ID, FLS_E_BUSY,E_NOT_OK ); /** @req SWS_Fls_00157 */ VALIDATE_W_RV(SourceAddressPtr != NULL,FLS_WRITE_ID, FLS_E_PARAM_DATA,E_NOT_OK ); /** @req SWS_Fls_00026 */ VALIDATE_W_RV( ((TargetAddress % FLASH_PAGE_SIZE) == 0) && (E_OK == checkValidAddress(TargetAddress)), FLS_WRITE_ID, FLS_E_PARAM_ADDRESS, E_NOT_OK ); /** @req SWS_Fls_00027 */ VALIDATE_W_RV( ((Length != 0) && ((((TargetAddress + Length) % FLASH_PAGE_SIZE) == 0) && (E_OK == checkValidAddress(TargetAddress + Length -1 )))), FLS_WRITE_ID, FLS_E_PARAM_LENGTH, E_NOT_OK ); #if defined(CFG_MPC5777M) VALIDATE_W_RV((E_OK == checkValidChunk(TargetAddress, TargetAddress + Length - 1)), FLS_WRITE_ID, FLS_E_INVALID_AREA, E_NOT_OK); #endif // Destination is FLS_BASE_ADDRESS + TargetAddress /** @req SWS_Fls_333 */ Fls_Global.jobResultType = MEMIF_JOB_PENDING; /** @req SWS_Fls_332 */ Fls_Global.status = MEMIF_BUSY; Fls_Global.jobType = FLS_JOB_WRITE; // Fill in the required fields for programming... /** @req SWS_Fls_331 */ Fls_Global.flashWriteInfo.source = (uint32)SourceAddressPtr; /*lint !e923 Intended use */ Fls_Global.flashWriteInfo.dest = TargetAddress; Fls_Global.flashWriteInfo.left = Length; if( Fls_Global.mode == MEMIF_MODE_FAST ) { Fls_Global.flashWriteInfo.chunkSize = Fls_Global.config->FlsMaxWriteFastMode; } else { Fls_Global.flashWriteInfo.chunkSize = Fls_Global.config->FlsMaxWriteNormalMode; } // unlock flash for the entire range. Flash_Lock(Fls_Global.config->FlsInfo,FLASH_OP_UNLOCK, TargetAddress, Length ); LOG_HEX2("Fls_Write() ",Fls_Global.flashWriteInfo.dest," ", Fls_Global.flashWriteInfo.left); /* Save to original request */ Fls_Global.flashWriteInfo.pDest = TargetAddress; Fls_Global.flashWriteInfo.pLeft = Length; /** @req SWS_Fls_146 */ if (EE_OK != Flash_ProgramPageStart( Fls_Global.config->FlsInfo, &Fls_Global.flashWriteInfo.dest, &Fls_Global.flashWriteInfo.source, &Fls_Global.flashWriteInfo.left, NULL)) { return E_NOT_OK; } return E_OK; /** @req SWS_Fls_334 */ }
void Fls_MainFunction(void) { /** @req FLS255 */ /** @req FLS266 */ /** @req FLS038 */ /** !req FLS040 No support for Fls_ConfigSetType.FlsMaxXXXX */ /** !req FLS104 */ /** !req FLS105 */ /** !req FLS106 */ /** !req FLS154 */ /** !req FLS200 */ /** !req FLS022 */ /** !req FLS055 */ /** !req FLS056 */ /** !req FLS052 */ /** !req FLS232 */ /** !req FLS233 */ /** !req FLS234 */ /** !req FLS235 */ /** !req FLS272 */ /** !req FLS196 */ uint32 flashStatus; int result; uint32 eccErrReg = 0; uint32 chunkSize; /** @req FLS117 */ VALIDATE_NO_RV(Fls_Global.status != MEMIF_UNINIT,FLS_MAIN_FUNCTION_ID, FLS_E_UNINIT ); /** @req FLS039 */ if ( Fls_Global.jobResultType == MEMIF_JOB_PENDING) { switch (Fls_Global.jobType) { case FLS_JOB_COMPARE: /** @req FLS243 */ // NOT implemented. Hardware error = FLS_E_COMPARE_FAILED // ( we are reading directly from flash so it makes no sense ) chunkSize = MIN( Fls_Global.length, Fls_Global.readChunkSize ); /** @req FLS244 */ result = memcmp((void *)Fls_Global.ramAddr, (void *)Fls_Global.flashAddr, chunkSize ); Fls_Global.ramAddr += chunkSize; Fls_Global.flashAddr += chunkSize; Fls_Global.length -= chunkSize; McuE_GetECCError(&eccErrReg); if( eccErrReg & FLASH_NON_CORRECTABLE_ERROR ){ fls_ReadFail(); } else { if( 0 != Fls_Global.length ) { if (result == 0) { Fls_Global.jobResultType = MEMIF_JOB_OK; } else { Fls_Global.jobResultType = MEMIF_BLOCK_INCONSISTENT; } Fls_Global.status = MEMIF_IDLE; Fls_Global.jobType = FLS_JOB_NONE; } else { /* Do nothing, wait for next loop */ } } break; case FLS_JOB_ERASE: { flashStatus = Flash_CheckStatus(Fls_Global.config->FlsInfo, (uint32_t *)Fls_Global.flashAddr, Fls_Global.length ); if (flashStatus == EE_OK ) { Fls_Global.jobResultType = MEMIF_JOB_OK; Fls_Global.jobType = FLS_JOB_NONE; Fls_Global.status = MEMIF_IDLE; FEE_JOB_END_NOTIFICATION(); } else if (flashStatus == EE_INFO_HVOP_INPROGRESS) { /* Busy, Do nothing */ } else { // Error fls_EraseFail(); } break; } case FLS_JOB_READ: /** @req FLS238 */ /** @req FLS239 */ // NOT implemented. Hardware error = FLS_E_READ_FAILED // ( we are reading directly from flash so it makes no sense ) // Read ECC-error to clear it McuE_GetECCError(&eccErrReg); chunkSize = MIN( Fls_Global.length, Fls_Global.readChunkSize ); memcpy( (void *)Fls_Global.ramAddr, (void *) Fls_Global.flashAddr, chunkSize ); Fls_Global.ramAddr += chunkSize; Fls_Global.flashAddr += chunkSize; Fls_Global.length -= chunkSize; McuE_GetECCError(&eccErrReg); if( eccErrReg & FLASH_NON_CORRECTABLE_ERROR ){ fls_ReadFail(); } else { if( 0 == Fls_Global.length ) { Fls_Global.jobResultType = MEMIF_JOB_OK; Fls_Global.status = MEMIF_IDLE; Fls_Global.jobType = FLS_JOB_NONE; FEE_JOB_END_NOTIFICATION(); LOG_STR("Fls_RP() OK\n"); } } break; case FLS_JOB_WRITE: { /* We are writing in chunks. If we want to write 6 chunks in total but * only 2 at a time: * * Call * #1 The Fls_Write * #2 Wait for Flash_CheckStatus(), Flash_ProgramPageStart().. function return * -> 1 verified write, 1 pending * #3 Wait for Flash_CheckStatus(), Flash_ProgramPageStart() * Wait for Flash_CheckStatus(), Flash_ProgramPageStart() .. function return * -> 3 verified writes, 1 pending * #4 Wait for Flash_CheckStatus(), Flash_ProgramPageStart() * Wait for Flash_CheckStatus(), Flash_ProgramPageStart() .. function return * -> 5 verified writes, 1 pending * #5 Wait for Flash_CheckStatus(), ...function return * -> 6 verified writes, */ int32_t chunkSize = MIN(Fls_Global.flashWriteInfo.chunkSize, Fls_Global.flashWriteInfo.left); do { flashStatus = Flash_CheckStatus( Fls_Global.config->FlsInfo, (uint32_t *) Fls_Global.flashWriteInfo.pDest, Fls_Global.flashWriteInfo.pLeft - Fls_Global.flashWriteInfo.left); if (flashStatus == EE_OK) { LOG_HEX1("Fls_CS() OK ",Fls_Global.flashWriteInfo.pDest); if (Fls_Global.flashWriteInfo.left == 0) { /* Done! */ Fls_Global.jobResultType = MEMIF_JOB_OK; Fls_Global.status = MEMIF_IDLE; Fls_Global.jobType = FLS_JOB_NONE; FEE_JOB_END_NOTIFICATION(); break; } /* Write more */ Fls_Global.flashWriteInfo.pDest = Fls_Global.flashWriteInfo.dest; Fls_Global.flashWriteInfo.pLeft = Fls_Global.flashWriteInfo.left; /* Double word programming */ LOG_HEX2("Fls_PP() ",Fls_Global.flashWriteInfo.dest," ", Fls_Global.flashWriteInfo.left); flashStatus = Flash_ProgramPageStart( Fls_Global.config->FlsInfo, &Fls_Global.flashWriteInfo.dest, &Fls_Global.flashWriteInfo.source, &Fls_Global.flashWriteInfo.left, NULL); if (flashStatus != EE_OK) { fls_WriteFail(); break; } chunkSize = chunkSize - (int32_t)(Fls_Global.flashWriteInfo.pLeft - Fls_Global.flashWriteInfo.left); } else if (flashStatus == EE_INFO_HVOP_INPROGRESS) { /* Wait for it */ } else { fls_WriteFail(); /* Nothing to do, quit loop */ break; } } while (chunkSize > 0 ); break; } case FLS_JOB_NONE: assert(0); break; default: break; } /* switch */ } /* if */ }
Std_ReturnType Fls_Write(Fls_AddressType TargetAddress, const uint8 *SourceAddressPtr, Fls_LengthType Length) { TargetAddress += FLS_BASE_ADDRESS; /** @req FLS251 3.0 */ /** @req FLS223 3.0 */ /** @req FLS225 3.0/4.0 */ /** @req FLS226 3.0/4.0 */ /** @req FLS066 3.0/4.0 */ /** @req FLS030 3.0/4.0 */ /** @req FLS157 3.0/4.0 */ /** @req FLS026 3.0/4.0 */ /** @req FLS027 3.0/4.0 */ VALIDATE_W_RV(Fls_Global.status != MEMIF_UNINIT,FLS_WRITE_ID, FLS_E_UNINIT,E_NOT_OK ); VALIDATE_W_RV(Fls_Global.status != MEMIF_BUSY,FLS_WRITE_ID, FLS_E_BUSY,E_NOT_OK ); VALIDATE_W_RV(SourceAddressPtr != ((void *)0),FLS_WRITE_ID, FLS_E_PARAM_DATA,E_NOT_OK ); VALIDATE_W_RV( (TargetAddress % FLASH_PAGE_SIZE == 0) && (E_OK == fls_CheckValidAddress(TargetAddress)), FLS_WRITE_ID, FLS_E_PARAM_ADDRESS, E_NOT_OK ); VALIDATE_W_RV( (Length != 0) && (((TargetAddress + Length) % FLASH_PAGE_SIZE) == 0 && (E_OK == fls_CheckValidAddress(TargetAddress + Length))), FLS_WRITE_ID, FLS_E_PARAM_LENGTH, E_NOT_OK ); // Destination is FLS_BASE_ADDRESS + TargetAddress /** @req FLS224 3.0 */ /** @req FLS333 4.0 */ Fls_Global.jobResultType = MEMIF_JOB_PENDING; /** @req FLS332 4.0 */ Fls_Global.status = MEMIF_BUSY; Fls_Global.jobType = FLS_JOB_WRITE; // Fill in the required fields for programming... /** @req FLS331 4.0 */ Fls_Global.flashWriteInfo.source = (uint32) SourceAddressPtr; Fls_Global.flashWriteInfo.dest = TargetAddress; Fls_Global.flashWriteInfo.left = Length; if( Fls_Global.mode == MEMIF_MODE_FAST ) { Fls_Global.flashWriteInfo.chunkSize = Fls_Global.config->FlsMaxWriteFastMode; } else { Fls_Global.flashWriteInfo.chunkSize = Fls_Global.config->FlsMaxWriteNormalMode; } // unlock flash for the entire range. Flash_Lock(Fls_Global.config->FlsInfo,FLASH_OP_UNLOCK, TargetAddress, Length ); LOG_HEX2("Fls_Write() ",Fls_Global.flashWriteInfo.dest," ", Fls_Global.flashWriteInfo.left); #if defined(CFG_FLS_EXTRA_CHECKS) for( int i=0;i<Fls_Global.flashWriteInfo.left;i++) { if( *((uint8 *)Fls_Global.flashWriteInfo.dest + i) != 0xff ) { while(1) {}; } } #endif /* Save to original request */ Fls_Global.flashWriteInfo.pDest = TargetAddress; Fls_Global.flashWriteInfo.pLeft = Length; /** @req FLS146 3.0/4.0 */ Flash_ProgramPageStart( Fls_Global.config->FlsInfo, &Fls_Global.flashWriteInfo.dest, &Fls_Global.flashWriteInfo.source, &Fls_Global.flashWriteInfo.left, NULL); return E_OK; /** @req FLS334 4.0 */ }