#include "uds_bsw_flash.h" #include "uds_bsw_flash_if.h" #include "../app/bl_flash.h" #include "../cdd/CddSbc/CddSbc_TLE9471.h" /*============================================================================== ======= DEFINES & MACROS FOR GENERAL PURPOSE ======= ==============================================================================*/ /*============================================================================== ======= CONSTANTS & TYPES ======= ==============================================================================*/ /*============================================================================== ======= VARIABLES & MESSAGES & RESSOURCEN ======= ==============================================================================*/ static FlsEraStateMachine_t Fls_ErasState = EraseIdle; static uint16_t FlsEraDelayCounter = 0u; static uint32_t local_eraseStartAddress = 0; static uint32_t local_eraseStartLength = 0; /*============================================================================== ======= METHODS ======= ==============================================================================*/ bool Zhixin_IsEraseCmd_Completed(void) { return true; } void FlsPgm_EraseStateMachinePolling(void) { switch(Fls_ErasState) { case EraseIdle: Fls_ErasState = EraseIdle; FlsEraDelayCounter = 0u; break; case EraseStart: local_eraseStartAddress = flash_transferPara.FlsPgm_TransferAddress; local_eraseStartLength = flash_transferPara.FlsPgm_TransferLength; FlsEraDelayCounter = 0u; Fls_ErasState = EraseDelay; break; case EraseDelay: if(FlsEraDelayCounter < 2u) { FlsEraDelayCounter++; Fls_ErasState = EraseDelay; } else { Fls_ErasState = EraseBusy; } break; case EraseBusy: /*NVIC_DisableIRQ(CPUIntIdx2_IRQn); */ /* disable cantp interrupt */ SCB_Watch_Dog_Trigger_Function(); FlashEraseSector(local_eraseStartAddress); /*NVIC_EnableIRQ(CPUIntIdx2_IRQn);*/ Fls_ErasState = EraseResultCheck; break; case EraseResultCheck: if(Zhixin_IsEraseCmd_Completed() == true) { local_eraseStartAddress += FLSPGM_MEMORY_BLOCK_LENGTH; Fls_ErasState = EraseNextBlock; } else { Fls_ErasState = EraseResultCheck; } break; case EraseNextBlock: if(local_eraseStartLength < FLSPGM_MEMORY_BLOCK_LENGTH) { local_eraseStartLength = 0u; } else { local_eraseStartLength -= FLSPGM_MEMORY_BLOCK_LENGTH; } if(local_eraseStartLength > 0u) { Fls_ErasState = EraseBusy; } else { Fls_ErasState = EraseComplete; } break; case EraseComplete: Fls_ErasState = EraseIdle; if(flash_transferPara.EraseCallback!=NULL) { flash_transferPara.EraseCallback(0u); } break; case EraseError: Fls_ErasState = EraseIdle; break; default: Fls_ErasState = EraseIdle; break; } } uint8_t StartFlsErase(void) { uint8_t retValue = 0xffu; if(Fls_ErasState == EraseIdle) { Fls_ErasState = EraseStart; retValue = 0x0u; } else { Fls_ErasState = Fls_ErasState; } return retValue; } FlsEraStateMachine_t GetFlashErasStatus(void) { return Fls_ErasState; }