363 lines
16 KiB
C
363 lines
16 KiB
C
/***********************************************************************************************************************
|
|
* FILE DESCRIPTION
|
|
* ------------------------------------------------------------------------------------------------------------------*/
|
|
/** \file
|
|
* \brief Flash Driver wrapper functions using an Autosar Fls driver
|
|
*
|
|
* --------------------------------------------------------------------------------------------------------------------
|
|
* COPYRIGHT
|
|
* --------------------------------------------------------------------------------------------------------------------
|
|
* \par Copyright
|
|
* \verbatim
|
|
* Copyright (c) 2022 by Vector Informatik GmbH. All rights reserved.
|
|
*
|
|
* This software is copyright protected and proprietary to Vector Informatik GmbH.
|
|
* Vector Informatik GmbH grants to you only those rights as set out in the license conditions.
|
|
* All other rights remain with Vector Informatik GmbH.
|
|
* \endverbatim
|
|
*/
|
|
/**********************************************************************************************************************/
|
|
|
|
/***********************************************************************************************************************
|
|
* REVISION HISTORY
|
|
* --------------------------------------------------------------------------------------------------------------------
|
|
* Version Date Author Change Id Description
|
|
* --------------------------------------------------------------------------------------------------------------------
|
|
* 01.00.00 2018-08-15 vistbe - Initial version
|
|
* 01.01.00 2020-08-12 visrie FBL-1953 Add support for downloadable driver
|
|
* 01.02.00 2022-01-21 visjdn FBL-4535 Support secondary/tertiary use-case
|
|
* Added/adapted MemMap sections
|
|
**********************************************************************************************************************/
|
|
|
|
#define FBL_FLIO_SOURCE
|
|
|
|
/***********************************************************************************************************************
|
|
* INCLUDES
|
|
**********************************************************************************************************************/
|
|
|
|
#include "fbl_inc.h"
|
|
#include "fbl_flio.h"
|
|
#include "fbl_flio_cfg.h"
|
|
|
|
/***********************************************************************************************************************
|
|
* VERSION
|
|
**********************************************************************************************************************/
|
|
|
|
#if (FBLWRAPPERFLASH_ASRFLSHIS_VERSION != 0x0102u) || \
|
|
(FBLWRAPPERFLASH_ASRFLSHIS_RELEASE_VERSION != 0x00u)
|
|
# error "Error in fbl_flio.c: Source and header file are inconsistent!"
|
|
#endif
|
|
|
|
/***********************************************************************************************************************
|
|
* TYPEDEFS
|
|
**********************************************************************************************************************/
|
|
|
|
/** Flash driver state handling */
|
|
typedef enum
|
|
{
|
|
kFlashInitState_Uninit = 0u, /**< Flash driver has not be initialized yet */
|
|
kFlashInitState_ReadDriver, /**< Read-only flash driver is active/initialized */
|
|
kFlashInitState_FullDriver /**< Full flash driver (read, write and erase) is active/initialized */
|
|
} tFlashInitState;
|
|
|
|
/***********************************************************************************************************************
|
|
* GLOBAL DATA
|
|
**********************************************************************************************************************/
|
|
|
|
#define FBLFLIO_FLASHCODE_START_SEC_VAR
|
|
#include "MemMap.h" /* PRQA S 5087 */ /* MD_MSR_MemMap */
|
|
V_MEMRAM0 V_MEMRAM1 vuint8 V_MEMRAM2 flashCode[FLASH_SIZE];
|
|
#define FBLFLIO_FLASHCODE_STOP_SEC_VAR
|
|
#include "MemMap.h" /* PRQA S 5087 */ /* MD_MSR_MemMap */
|
|
|
|
/***********************************************************************************************************************
|
|
* LOCAL DATA
|
|
**********************************************************************************************************************/
|
|
|
|
#define FBLFLIO_START_SEC_VAR
|
|
#include "MemMap.h" /* PRQA S 5087 */ /* MD_MSR_MemMap */
|
|
/** Current initialization state of the flash driver */
|
|
V_MEMRAM0 static V_MEMRAM1 tFlashInitState V_MEMRAM2 initState;
|
|
#define FBLFLIO_STOP_SEC_VAR
|
|
#include "MemMap.h" /* PRQA S 5087 */ /* MD_MSR_MemMap */
|
|
|
|
#define FBLFLIO_START_SEC_CODE
|
|
#include "MemMap.h" /* PRQA S 5087 */ /* MD_MSR_MemMap */
|
|
|
|
/***********************************************************************************************************************
|
|
* LOCAL FUNCTION PROTOTYPES
|
|
**********************************************************************************************************************/
|
|
|
|
static IO_ErrorType FlashDriver_PollFls( void );
|
|
|
|
/***********************************************************************************************************************
|
|
* LOCAL FUNCTIONS
|
|
**********************************************************************************************************************/
|
|
|
|
/***********************************************************************************************************************
|
|
* FlashDriver_PollFls
|
|
**********************************************************************************************************************/
|
|
/*! \brief Executes operation and polls the status
|
|
* \details Calls the Fls main function and polls the status of the flash operation
|
|
* \pre Flash driver/Fls is initialized, operation has been started
|
|
* \return IO_E_OK in case of success, otherwise IO_E_NOT_OK
|
|
**********************************************************************************************************************/
|
|
static IO_ErrorType FlashDriver_PollFls( void )
|
|
{
|
|
IO_ErrorType returnValue;
|
|
tFlashUint32 i;
|
|
|
|
returnValue = IO_E_NOT_OK;
|
|
i = 0u;
|
|
|
|
while (FBL_FLASHFLS_GETSTATUS() == MEMIF_BUSY)
|
|
{
|
|
/* Poll the watchdog frequently */ /* PRQA S 2991, 2995 1 */ /* MD_FblWrapperFlash_2991_2995 */
|
|
if ((i & (FBL_FLASHFLS_WD_POLLING_INTERVAL - 1u)) == 0x00u)
|
|
{
|
|
FblLookForWatchdogVoid();
|
|
}
|
|
i++;
|
|
FBL_FLASHFLS_MAINFUNCTION();
|
|
}
|
|
|
|
if (FBL_FLASHFLS_GETJOBRESULT() == MEMIF_JOB_OK)
|
|
{
|
|
returnValue = IO_E_OK;
|
|
}
|
|
|
|
return returnValue;
|
|
}
|
|
|
|
/***********************************************************************************************************************
|
|
* GLOBAL FUNCTIONS
|
|
**********************************************************************************************************************/
|
|
|
|
/***********************************************************************************************************************
|
|
* FlashDriver_InitPowerOnSync
|
|
**********************************************************************************************************************/
|
|
/*! \brief Initialize modules variables and read-only driver
|
|
* \return The return code shows the success of the initialization
|
|
**********************************************************************************************************************/
|
|
IO_ErrorType FlashDriver_InitPowerOnSync(void)
|
|
{
|
|
IO_ErrorType returnValue;
|
|
|
|
initState = kFlashInitState_Uninit;
|
|
returnValue = IO_E_NOT_OK;
|
|
|
|
FBL_FLASHFLS_INITMEMORY();
|
|
FBL_FLASHFLS_INIT();
|
|
|
|
if (FBL_FLASHFLS_GETJOBRESULT() == MEMIF_JOB_OK)
|
|
{
|
|
initState = kFlashInitState_ReadDriver;
|
|
returnValue = IO_E_OK;
|
|
}
|
|
|
|
return returnValue;
|
|
}
|
|
|
|
/***********************************************************************************************************************
|
|
* FlashDriver_InitSync
|
|
**********************************************************************************************************************/
|
|
/*! \brief Initializes the flash driver
|
|
* \details Initializes the Fls module
|
|
* \pre None
|
|
* \param[in] *address Unused parameter to implement HIS interface
|
|
* \return IO_E_OK in case of success, otherwise IO_E_NOT_OK
|
|
**********************************************************************************************************************/
|
|
/* PRQA S 3673 1 */ /* MD_MSR_Rule8.13 */
|
|
IO_ErrorType FlashDriver_InitSync( void* address )
|
|
{
|
|
IO_ErrorType returnValue;
|
|
|
|
#if defined( V_ENABLE_USE_DUMMY_STATEMENT )
|
|
/* Parameters not used: avoid compiler warning */ /* PRQA S 3112 1 */ /* MD_MSR_DummyStmt */
|
|
(void)address;
|
|
#endif
|
|
|
|
/* Verify if flashcode signature is correct */ /* PRQA S 0488 3 */ /* MD_FblWrapperFlash_0488 */
|
|
if ( (FLASH_DRIVER_MCUTYPE(flashCode) != FLASH_DRIVER_VERSION_MCUTYPE)
|
|
|| (FLASH_DRIVER_MASKTYPE(flashCode) != FLASH_DRIVER_VERSION_MASKTYPE)
|
|
|| (FLASH_DRIVER_INTERFACE(flashCode) != FLASH_DRIVER_VERSION_INTERFACE)
|
|
)
|
|
{
|
|
/* Flash driver signature mismatch, wrong flash driver */
|
|
returnValue = IO_E_NOT_OK;
|
|
}
|
|
else
|
|
{
|
|
initState = kFlashInitState_FullDriver;
|
|
returnValue = IO_E_OK;
|
|
}
|
|
|
|
return returnValue;
|
|
}
|
|
|
|
/***********************************************************************************************************************
|
|
* FlashDriver_DeinitSync
|
|
**********************************************************************************************************************/
|
|
/*! \brief Deinitializes the flash driver
|
|
* \details No functionality, just to satisfy interface
|
|
* \pre None
|
|
* \param[in] *address Unused parameter to implement HIS interface
|
|
* \return Always IO_E_OK
|
|
**********************************************************************************************************************/
|
|
/* PRQA S 3673 1 */ /* MD_MSR_Rule8.13 */
|
|
IO_ErrorType FlashDriver_DeinitSync( void* address )
|
|
{
|
|
#if defined( V_ENABLE_USE_DUMMY_STATEMENT )
|
|
/* Parameters not used: avoid compiler warning */ /* PRQA S 3112 1 */ /* MD_MSR_DummyStmt */
|
|
(void)address;
|
|
#endif
|
|
|
|
return IO_E_OK;
|
|
}
|
|
|
|
/***********************************************************************************************************************
|
|
* FlashDriver_RWriteSync
|
|
**********************************************************************************************************************/
|
|
/*! \brief Writes data to flash memory
|
|
* \details This function programs flash memory by calling the Fls write routine
|
|
* \pre Flash driver/Fls is initialized, memory to be programmed is erased
|
|
* \param[in] writeBuffer Pointer to input data buffer.
|
|
* \param[in] writeLength Data length
|
|
* \param[in] writeAddress Write target address
|
|
* \return IO_E_OK in case of success, otherwise IO_E_NOT_OK
|
|
**********************************************************************************************************************/
|
|
/* PRQA S 3673 1 */ /* MD_MSR_Rule8.13 */
|
|
IO_ErrorType FlashDriver_RWriteSync( IO_MemPtrType writeBuffer, IO_SizeType writeLength, IO_PositionType writeAddress )
|
|
{
|
|
IO_ErrorType returnValue;
|
|
|
|
/* Verify if flashcode signature is correct */ /* PRQA S 0488 3 */ /* MD_FblWrapperFlash_0488 */
|
|
if ( (FLASH_DRIVER_MCUTYPE(flashCode) != FLASH_DRIVER_VERSION_MCUTYPE)
|
|
|| (FLASH_DRIVER_MASKTYPE(flashCode) != FLASH_DRIVER_VERSION_MASKTYPE)
|
|
|| (FLASH_DRIVER_INTERFACE(flashCode) != FLASH_DRIVER_VERSION_INTERFACE)
|
|
)
|
|
{
|
|
/* Flash driver signature mismatch, wrong flash driver */
|
|
returnValue = IO_E_NOT_OK;
|
|
}
|
|
else
|
|
{
|
|
if (initState != kFlashInitState_FullDriver)
|
|
{
|
|
/* Driver was not initialized yet */
|
|
returnValue = IO_E_NOT_OK;
|
|
}
|
|
else
|
|
{
|
|
if (FBL_FLASHFLS_WRITE(writeAddress, writeBuffer, writeLength) == E_OK)
|
|
{
|
|
returnValue = FlashDriver_PollFls();
|
|
}
|
|
else
|
|
{
|
|
returnValue = IO_E_NOT_OK;
|
|
}
|
|
}
|
|
}
|
|
|
|
return returnValue;
|
|
}
|
|
|
|
/***********************************************************************************************************************
|
|
* FlashDriver_REraseSync
|
|
**********************************************************************************************************************/
|
|
/*! \brief Erases area in flash memory
|
|
* \details This function erases one or more logical sectors
|
|
* \pre Flash driver/Fls is initialized
|
|
* \param[in] eraseLength Length of memory to be erased. The length has to be aligned to the length
|
|
* of one or more flash sectors
|
|
* \param[in] eraseAddress Start address of erase area. The start address has to be the start
|
|
* address of a logical flash sector
|
|
* \return IO_E_OK in case of success, otherwise IO_E_NOT_OK
|
|
**********************************************************************************************************************/
|
|
IO_ErrorType FlashDriver_REraseSync( IO_SizeType eraseLength, IO_PositionType eraseAddress )
|
|
{
|
|
IO_ErrorType returnValue;
|
|
|
|
/* Verify if flashcode signature is correct */ /* PRQA S 0488 3 */ /* MD_FblWrapperFlash_0488 */
|
|
if ( (FLASH_DRIVER_MCUTYPE(flashCode) != FLASH_DRIVER_VERSION_MCUTYPE)
|
|
|| (FLASH_DRIVER_MASKTYPE(flashCode) != FLASH_DRIVER_VERSION_MASKTYPE)
|
|
|| (FLASH_DRIVER_INTERFACE(flashCode) != FLASH_DRIVER_VERSION_INTERFACE)
|
|
)
|
|
{
|
|
/* Flash driver signature mismatch, wrong flash driver */
|
|
returnValue = IO_E_NOT_OK;
|
|
}
|
|
else
|
|
{
|
|
if (initState != kFlashInitState_FullDriver)
|
|
{
|
|
/* Driver was not initialized yet */
|
|
returnValue = IO_E_NOT_OK;
|
|
}
|
|
else
|
|
{
|
|
if (FBL_FLASHFLS_ERASE(eraseAddress, eraseLength) == E_OK)
|
|
{
|
|
returnValue = FlashDriver_PollFls();
|
|
}
|
|
else
|
|
{
|
|
/* Erase request failed */
|
|
returnValue = IO_E_NOT_OK;
|
|
}
|
|
}
|
|
}
|
|
|
|
return returnValue;
|
|
}
|
|
|
|
/***********************************************************************************************************************
|
|
* FlashDriver_RReadSync
|
|
**********************************************************************************************************************/
|
|
/*! \brief Reads data from flash memory
|
|
* \details This function reads data from flash memory by calling the Fls Read function
|
|
* \pre Flash driver/Fls is initialized
|
|
* \param[out] readBuffer Pointer to read target buffer. The buffer size must be at least readLength Bytes
|
|
* \param[in] readLength Size of data to be read
|
|
* \param[in] readAddress Start address of data to be read
|
|
* \return IO_E_OK in case of success, otherwise IO_E_NOT_OK
|
|
**********************************************************************************************************************/
|
|
IO_ErrorType FlashDriver_RReadSync( IO_MemPtrType readBuffer, IO_SizeType readLength, IO_PositionType readAddress )
|
|
{
|
|
IO_ErrorType returnValue;
|
|
|
|
returnValue = IO_E_NOT_OK;
|
|
|
|
if (initState != kFlashInitState_Uninit)
|
|
{
|
|
if (FBL_FLASHFLS_READ(readAddress, readBuffer, readLength) == E_OK)
|
|
{
|
|
returnValue = FlashDriver_PollFls();
|
|
}
|
|
}
|
|
|
|
return returnValue;
|
|
}
|
|
|
|
#define FBLFLIO_STOP_SEC_CODE
|
|
#include "MemMap.h" /* PRQA S 5087 */ /* MD_MSR_MemMap */
|
|
|
|
/* module specific MISRA deviations:
|
|
|
|
MD_FblWrapperFlash_0488
|
|
Reason: Performing pointer arithmetic to get version information of flash driver from flash code buffer.
|
|
Risk: If "unsigned char" doesn't have a size of 1 Byte, the comparison will lead to wrong results.
|
|
Prevention: Check if "unsigned char" has a size of 1 Byte on used platform.
|
|
|
|
MD_FblWrapperFlash_2991_2995:
|
|
Reason: The value of the if-controlling expression depends on the configuration.
|
|
Risk: No risk.
|
|
Prevention: No prevention necessary.
|
|
|
|
*/
|
|
|
|
/***********************************************************************************************************************
|
|
* END OF FILE: FBL_FLIO.C
|
|
**********************************************************************************************************************/
|