RabbitECUTeensyMCUXpresso/source/Peripherals/FEE.c

248 lines
5.9 KiB
C

/******************************************************************************/
/* Copyright (c) 2016 MD Automotive Controls. Original Work. */
/* License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher */
/******************************************************************************/
/* CONTEXT:KERNEL */
/* PACKAGE TITLE: XXX */
/* DESCRIPTION: XXX */
/* FILE NAME: XXX.c */
/* REVISION HISTORY: 19-08-2016 | 1.0 | Initial revision */
/* */
/******************************************************************************/
#include "FEE.h"
#include "FEEHA.h"
FEE_tstWriteControlBlock FEE_stWriteControlBlock;
FEE_tenPgmErrCode FEE_enPgmErrCode;
FEE_tstWorkingPage FEE_stWorkingPage;
#if BUILD_SBL
uint8 FEE_au8ProgBuff[FEE_PFLASH_SCTR_BYTES];
#else
uint8 FEE_au8ProgBuff[1];
#endif
void FEE_vStartSBL(void)
{
#if BUILD_SBL
FEEHA_vStartSBL();
#endif
}
bool FEE_boCheckPartition(void)
{
bool boRetVal = false;
#if defined(BUILD_MK60) || defined(BUILD_MK64)
return FEEHA_boCheckPartition();
#endif
#ifdef BUILD_SAM3X8E
boRetVal = true;
#endif //BUILD_SAM3X8E
return boRetVal;
}
bool FEE_boSetWorkingData(puint8 pu8WorkingAddress, uint16 u16WorkingDataCount)
{
bool boWorkingDataOK = FALSE;
if (((puint8)FEEHA_WORK_DATA_START <= pu8WorkingAddress) &&
((puint8)FEEHA_WORK_DATA_END >= pu8WorkingAddress) &&
((uint16)FEEHA_WORK_DATA_MAX > u16WorkingDataCount) &&
(2 <= u16WorkingDataCount))
{
FEE_stWorkingPage.pu8WorkingData = pu8WorkingAddress;
FEE_stWorkingPage.s16WorkingDataCount = (sint16)u16WorkingDataCount;
boWorkingDataOK = TRUE;
}
return boWorkingDataOK;
}
bool FEE_boNVMWorkingCopy(bool boNVMToWorking, bool boCheckCRC16MakeCRC16)
{
bool boCopyOK;
boCopyOK = FEEHA_boNVMWorkingCopy(boNVMToWorking, boCheckCRC16MakeCRC16);
return boCopyOK;
}
bool FEE_boWriteNVM(puint8 pu8SourceData, puint8 pu8DestData, uint32 u32DataByteCount)
{
bool boCopyOK = TRUE;
boCopyOK = FEEHA_boWriteNVM(pu8SourceData, pu8DestData, u32DataByteCount);
return boCopyOK;
}
bool FEE_boNVMClear(void)
{
bool boClearOK;
boClearOK = FEEHA_boNVMClear();
return boClearOK;
}
bool FEE_boEraseForDownload(puint8 pu8TargetAddress, uint32 u32EraseCount)
{
bool boEraseErr = false;
boEraseErr = FEEHA_boEraseForDownload(pu8TargetAddress, u32EraseCount);
return boEraseErr;
}
void FEE_vStart(uint32* const pu32Stat)
{
bool boStartOK;
boStartOK = FEEHA_boStart(pu32Stat);
if (false == boStartOK)
{
*pu32Stat = false;
}
else
{
FEE_stWriteControlBlock.boProgramming = false;
FEE_stWriteControlBlock.boProgErr = false;
*pu32Stat = true;
}
FEE_stWorkingPage.pu8WorkingData = NULL;
FEE_stWorkingPage.s16WorkingDataCount = -1;
OS_xModuleStartOK(*pu32Stat);
}
void FEE_vRun(uint32* const u32Stat)
{
FEEHA_vRun(u32Stat);
}
void FEE_vTerminate(uint32* const u32Stat)
{
}
bool FEE_boPartition(void)
{
bool boRetVal;
boRetVal = FEE_boCheckPartition();
if (FALSE == boRetVal)
{
boRetVal = FEEHA_boPartition();
}
return boRetVal;
}
void FEE_vWriteExceptionRecord(puint8 pu8ExceptionRecord)
{
#if 0
puint8 pu8Search = (uint8*)FEEHA_EXC_RECS_START;
uint32 u32ErasedCounts = 0;
while (pu8Search <= (puint8)FEEHA_EXC_RECS_END)
{
if (0xff == *pu8Search)
{
u32ErasedCounts++;
if (32 == u32ErasedCounts)
{
break;
}
}
else
{
u32ErasedCounts = 0;
}
pu8Search++;
}
if (32 == u32ErasedCounts)
{
pu8ExceptionRecord -= FEEHA_EXC_RECS_START;
FEEHA_boWriteNVM(pu8ExceptionRecord, pu8Search, 32);
}
#endif
}
bool FEE_boWriteControlBlock(COMMONNL_tstRXLargeBuffer* const pstParamSourceBuffer,
uint8* const pu8ParamTargetAddress,
uint32 u32ParamWriteCount)
{
if ((false == FEE_stWriteControlBlock.boProgramming) &&
(false == FEE_stWriteControlBlock.boProgErr))
{
FEE_stWriteControlBlock.pstSourceBuffer = pstParamSourceBuffer;
FEE_stWriteControlBlock.pu8TargetAddress = pu8ParamTargetAddress;
FEE_stWriteControlBlock.u32WriteCount = u32ParamWriteCount;
FEE_stWriteControlBlock.u32AccumulateCount = 0;
FEE_stWriteControlBlock.boProgramming = true;
}
else
{
FEE_stWriteControlBlock.boProgramming = false;
}
return FEE_stWriteControlBlock.boProgramming;
}
bool FEE_boUpdateControlBlock(uint32 u32BlockWriteCount)
{
puint8 pu8SourceData;
puint8 pu8BufferData;
if (FEE_stWriteControlBlock.boProgramming == true)
{
if ((FEEHA_PFLASH_SCTR_BYTES >=
(u32BlockWriteCount + FEE_stWriteControlBlock.u32AccumulateCount)) &&
(0 != u32BlockWriteCount))
{
pu8SourceData = (puint8)&FEE_stWriteControlBlock.pstSourceBuffer->u8Data[0];
pu8BufferData = (puint8)((uint32)&FEE_au8ProgBuff + FEE_stWriteControlBlock.u32AccumulateCount);
memcpy((void*)pu8BufferData, (void*)pu8SourceData, u32BlockWriteCount);
FEE_stWriteControlBlock.u32AccumulateCount += u32BlockWriteCount;
if (FEEHA_PFLASH_SCTR_BYTES == FEE_stWriteControlBlock.u32AccumulateCount)
{
FEE_stWriteControlBlock.u32AccumulateCount = 0;
FEEHA_boWriteSector();
}
else if (FEEHA_PFLASH_SCTR_BYTES < FEE_stWriteControlBlock.u32AccumulateCount)
{
/* Uh oh too many bytes received - ran past the sector size */
/* matthew deal with this */
FEE_stWriteControlBlock.boProgramming = false;
}
else if (FEE_stWriteControlBlock.u32WriteCount <= FEE_stWriteControlBlock.u32AccumulateCount)
{
FEE_stWriteControlBlock.u32AccumulateCount = 0;
FEEHA_boWriteSector();
}
}
else
{
FEE_stWriteControlBlock.boProgramming = false;
}
}
return FEE_stWriteControlBlock.boProgramming;
}