parent
72d9f5cd7b
commit
361fbeb73c
@ -0,0 +1,41 @@ |
|||||||
|
/*
|
||||||
|
* Copyright 2013-2016 Freescale Semiconductor, Inc. |
||||||
|
* Copyright 2016-2020 NXP |
||||||
|
* All rights reserved. |
||||||
|
* |
||||||
|
* SPDX-License-Identifier: BSD-3-Clause |
||||||
|
* |
||||||
|
*/ |
||||||
|
|
||||||
|
#ifndef FSL_FLASH_H |
||||||
|
#define FSL_FLASH_H |
||||||
|
|
||||||
|
#include "fsl_ftfx_cache.h" |
||||||
|
#include "fsl_ftfx_flash.h" |
||||||
|
#if FSL_FEATURE_FLASH_HAS_FLEX_NVM |
||||||
|
#include "fsl_ftfx_flexnvm.h" |
||||||
|
#endif |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @addtogroup flash_driver |
||||||
|
* @{ |
||||||
|
*/ |
||||||
|
/*******************************************************************************
|
||||||
|
* Definitions |
||||||
|
******************************************************************************/ |
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* API |
||||||
|
******************************************************************************/ |
||||||
|
|
||||||
|
#if defined(__cplusplus) |
||||||
|
extern "C" { |
||||||
|
#endif |
||||||
|
|
||||||
|
#if defined(__cplusplus) |
||||||
|
} |
||||||
|
#endif |
||||||
|
|
||||||
|
/*! @}*/ |
||||||
|
|
||||||
|
#endif /* FSL_FLASH_H */ |
||||||
@ -0,0 +1,396 @@ |
|||||||
|
/*
|
||||||
|
* Copyright 2017-2020 NXP |
||||||
|
* All rights reserved. |
||||||
|
* |
||||||
|
* SPDX-License-Identifier: BSD-3-Clause |
||||||
|
* |
||||||
|
*/ |
||||||
|
|
||||||
|
#ifndef FSL_FTFX_ADAPTER_H |
||||||
|
#define FSL_FTFX_ADAPTER_H |
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Definitions |
||||||
|
******************************************************************************/ |
||||||
|
|
||||||
|
#define INVALID_REG_MASK (0) |
||||||
|
#define INVALID_REG_SHIFT (0) |
||||||
|
#define INVALID_REG_ADDRESS (NULL) |
||||||
|
#define INVALID_REG_VALUE (0x00U) |
||||||
|
|
||||||
|
/* @brief Flash register access type defines */ |
||||||
|
#define FTFx_REG8_ACCESS_TYPE volatile uint8_t * |
||||||
|
#define FTFx_REG32_ACCESS_TYPE volatile uint32_t * |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @name Common flash register info defines |
||||||
|
* @{ |
||||||
|
*/ |
||||||
|
#if defined(FTFA) |
||||||
|
#define FTFx FTFA |
||||||
|
#define FTFx_BASE FTFA_BASE |
||||||
|
#define FTFx_FSTAT_CCIF_MASK FTFA_FSTAT_CCIF_MASK |
||||||
|
#define FTFx_FSTAT_CCIF_SHIFT FTFA_FSTAT_CCIF_SHIFT |
||||||
|
#define FTFx_FSTAT_RDCOLERR_MASK FTFA_FSTAT_RDCOLERR_MASK |
||||||
|
#define FTFx_FSTAT_ACCERR_MASK FTFA_FSTAT_ACCERR_MASK |
||||||
|
#define FTFx_FSTAT_FPVIOL_MASK FTFA_FSTAT_FPVIOL_MASK |
||||||
|
#define FTFx_FSTAT_MGSTAT0_MASK FTFA_FSTAT_MGSTAT0_MASK |
||||||
|
#define FTFx_FSEC_SEC_MASK FTFA_FSEC_SEC_MASK |
||||||
|
#define FTFx_FSEC_KEYEN_MASK FTFA_FSEC_KEYEN_MASK |
||||||
|
#if defined(FSL_FEATURE_FLASH_HAS_FLEX_RAM) && FSL_FEATURE_FLASH_HAS_FLEX_RAM |
||||||
|
#define FTFx_FCNFG_RAMRDY_MASK FTFA_FCNFG_RAMRDY_MASK |
||||||
|
#endif /* FSL_FEATURE_FLASH_HAS_FLEX_RAM */ |
||||||
|
#if defined(FSL_FEATURE_FLASH_HAS_FLEX_NVM) && FSL_FEATURE_FLASH_HAS_FLEX_NVM |
||||||
|
#define FTFx_FCNFG_EEERDY_MASK FTFA_FCNFG_EEERDY_MASK |
||||||
|
#endif /* FSL_FEATURE_FLASH_HAS_FLEX_NVM */ |
||||||
|
#elif defined(FTFE) |
||||||
|
#define FTFx FTFE |
||||||
|
#define FTFx_BASE FTFE_BASE |
||||||
|
#define FTFx_FSTAT_CCIF_MASK FTFE_FSTAT_CCIF_MASK |
||||||
|
#define FTFx_FSTAT_CCIF_SHIFT FTFE_FSTAT_CCIF_SHIFT |
||||||
|
#define FTFx_FSTAT_RDCOLERR_MASK FTFE_FSTAT_RDCOLERR_MASK |
||||||
|
#define FTFx_FSTAT_ACCERR_MASK FTFE_FSTAT_ACCERR_MASK |
||||||
|
#define FTFx_FSTAT_FPVIOL_MASK FTFE_FSTAT_FPVIOL_MASK |
||||||
|
#define FTFx_FSTAT_MGSTAT0_MASK FTFE_FSTAT_MGSTAT0_MASK |
||||||
|
#define FTFx_FSEC_SEC_MASK FTFE_FSEC_SEC_MASK |
||||||
|
#define FTFx_FSEC_KEYEN_MASK FTFE_FSEC_KEYEN_MASK |
||||||
|
#if defined(FSL_FEATURE_FLASH_HAS_FLEX_RAM) && FSL_FEATURE_FLASH_HAS_FLEX_RAM |
||||||
|
#define FTFx_FCNFG_RAMRDY_MASK FTFE_FCNFG_RAMRDY_MASK |
||||||
|
#endif /* FSL_FEATURE_FLASH_HAS_FLEX_RAM */ |
||||||
|
#if defined(FSL_FEATURE_FLASH_HAS_FLEX_NVM) && FSL_FEATURE_FLASH_HAS_FLEX_NVM |
||||||
|
#define FTFx_FCNFG_EEERDY_MASK FTFE_FCNFG_EEERDY_MASK |
||||||
|
#endif /* FSL_FEATURE_FLASH_HAS_FLEX_NVM */ |
||||||
|
#elif defined(FTFL) |
||||||
|
#define FTFx FTFL |
||||||
|
#define FTFx_BASE FTFL_BASE |
||||||
|
#define FTFx_FSTAT_CCIF_MASK FTFL_FSTAT_CCIF_MASK |
||||||
|
#define FTFx_FSTAT_CCIF_SHIFT FTFL_FSTAT_CCIF_SHIFT |
||||||
|
#define FTFx_FSTAT_RDCOLERR_MASK FTFL_FSTAT_RDCOLERR_MASK |
||||||
|
#define FTFx_FSTAT_ACCERR_MASK FTFL_FSTAT_ACCERR_MASK |
||||||
|
#define FTFx_FSTAT_FPVIOL_MASK FTFL_FSTAT_FPVIOL_MASK |
||||||
|
#define FTFx_FSTAT_MGSTAT0_MASK FTFL_FSTAT_MGSTAT0_MASK |
||||||
|
#define FTFx_FSEC_SEC_MASK FTFL_FSEC_SEC_MASK |
||||||
|
#define FTFx_FSEC_KEYEN_MASK FTFL_FSEC_KEYEN_MASK |
||||||
|
#if defined(FSL_FEATURE_FLASH_HAS_FLEX_RAM) && FSL_FEATURE_FLASH_HAS_FLEX_RAM |
||||||
|
#define FTFx_FCNFG_RAMRDY_MASK FTFL_FCNFG_RAMRDY_MASK |
||||||
|
#endif /* FSL_FEATURE_FLASH_HAS_FLEX_RAM */ |
||||||
|
#if defined(FSL_FEATURE_FLASH_HAS_FLEX_NVM) && FSL_FEATURE_FLASH_HAS_FLEX_NVM |
||||||
|
#define FTFx_FCNFG_EEERDY_MASK FTFL_FCNFG_EEERDY_MASK |
||||||
|
#endif /* FSL_FEATURE_FLASH_HAS_FLEX_NVM */ |
||||||
|
#else |
||||||
|
#error "Unknown flash controller" |
||||||
|
#endif |
||||||
|
/*@}*/ |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @name Common flash register access info defines |
||||||
|
* @{ |
||||||
|
*/ |
||||||
|
#define FTFx_FCCOB3_REG (FTFx->FCCOB3) |
||||||
|
#define FTFx_FCCOB5_REG (FTFx->FCCOB5) |
||||||
|
#define FTFx_FCCOB6_REG (FTFx->FCCOB6) |
||||||
|
#define FTFx_FCCOB7_REG (FTFx->FCCOB7) |
||||||
|
|
||||||
|
#if defined(FSL_FEATURE_FLASH_HAS_MULTIPLE_FLASH) || defined(FSL_FEATURE_FLASH_PFLASH_1_START_ADDRESS) |
||||||
|
#if defined(FTFA_FPROTSL_PROTS_MASK) || defined(FTFE_FPROTSL_PROTS_MASK) || defined(FTFL_FPROTSL_PROTS_MASK) |
||||||
|
#define FTFx_FLASH1_HAS_INT_PROT_REG (1) |
||||||
|
#define FTFx_FPROTSH_REG (FTFx->FPROTSH) |
||||||
|
#define FTFx_FPROTSL_REG (FTFx->FPROTSL) |
||||||
|
#else |
||||||
|
#define FTFx_FLASH1_HAS_INT_PROT_REG (0) |
||||||
|
#endif |
||||||
|
#endif |
||||||
|
|
||||||
|
#if defined(FTFA_FPROTH0_PROT_MASK) || defined(FTFE_FPROTH0_PROT_MASK) || defined(FTFL_FPROTH0_PROT_MASK) |
||||||
|
#define FTFx_FLASH0_HAS_HIGH_PROT_REG (1) |
||||||
|
#define FTFx_FPROT_HIGH_REG (FTFx->FPROTH3) |
||||||
|
#define FTFx_FPROTH3_REG (FTFx->FPROTH3) |
||||||
|
#define FTFx_FPROTH2_REG (FTFx->FPROTH2) |
||||||
|
#define FTFx_FPROTH1_REG (FTFx->FPROTH1) |
||||||
|
#define FTFx_FPROTH0_REG (FTFx->FPROTH0) |
||||||
|
#else |
||||||
|
#define FTFx_FLASH0_HAS_HIGH_PROT_REG (0) |
||||||
|
#endif |
||||||
|
|
||||||
|
#if defined(FTFA_FPROTL0_PROT_MASK) || defined(FTFE_FPROTL0_PROT_MASK) || defined(FTFL_FPROTL0_PROT_MASK) |
||||||
|
#define FTFx_FPROT_LOW_REG (FTFx->FPROTL3) |
||||||
|
#define FTFx_FPROTL3_REG (FTFx->FPROTL3) |
||||||
|
#define FTFx_FPROTL2_REG (FTFx->FPROTL2) |
||||||
|
#define FTFx_FPROTL1_REG (FTFx->FPROTL1) |
||||||
|
#define FTFx_FPROTL0_REG (FTFx->FPROTL0) |
||||||
|
#elif defined(FTFA_FPROT0_PROT_MASK) || defined(FTFE_FPROT0_PROT_MASK) || defined(FTFL_FPROT0_PROT_MASK) |
||||||
|
#define FTFx_FPROT_LOW_REG (FTFx->FPROT3) |
||||||
|
#define FTFx_FPROTL3_REG (FTFx->FPROT3) |
||||||
|
#define FTFx_FPROTL2_REG (FTFx->FPROT2) |
||||||
|
#define FTFx_FPROTL1_REG (FTFx->FPROT1) |
||||||
|
#define FTFx_FPROTL0_REG (FTFx->FPROT0) |
||||||
|
#endif |
||||||
|
|
||||||
|
#if defined(FSL_FEATURE_FLASH_HAS_MULTIPLE_FLASH) || defined(FSL_FEATURE_FLASH_PFLASH_1_START_ADDRESS) |
||||||
|
#if defined(FTFA_FACSSS_SGSIZE_S_MASK) || defined(FTFE_FACSSS_SGSIZE_S_MASK) || defined(FTFL_FACSSS_SGSIZE_S_MASK) |
||||||
|
#define FTFx_FLASH1_HAS_INT_XACC_REG (1) |
||||||
|
#define FTFx_XACCSH_REG (FTFx->XACCSH) |
||||||
|
#define FTFx_XACCSL_REG (FTFx->XACCSL) |
||||||
|
#define FTFx_FACSSS_REG (FTFx->FACSSS) |
||||||
|
#define FTFx_FACSNS_REG (FTFx->FACSNS) |
||||||
|
#else |
||||||
|
#define FTFx_FLASH1_HAS_INT_XACC_REG (0) |
||||||
|
#endif |
||||||
|
#endif |
||||||
|
|
||||||
|
#if (defined(FTFA_FACSS_SGSIZE_MASK) || defined(FTFE_FACSS_SGSIZE_MASK) || defined(FTFL_FACSS_SGSIZE_MASK) || \ |
||||||
|
defined(FTFA_FACSS_SGSIZE_S_MASK) || defined(FTFE_FACSS_SGSIZE_S_MASK) || defined(FTFL_FACSS_SGSIZE_S_MASK)) |
||||||
|
#define FTFx_FLASH0_HAS_INT_XACC_REG (1) |
||||||
|
#define FTFx_XACCH3_REG (FTFx->XACCH3) |
||||||
|
#define FTFx_XACCL3_REG (FTFx->XACCL3) |
||||||
|
#define FTFx_FACSS_REG (FTFx->FACSS) |
||||||
|
#define FTFx_FACSN_REG (FTFx->FACSN) |
||||||
|
#else |
||||||
|
#define FTFx_FLASH0_HAS_INT_XACC_REG (0) |
||||||
|
#endif |
||||||
|
/*@}*/ |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief MCM cache register access info defines. |
||||||
|
*/ |
||||||
|
#if defined(MCM_PLACR_CFCC_MASK) |
||||||
|
#define MCM_CACHE_CLEAR_MASK MCM_PLACR_CFCC_MASK |
||||||
|
#define MCM_CACHE_CLEAR_SHIFT MCM_PLACR_CFCC_SHIFT |
||||||
|
#if defined(MCM0) |
||||||
|
#define MCM0_CACHE_REG MCM0->PLACR |
||||||
|
#elif defined(MCM) && (!defined(MCM1)) |
||||||
|
#define MCM0_CACHE_REG MCM->PLACR |
||||||
|
#endif |
||||||
|
#if defined(MCM1) |
||||||
|
#define MCM1_CACHE_REG MCM1->PLACR |
||||||
|
#elif defined(MCM) && (!defined(MCM0)) |
||||||
|
#define MCM1_CACHE_REG MCM->PLACR |
||||||
|
#endif |
||||||
|
#else |
||||||
|
#define MCM_CACHE_CLEAR_MASK INVALID_REG_MASK |
||||||
|
#define MCM_CACHE_CLEAR_SHIFT INVALID_REG_SHIFT |
||||||
|
#define MCM0_CACHE_REG (INVALID_REG_ADDRESS) |
||||||
|
#define MCM1_CACHE_REG (INVALID_REG_ADDRESS) |
||||||
|
#endif |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief FMC cache register access info defines. |
||||||
|
*/ |
||||||
|
#if defined(FMC_PFB01CR_S_INV_MASK) |
||||||
|
#define FMC_SPECULATION_INVALIDATE_MASK FMC_PFB01CR_S_INV_MASK |
||||||
|
#define FMC_SPECULATION_INVALIDATE_SHIFT FMC_PFB01CR_S_INV_SHIFT |
||||||
|
#define FMC_SPECULATION_INVALIDATE_REG FMC->PFB01CR |
||||||
|
#elif defined(FMC_PFB01CR_S_B_INV_MASK) |
||||||
|
#define FMC_SPECULATION_INVALIDATE_MASK FMC_PFB01CR_S_B_INV_MASK |
||||||
|
#define FMC_SPECULATION_INVALIDATE_SHIFT FMC_PFB01CR_S_B_INV_SHIFT |
||||||
|
#define FMC_SPECULATION_INVALIDATE_REG FMC->PFB01CR |
||||||
|
#elif defined(FMC_PFB0CR_S_INV_MASK) |
||||||
|
#define FMC_SPECULATION_INVALIDATE_MASK FMC_PFB0CR_S_INV_MASK |
||||||
|
#define FMC_SPECULATION_INVALIDATE_SHIFT FMC_PFB0CR_S_INV_SHIFT |
||||||
|
#define FMC_SPECULATION_INVALIDATE_REG FMC->PFB0CR |
||||||
|
#elif defined(FMC_PFB0CR_S_B_INV_MASK) |
||||||
|
#define FMC_SPECULATION_INVALIDATE_MASK FMC_PFB0CR_S_B_INV_MASK |
||||||
|
#define FMC_SPECULATION_INVALIDATE_SHIFT FMC_PFB0CR_S_B_INV_SHIFT |
||||||
|
#define FMC_SPECULATION_INVALIDATE_REG FMC->PFB0CR |
||||||
|
#else |
||||||
|
#define FMC_SPECULATION_INVALIDATE_MASK INVALID_REG_MASK |
||||||
|
#define FMC_SPECULATION_INVALIDATE_SHIFT INVALID_REG_SHIFT |
||||||
|
#define FMC_SPECULATION_INVALIDATE(x) (((uint32_t)(((uint32_t)(x)) << INVALID_REG_SHIFT)) & INVALID_REG_MASK) |
||||||
|
#define FMC_SPECULATION_INVALIDATE_REG (INVALID_REG_ADDRESS) |
||||||
|
#endif |
||||||
|
|
||||||
|
#if defined(FMC_PFB01CR_CINV_WAY_MASK) |
||||||
|
#define FMC_CACHE_CLEAR_MASK FMC_PFB01CR_CINV_WAY_MASK |
||||||
|
#define FMC_CACHE_CLEAR_SHIFT FMC_PFB01CR_CINV_WAY_SHIFT |
||||||
|
#define FMC_CACHE_CLEAR(x) FMC_PFB01CR_CINV_WAY(x) |
||||||
|
#elif defined(FMC_PFB0CR_CINV_WAY_MASK) |
||||||
|
#define FMC_CACHE_CLEAR_MASK FMC_PFB0CR_CINV_WAY_MASK |
||||||
|
#define FMC_CACHE_CLEAR_SHIFT FMC_PFB0CR_CINV_WAY_SHIFT |
||||||
|
#define FMC_CACHE_CLEAR(x) FMC_PFB0CR_CINV_WAY(x) |
||||||
|
#else |
||||||
|
#define FMC_CACHE_CLEAR_MASK INVALID_REG_MASK |
||||||
|
#define FMC_CACHE_CLEAR_SHIFT INVALID_REG_SHIFT |
||||||
|
#define FMC_CACHE_CLEAR(x) (((uint32_t)(((uint32_t)(x)) << INVALID_REG_SHIFT)) & INVALID_REG_MASK) |
||||||
|
#endif |
||||||
|
|
||||||
|
#if defined(FMC_PFB01CR_B0DPE_MASK) |
||||||
|
#define FMC_CACHE_B0DPE_MASK FMC_PFB01CR_B0DPE_MASK |
||||||
|
#define FMC_CACHE_B0IPE_MASK FMC_PFB01CR_B0IPE_MASK |
||||||
|
#define FMC_CACHE_REG FMC->PFB01CR |
||||||
|
#elif defined(FMC_PFB0CR_B0DPE_MASK) |
||||||
|
#define FMC_CACHE_B0DPE_MASK FMC_PFB0CR_B0DPE_MASK |
||||||
|
#define FMC_CACHE_B0IPE_MASK FMC_PFB0CR_B0IPE_MASK |
||||||
|
#define FMC_CACHE_REG FMC->PFB0CR |
||||||
|
#else |
||||||
|
#define FMC_CACHE_B0DPE_MASK INVALID_REG_MASK |
||||||
|
#define FMC_CACHE_B0IPE_MASK INVALID_REG_MASK |
||||||
|
#define FMC_CACHE_REG (INVALID_REG_ADDRESS) |
||||||
|
#endif |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief MSCM cache register access info defines. |
||||||
|
*/ |
||||||
|
#if defined(MSCM_OCMDR_OCM1_MASK) |
||||||
|
#define MSCM_SPECULATION_SET_MASK MSCM_OCMDR_OCM1_MASK |
||||||
|
#define MSCM_SPECULATION_SET_SHIFT MSCM_OCMDR_OCM1_SHIFT |
||||||
|
#define MSCM_SPECULATION_SET(x) MSCM_OCMDR_OCM1(x) |
||||||
|
#elif defined(MSCM_OCMDR0_OCM1_MASK) || defined(MSCM_OCMDR1_OCM1_MASK) |
||||||
|
#define MSCM_SPECULATION_SET_MASK MSCM_OCMDR0_OCM1_MASK |
||||||
|
#define MSCM_SPECULATION_SET_SHIFT MSCM_OCMDR0_OCM1_SHIFT |
||||||
|
#define MSCM_SPECULATION_SET(x) MSCM_OCMDR0_OCM1(x) |
||||||
|
#elif defined(MSCM_OCMDR_OCMC1_MASK) |
||||||
|
#define MSCM_SPECULATION_SET_MASK MSCM_OCMDR_OCMC1_MASK |
||||||
|
#define MSCM_SPECULATION_SET_SHIFT MSCM_OCMDR_OCMC1_SHIFT |
||||||
|
#define MSCM_SPECULATION_SET(x) MSCM_OCMDR_OCMC1(x) |
||||||
|
#else |
||||||
|
#define MSCM_SPECULATION_SET_MASK INVALID_REG_MASK |
||||||
|
#define MSCM_SPECULATION_SET_SHIFT INVALID_REG_SHIFT |
||||||
|
#define MSCM_SPECULATION_SET(x) (((uint32_t)(((uint32_t)(x)) << INVALID_REG_SHIFT)) & INVALID_REG_MASK) |
||||||
|
#endif |
||||||
|
|
||||||
|
#if defined(MSCM_OCMDR_OCM2_MASK) |
||||||
|
#define MSCM_CACHE_CLEAR_MASK MSCM_OCMDR_OCM2_MASK |
||||||
|
#define MSCM_CACHE_CLEAR_SHIFT MSCM_OCMDR_OCM2_SHIFT |
||||||
|
#define MSCM_CACHE_CLEAR(x) MSCM_OCMDR_OCM2(x) |
||||||
|
#else |
||||||
|
#define MSCM_CACHE_CLEAR_MASK INVALID_REG_MASK |
||||||
|
#define MSCM_CACHE_CLEAR_SHIFT INVALID_REG_SHIFT |
||||||
|
#define MSCM_CACHE_CLEAR(x) (((uint32_t)(((uint32_t)(x)) << INVALID_REG_SHIFT)) & INVALID_REG_MASK) |
||||||
|
#endif |
||||||
|
|
||||||
|
#if defined(MSCM_OCMDR_OCM1_MASK) || defined(MSCM_OCMDR_OCMC1_MASK) |
||||||
|
#define MSCM_OCMDR0_REG MSCM->OCMDR[0] |
||||||
|
#define MSCM_OCMDR1_REG MSCM->OCMDR[1] |
||||||
|
#elif defined(MSCM_OCMDR0_OCM1_MASK) || defined(MSCM_OCMDR1_OCM1_MASK) |
||||||
|
#define MSCM_OCMDR0_REG MSCM->OCMDR0 |
||||||
|
#define MSCM_OCMDR1_REG MSCM->OCMDR1 |
||||||
|
#else |
||||||
|
#define MSCM_OCMDR0_REG (INVALID_REG_ADDRESS) |
||||||
|
#define MSCM_OCMDR1_REG (INVALID_REG_ADDRESS) |
||||||
|
#endif |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief MSCM prefetch speculation defines. |
||||||
|
*/ |
||||||
|
#define MSCM_OCMDR_OCMC1_DFDS_MASK (0x10U) |
||||||
|
#define MSCM_OCMDR_OCMC1_DFCS_MASK (0x20U) |
||||||
|
#define MSCM_OCMDR_OCMC1_DFDS_SHIFT (4U) |
||||||
|
#define MSCM_OCMDR_OCMC1_DFCS_SHIFT (5U) |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief SIM PFSIZE register access info defines. |
||||||
|
*/ |
||||||
|
#if defined(SIM_FCFG1_CORE0_PFSIZE_MASK) |
||||||
|
#define SIM_FLASH0_PFSIZE_MASK SIM_FCFG1_CORE0_PFSIZE_MASK |
||||||
|
#define SIM_FLASH0_PFSIZE_SHIFT SIM_FCFG1_CORE0_PFSIZE_SHIFT |
||||||
|
#define SIM_FCFG1_REG SIM->FCFG1 |
||||||
|
#elif defined(SIM_FCFG1_PFSIZE_MASK) |
||||||
|
#define SIM_FLASH0_PFSIZE_MASK SIM_FCFG1_PFSIZE_MASK |
||||||
|
#define SIM_FLASH0_PFSIZE_SHIFT SIM_FCFG1_PFSIZE_SHIFT |
||||||
|
#define SIM_FCFG1_REG SIM->FCFG1 |
||||||
|
#else |
||||||
|
#define SIM_FLASH0_PFSIZE_MASK INVALID_REG_MASK |
||||||
|
#define SIM_FLASH0_PFSIZE_SHIFT INVALID_REG_SHIFT |
||||||
|
#define SIM_FCFG1_REG INVALID_REG_VALUE |
||||||
|
#endif |
||||||
|
|
||||||
|
#if defined(SIM_FCFG1_CORE1_PFSIZE_MASK) |
||||||
|
#define SIM_FLASH1_PFSIZE_MASK SIM_FCFG1_CORE1_PFSIZE_MASK |
||||||
|
#define SIM_FLASH1_PFSIZE_SHIFT SIM_FCFG1_CORE1_PFSIZE_SHIFT |
||||||
|
#else |
||||||
|
#define SIM_FLASH1_PFSIZE_MASK INVALID_REG_MASK |
||||||
|
#define SIM_FLASH1_PFSIZE_SHIFT INVALID_REG_SHIFT |
||||||
|
#endif |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @name Dual core/flash configuration |
||||||
|
* @{ |
||||||
|
*/ |
||||||
|
/*! @brief Redefines some flash features. */ |
||||||
|
#if defined(FSL_FEATURE_FLASH_CURRENT_CORE_ID) |
||||||
|
#if (FSL_FEATURE_FLASH_CURRENT_CORE_ID == 0u) |
||||||
|
#define FLASH0_FEATURE_PFLASH_START_ADDRESS FSL_FEATURE_FLASH_PFLASH_START_ADDRESS |
||||||
|
#define FLASH0_FEATURE_PFLASH_BLOCK_COUNT FSL_FEATURE_FLASH_PFLASH_BLOCK_COUNT |
||||||
|
#define FLASH0_FEATURE_PFLASH_BLOCK_SIZE FSL_FEATURE_FLASH_PFLASH_BLOCK_SIZE |
||||||
|
#define FLASH0_FEATURE_PFLASH_BLOCK_SECTOR_SIZE FSL_FEATURE_FLASH_PFLASH_BLOCK_SECTOR_SIZE |
||||||
|
#define FLASH0_FEATURE_PFLASH_BLOCK_WRITE_UNIT_SIZE FSL_FEATURE_FLASH_PFLASH_BLOCK_WRITE_UNIT_SIZE |
||||||
|
#define FLASH0_FEATURE_PFLASH_SECTOR_CMD_ADDRESS_ALIGMENT FSL_FEATURE_FLASH_PFLASH_SECTOR_CMD_ADDRESS_ALIGMENT |
||||||
|
#define FLASH0_FEATURE_PFLASH_SECTION_CMD_ADDRESS_ALIGMENT FSL_FEATURE_FLASH_PFLASH_SECTION_CMD_ADDRESS_ALIGMENT |
||||||
|
#define FLASH0_FEATURE_PFLASH_PROTECTION_REGION_COUNT FSL_FEATURE_FLASH_PFLASH_PROTECTION_REGION_COUNT |
||||||
|
#define FLASH1_FEATURE_PFLASH_START_ADDRESS FSL_FEATURE_FLASH_PFLASH_1_START_ADDRESS |
||||||
|
#define FLASH1_FEATURE_PFLASH_BLOCK_COUNT FSL_FEATURE_FLASH_PFLASH_1_BLOCK_COUNT |
||||||
|
#define FLASH1_FEATURE_PFLASH_BLOCK_SIZE FSL_FEATURE_FLASH_PFLASH_1_BLOCK_SIZE |
||||||
|
#define FLASH1_FEATURE_PFLASH_BLOCK_SECTOR_SIZE FSL_FEATURE_FLASH_PFLASH_1_BLOCK_SECTOR_SIZE |
||||||
|
#define FLASH1_FEATURE_PFLASH_BLOCK_WRITE_UNIT_SIZE FSL_FEATURE_FLASH_PFLASH_1_BLOCK_WRITE_UNIT_SIZE |
||||||
|
#if defined(FSL_FEATURE_FLASH_PFLASH_1_SECTOR_CMD_ADDRESS_ALIGMENT) && \ |
||||||
|
defined(FSL_FEATURE_FLASH_PFLASH_1_SECTION_CMD_ADDRESS_ALIGMENT) |
||||||
|
#define FLASH1_FEATURE_PFLASH_SECTOR_CMD_ADDRESS_ALIGMENT FSL_FEATURE_FLASH_PFLASH_1_SECTOR_CMD_ADDRESS_ALIGMENT |
||||||
|
#define FLASH1_FEATURE_PFLASH_SECTION_CMD_ADDRESS_ALIGMENT FSL_FEATURE_FLASH_PFLASH_1_SECTION_CMD_ADDRESS_ALIGMENT |
||||||
|
#else |
||||||
|
#define FLASH1_FEATURE_PFLASH_SECTOR_CMD_ADDRESS_ALIGMENT FSL_FEATURE_FLASH_PFLASH_SECTOR_CMD_ADDRESS_ALIGMENT |
||||||
|
#define FLASH1_FEATURE_PFLASH_SECTION_CMD_ADDRESS_ALIGMENT FSL_FEATURE_FLASH_PFLASH_SECTION_CMD_ADDRESS_ALIGMENT |
||||||
|
#endif |
||||||
|
#define FLASH1_FEATURE_PFLASH_PROTECTION_REGION_COUNT FSL_FEATURE_FLASH_PFLASH_1_PROTECTION_REGION_COUNT |
||||||
|
#elif (FSL_FEATURE_FLASH_CURRENT_CORE_ID == 1u) |
||||||
|
#define FLASH0_FEATURE_PFLASH_START_ADDRESS FSL_FEATURE_FLASH_PFLASH_1_START_ADDRESS |
||||||
|
#define FLASH0_FEATURE_PFLASH_BLOCK_COUNT FSL_FEATURE_FLASH_PFLASH_1_BLOCK_COUNT |
||||||
|
#define FLASH0_FEATURE_PFLASH_BLOCK_SIZE FSL_FEATURE_FLASH_PFLASH_1_BLOCK_SIZE |
||||||
|
#define FLASH0_FEATURE_PFLASH_BLOCK_SECTOR_SIZE FSL_FEATURE_FLASH_PFLASH_1_BLOCK_SECTOR_SIZE |
||||||
|
#define FLASH0_FEATURE_PFLASH_BLOCK_WRITE_UNIT_SIZE FSL_FEATURE_FLASH_PFLASH_1_BLOCK_WRITE_UNIT_SIZE |
||||||
|
#if defined(FSL_FEATURE_FLASH_PFLASH_1_SECTOR_CMD_ADDRESS_ALIGMENT) && \ |
||||||
|
defined(FSL_FEATURE_FLASH_PFLASH_1_SECTION_CMD_ADDRESS_ALIGMENT) |
||||||
|
#define FLASH0_FEATURE_PFLASH_SECTOR_CMD_ADDRESS_ALIGMENT FSL_FEATURE_FLASH_PFLASH_1_SECTOR_CMD_ADDRESS_ALIGMENT |
||||||
|
#define FLASH0_FEATURE_PFLASH_SECTION_CMD_ADDRESS_ALIGMENT FSL_FEATURE_FLASH_PFLASH_1_SECTION_CMD_ADDRESS_ALIGMENT |
||||||
|
#else |
||||||
|
#define FLASH0_FEATURE_PFLASH_SECTOR_CMD_ADDRESS_ALIGMENT FSL_FEATURE_FLASH_PFLASH_SECTOR_CMD_ADDRESS_ALIGMENT |
||||||
|
#define FLASH0_FEATURE_PFLASH_SECTION_CMD_ADDRESS_ALIGMENT FSL_FEATURE_FLASH_PFLASH_SECTION_CMD_ADDRESS_ALIGMENT |
||||||
|
#endif |
||||||
|
#define FLASH0_FEATURE_PFLASH_PROTECTION_REGION_COUNT FSL_FEATURE_FLASH_PFLASH_1_PROTECTION_REGION_COUNT |
||||||
|
#define FLASH1_FEATURE_PFLASH_START_ADDRESS FSL_FEATURE_FLASH_PFLASH_START_ADDRESS |
||||||
|
#define FLASH1_FEATURE_PFLASH_BLOCK_COUNT FSL_FEATURE_FLASH_PFLASH_BLOCK_COUNT |
||||||
|
#define FLASH1_FEATURE_PFLASH_BLOCK_SIZE FSL_FEATURE_FLASH_PFLASH_BLOCK_SIZE |
||||||
|
#define FLASH1_FEATURE_PFLASH_BLOCK_SECTOR_SIZE FSL_FEATURE_FLASH_PFLASH_BLOCK_SECTOR_SIZE |
||||||
|
#define FLASH1_FEATURE_PFLASH_BLOCK_WRITE_UNIT_SIZE FSL_FEATURE_FLASH_PFLASH_BLOCK_WRITE_UNIT_SIZE |
||||||
|
#define FLASH1_FEATURE_PFLASH_SECTOR_CMD_ADDRESS_ALIGMENT FSL_FEATURE_FLASH_PFLASH_SECTOR_CMD_ADDRESS_ALIGMENT |
||||||
|
#define FLASH1_FEATURE_PFLASH_SECTION_CMD_ADDRESS_ALIGMENT FSL_FEATURE_FLASH_PFLASH_SECTION_CMD_ADDRESS_ALIGMENT |
||||||
|
#define FLASH1_FEATURE_PFLASH_PROTECTION_REGION_COUNT FSL_FEATURE_FLASH_PFLASH_PROTECTION_REGION_COUNT |
||||||
|
#endif |
||||||
|
#else /* undfine FSL_FEATURE_FLASH_CURRENT_CORE_ID */ |
||||||
|
#define FLASH0_FEATURE_PFLASH_START_ADDRESS FSL_FEATURE_FLASH_PFLASH_START_ADDRESS |
||||||
|
#define FLASH0_FEATURE_PFLASH_BLOCK_COUNT FSL_FEATURE_FLASH_PFLASH_BLOCK_COUNT |
||||||
|
#define FLASH0_FEATURE_PFLASH_BLOCK_SIZE FSL_FEATURE_FLASH_PFLASH_BLOCK_SIZE |
||||||
|
#define FLASH0_FEATURE_PFLASH_BLOCK_SECTOR_SIZE FSL_FEATURE_FLASH_PFLASH_BLOCK_SECTOR_SIZE |
||||||
|
#define FLASH0_FEATURE_PFLASH_BLOCK_WRITE_UNIT_SIZE FSL_FEATURE_FLASH_PFLASH_BLOCK_WRITE_UNIT_SIZE |
||||||
|
#define FLASH0_FEATURE_PFLASH_SECTOR_CMD_ADDRESS_ALIGMENT FSL_FEATURE_FLASH_PFLASH_SECTOR_CMD_ADDRESS_ALIGMENT |
||||||
|
#define FLASH0_FEATURE_PFLASH_SECTION_CMD_ADDRESS_ALIGMENT FSL_FEATURE_FLASH_PFLASH_SECTION_CMD_ADDRESS_ALIGMENT |
||||||
|
#define FLASH0_FEATURE_PFLASH_PROTECTION_REGION_COUNT FSL_FEATURE_FLASH_PFLASH_PROTECTION_REGION_COUNT |
||||||
|
#if defined(FSL_FEATURE_FLASH_HAS_MULTIPLE_FLASH) || defined(FSL_FEATURE_FLASH_PFLASH_1_START_ADDRESS) |
||||||
|
#define FLASH1_FEATURE_PFLASH_START_ADDRESS FSL_FEATURE_FLASH_PFLASH_1_START_ADDRESS |
||||||
|
#define FLASH1_FEATURE_PFLASH_BLOCK_COUNT FSL_FEATURE_FLASH_PFLASH_1_BLOCK_COUNT |
||||||
|
#define FLASH1_FEATURE_PFLASH_BLOCK_SIZE FSL_FEATURE_FLASH_PFLASH_1_BLOCK_SIZE |
||||||
|
#define FLASH1_FEATURE_PFLASH_BLOCK_SECTOR_SIZE FSL_FEATURE_FLASH_PFLASH_1_BLOCK_SECTOR_SIZE |
||||||
|
#define FLASH1_FEATURE_PFLASH_BLOCK_WRITE_UNIT_SIZE FSL_FEATURE_FLASH_PFLASH_1_BLOCK_WRITE_UNIT_SIZE |
||||||
|
#define FLASH1_FEATURE_PFLASH_SECTOR_CMD_ADDRESS_ALIGMENT FSL_FEATURE_FLASH_PFLASH_SECTOR_CMD_ADDRESS_ALIGMENT |
||||||
|
#define FLASH1_FEATURE_PFLASH_SECTION_CMD_ADDRESS_ALIGMENT FSL_FEATURE_FLASH_PFLASH_SECTION_CMD_ADDRESS_ALIGMENT |
||||||
|
#define FLASH1_FEATURE_PFLASH_PROTECTION_REGION_COUNT FSL_FEATURE_FLASH_PFLASH_PROTECTION_REGION_COUNT |
||||||
|
#else /* undfine FSL_FEATURE_FLASH_HAS_MULTIPLE_FLASH or FSL_FEATURE_FLASH_PFLASH_1_START_ADDRESS */ |
||||||
|
#define FLASH1_FEATURE_PFLASH_START_ADDRESS 0 |
||||||
|
#define FLASH1_FEATURE_PFLASH_BLOCK_COUNT 0 |
||||||
|
#define FLASH1_FEATURE_PFLASH_BLOCK_SIZE 0 |
||||||
|
#define FLASH1_FEATURE_PFLASH_BLOCK_SECTOR_SIZE 0 |
||||||
|
#define FLASH1_FEATURE_PFLASH_BLOCK_WRITE_UNIT_SIZE 0 |
||||||
|
#define FLASH1_FEATURE_PFLASH_SECTOR_CMD_ADDRESS_ALIGMENT 0 |
||||||
|
#define FLASH1_FEATURE_PFLASH_SECTION_CMD_ADDRESS_ALIGMENT 0 |
||||||
|
#define FLASH1_FEATURE_PFLASH_PROTECTION_REGION_COUNT 0 |
||||||
|
#endif |
||||||
|
#endif |
||||||
|
|
||||||
|
#if FLASH0_FEATURE_PFLASH_PROTECTION_REGION_COUNT > FLASH1_FEATURE_PFLASH_PROTECTION_REGION_COUNT |
||||||
|
#define MAX_FLASH_PROT_REGION_COUNT FLASH0_FEATURE_PFLASH_PROTECTION_REGION_COUNT |
||||||
|
#else |
||||||
|
#define MAX_FLASH_PROT_REGION_COUNT FLASH1_FEATURE_PFLASH_PROTECTION_REGION_COUNT |
||||||
|
#endif |
||||||
|
|
||||||
|
/*@}*/ |
||||||
|
|
||||||
|
#endif /* FSL_FTFX_ADAPTER_H */ |
||||||
@ -0,0 +1,549 @@ |
|||||||
|
/*
|
||||||
|
* Copyright 2013-2016 Freescale Semiconductor, Inc. |
||||||
|
* Copyright 2016-2020 NXP |
||||||
|
* All rights reserved. |
||||||
|
* |
||||||
|
* SPDX-License-Identifier: BSD-3-Clause |
||||||
|
* |
||||||
|
*/ |
||||||
|
|
||||||
|
#include "fsl_ftfx_cache.h" |
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Definitions |
||||||
|
******************************************************************************/ |
||||||
|
|
||||||
|
/* Component ID definition, used by tools. */ |
||||||
|
#ifndef FSL_COMPONENT_ID |
||||||
|
#define FSL_COMPONENT_ID "platform.drivers.flash" |
||||||
|
#endif |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @name Flash cache and speculation control defines |
||||||
|
* @{ |
||||||
|
*/ |
||||||
|
#if defined(MCM_PLACR_CFCC_MASK) |
||||||
|
#define FLASH_CACHE_IS_CONTROLLED_BY_MCM (1u) |
||||||
|
#else |
||||||
|
#define FLASH_CACHE_IS_CONTROLLED_BY_MCM (0u) |
||||||
|
#endif |
||||||
|
|
||||||
|
#define FLASH_CACHE_IS_CONTROLLED_BY_MSCM (0u) |
||||||
|
|
||||||
|
#if defined(FMC_PFB0CR_CINV_WAY_MASK) || defined(FMC_PFB01CR_CINV_WAY_MASK) |
||||||
|
#define FLASH_CACHE_IS_CONTROLLED_BY_FMC (1u) |
||||||
|
#else |
||||||
|
#define FLASH_CACHE_IS_CONTROLLED_BY_FMC (0u) |
||||||
|
#endif |
||||||
|
|
||||||
|
#if defined(MCM_PLACR_DFCS_MASK) |
||||||
|
#define FLASH_PREFETCH_SPECULATION_IS_CONTROLLED_BY_MCM (1u) |
||||||
|
#else |
||||||
|
#define FLASH_PREFETCH_SPECULATION_IS_CONTROLLED_BY_MCM (0u) |
||||||
|
#endif |
||||||
|
|
||||||
|
#if defined(MSCM_OCMDR_OCMC1_MASK) || defined(MSCM_OCMDR_OCM1_MASK) || defined(MSCM_OCMDR0_OCM1_MASK) || \ |
||||||
|
defined(MSCM_OCMDR1_OCM1_MASK) |
||||||
|
#define FLASH_PREFETCH_SPECULATION_IS_CONTROLLED_BY_MSCM (1u) |
||||||
|
#else |
||||||
|
#define FLASH_PREFETCH_SPECULATION_IS_CONTROLLED_BY_MSCM (0u) |
||||||
|
#endif |
||||||
|
|
||||||
|
#if defined(FMC_PFB0CR_S_INV_MASK) || defined(FMC_PFB0CR_S_B_INV_MASK) || defined(FMC_PFB01CR_S_INV_MASK) || \ |
||||||
|
defined(FMC_PFB01CR_S_B_INV_MASK) |
||||||
|
#define FLASH_PREFETCH_SPECULATION_IS_CONTROLLED_BY_FMC (1u) |
||||||
|
#else |
||||||
|
#define FLASH_PREFETCH_SPECULATION_IS_CONTROLLED_BY_FMC (0u) |
||||||
|
#endif |
||||||
|
|
||||||
|
#if FLASH_PREFETCH_SPECULATION_IS_CONTROLLED_BY_MSCM || FLASH_PREFETCH_SPECULATION_IS_CONTROLLED_BY_FMC || \ |
||||||
|
FLASH_CACHE_IS_CONTROLLED_BY_MCM || FLASH_CACHE_IS_CONTROLLED_BY_FMC || FLASH_CACHE_IS_CONTROLLED_BY_MSCM |
||||||
|
#define FLASH_IS_CACHE_INVALIDATION_AVAILABLE (1) |
||||||
|
#else |
||||||
|
#define FLASH_IS_CACHE_INVALIDATION_AVAILABLE (0u) |
||||||
|
#endif |
||||||
|
/*@}*/ |
||||||
|
|
||||||
|
/*! @brief A function pointer used to point to relocated ftfx_common_bit_operation() */ |
||||||
|
typedef void (*callftfxCommonBitOperation_t)(FTFx_REG32_ACCESS_TYPE base, |
||||||
|
uint32_t bitMask, |
||||||
|
uint32_t bitShift, |
||||||
|
uint32_t bitValue); |
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Prototypes |
||||||
|
******************************************************************************/ |
||||||
|
|
||||||
|
#if FLASH_CACHE_IS_CONTROLLED_BY_MCM |
||||||
|
/*! @brief Performs the cache clear to the flash by MCM.*/ |
||||||
|
void mcm_flash_cache_clear(ftfx_cache_config_t *config); |
||||||
|
#endif /* FLASH_CACHE_IS_CONTROLLED_BY_MCM */ |
||||||
|
|
||||||
|
#if FLASH_CACHE_IS_CONTROLLED_BY_MSCM |
||||||
|
/*! @brief Performs the cache clear to the flash by MSCM.*/ |
||||||
|
void mscm_flash_cache_clear(ftfx_cache_config_t *config); |
||||||
|
#endif /* FLASH_CACHE_IS_CONTROLLED_BY_MSCM */ |
||||||
|
|
||||||
|
#if FLASH_CACHE_IS_CONTROLLED_BY_FMC |
||||||
|
/*! @brief Performs the cache clear to the flash by FMC.*/ |
||||||
|
void fmc_flash_cache_clear(ftfx_cache_config_t *config); |
||||||
|
#endif /* FLASH_CACHE_IS_CONTROLLED_BY_FMC */ |
||||||
|
|
||||||
|
#if FLASH_PREFETCH_SPECULATION_IS_CONTROLLED_BY_MSCM |
||||||
|
/*! @brief Sets the prefetch speculation buffer to the flash by MSCM.*/ |
||||||
|
void mscm_flash_prefetch_speculation_enable(ftfx_cache_config_t *config, bool enable); |
||||||
|
#endif /* FLASH_PREFETCH_SPECULATION_IS_CONTROLLED_BY_MSCM */ |
||||||
|
|
||||||
|
#if FLASH_PREFETCH_SPECULATION_IS_CONTROLLED_BY_FMC |
||||||
|
/*! @brief Performs the prefetch speculation buffer clear to the flash by FMC.*/ |
||||||
|
void fmc_flash_prefetch_speculation_clear(ftfx_cache_config_t *config); |
||||||
|
#endif /* FLASH_PREFETCH_SPECULATION_IS_CONTROLLED_BY_FMC */ |
||||||
|
|
||||||
|
#if FTFx_DRIVER_IS_FLASH_RESIDENT |
||||||
|
static void ftfx_common_bit_operation_command_sequence( |
||||||
|
ftfx_cache_config_t *config, FTFx_REG32_ACCESS_TYPE base, uint32_t bitMask, uint32_t bitShift, uint32_t bitValue); |
||||||
|
#endif /* FTFx_DRIVER_IS_FLASH_RESIDENT */ |
||||||
|
|
||||||
|
#if FTFx_DRIVER_IS_FLASH_RESIDENT && FLASH_IS_CACHE_INVALIDATION_AVAILABLE |
||||||
|
/*! @brief Copy flash_cache_clear_command() to RAM*/ |
||||||
|
static void ftfx_copy_common_bit_operation_to_ram(uint32_t *ftfxCommonBitOperation); |
||||||
|
#endif /* FTFx_DRIVER_IS_FLASH_RESIDENT */ |
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Variables |
||||||
|
******************************************************************************/ |
||||||
|
|
||||||
|
#if FTFx_DRIVER_IS_FLASH_RESIDENT && FLASH_IS_CACHE_INVALIDATION_AVAILABLE |
||||||
|
/*!
|
||||||
|
* @brief Position independent code of ftfx_common_bit_operation() |
||||||
|
* |
||||||
|
* Note1: The prototype of C function is shown as below: |
||||||
|
* @code |
||||||
|
* void ftfx_common_bit_operation(FTFx_REG32_ACCESS_TYPE base, uint32_t bitMask, uint32_t bitShift, uint32_t |
||||||
|
* bitValue) |
||||||
|
* { |
||||||
|
* if (bitMask) |
||||||
|
* { |
||||||
|
* uint32_t value = (((uint32_t)(((uint32_t)(bitValue)) << bitShift)) & bitMask); |
||||||
|
* *base = (*base & (~bitMask)) | value; |
||||||
|
* } |
||||||
|
* |
||||||
|
* __ISB(); |
||||||
|
* __DSB(); |
||||||
|
* } |
||||||
|
* @endcode |
||||||
|
* Note2: The binary code is generated by IAR 7.70.1 |
||||||
|
*/ |
||||||
|
static const uint32_t s_ftfxCommonBitOperationFunctionCode[] = { |
||||||
|
0x2900b510u, 0x6804d005u, 0x4093438cu, 0x43214019u, 0xf3bf6001u, 0xf3bf8f6fu, 0xbd108f4fu, |
||||||
|
}; |
||||||
|
|
||||||
|
#if (!FTFx_DRIVER_IS_EXPORTED) |
||||||
|
/*! @brief A static buffer used to hold ftfx_common_bit_operation() */ |
||||||
|
static uint32_t s_ftfxCommonBitOperation[kFTFx_CACHE_RamFuncMaxSizeInWords]; |
||||||
|
#endif /* (!FTFx_DRIVER_IS_EXPORTED) */ |
||||||
|
#endif /* FLASH_IS_CACHE_INVALIDATION_AVAILABLE && FTFx_DRIVER_IS_FLASH_RESIDENT */ |
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Code |
||||||
|
******************************************************************************/ |
||||||
|
|
||||||
|
status_t FTFx_CACHE_Init(ftfx_cache_config_t *config) |
||||||
|
{ |
||||||
|
if (config == NULL) |
||||||
|
{ |
||||||
|
return kStatus_FTFx_InvalidArgument; |
||||||
|
} |
||||||
|
|
||||||
|
/* copy required flash commands to RAM */ |
||||||
|
#if FTFx_DRIVER_IS_FLASH_RESIDENT && FLASH_IS_CACHE_INVALIDATION_AVAILABLE |
||||||
|
if (NULL == config->bitOperFuncAddr.callFlashCommand) |
||||||
|
{ |
||||||
|
#if FTFx_DRIVER_IS_EXPORTED |
||||||
|
return kStatus_FTFx_ExecuteInRamFunctionNotReady; |
||||||
|
#else |
||||||
|
config->bitOperFuncAddr.commadAddr = (uint32_t)s_ftfxCommonBitOperation; |
||||||
|
#endif /* FTFx_DRIVER_IS_EXPORTED */ |
||||||
|
} |
||||||
|
|
||||||
|
ftfx_copy_common_bit_operation_to_ram((uint32_t *)config->bitOperFuncAddr.commadAddr); |
||||||
|
#endif /* FLASH_IS_CACHE_INVALIDATION_AVAILABLE && FTFx_DRIVER_IS_FLASH_RESIDENT */ |
||||||
|
|
||||||
|
return kStatus_FTFx_Success; |
||||||
|
} |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Flash Cache/Prefetch/Speculation Clear Process |
||||||
|
* |
||||||
|
* This function is used to perform the cache and prefetch speculation clear process to the flash. |
||||||
|
*/ |
||||||
|
status_t FTFx_CACHE_ClearCachePrefetchSpeculation(ftfx_cache_config_t *config, bool isPreProcess) |
||||||
|
{ |
||||||
|
/* We pass the ftfx register address as a parameter to ftfx_common_bit_operation() instead of using
|
||||||
|
* pre-processed MACROs or a global variable in ftfx_common_bit_operation() |
||||||
|
* to make sure that ftfx_common_bit_operation() will be compiled into position-independent code (PIC). */ |
||||||
|
if (!isPreProcess) |
||||||
|
{ |
||||||
|
#if FLASH_CACHE_IS_CONTROLLED_BY_MCM |
||||||
|
mcm_flash_cache_clear(config); |
||||||
|
#endif |
||||||
|
#if FLASH_CACHE_IS_CONTROLLED_BY_MSCM |
||||||
|
mscm_flash_cache_clear(config); |
||||||
|
#endif |
||||||
|
#if FLASH_CACHE_IS_CONTROLLED_BY_FMC |
||||||
|
fmc_flash_cache_clear(config); |
||||||
|
#endif |
||||||
|
#if FLASH_PREFETCH_SPECULATION_IS_CONTROLLED_BY_MSCM |
||||||
|
mscm_flash_prefetch_speculation_enable(config, true); |
||||||
|
#endif |
||||||
|
#if FLASH_PREFETCH_SPECULATION_IS_CONTROLLED_BY_FMC |
||||||
|
fmc_flash_prefetch_speculation_clear(config); |
||||||
|
#endif |
||||||
|
} |
||||||
|
if (isPreProcess) |
||||||
|
{ |
||||||
|
#if FLASH_PREFETCH_SPECULATION_IS_CONTROLLED_BY_MSCM |
||||||
|
mscm_flash_prefetch_speculation_enable(config, false); |
||||||
|
#endif |
||||||
|
} |
||||||
|
|
||||||
|
return kStatus_FTFx_Success; |
||||||
|
} |
||||||
|
|
||||||
|
status_t FTFx_CACHE_PflashSetPrefetchSpeculation(ftfx_prefetch_speculation_status_t *speculationStatus) |
||||||
|
{ |
||||||
|
#if FLASH_PREFETCH_SPECULATION_IS_CONTROLLED_BY_MCM |
||||||
|
{ |
||||||
|
if (true == speculationStatus->instructionOff) |
||||||
|
{ |
||||||
|
if (false == speculationStatus->dataOff) |
||||||
|
{ |
||||||
|
return kStatus_FTFx_InvalidSpeculationOption; |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
MCM0_CACHE_REG |= MCM_PLACR_DFCS_MASK; |
||||||
|
} |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
MCM0_CACHE_REG &= ~MCM_PLACR_DFCS_MASK; |
||||||
|
if (false == speculationStatus->dataOff) |
||||||
|
{ |
||||||
|
MCM0_CACHE_REG |= MCM_PLACR_EFDS_MASK; |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
MCM0_CACHE_REG &= ~MCM_PLACR_EFDS_MASK; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
#elif FLASH_PREFETCH_SPECULATION_IS_CONTROLLED_BY_FMC |
||||||
|
{ |
||||||
|
if (false == speculationStatus->instructionOff) |
||||||
|
{ |
||||||
|
FMC_CACHE_REG |= FMC_CACHE_B0IPE_MASK; |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
FMC_CACHE_REG &= ~FMC_CACHE_B0IPE_MASK; |
||||||
|
} |
||||||
|
if (false == speculationStatus->dataOff) |
||||||
|
{ |
||||||
|
FMC_CACHE_REG |= FMC_CACHE_B0DPE_MASK; |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
FMC_CACHE_REG &= ~FMC_CACHE_B0DPE_MASK; |
||||||
|
} |
||||||
|
|
||||||
|
/* Invalidate Prefetch Speculation Buffer */ |
||||||
|
FMC_SPECULATION_INVALIDATE_REG |= FMC_SPECULATION_INVALIDATE_MASK; |
||||||
|
} |
||||||
|
#elif FLASH_PREFETCH_SPECULATION_IS_CONTROLLED_BY_MSCM |
||||||
|
{ |
||||||
|
if (true == speculationStatus->instructionOff) |
||||||
|
{ |
||||||
|
if (false == speculationStatus->dataOff) |
||||||
|
{ |
||||||
|
return kStatus_FTFx_InvalidSpeculationOption; |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
MSCM_OCMDR0_REG |= MSCM_OCMDR_OCMC1_DFCS_MASK; |
||||||
|
} |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
MSCM_OCMDR0_REG &= ~MSCM_OCMDR_OCMC1_DFCS_MASK; |
||||||
|
if (false == speculationStatus->dataOff) |
||||||
|
{ |
||||||
|
MSCM_OCMDR0_REG &= ~MSCM_OCMDR_OCMC1_DFDS_MASK; |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
MSCM_OCMDR0_REG |= MSCM_OCMDR_OCMC1_DFDS_MASK; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
#endif /* FSL_FEATURE_FTFx_MCM_FLASH_CACHE_CONTROLS */ |
||||||
|
|
||||||
|
return kStatus_FTFx_Success; |
||||||
|
} |
||||||
|
|
||||||
|
status_t FTFx_CACHE_PflashGetPrefetchSpeculation(ftfx_prefetch_speculation_status_t *speculationStatus) |
||||||
|
{ |
||||||
|
(void)memset(speculationStatus, 0, sizeof(ftfx_prefetch_speculation_status_t)); |
||||||
|
|
||||||
|
/* Assuming that all speculation options are enabled. */ |
||||||
|
speculationStatus->instructionOff = false; |
||||||
|
speculationStatus->dataOff = false; |
||||||
|
|
||||||
|
#if FLASH_PREFETCH_SPECULATION_IS_CONTROLLED_BY_MCM |
||||||
|
{ |
||||||
|
uint32_t value = MCM0_CACHE_REG; |
||||||
|
if (0U != (value & MCM_PLACR_DFCS_MASK)) |
||||||
|
{ |
||||||
|
/* Speculation buffer is off. */ |
||||||
|
speculationStatus->instructionOff = true; |
||||||
|
speculationStatus->dataOff = true; |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
/* Speculation buffer is on for instruction. */ |
||||||
|
if (0U == (value & MCM_PLACR_EFDS_MASK)) |
||||||
|
{ |
||||||
|
/* Speculation buffer is off for data. */ |
||||||
|
speculationStatus->dataOff = true; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
#elif FLASH_PREFETCH_SPECULATION_IS_CONTROLLED_BY_FMC |
||||||
|
{ |
||||||
|
uint32_t value = FMC_CACHE_REG; |
||||||
|
if (0U == (value & FMC_CACHE_B0DPE_MASK)) |
||||||
|
{ |
||||||
|
/* Do not prefetch in response to data references. */ |
||||||
|
speculationStatus->dataOff = true; |
||||||
|
} |
||||||
|
if (0U == (value & FMC_CACHE_B0IPE_MASK)) |
||||||
|
{ |
||||||
|
/* Do not prefetch in response to instruction fetches. */ |
||||||
|
speculationStatus->instructionOff = true; |
||||||
|
} |
||||||
|
} |
||||||
|
#elif FLASH_PREFETCH_SPECULATION_IS_CONTROLLED_BY_MSCM |
||||||
|
{ |
||||||
|
uint32_t value = MSCM_OCMDR0_REG; |
||||||
|
if (0U != (value & MSCM_OCMDR_OCMC1_DFCS_MASK)) |
||||||
|
{ |
||||||
|
/* Speculation buffer is off. */ |
||||||
|
speculationStatus->instructionOff = true; |
||||||
|
speculationStatus->dataOff = true; |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
/* Speculation buffer is on for instruction. */ |
||||||
|
if (0U != (value & MSCM_OCMDR_OCMC1_DFDS_MASK)) |
||||||
|
{ |
||||||
|
/* Speculation buffer is off for data. */ |
||||||
|
speculationStatus->dataOff = true; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
#endif |
||||||
|
|
||||||
|
return kStatus_FTFx_Success; |
||||||
|
} |
||||||
|
|
||||||
|
#if FTFx_DRIVER_IS_FLASH_RESIDENT && FLASH_IS_CACHE_INVALIDATION_AVAILABLE |
||||||
|
/*! @brief Copy PIC of ftfx_common_bit_operation() to RAM */ |
||||||
|
static void ftfx_copy_common_bit_operation_to_ram(uint32_t *ftfxCommonBitOperation) |
||||||
|
{ |
||||||
|
assert(sizeof(s_ftfxCommonBitOperationFunctionCode) <= ((uint32_t)kFTFx_CACHE_RamFuncMaxSizeInWords * 4U)); |
||||||
|
|
||||||
|
(void)memcpy(ftfxCommonBitOperation, s_ftfxCommonBitOperationFunctionCode, |
||||||
|
sizeof(s_ftfxCommonBitOperationFunctionCode)); |
||||||
|
} |
||||||
|
#endif /* FTFx_DRIVER_IS_FLASH_RESIDENT && FLASH_IS_CACHE_INVALIDATION_AVAILABLE */ |
||||||
|
|
||||||
|
#if FTFx_DRIVER_IS_FLASH_RESIDENT |
||||||
|
static void ftfx_common_bit_operation_command_sequence( |
||||||
|
ftfx_cache_config_t *config, FTFx_REG32_ACCESS_TYPE base, uint32_t bitMask, uint32_t bitShift, uint32_t bitValue) |
||||||
|
{ |
||||||
|
uint32_t *ftfxCommonBitOperationAddr; |
||||||
|
ftfxCommonBitOperationAddr = &config->bitOperFuncAddr.commadAddr; |
||||||
|
/* Since the value of ARM function pointer is always odd, but the real start
|
||||||
|
* address |
||||||
|
* of function memory should be even, that's why +1 operation exist. */ |
||||||
|
*ftfxCommonBitOperationAddr += 1UL; |
||||||
|
callftfxCommonBitOperation_t ftfxCommonBitOperationCommand = config->bitOperFuncAddr.callFlashCommand; |
||||||
|
/* Workround for some devices which doesn't need this function */ |
||||||
|
ftfxCommonBitOperationCommand((FTFx_REG32_ACCESS_TYPE)base, bitMask, bitShift, bitValue); |
||||||
|
*ftfxCommonBitOperationAddr -= 1UL; |
||||||
|
} |
||||||
|
#endif /*FTFx_DRIVER_IS_FLASH_RESIDENT*/ |
||||||
|
|
||||||
|
#if FLASH_CACHE_IS_CONTROLLED_BY_MCM |
||||||
|
/*! @brief Performs the cache clear to the flash by MCM.*/ |
||||||
|
void mcm_flash_cache_clear(ftfx_cache_config_t *config) |
||||||
|
{ |
||||||
|
FTFx_REG32_ACCESS_TYPE regBase; |
||||||
|
|
||||||
|
#if defined(MCM0_CACHE_REG) |
||||||
|
regBase = (FTFx_REG32_ACCESS_TYPE)&MCM0_CACHE_REG; |
||||||
|
#elif defined(MCM1_CACHE_REG) |
||||||
|
regBase = (FTFx_REG32_ACCESS_TYPE)&MCM1_CACHE_REG; |
||||||
|
#endif |
||||||
|
|
||||||
|
#if FTFx_DRIVER_IS_FLASH_RESIDENT |
||||||
|
/* calling flash command sequence function to execute the command */ |
||||||
|
ftfx_common_bit_operation_command_sequence(config, regBase, MCM_CACHE_CLEAR_MASK, MCM_CACHE_CLEAR_SHIFT, 1UL); |
||||||
|
|
||||||
|
#else /* !FTFx_DRIVER_IS_FLASH_RESIDENT */ |
||||||
|
*regBase |= MCM_CACHE_CLEAR_MASK; |
||||||
|
|
||||||
|
/* Memory barriers for good measure.
|
||||||
|
* All Cache, Branch predictor and TLB maintenance operations before this instruction complete */ |
||||||
|
__ISB(); |
||||||
|
__DSB(); |
||||||
|
#endif /* FTFx_DRIVER_IS_FLASH_RESIDENT */ |
||||||
|
} |
||||||
|
#endif /* FLASH_CACHE_IS_CONTROLLED_BY_MCM */ |
||||||
|
|
||||||
|
#if FLASH_CACHE_IS_CONTROLLED_BY_MSCM |
||||||
|
/*! @brief Performs the cache clear to the flash by MSCM.*/ |
||||||
|
void mscm_flash_cache_clear(ftfx_cache_config_t *config) |
||||||
|
{ |
||||||
|
uint8_t setValue = 0x1U; |
||||||
|
|
||||||
|
/* The OCMDR[0] is always used to cache main Pflash*/ |
||||||
|
/* For device with FlexNVM support, the OCMDR[1] is used to cache Dflash.
|
||||||
|
* For device with secondary flash support, the OCMDR[1] is used to cache secondary Pflash. */ |
||||||
|
#if FTFx_DRIVER_IS_FLASH_RESIDENT |
||||||
|
switch (config->flashMemoryIndex) |
||||||
|
{ |
||||||
|
case kFLASH_MemoryIndexSecondaryFlash: |
||||||
|
/* calling flash command sequence function to execute the command */ |
||||||
|
ftfx_common_bit_operation_command_sequence(config, (FTFx_REG32_ACCESS_TYPE)&MSCM_OCMDR1_REG, |
||||||
|
MSCM_CACHE_CLEAR_MASK, MSCM_CACHE_CLEAR_SHIFT, setValue); |
||||||
|
break; |
||||||
|
case kFLASH_MemoryIndexPrimaryFlash: |
||||||
|
default: |
||||||
|
/* calling flash command sequence function to execute the command */ |
||||||
|
ftfx_common_bit_operation_command_sequence(config, (FTFx_REG32_ACCESS_TYPE)&MSCM_OCMDR0_REG, |
||||||
|
MSCM_CACHE_CLEAR_MASK, MSCM_CACHE_CLEAR_SHIFT, setValue); |
||||||
|
break; |
||||||
|
} |
||||||
|
#else /* !FTFx_DRIVER_IS_FLASH_RESIDENT */ |
||||||
|
switch (config->flashMemoryIndex) |
||||||
|
{ |
||||||
|
case kFLASH_MemoryIndexSecondaryFlash: |
||||||
|
MSCM_OCMDR1_REG = (MSCM_OCMDR1_REG & (~MSCM_CACHE_CLEAR_MASK)) | MSCM_CACHE_CLEAR(setValue); |
||||||
|
/* Each cache clear instruction should be followed by below code*/ |
||||||
|
__ISB(); |
||||||
|
__DSB(); |
||||||
|
break; |
||||||
|
case kFLASH_MemoryIndexPrimaryFlash: |
||||||
|
default: |
||||||
|
MSCM_OCMDR0_REG = (MSCM_OCMDR0_REG & (~MSCM_CACHE_CLEAR_MASK)) | MSCM_CACHE_CLEAR(setValue); |
||||||
|
/* Memory barriers for good measure.
|
||||||
|
* All Cache, Branch predictor and TLB maintenance operations before this instruction complete */ |
||||||
|
__ISB(); |
||||||
|
__DSB(); |
||||||
|
break; |
||||||
|
} |
||||||
|
#endif /* FTFx_DRIVER_IS_FLASH_RESIDENT */ |
||||||
|
} |
||||||
|
#endif /* FLASH_CACHE_IS_CONTROLLED_BY_MSCM */ |
||||||
|
|
||||||
|
#if FLASH_CACHE_IS_CONTROLLED_BY_FMC |
||||||
|
/*! @brief Performs the cache clear to the flash by FMC.*/ |
||||||
|
void fmc_flash_cache_clear(ftfx_cache_config_t *config) |
||||||
|
{ |
||||||
|
#if FTFx_DRIVER_IS_FLASH_RESIDENT |
||||||
|
/* calling flash command sequence function to execute the command */ |
||||||
|
ftfx_common_bit_operation_command_sequence(config, (FTFx_REG32_ACCESS_TYPE)&FMC_CACHE_REG, FMC_CACHE_CLEAR_MASK, |
||||||
|
FMC_CACHE_CLEAR_SHIFT, 0xFUL); |
||||||
|
#else /* !FTFx_DRIVER_IS_FLASH_RESIDENT */ |
||||||
|
FMC_CACHE_REG = (FMC_CACHE_REG & (~FMC_CACHE_CLEAR_MASK)) | FMC_CACHE_CLEAR(~0); |
||||||
|
/* Memory barriers for good measure.
|
||||||
|
* All Cache, Branch predictor and TLB maintenance operations before this instruction complete */ |
||||||
|
__ISB(); |
||||||
|
__DSB(); |
||||||
|
#endif /* FTFx_DRIVER_IS_FLASH_RESIDENT */ |
||||||
|
} |
||||||
|
#endif /* FLASH_CACHE_IS_CONTROLLED_BY_FMC */ |
||||||
|
|
||||||
|
#if FLASH_PREFETCH_SPECULATION_IS_CONTROLLED_BY_MSCM |
||||||
|
/*! @brief Performs the prefetch speculation buffer clear to the flash by MSCM.*/ |
||||||
|
void mscm_flash_prefetch_speculation_enable(ftfx_cache_config_t *config, bool enable) |
||||||
|
{ |
||||||
|
uint8_t setValue; |
||||||
|
if (enable) |
||||||
|
{ |
||||||
|
setValue = 0x0U; |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
setValue = 0x3U; |
||||||
|
} |
||||||
|
|
||||||
|
/* The OCMDR[0] is always used to prefetch main Pflash*/ |
||||||
|
/* For device with FlexNVM support, the OCMDR[1] is used to prefetch Dflash.
|
||||||
|
* For device with secondary flash support, the OCMDR[1] is used to prefetch secondary Pflash. */ |
||||||
|
#if FTFx_DRIVER_IS_FLASH_RESIDENT |
||||||
|
|
||||||
|
switch (config->flashMemoryIndex) |
||||||
|
{ |
||||||
|
case 1: |
||||||
|
/* calling flash command sequence function to execute the command */ |
||||||
|
ftfx_common_bit_operation_command_sequence(config, (FTFx_REG32_ACCESS_TYPE)&MSCM_OCMDR1_REG, |
||||||
|
MSCM_SPECULATION_SET_MASK, MSCM_SPECULATION_SET_SHIFT, setValue); |
||||||
|
break; |
||||||
|
case 0: |
||||||
|
default: |
||||||
|
/* calling flash command sequence function to execute the command */ |
||||||
|
ftfx_common_bit_operation_command_sequence(config, (FTFx_REG32_ACCESS_TYPE)&MSCM_OCMDR0_REG, |
||||||
|
MSCM_SPECULATION_SET_MASK, MSCM_SPECULATION_SET_SHIFT, setValue); |
||||||
|
break; |
||||||
|
} |
||||||
|
#else /* !FTFx_DRIVER_IS_FLASH_RESIDENT */ |
||||||
|
switch (config->flashMemoryIndex) |
||||||
|
{ |
||||||
|
case kFLASH_MemoryIndexSecondaryFlash: |
||||||
|
MSCM_OCMDR1_REG = (MSCM_OCMDR1_REG & (~MSCM_SPECULATION_SET_MASK)) | MSCM_SPECULATION_SET(setValue); |
||||||
|
/* Each cache clear instruction should be followed by below code*/ |
||||||
|
__ISB(); |
||||||
|
__DSB(); |
||||||
|
break; |
||||||
|
case kFLASH_MemoryIndexPrimaryFlash: |
||||||
|
default: |
||||||
|
MSCM_OCMDR0_REG = (MSCM_OCMDR0_REG & (~MSCM_SPECULATION_SET_MASK)) | MSCM_SPECULATION_SET(setValue); |
||||||
|
/* Memory barriers for good measure.
|
||||||
|
* All Cache, Branch predictor and TLB maintenance operations before this instruction complete */ |
||||||
|
__ISB(); |
||||||
|
__DSB(); |
||||||
|
break; |
||||||
|
} |
||||||
|
#endif /* FTFx_DRIVER_IS_FLASH_RESIDENT */ |
||||||
|
} |
||||||
|
#endif /* FLASH_PREFETCH_SPECULATION_IS_CONTROLLED_BY_MSCM */ |
||||||
|
|
||||||
|
#if FLASH_PREFETCH_SPECULATION_IS_CONTROLLED_BY_FMC |
||||||
|
/*! @brief Performs the prefetch speculation buffer clear to the flash by FMC.*/ |
||||||
|
void fmc_flash_prefetch_speculation_clear(ftfx_cache_config_t *config) |
||||||
|
{ |
||||||
|
#if FTFx_DRIVER_IS_FLASH_RESIDENT |
||||||
|
/* calling flash command sequence function to execute the command */ |
||||||
|
ftfx_common_bit_operation_command_sequence(config, (FTFx_REG32_ACCESS_TYPE)&FMC_SPECULATION_INVALIDATE_REG, |
||||||
|
FMC_SPECULATION_INVALIDATE_MASK, FMC_SPECULATION_INVALIDATE_SHIFT, 1UL); |
||||||
|
#else /* !FTFx_DRIVER_IS_FLASH_RESIDENT */ |
||||||
|
FMC_SPECULATION_INVALIDATE_REG |= FMC_SPECULATION_INVALIDATE_MASK; |
||||||
|
/* Memory barriers for good measure.
|
||||||
|
* All Cache, Branch predictor and TLB maintenance operations before this instruction complete */ |
||||||
|
__ISB(); |
||||||
|
__DSB(); |
||||||
|
#endif /* FTFx_DRIVER_IS_FLASH_RESIDENT */ |
||||||
|
} |
||||||
|
#endif /* FLASH_PREFETCH_SPECULATION_IS_CONTROLLED_BY_FMC */ |
||||||
@ -0,0 +1,113 @@ |
|||||||
|
/*
|
||||||
|
* Copyright 2013-2016 Freescale Semiconductor, Inc. |
||||||
|
* Copyright 2016-2020 NXP |
||||||
|
* All rights reserved. |
||||||
|
* |
||||||
|
* SPDX-License-Identifier: BSD-3-Clause |
||||||
|
* |
||||||
|
*/ |
||||||
|
|
||||||
|
#ifndef FSL_FTFX_CACHE_H |
||||||
|
#define FSL_FTFX_CACHE_H |
||||||
|
|
||||||
|
#include "fsl_ftfx_controller.h" |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @addtogroup ftfx_cache_driver |
||||||
|
* @{ |
||||||
|
*/ |
||||||
|
/*******************************************************************************
|
||||||
|
* Definitions |
||||||
|
******************************************************************************/ |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief FTFx prefetch speculation status. |
||||||
|
*/ |
||||||
|
typedef struct _flash_prefetch_speculation_status |
||||||
|
{ |
||||||
|
bool instructionOff; /*!< Instruction speculation.*/ |
||||||
|
bool dataOff; /*!< Data speculation.*/ |
||||||
|
} ftfx_prefetch_speculation_status_t; |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Constants for execute-in-RAM flash function. |
||||||
|
*/ |
||||||
|
enum _ftfx_cache_ram_func_constants |
||||||
|
{ |
||||||
|
kFTFx_CACHE_RamFuncMaxSizeInWords = 16U, /*!< The maximum size of execute-in-RAM function.*/ |
||||||
|
}; |
||||||
|
|
||||||
|
typedef union |
||||||
|
{ |
||||||
|
uint32_t commadAddr; |
||||||
|
void (*callFlashCommand)(FTFx_REG32_ACCESS_TYPE base, uint32_t bitMask, uint32_t bitShift, uint32_t bitValue); |
||||||
|
} function_bit_operation_ptr_t; |
||||||
|
|
||||||
|
/*! @brief FTFx cache driver state information.
|
||||||
|
* |
||||||
|
* An instance of this structure is allocated by the user of the flash driver and |
||||||
|
* passed into each of the driver APIs. |
||||||
|
*/ |
||||||
|
typedef struct _ftfx_cache_config |
||||||
|
{ |
||||||
|
uint8_t flashMemoryIndex; /*!< 0 - primary flash; 1 - secondary flash*/ |
||||||
|
uint8_t reserved[3]; |
||||||
|
function_bit_operation_ptr_t bitOperFuncAddr; /*!< An buffer point to the flash execute-in-RAM function. */ |
||||||
|
} ftfx_cache_config_t; |
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* API |
||||||
|
******************************************************************************/ |
||||||
|
|
||||||
|
#if defined(__cplusplus) |
||||||
|
extern "C" { |
||||||
|
#endif |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Initializes the global FTFx cache structure members. |
||||||
|
* |
||||||
|
* This function checks and initializes the Flash module for the other FTFx cache APIs. |
||||||
|
* |
||||||
|
* @param config Pointer to the storage for the driver runtime state. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_Success API was executed successfully. |
||||||
|
* @retval #kStatus_FTFx_InvalidArgument An invalid argument is provided. |
||||||
|
* @retval #kStatus_FTFx_ExecuteInRamFunctionNotReady Execute-in-RAM function is not available. |
||||||
|
*/ |
||||||
|
status_t FTFx_CACHE_Init(ftfx_cache_config_t *config); |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Process the cache/prefetch/speculation to the flash. |
||||||
|
* |
||||||
|
* @param config A pointer to the storage for the driver runtime state. |
||||||
|
* @param isPreProcess The possible option used to control flash cache/prefetch/speculation |
||||||
|
* @retval #kStatus_FTFx_Success API was executed successfully. |
||||||
|
* @retval #kStatus_FTFx_InvalidArgument Invalid argument is provided. |
||||||
|
* @retval #kStatus_FTFx_ExecuteInRamFunctionNotReady Execute-in-RAM function is not available. |
||||||
|
*/ |
||||||
|
status_t FTFx_CACHE_ClearCachePrefetchSpeculation(ftfx_cache_config_t *config, bool isPreProcess); |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Sets the PFlash prefetch speculation to the intended speculation status. |
||||||
|
* |
||||||
|
* @param speculationStatus The expected protect status to set to the PFlash protection register. Each bit is |
||||||
|
* @retval #kStatus_FTFx_Success API was executed successfully. |
||||||
|
* @retval #kStatus_FTFx_InvalidSpeculationOption An invalid speculation option argument is provided. |
||||||
|
*/ |
||||||
|
status_t FTFx_CACHE_PflashSetPrefetchSpeculation(ftfx_prefetch_speculation_status_t *speculationStatus); |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Gets the PFlash prefetch speculation status. |
||||||
|
* |
||||||
|
* @param speculationStatus Speculation status returned by the PFlash IP. |
||||||
|
* @retval #kStatus_FTFx_Success API was executed successfully. |
||||||
|
*/ |
||||||
|
status_t FTFx_CACHE_PflashGetPrefetchSpeculation(ftfx_prefetch_speculation_status_t *speculationStatus); |
||||||
|
|
||||||
|
#if defined(__cplusplus) |
||||||
|
} |
||||||
|
#endif |
||||||
|
|
||||||
|
/*! @}*/ |
||||||
|
|
||||||
|
#endif /* FSL_FTFX_CACHE_H */ |
||||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,846 @@ |
|||||||
|
/*
|
||||||
|
* Copyright 2013-2016 Freescale Semiconductor, Inc. |
||||||
|
* Copyright 2016-2020 NXP |
||||||
|
* All rights reserved. |
||||||
|
* |
||||||
|
* SPDX-License-Identifier: BSD-3-Clause |
||||||
|
* |
||||||
|
*/ |
||||||
|
|
||||||
|
#ifndef FSL_FTFX_CONTROLLER_H |
||||||
|
#define FSL_FTFX_CONTROLLER_H |
||||||
|
|
||||||
|
#include "fsl_ftfx_features.h" |
||||||
|
#include "fsl_ftfx_utilities.h" |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @addtogroup ftfx_controller |
||||||
|
* @{ |
||||||
|
*/ |
||||||
|
/*******************************************************************************
|
||||||
|
* Definitions |
||||||
|
******************************************************************************/ |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @name FTFx status |
||||||
|
* @{ |
||||||
|
*/ |
||||||
|
/*! @brief FTFx driver status group. */ |
||||||
|
#if defined(kStatusGroup_FlashDriver) |
||||||
|
#define kStatusGroupGeneric kStatusGroup_Generic |
||||||
|
#define kStatusGroupFtfxDriver kStatusGroup_FlashDriver |
||||||
|
#elif defined(kStatusGroup_FLASH) |
||||||
|
#define kStatusGroupGeneric kStatusGroup_Generic |
||||||
|
#define kStatusGroupFtfxDriver kStatusGroup_FLASH |
||||||
|
#else |
||||||
|
#define kStatusGroupGeneric 0 |
||||||
|
#define kStatusGroupFtfxDriver 1 |
||||||
|
#endif |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief FTFx driver status codes. |
||||||
|
*/ |
||||||
|
enum |
||||||
|
{ |
||||||
|
kStatus_FTFx_Success = MAKE_STATUS(kStatusGroupGeneric, 0), /*!< API is executed successfully*/ |
||||||
|
kStatus_FTFx_InvalidArgument = MAKE_STATUS(kStatusGroupGeneric, 4), /*!< Invalid argument*/ |
||||||
|
kStatus_FTFx_SizeError = MAKE_STATUS(kStatusGroupFtfxDriver, 0), /*!< Error size*/ |
||||||
|
kStatus_FTFx_AlignmentError = |
||||||
|
MAKE_STATUS(kStatusGroupFtfxDriver, 1), /*!< Parameter is not aligned with the specified baseline*/ |
||||||
|
kStatus_FTFx_AddressError = MAKE_STATUS(kStatusGroupFtfxDriver, 2), /*!< Address is out of range */ |
||||||
|
kStatus_FTFx_AccessError = |
||||||
|
MAKE_STATUS(kStatusGroupFtfxDriver, 3), /*!< Invalid instruction codes and out-of bound addresses */ |
||||||
|
kStatus_FTFx_ProtectionViolation = MAKE_STATUS( |
||||||
|
kStatusGroupFtfxDriver, 4), /*!< The program/erase operation is requested to execute on protected areas */ |
||||||
|
kStatus_FTFx_CommandFailure = |
||||||
|
MAKE_STATUS(kStatusGroupFtfxDriver, 5), /*!< Run-time error during command execution. */ |
||||||
|
kStatus_FTFx_UnknownProperty = MAKE_STATUS(kStatusGroupFtfxDriver, 6), /*!< Unknown property.*/ |
||||||
|
kStatus_FTFx_EraseKeyError = MAKE_STATUS(kStatusGroupFtfxDriver, 7), /*!< API erase key is invalid.*/ |
||||||
|
kStatus_FTFx_RegionExecuteOnly = MAKE_STATUS(kStatusGroupFtfxDriver, 8), /*!< The current region is execute-only.*/ |
||||||
|
kStatus_FTFx_ExecuteInRamFunctionNotReady = |
||||||
|
MAKE_STATUS(kStatusGroupFtfxDriver, 9), /*!< Execute-in-RAM function is not available.*/ |
||||||
|
kStatus_FTFx_PartitionStatusUpdateFailure = |
||||||
|
MAKE_STATUS(kStatusGroupFtfxDriver, 10), /*!< Failed to update partition status.*/ |
||||||
|
kStatus_FTFx_SetFlexramAsEepromError = |
||||||
|
MAKE_STATUS(kStatusGroupFtfxDriver, 11), /*!< Failed to set FlexRAM as EEPROM.*/ |
||||||
|
kStatus_FTFx_RecoverFlexramAsRamError = |
||||||
|
MAKE_STATUS(kStatusGroupFtfxDriver, 12), /*!< Failed to recover FlexRAM as RAM.*/ |
||||||
|
kStatus_FTFx_SetFlexramAsRamError = MAKE_STATUS(kStatusGroupFtfxDriver, 13), /*!< Failed to set FlexRAM as RAM.*/ |
||||||
|
kStatus_FTFx_RecoverFlexramAsEepromError = |
||||||
|
MAKE_STATUS(kStatusGroupFtfxDriver, 14), /*!< Failed to recover FlexRAM as EEPROM.*/ |
||||||
|
kStatus_FTFx_CommandNotSupported = MAKE_STATUS(kStatusGroupFtfxDriver, 15), /*!< Flash API is not supported.*/ |
||||||
|
kStatus_FTFx_SwapSystemNotInUninitialized = |
||||||
|
MAKE_STATUS(kStatusGroupFtfxDriver, 16), /*!< Swap system is not in an uninitialzed state.*/ |
||||||
|
kStatus_FTFx_SwapIndicatorAddressError = |
||||||
|
MAKE_STATUS(kStatusGroupFtfxDriver, 17), /*!< The swap indicator address is invalid.*/ |
||||||
|
kStatus_FTFx_ReadOnlyProperty = MAKE_STATUS(kStatusGroupFtfxDriver, 18), /*!< The flash property is read-only.*/ |
||||||
|
kStatus_FTFx_InvalidPropertyValue = |
||||||
|
MAKE_STATUS(kStatusGroupFtfxDriver, 19), /*!< The flash property value is out of range.*/ |
||||||
|
kStatus_FTFx_InvalidSpeculationOption = |
||||||
|
MAKE_STATUS(kStatusGroupFtfxDriver, 20), /*!< The option of flash prefetch speculation is invalid.*/ |
||||||
|
kStatus_FTFx_CommandOperationInProgress = |
||||||
|
MAKE_STATUS(kStatusGroupFtfxDriver, 21), /*!< The option of flash command is processing.*/ |
||||||
|
}; |
||||||
|
/*@}*/ |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @name FTFx API key |
||||||
|
* @{ |
||||||
|
*/ |
||||||
|
/*!
|
||||||
|
* @brief Enumeration for FTFx driver API keys. |
||||||
|
* |
||||||
|
* @note The resulting value is built with a byte order such that the string |
||||||
|
* being readable in expected order when viewed in a hex editor, if the value |
||||||
|
* is treated as a 32-bit little endian value. |
||||||
|
*/ |
||||||
|
enum _ftfx_driver_api_keys |
||||||
|
{ |
||||||
|
kFTFx_ApiEraseKey = FOUR_CHAR_CODE('k', 'f', 'e', 'k') /*!< Key value used to validate all FTFx erase APIs.*/ |
||||||
|
}; |
||||||
|
/*@}*/ |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Enumeration for the FlexRAM load during reset option. |
||||||
|
*/ |
||||||
|
typedef enum _ftfx_partition_flexram_load_option |
||||||
|
{ |
||||||
|
kFTFx_PartitionFlexramLoadOptLoadedWithValidEepromData = |
||||||
|
0x00U, /*!< FlexRAM is loaded with valid EEPROM data during reset sequence.*/ |
||||||
|
kFTFx_PartitionFlexramLoadOptNotLoaded = 0x01U /*!< FlexRAM is not loaded during reset sequence.*/ |
||||||
|
} ftfx_partition_flexram_load_opt_t; |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Enumeration for the two possible options of flash read resource command. |
||||||
|
*/ |
||||||
|
typedef enum _ftfx_read_resource_opt |
||||||
|
{ |
||||||
|
kFTFx_ResourceOptionFlashIfr = |
||||||
|
0x00U, /*!< Select code for Program flash 0 IFR, Program flash swap 0 IFR, Data flash 0 IFR */ |
||||||
|
kFTFx_ResourceOptionVersionId = 0x01U /*!< Select code for the version ID*/ |
||||||
|
} ftfx_read_resource_opt_t; |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Enumeration for supported FTFx margin levels. |
||||||
|
*/ |
||||||
|
typedef enum _ftfx_margin_value |
||||||
|
{ |
||||||
|
kFTFx_MarginValueNormal, /*!< Use the 'normal' read level for 1s.*/ |
||||||
|
kFTFx_MarginValueUser, /*!< Apply the 'User' margin to the normal read-1 level.*/ |
||||||
|
kFTFx_MarginValueFactory, /*!< Apply the 'Factory' margin to the normal read-1 level.*/ |
||||||
|
kFTFx_MarginValueInvalid /*!< Not real margin level, Used to determine the range of valid margin level. */ |
||||||
|
} ftfx_margin_value_t; |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Enumeration for the three possible FTFx security states. |
||||||
|
*/ |
||||||
|
typedef enum _ftfx_security_state |
||||||
|
{ |
||||||
|
kFTFx_SecurityStateNotSecure = (int)0xc33cc33cu, /*!< Flash is not secure.*/ |
||||||
|
kFTFx_SecurityStateBackdoorEnabled = (int)0x5aa55aa5u, /*!< Flash backdoor is enabled.*/ |
||||||
|
kFTFx_SecurityStateBackdoorDisabled = (int)0x5ac33ca5u /*!< Flash backdoor is disabled.*/ |
||||||
|
} ftfx_security_state_t; |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Enumeration for the two possilbe options of set FlexRAM function command. |
||||||
|
*/ |
||||||
|
typedef enum _ftfx_flexram_function_option |
||||||
|
{ |
||||||
|
kFTFx_FlexramFuncOptAvailableAsRam = 0xFFU, /*!< An option used to make FlexRAM available as RAM */ |
||||||
|
kFTFx_FlexramFuncOptAvailableForEeprom = 0x00U /*!< An option used to make FlexRAM available for EEPROM */ |
||||||
|
} ftfx_flexram_func_opt_t; |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Enumeration for acceleration ram property. |
||||||
|
*/ |
||||||
|
enum _flash_acceleration_ram_property |
||||||
|
{ |
||||||
|
kFLASH_AccelerationRamSize = 0x400U |
||||||
|
}; |
||||||
|
|
||||||
|
#if defined(FSL_FEATURE_FLASH_HAS_SWAP_CONTROL_CMD) && FSL_FEATURE_FLASH_HAS_SWAP_CONTROL_CMD |
||||||
|
/*!
|
||||||
|
* @brief Enumeration for the possible options of Swap control commands |
||||||
|
*/ |
||||||
|
typedef enum _ftfx_swap_control_option |
||||||
|
{ |
||||||
|
kFTFx_SwapControlOptionIntializeSystem = 0x01U, /*!< An option used to initialize the Swap system */ |
||||||
|
kFTFx_SwapControlOptionSetInUpdateState = 0x02U, /*!< An option used to set the Swap in an update state */ |
||||||
|
kFTFx_SwapControlOptionSetInCompleteState = 0x04U, /*!< An option used to set the Swap in a complete state */ |
||||||
|
kFTFx_SwapControlOptionReportStatus = 0x08U, /*!< An option used to report the Swap status */ |
||||||
|
kFTFx_SwapControlOptionDisableSystem = 0x10U /*!< An option used to disable the Swap status */ |
||||||
|
} ftfx_swap_control_opt_t; |
||||||
|
#endif /* FSL_FEATURE_FLASH_HAS_SWAP_CONTROL_CMD */ |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Enumeration for the possible flash Swap status. |
||||||
|
*/ |
||||||
|
typedef enum _ftfx_swap_state |
||||||
|
{ |
||||||
|
kFTFx_SwapStateUninitialized = 0x00U, /*!< Flash Swap system is in an uninitialized state.*/ |
||||||
|
kFTFx_SwapStateReady = 0x01U, /*!< Flash Swap system is in a ready state.*/ |
||||||
|
kFTFx_SwapStateUpdate = 0x02U, /*!< Flash Swap system is in an update state.*/ |
||||||
|
kFTFx_SwapStateUpdateErased = 0x03U, /*!< Flash Swap system is in an updateErased state.*/ |
||||||
|
kFTFx_SwapStateComplete = 0x04U, /*!< Flash Swap system is in a complete state.*/ |
||||||
|
kFTFx_SwapStateDisabled = 0x05U /*!< Flash Swap system is in a disabled state.*/ |
||||||
|
} ftfx_swap_state_t; |
||||||
|
|
||||||
|
#if defined(FSL_FEATURE_FLASH_HAS_SWAP_CONTROL_CMD) && FSL_FEATURE_FLASH_HAS_SWAP_CONTROL_CMD |
||||||
|
/*!
|
||||||
|
* @brief Enumeration for the possible flash Swap block status |
||||||
|
*/ |
||||||
|
typedef enum _ftfx_swap_block_status |
||||||
|
{ |
||||||
|
kFTFx_SwapBlockStatusLowerHalfProgramBlocksAtZero = |
||||||
|
0x00U, /*!< Swap block status is that lower half program block at zero.*/ |
||||||
|
kFTFx_SwapBlockStatusUpperHalfProgramBlocksAtZero = |
||||||
|
0x01U, /*!< Swap block status is that upper half program block at zero.*/ |
||||||
|
} ftfx_swap_block_status_t; |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Flash Swap information |
||||||
|
*/ |
||||||
|
typedef struct _ftfx_swap_state_config |
||||||
|
{ |
||||||
|
ftfx_swap_state_t flashSwapState; /*!<The current Swap system status.*/ |
||||||
|
ftfx_swap_block_status_t currentSwapBlockStatus; /*!< The current Swap block status.*/ |
||||||
|
ftfx_swap_block_status_t nextSwapBlockStatus; /*!< The next Swap block status.*/ |
||||||
|
} ftfx_swap_state_config_t; |
||||||
|
#endif /* FSL_FEATURE_FLASH_HAS_SWAP_CONTROL_CMD */ |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Enumeration for FTFx memory type. |
||||||
|
*/ |
||||||
|
enum _ftfx_memory_type |
||||||
|
{ |
||||||
|
kFTFx_MemTypePflash = 0x00U, |
||||||
|
kFTFx_MemTypeFlexnvm = 0x01U |
||||||
|
}; |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief ftfx special memory access information. |
||||||
|
*/ |
||||||
|
typedef struct _ftfx_special_mem |
||||||
|
{ |
||||||
|
uint32_t base; /*!< Base address of flash special memory.*/ |
||||||
|
uint32_t size; /*!< size of flash special memory.*/ |
||||||
|
uint32_t count; /*!< flash special memory count.*/ |
||||||
|
} ftfx_spec_mem_t; |
||||||
|
|
||||||
|
#if defined(__CC_ARM) |
||||||
|
#pragma anon_unions |
||||||
|
#endif |
||||||
|
/*!
|
||||||
|
* @brief Flash memory descriptor. |
||||||
|
*/ |
||||||
|
typedef struct _ftfx_mem_descriptor |
||||||
|
{ |
||||||
|
struct |
||||||
|
{ |
||||||
|
uint8_t type; /*!< Type of flash block.*/ |
||||||
|
uint8_t index; /*!< Index of flash block.*/ |
||||||
|
uint8_t reserved[2]; |
||||||
|
}; |
||||||
|
struct |
||||||
|
{ |
||||||
|
uint32_t isIndBlock : 1; |
||||||
|
uint32_t hasIndPfsizeReg : 1; |
||||||
|
uint32_t hasProtControl : 1; |
||||||
|
uint32_t hasIndProtReg : 1; |
||||||
|
uint32_t hasXaccControl : 1; |
||||||
|
uint32_t hasIndXaccReg : 1; |
||||||
|
uint32_t : 18; |
||||||
|
uint32_t ProtRegBits : 8; |
||||||
|
} feature; |
||||||
|
uint32_t blockBase; /*!< A base address of the flash block */ |
||||||
|
#if defined(FSL_FEATURE_FLASH_HAS_FLEX_NVM_ALIAS) && FSL_FEATURE_FLASH_HAS_FLEX_NVM_ALIAS |
||||||
|
uint32_t aliasBlockBase; /*!< A base address of the alias flash block */ |
||||||
|
#endif |
||||||
|
uint32_t totalSize; /*!< The size of the flash block. */ |
||||||
|
uint32_t sectorSize; /*!< The size in bytes of a sector of flash. */ |
||||||
|
uint32_t blockCount; /*!< A number of flash blocks. */ |
||||||
|
ftfx_spec_mem_t accessSegmentMem; |
||||||
|
ftfx_spec_mem_t protectRegionMem; |
||||||
|
} ftfx_mem_desc_t; |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Active FTFx information for the current operation. |
||||||
|
*/ |
||||||
|
typedef struct _ftfx_ops_config |
||||||
|
{ |
||||||
|
uint32_t convertedAddress; /*!< A converted address for the current flash type.*/ |
||||||
|
struct |
||||||
|
{ |
||||||
|
uint8_t sectorCmd; |
||||||
|
uint8_t sectionCmd; |
||||||
|
uint8_t resourceCmd; |
||||||
|
uint8_t checkCmd; |
||||||
|
uint8_t swapCtrlCmd; |
||||||
|
uint8_t blockWriteUnitSize; |
||||||
|
uint8_t reserved[2]; |
||||||
|
} addrAligment; |
||||||
|
} ftfx_ops_config_t; |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Flash IFR memory descriptor. |
||||||
|
*/ |
||||||
|
typedef struct _ftfx_ifr_descriptor |
||||||
|
{ |
||||||
|
struct |
||||||
|
{ |
||||||
|
uint32_t has4ByteIdxSupport : 1; |
||||||
|
uint32_t has8ByteIdxSupport : 1; |
||||||
|
uint32_t : 30; |
||||||
|
} feature; |
||||||
|
struct |
||||||
|
{ |
||||||
|
uint8_t versionIdStart; /*!< Version ID start address */ |
||||||
|
uint8_t versionIdSize; |
||||||
|
uint16_t ifrMemSize; |
||||||
|
uint32_t pflashIfrStart; /*!< Program Flash 0 IFR start address */ |
||||||
|
uint32_t dflashIfrStart; /*!< Data Flash 0 IFR start address */ |
||||||
|
uint32_t pflashSwapIfrStart; /*!< Program Flash Swap IFR start address*/ |
||||||
|
} resRange; |
||||||
|
struct |
||||||
|
{ |
||||||
|
uint16_t mix8byteIdxStart; |
||||||
|
uint16_t mix8byteIdxEnd; |
||||||
|
} idxInfo; |
||||||
|
} ftfx_ifr_desc_t; |
||||||
|
|
||||||
|
typedef union |
||||||
|
{ |
||||||
|
uint32_t commadAddr; |
||||||
|
void (*callFlashCommand)(FTFx_REG8_ACCESS_TYPE FTMRx_fstat); |
||||||
|
} function_ptr_t; |
||||||
|
|
||||||
|
/*! @brief Flash driver state information.
|
||||||
|
* |
||||||
|
* An instance of this structure is allocated by the user of the flash driver and |
||||||
|
* passed into each of the driver APIs. |
||||||
|
*/ |
||||||
|
typedef struct _ftfx_config |
||||||
|
{ |
||||||
|
ftfx_mem_desc_t flashDesc; |
||||||
|
ftfx_ops_config_t opsConfig; |
||||||
|
uint32_t flexramBlockBase; /*!< The base address of the FlexRAM/acceleration RAM */ |
||||||
|
uint32_t flexramTotalSize; /*!< The size of the FlexRAM/acceleration RAM */ |
||||||
|
uint16_t eepromTotalSize; /*!< The size of EEPROM area which was partitioned from FlexRAM */ |
||||||
|
uint16_t reserved; |
||||||
|
function_ptr_t runCmdFuncAddr; /*!< An buffer point to the flash execute-in-RAM function. */ |
||||||
|
ftfx_ifr_desc_t ifrDesc; |
||||||
|
} ftfx_config_t; |
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* API |
||||||
|
******************************************************************************/ |
||||||
|
|
||||||
|
#if defined(__cplusplus) |
||||||
|
extern "C" { |
||||||
|
#endif |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @name Initialization |
||||||
|
* @{ |
||||||
|
*/ |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Initializes the global flash properties structure members. |
||||||
|
* |
||||||
|
* This function checks and initializes the Flash module for the other Flash APIs. |
||||||
|
* |
||||||
|
* @param config Pointer to the storage for the driver runtime state. |
||||||
|
* |
||||||
|
*/ |
||||||
|
void FTFx_API_Init(ftfx_config_t *config); |
||||||
|
|
||||||
|
#if defined(FSL_FEATURE_FLASH_HAS_FLEX_NVM) && FSL_FEATURE_FLASH_HAS_FLEX_NVM |
||||||
|
/*!
|
||||||
|
* @brief Updates FlexNVM memory partition status according to data flash 0 IFR. |
||||||
|
* |
||||||
|
* This function updates FlexNVM memory partition status. |
||||||
|
* |
||||||
|
* @param config Pointer to the storage for the driver runtime state. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_Success API was executed successfully. |
||||||
|
* @retval #kStatus_FTFx_InvalidArgument An invalid argument is provided. |
||||||
|
* @retval #kStatus_FTFx_PartitionStatusUpdateFailure Failed to update the partition status. |
||||||
|
*/ |
||||||
|
status_t FTFx_API_UpdateFlexnvmPartitionStatus(ftfx_config_t *config); |
||||||
|
#endif /* FSL_FEATURE_FLASH_HAS_FLEX_NVM */ |
||||||
|
|
||||||
|
/*@}*/ |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @name Erasing |
||||||
|
* @{ |
||||||
|
*/ |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Erases the flash sectors encompassed by parameters passed into function. |
||||||
|
* |
||||||
|
* This function erases the appropriate number of flash sectors based on the |
||||||
|
* desired start address and length. |
||||||
|
* |
||||||
|
* @param config The pointer to the storage for the driver runtime state. |
||||||
|
* @param start The start address of the desired flash memory to be erased. |
||||||
|
* The start address does not need to be sector-aligned but must be word-aligned. |
||||||
|
* @param lengthInBytes The length, given in bytes (not words or long-words) |
||||||
|
* to be erased. Must be word-aligned. |
||||||
|
* @param key The value used to validate all flash erase APIs. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_Success API was executed successfully. |
||||||
|
* @retval #kStatus_FTFx_InvalidArgument An invalid argument is provided. |
||||||
|
* @retval #kStatus_FTFx_AlignmentError The parameter is not aligned with the specified baseline. |
||||||
|
* @retval #kStatus_FTFx_AddressError The address is out of range. |
||||||
|
* @retval #kStatus_FTFx_EraseKeyError The API erase key is invalid. |
||||||
|
* @retval #kStatus_FTFx_ExecuteInRamFunctionNotReady Execute-in-RAM function is not available. |
||||||
|
* @retval #kStatus_FTFx_AccessError Invalid instruction codes and out-of bounds addresses. |
||||||
|
* @retval #kStatus_FTFx_ProtectionViolation The program/erase operation is requested to execute on protected areas. |
||||||
|
* @retval #kStatus_FTFx_CommandFailure Run-time error during the command execution. |
||||||
|
*/ |
||||||
|
status_t FTFx_CMD_Erase(ftfx_config_t *config, uint32_t start, uint32_t lengthInBytes, uint32_t key); |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Erases the flash sectors encompassed by parameters passed into function. |
||||||
|
* |
||||||
|
* This function erases one flash sector size based on the start address. |
||||||
|
* |
||||||
|
* @param config The pointer to the storage for the driver runtime state. |
||||||
|
* @param start The start address of the desired flash memory to be erased. |
||||||
|
* The start address does not need to be sector-aligned but must be word-aligned. |
||||||
|
* @param key The value used to validate all flash erase APIs. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_Success API was executed successfully. |
||||||
|
* @retval #kStatus_FTFx_InvalidArgument An invalid argument is provided. |
||||||
|
* @retval #kStatus_FTFx_AlignmentError The parameter is not aligned with the specified baseline. |
||||||
|
* @retval #kStatus_FTFx_AddressError The address is out of range. |
||||||
|
* @retval #kStatus_FTFx_EraseKeyError The API erase key is invalid. |
||||||
|
* @retval #kStatus_FTFx_ExecuteInRamFunctionNotReady Execute-in-RAM function is not available. |
||||||
|
*/ |
||||||
|
status_t FTFx_CMD_EraseSectorNonBlocking(ftfx_config_t *config, uint32_t start, uint32_t key); |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Erases entire flash |
||||||
|
* |
||||||
|
* @param config Pointer to the storage for the driver runtime state. |
||||||
|
* @param key A value used to validate all flash erase APIs. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_Success API was executed successfully. |
||||||
|
* @retval #kStatus_FTFx_InvalidArgument An invalid argument is provided. |
||||||
|
* @retval #kStatus_FTFx_EraseKeyError API erase key is invalid. |
||||||
|
* @retval #kStatus_FTFx_ExecuteInRamFunctionNotReady Execute-in-RAM function is not available. |
||||||
|
* @retval #kStatus_FTFx_AccessError Invalid instruction codes and out-of bounds addresses. |
||||||
|
* @retval #kStatus_FTFx_ProtectionViolation The program/erase operation is requested to execute on protected areas. |
||||||
|
* @retval #kStatus_FTFx_CommandFailure Run-time error during command execution. |
||||||
|
* @retval #kStatus_FTFx_PartitionStatusUpdateFailure Failed to update the partition status. |
||||||
|
*/ |
||||||
|
status_t FTFx_CMD_EraseAll(ftfx_config_t *config, uint32_t key); |
||||||
|
|
||||||
|
#if defined(FSL_FEATURE_FLASH_HAS_ERASE_ALL_BLOCKS_UNSECURE_CMD) && FSL_FEATURE_FLASH_HAS_ERASE_ALL_BLOCKS_UNSECURE_CMD |
||||||
|
/*!
|
||||||
|
* @brief Erases the entire flash, including protected sectors. |
||||||
|
* |
||||||
|
* @param config Pointer to the storage for the driver runtime state. |
||||||
|
* @param key A value used to validate all flash erase APIs. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_Success API was executed successfully. |
||||||
|
* @retval #kStatus_FTFx_InvalidArgument An invalid argument is provided. |
||||||
|
* @retval #kStatus_FTFx_EraseKeyError API erase key is invalid. |
||||||
|
* @retval #kStatus_FTFx_ExecuteInRamFunctionNotReady Execute-in-RAM function is not available. |
||||||
|
* @retval #kStatus_FTFx_AccessError Invalid instruction codes and out-of bounds addresses. |
||||||
|
* @retval #kStatus_FTFx_ProtectionViolation The program/erase operation is requested to execute on protected areas. |
||||||
|
* @retval #kStatus_FTFx_CommandFailure Run-time error during command execution. |
||||||
|
* @retval #kStatus_FTFx_PartitionStatusUpdateFailure Failed to update the partition status. |
||||||
|
*/ |
||||||
|
status_t FTFx_CMD_EraseAllUnsecure(ftfx_config_t *config, uint32_t key); |
||||||
|
#endif /* FSL_FEATURE_FLASH_HAS_ERASE_ALL_BLOCKS_UNSECURE_CMD */ |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Erases all program flash execute-only segments defined by the FXACC registers. |
||||||
|
* |
||||||
|
* @param config Pointer to the storage for the driver runtime state. |
||||||
|
* @param key A value used to validate all flash erase APIs. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_Success API was executed successfully. |
||||||
|
* @retval #kStatus_FTFx_InvalidArgument An invalid argument is provided. |
||||||
|
* @retval #kStatus_FTFx_EraseKeyError API erase key is invalid. |
||||||
|
* @retval #kStatus_FTFx_ExecuteInRamFunctionNotReady Execute-in-RAM function is not available. |
||||||
|
* @retval #kStatus_FTFx_AccessError Invalid instruction codes and out-of bounds addresses. |
||||||
|
* @retval #kStatus_FTFx_ProtectionViolation The program/erase operation is requested to execute on protected areas. |
||||||
|
* @retval #kStatus_FTFx_CommandFailure Run-time error during the command execution. |
||||||
|
*/ |
||||||
|
status_t FTFx_CMD_EraseAllExecuteOnlySegments(ftfx_config_t *config, uint32_t key); |
||||||
|
|
||||||
|
/*@}*/ |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @name Programming |
||||||
|
* @{ |
||||||
|
*/ |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Programs flash with data at locations passed in through parameters. |
||||||
|
* |
||||||
|
* This function programs the flash memory with the desired data for a given |
||||||
|
* flash area as determined by the start address and the length. |
||||||
|
* |
||||||
|
* @param config A pointer to the storage for the driver runtime state. |
||||||
|
* @param start The start address of the desired flash memory to be programmed. Must be |
||||||
|
* word-aligned. |
||||||
|
* @param src A pointer to the source buffer of data that is to be programmed |
||||||
|
* into the flash. |
||||||
|
* @param lengthInBytes The length, given in bytes (not words or long-words), |
||||||
|
* to be programmed. Must be word-aligned. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_Success API was executed successfully. |
||||||
|
* @retval #kStatus_FTFx_InvalidArgument An invalid argument is provided. |
||||||
|
* @retval #kStatus_FTFx_AlignmentError Parameter is not aligned with the specified baseline. |
||||||
|
* @retval #kStatus_FTFx_AddressError Address is out of range. |
||||||
|
* @retval #kStatus_FTFx_ExecuteInRamFunctionNotReady Execute-in-RAM function is not available. |
||||||
|
* @retval #kStatus_FTFx_AccessError Invalid instruction codes and out-of bounds addresses. |
||||||
|
* @retval #kStatus_FTFx_ProtectionViolation The program/erase operation is requested to execute on protected areas. |
||||||
|
* @retval #kStatus_FTFx_CommandFailure Run-time error during the command execution. |
||||||
|
*/ |
||||||
|
status_t FTFx_CMD_Program(ftfx_config_t *config, uint32_t start, const uint8_t *src, uint32_t lengthInBytes); |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Programs Program Once Field through parameters. |
||||||
|
* |
||||||
|
* This function programs the Program Once Field with the desired data for a given |
||||||
|
* flash area as determined by the index and length. |
||||||
|
* |
||||||
|
* @param config A pointer to the storage for the driver runtime state. |
||||||
|
* @param index The index indicating which area of the Program Once Field to be programmed. |
||||||
|
* @param src A pointer to the source buffer of data that is to be programmed |
||||||
|
* into the Program Once Field. |
||||||
|
* @param lengthInBytes The length, given in bytes (not words or long-words), |
||||||
|
* to be programmed. Must be word-aligned. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_Success API was executed successfully. |
||||||
|
* @retval #kStatus_FTFx_InvalidArgument An invalid argument is provided. |
||||||
|
* @retval #kStatus_FTFx_ExecuteInRamFunctionNotReady Execute-in-RAM function is not available. |
||||||
|
* @retval #kStatus_FTFx_AccessError Invalid instruction codes and out-of bounds addresses. |
||||||
|
* @retval #kStatus_FTFx_ProtectionViolation The program/erase operation is requested to execute on protected areas. |
||||||
|
* @retval #kStatus_FTFx_CommandFailure Run-time error during the command execution. |
||||||
|
*/ |
||||||
|
status_t FTFx_CMD_ProgramOnce(ftfx_config_t *config, uint32_t index, const uint8_t *src, uint32_t lengthInBytes); |
||||||
|
|
||||||
|
#if defined(FSL_FEATURE_FLASH_HAS_PROGRAM_SECTION_CMD) && FSL_FEATURE_FLASH_HAS_PROGRAM_SECTION_CMD |
||||||
|
/*!
|
||||||
|
* @brief Programs flash with data at locations passed in through parameters via the Program Section command. |
||||||
|
* |
||||||
|
* This function programs the flash memory with the desired data for a given |
||||||
|
* flash area as determined by the start address and length. |
||||||
|
* |
||||||
|
* @param config A pointer to the storage for the driver runtime state. |
||||||
|
* @param start The start address of the desired flash memory to be programmed. Must be |
||||||
|
* word-aligned. |
||||||
|
* @param src A pointer to the source buffer of data that is to be programmed |
||||||
|
* into the flash. |
||||||
|
* @param lengthInBytes The length, given in bytes (not words or long-words), |
||||||
|
* to be programmed. Must be word-aligned. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_Success API was executed successfully. |
||||||
|
* @retval #kStatus_FTFx_InvalidArgument An invalid argument is provided. |
||||||
|
* @retval #kStatus_FTFx_AlignmentError Parameter is not aligned with specified baseline. |
||||||
|
* @retval #kStatus_FTFx_AddressError Address is out of range. |
||||||
|
* @retval #kStatus_FTFx_SetFlexramAsRamError Failed to set flexram as RAM. |
||||||
|
* @retval #kStatus_FTFx_ExecuteInRamFunctionNotReady Execute-in-RAM function is not available. |
||||||
|
* @retval #kStatus_FTFx_AccessError Invalid instruction codes and out-of bounds addresses. |
||||||
|
* @retval #kStatus_FTFx_ProtectionViolation The program/erase operation is requested to execute on protected areas. |
||||||
|
* @retval #kStatus_FTFx_CommandFailure Run-time error during command execution. |
||||||
|
* @retval #kStatus_FTFx_RecoverFlexramAsEepromError Failed to recover FlexRAM as EEPROM. |
||||||
|
*/ |
||||||
|
status_t FTFx_CMD_ProgramSection(ftfx_config_t *config, uint32_t start, const uint8_t *src, uint32_t lengthInBytes); |
||||||
|
#endif /* FSL_FEATURE_FLASH_HAS_PROGRAM_SECTION_CMD */ |
||||||
|
|
||||||
|
#if defined(FSL_FEATURE_FLASH_HAS_PROGRAM_PARTITION_CMD) && FSL_FEATURE_FLASH_HAS_PROGRAM_PARTITION_CMD |
||||||
|
/*!
|
||||||
|
* @brief Prepares the FlexNVM block for use as data flash, EEPROM backup, or a combination of both and initializes the |
||||||
|
* FlexRAM. |
||||||
|
* |
||||||
|
* @param config Pointer to storage for the driver runtime state. |
||||||
|
* @param option The option used to set FlexRAM load behavior during reset. |
||||||
|
* @param eepromDataSizeCode Determines the amount of FlexRAM used in each of the available EEPROM subsystems. |
||||||
|
* @param flexnvmPartitionCode Specifies how to split the FlexNVM block between data flash memory and EEPROM backup |
||||||
|
* memory supporting EEPROM functions. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_Success API was executed successfully. |
||||||
|
* @retval #kStatus_FTFx_InvalidArgument Invalid argument is provided. |
||||||
|
* @retval #kStatus_FTFx_ExecuteInRamFunctionNotReady Execute-in-RAM function is not available. |
||||||
|
* @retval #kStatus_FTFx_AccessError Invalid instruction codes and out-of bounds addresses. |
||||||
|
* @retval #kStatus_FTFx_ProtectionViolation The program/erase operation is requested to execute on protected areas. |
||||||
|
* @retval #kStatus_FTFx_CommandFailure Run-time error during command execution. |
||||||
|
*/ |
||||||
|
status_t FTFx_CMD_ProgramPartition(ftfx_config_t *config, |
||||||
|
ftfx_partition_flexram_load_opt_t option, |
||||||
|
uint32_t eepromDataSizeCode, |
||||||
|
uint32_t flexnvmPartitionCode); |
||||||
|
#endif /* FSL_FEATURE_FLASH_HAS_PROGRAM_PARTITION_CMD */ |
||||||
|
|
||||||
|
/*@}*/ |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @name Reading |
||||||
|
* @{ |
||||||
|
*/ |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Reads the Program Once Field through parameters. |
||||||
|
* |
||||||
|
* This function reads the read once feild with given index and length. |
||||||
|
* |
||||||
|
* @param config A pointer to the storage for the driver runtime state. |
||||||
|
* @param index The index indicating the area of program once field to be read. |
||||||
|
* @param dst A pointer to the destination buffer of data that is used to store |
||||||
|
* data to be read. |
||||||
|
* @param lengthInBytes The length, given in bytes (not words or long-words), |
||||||
|
* to be programmed. Must be word-aligned. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_Success API was executed successfully. |
||||||
|
* @retval #kStatus_FTFx_InvalidArgument An invalid argument is provided. |
||||||
|
* @retval #kStatus_FTFx_ExecuteInRamFunctionNotReady Execute-in-RAM function is not available. |
||||||
|
* @retval #kStatus_FTFx_AccessError Invalid instruction codes and out-of bounds addresses. |
||||||
|
* @retval #kStatus_FTFx_ProtectionViolation The program/erase operation is requested to execute on protected areas. |
||||||
|
* @retval #kStatus_FTFx_CommandFailure Run-time error during the command execution. |
||||||
|
*/ |
||||||
|
status_t FTFx_CMD_ReadOnce(ftfx_config_t *config, uint32_t index, uint8_t *dst, uint32_t lengthInBytes); |
||||||
|
|
||||||
|
#if defined(FSL_FEATURE_FLASH_HAS_READ_RESOURCE_CMD) && FSL_FEATURE_FLASH_HAS_READ_RESOURCE_CMD |
||||||
|
/*!
|
||||||
|
* @brief Reads the resource with data at locations passed in through parameters. |
||||||
|
* |
||||||
|
* This function reads the flash memory with the desired location for a given |
||||||
|
* flash area as determined by the start address and length. |
||||||
|
* |
||||||
|
* @param config A pointer to the storage for the driver runtime state. |
||||||
|
* @param start The start address of the desired flash memory to be programmed. Must be |
||||||
|
* word-aligned. |
||||||
|
* @param dst A pointer to the destination buffer of data that is used to store |
||||||
|
* data to be read. |
||||||
|
* @param lengthInBytes The length, given in bytes (not words or long-words), |
||||||
|
* to be read. Must be word-aligned. |
||||||
|
* @param option The resource option which indicates which area should be read back. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_Success API was executed successfully. |
||||||
|
* @retval #kStatus_FTFx_InvalidArgument An invalid argument is provided. |
||||||
|
* @retval #kStatus_FTFx_AlignmentError Parameter is not aligned with the specified baseline. |
||||||
|
* @retval #kStatus_FTFx_ExecuteInRamFunctionNotReady Execute-in-RAM function is not available. |
||||||
|
* @retval #kStatus_FTFx_AccessError Invalid instruction codes and out-of bounds addresses. |
||||||
|
* @retval #kStatus_FTFx_ProtectionViolation The program/erase operation is requested to execute on protected areas. |
||||||
|
* @retval #kStatus_FTFx_CommandFailure Run-time error during the command execution. |
||||||
|
*/ |
||||||
|
status_t FTFx_CMD_ReadResource( |
||||||
|
ftfx_config_t *config, uint32_t start, uint8_t *dst, uint32_t lengthInBytes, ftfx_read_resource_opt_t option); |
||||||
|
#endif /* FSL_FEATURE_FLASH_HAS_READ_RESOURCE_CMD */ |
||||||
|
|
||||||
|
/*@}*/ |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @name Verification |
||||||
|
* @{ |
||||||
|
*/ |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Verifies an erasure of the desired flash area at a specified margin level. |
||||||
|
* |
||||||
|
* This function checks the appropriate number of flash sectors based on |
||||||
|
* the desired start address and length to check whether the flash is erased |
||||||
|
* to the specified read margin level. |
||||||
|
* |
||||||
|
* @param config A pointer to the storage for the driver runtime state. |
||||||
|
* @param start The start address of the desired flash memory to be verified. |
||||||
|
* The start address does not need to be sector-aligned but must be word-aligned. |
||||||
|
* @param lengthInBytes The length, given in bytes (not words or long-words), |
||||||
|
* to be verified. Must be word-aligned. |
||||||
|
* @param margin Read margin choice. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_Success API was executed successfully. |
||||||
|
* @retval #kStatus_FTFx_InvalidArgument An invalid argument is provided. |
||||||
|
* @retval #kStatus_FTFx_AlignmentError Parameter is not aligned with specified baseline. |
||||||
|
* @retval #kStatus_FTFx_AddressError Address is out of range. |
||||||
|
* @retval #kStatus_FTFx_ExecuteInRamFunctionNotReady Execute-in-RAM function is not available. |
||||||
|
* @retval #kStatus_FTFx_AccessError Invalid instruction codes and out-of bounds addresses. |
||||||
|
* @retval #kStatus_FTFx_ProtectionViolation The program/erase operation is requested to execute on protected areas. |
||||||
|
* @retval #kStatus_FTFx_CommandFailure Run-time error during the command execution. |
||||||
|
*/ |
||||||
|
status_t FTFx_CMD_VerifyErase(ftfx_config_t *config, |
||||||
|
uint32_t start, |
||||||
|
uint32_t lengthInBytes, |
||||||
|
ftfx_margin_value_t margin); |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Verifies erasure of the entire flash at a specified margin level. |
||||||
|
* |
||||||
|
* This function checks whether the flash is erased to the |
||||||
|
* specified read margin level. |
||||||
|
* |
||||||
|
* @param config A pointer to the storage for the driver runtime state. |
||||||
|
* @param margin Read margin choice. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_Success API was executed successfully. |
||||||
|
* @retval #kStatus_FTFx_InvalidArgument An invalid argument is provided. |
||||||
|
* @retval #kStatus_FTFx_ExecuteInRamFunctionNotReady Execute-in-RAM function is not available. |
||||||
|
* @retval #kStatus_FTFx_AccessError Invalid instruction codes and out-of bounds addresses. |
||||||
|
* @retval #kStatus_FTFx_ProtectionViolation The program/erase operation is requested to execute on protected areas. |
||||||
|
* @retval #kStatus_FTFx_CommandFailure Run-time error during the command execution. |
||||||
|
*/ |
||||||
|
status_t FTFx_CMD_VerifyEraseAll(ftfx_config_t *config, ftfx_margin_value_t margin); |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Verifies whether the program flash execute-only segments have been erased to |
||||||
|
* the specified read margin level. |
||||||
|
* |
||||||
|
* @param config A pointer to the storage for the driver runtime state. |
||||||
|
* @param margin Read margin choice. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_Success API was executed successfully. |
||||||
|
* @retval #kStatus_FTFx_InvalidArgument An invalid argument is provided. |
||||||
|
* @retval #kStatus_FTFx_ExecuteInRamFunctionNotReady Execute-in-RAM function is not available. |
||||||
|
* @retval #kStatus_FTFx_AccessError Invalid instruction codes and out-of bounds addresses. |
||||||
|
* @retval #kStatus_FTFx_ProtectionViolation The program/erase operation is requested to execute on protected areas. |
||||||
|
* @retval #kStatus_FTFx_CommandFailure Run-time error during the command execution. |
||||||
|
*/ |
||||||
|
status_t FTFx_CMD_VerifyEraseAllExecuteOnlySegments(ftfx_config_t *config, ftfx_margin_value_t margin); |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Verifies programming of the desired flash area at a specified margin level. |
||||||
|
* |
||||||
|
* This function verifies the data programed in the flash memory using the |
||||||
|
* Flash Program Check Command and compares it to the expected data for a given |
||||||
|
* flash area as determined by the start address and length. |
||||||
|
* |
||||||
|
* @param config A pointer to the storage for the driver runtime state. |
||||||
|
* @param start The start address of the desired flash memory to be verified. Must be word-aligned. |
||||||
|
* @param lengthInBytes The length, given in bytes (not words or long-words), |
||||||
|
* to be verified. Must be word-aligned. |
||||||
|
* @param expectedData A pointer to the expected data that is to be |
||||||
|
* verified against. |
||||||
|
* @param margin Read margin choice. |
||||||
|
* @param failedAddress A pointer to the returned failing address. |
||||||
|
* @param failedData A pointer to the returned failing data. Some derivatives do |
||||||
|
* not include failed data as part of the FCCOBx registers. In this |
||||||
|
* case, zeros are returned upon failure. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_Success API was executed successfully. |
||||||
|
* @retval #kStatus_FTFx_InvalidArgument An invalid argument is provided. |
||||||
|
* @retval #kStatus_FTFx_AlignmentError Parameter is not aligned with specified baseline. |
||||||
|
* @retval #kStatus_FTFx_AddressError Address is out of range. |
||||||
|
* @retval #kStatus_FTFx_ExecuteInRamFunctionNotReady Execute-in-RAM function is not available. |
||||||
|
* @retval #kStatus_FTFx_AccessError Invalid instruction codes and out-of bounds addresses. |
||||||
|
* @retval #kStatus_FTFx_ProtectionViolation The program/erase operation is requested to execute on protected areas. |
||||||
|
* @retval #kStatus_FTFx_CommandFailure Run-time error during the command execution. |
||||||
|
*/ |
||||||
|
status_t FTFx_CMD_VerifyProgram(ftfx_config_t *config, |
||||||
|
uint32_t start, |
||||||
|
uint32_t lengthInBytes, |
||||||
|
const uint8_t *expectedData, |
||||||
|
ftfx_margin_value_t margin, |
||||||
|
uint32_t *failedAddress, |
||||||
|
uint32_t *failedData); |
||||||
|
|
||||||
|
/*@}*/ |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @name Security |
||||||
|
* @{ |
||||||
|
*/ |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Returns the security state via the pointer passed into the function. |
||||||
|
* |
||||||
|
* This function retrieves the current flash security status, including the |
||||||
|
* security enabling state and the backdoor key enabling state. |
||||||
|
* |
||||||
|
* @param config A pointer to storage for the driver runtime state. |
||||||
|
* @param state A pointer to the value returned for the current security status code: |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_Success API was executed successfully. |
||||||
|
* @retval #kStatus_FTFx_InvalidArgument An invalid argument is provided. |
||||||
|
*/ |
||||||
|
status_t FTFx_REG_GetSecurityState(ftfx_config_t *config, ftfx_security_state_t *state); |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Allows users to bypass security with a backdoor key. |
||||||
|
* |
||||||
|
* If the MCU is in secured state, this function unsecures the MCU by |
||||||
|
* comparing the provided backdoor key with ones in the flash configuration |
||||||
|
* field. |
||||||
|
* |
||||||
|
* @param config A pointer to the storage for the driver runtime state. |
||||||
|
* @param backdoorKey A pointer to the user buffer containing the backdoor key. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_Success API was executed successfully. |
||||||
|
* @retval #kStatus_FTFx_InvalidArgument An invalid argument is provided. |
||||||
|
* @retval #kStatus_FTFx_ExecuteInRamFunctionNotReady Execute-in-RAM function is not available. |
||||||
|
* @retval #kStatus_FTFx_AccessError Invalid instruction codes and out-of bounds addresses. |
||||||
|
* @retval #kStatus_FTFx_ProtectionViolation The program/erase operation is requested to execute on protected areas. |
||||||
|
* @retval #kStatus_FTFx_CommandFailure Run-time error during the command execution. |
||||||
|
*/ |
||||||
|
status_t FTFx_CMD_SecurityBypass(ftfx_config_t *config, const uint8_t *backdoorKey); |
||||||
|
|
||||||
|
/*@}*/ |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @name FlexRAM |
||||||
|
* @{ |
||||||
|
*/ |
||||||
|
|
||||||
|
#if defined(FSL_FEATURE_FLASH_HAS_SET_FLEXRAM_FUNCTION_CMD) && FSL_FEATURE_FLASH_HAS_SET_FLEXRAM_FUNCTION_CMD |
||||||
|
/*!
|
||||||
|
* @brief Sets the FlexRAM function command. |
||||||
|
* |
||||||
|
* @param config A pointer to the storage for the driver runtime state. |
||||||
|
* @param option The option used to set the work mode of FlexRAM. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_Success API was executed successfully. |
||||||
|
* @retval #kStatus_FTFx_InvalidArgument An invalid argument is provided. |
||||||
|
* @retval #kStatus_FTFx_ExecuteInRamFunctionNotReady Execute-in-RAM function is not available. |
||||||
|
* @retval #kStatus_FTFx_AccessError Invalid instruction codes and out-of bounds addresses. |
||||||
|
* @retval #kStatus_FTFx_ProtectionViolation The program/erase operation is requested to execute on protected areas. |
||||||
|
* @retval #kStatus_FTFx_CommandFailure Run-time error during the command execution. |
||||||
|
*/ |
||||||
|
status_t FTFx_CMD_SetFlexramFunction(ftfx_config_t *config, ftfx_flexram_func_opt_t option); |
||||||
|
#endif /* FSL_FEATURE_FLASH_HAS_SET_FLEXRAM_FUNCTION_CMD */ |
||||||
|
|
||||||
|
/*@}*/ |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @name Swap |
||||||
|
* @{ |
||||||
|
*/ |
||||||
|
|
||||||
|
#if defined(FSL_FEATURE_FLASH_HAS_SWAP_CONTROL_CMD) && FSL_FEATURE_FLASH_HAS_SWAP_CONTROL_CMD |
||||||
|
/*!
|
||||||
|
* @brief Configures the Swap function or checks the swap state of the Flash module. |
||||||
|
* |
||||||
|
* @param config A pointer to the storage for the driver runtime state. |
||||||
|
* @param address Address used to configure the flash Swap function. |
||||||
|
* @param option The possible option used to configure Flash Swap function or check the flash Swap status |
||||||
|
* @param returnInfo A pointer to the data which is used to return the information of flash Swap. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_Success API was executed successfully. |
||||||
|
* @retval #kStatus_FTFx_InvalidArgument An invalid argument is provided. |
||||||
|
* @retval #kStatus_FTFx_AlignmentError Parameter is not aligned with specified baseline. |
||||||
|
* @retval #kStatus_FTFx_SwapIndicatorAddressError Swap indicator address is invalid. |
||||||
|
* @retval #kStatus_FTFx_ExecuteInRamFunctionNotReady Execute-in-RAM function is not available. |
||||||
|
* @retval #kStatus_FTFx_AccessError Invalid instruction codes and out-of bounds addresses. |
||||||
|
* @retval #kStatus_FTFx_ProtectionViolation The program/erase operation is requested to execute on protected areas. |
||||||
|
* @retval #kStatus_FTFx_CommandFailure Run-time error during the command execution. |
||||||
|
*/ |
||||||
|
status_t FTFx_CMD_SwapControl(ftfx_config_t *config, |
||||||
|
uint32_t address, |
||||||
|
ftfx_swap_control_opt_t option, |
||||||
|
ftfx_swap_state_config_t *returnInfo); |
||||||
|
#endif /* FSL_FEATURE_FLASH_HAS_SWAP_CONTROL_CMD */ |
||||||
|
|
||||||
|
/*@}*/ |
||||||
|
|
||||||
|
#if defined(__cplusplus) |
||||||
|
} |
||||||
|
#endif |
||||||
|
|
||||||
|
/*! @}*/ |
||||||
|
|
||||||
|
#endif /* FSL_FTFX_CONTROLLER_H */ |
||||||
@ -0,0 +1,90 @@ |
|||||||
|
/*
|
||||||
|
* Copyright 2017-2019 NXP |
||||||
|
* All rights reserved. |
||||||
|
* |
||||||
|
* SPDX-License-Identifier: BSD-3-Clause |
||||||
|
* |
||||||
|
*/ |
||||||
|
|
||||||
|
#ifndef FSL_FTFX_FEATURES_H |
||||||
|
#define FSL_FTFX_FEATURES_H |
||||||
|
|
||||||
|
#if (defined(BL_TARGET_FLASH) || defined(BL_TARGET_ROM) || defined(BL_TARGET_RAM)) |
||||||
|
#include <assert.h> |
||||||
|
#include <string.h> |
||||||
|
#include "fsl_device_registers.h" |
||||||
|
#include "bootloader_common.h" |
||||||
|
#else |
||||||
|
#include "fsl_common.h" |
||||||
|
#endif |
||||||
|
|
||||||
|
#include "fsl_ftfx_adapter.h" |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @addtogroup ftfx_feature |
||||||
|
* @{ |
||||||
|
*/ |
||||||
|
/*******************************************************************************
|
||||||
|
* Definitions |
||||||
|
******************************************************************************/ |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @name FTFx configuration |
||||||
|
* @{ |
||||||
|
*/ |
||||||
|
/*! @brief Flash driver location. */ |
||||||
|
#if !defined(FTFx_DRIVER_IS_FLASH_RESIDENT) |
||||||
|
#if (!defined(BL_TARGET_ROM) && !defined(BL_TARGET_RAM)) |
||||||
|
#define FTFx_DRIVER_IS_FLASH_RESIDENT 1U /*!< Used for the flash resident application. */ |
||||||
|
#else |
||||||
|
#define FTFx_DRIVER_IS_FLASH_RESIDENT 0U /*!< Used for the non-flash resident application. */ |
||||||
|
#endif |
||||||
|
#endif |
||||||
|
|
||||||
|
/*! @brief Flash Driver Export option */ |
||||||
|
#if !defined(FTFx_DRIVER_IS_EXPORTED) |
||||||
|
#if defined(BL_TARGET_ROM) |
||||||
|
#define FTFx_DRIVER_IS_EXPORTED 1U /*!< Used for the ROM bootloader. */ |
||||||
|
#else |
||||||
|
#define FTFx_DRIVER_IS_EXPORTED 0U /*!< Used for the MCUXpresso SDK application. */ |
||||||
|
#endif |
||||||
|
#endif |
||||||
|
/*@}*/ |
||||||
|
|
||||||
|
/*! @brief Indicates whether the secondary flash is supported in the Flash driver */ |
||||||
|
#if defined(FSL_FEATURE_FLASH_HAS_MULTIPLE_FLASH) || defined(FSL_FEATURE_FLASH_PFLASH_1_START_ADDRESS) |
||||||
|
#define FTFx_DRIVER_HAS_FLASH1_SUPPORT (1U) |
||||||
|
#define FTFx_FLASH_COUNT (2U) |
||||||
|
#else |
||||||
|
#define FTFx_DRIVER_HAS_FLASH1_SUPPORT (0U) |
||||||
|
#define FTFx_FLASH_COUNT (1U) |
||||||
|
#endif |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @name Secondary flash configuration |
||||||
|
* @{ |
||||||
|
*/ |
||||||
|
/*! @brief Indicates whether the secondary flash has its own protection register in flash module. */ |
||||||
|
#if defined(FSL_FEATURE_FLASH_HAS_MULTIPLE_FLASH) && defined(FTFE_FPROTS_PROTS_MASK) |
||||||
|
#define FTFx_FLASH1_HAS_PROT_CONTROL (1U) |
||||||
|
#else |
||||||
|
#define FTFx_FLASH1_HAS_PROT_CONTROL (0U) |
||||||
|
#endif |
||||||
|
|
||||||
|
/*! @brief Indicates whether the secondary flash has its own Execute-Only access register in flash module. */ |
||||||
|
#if defined(FSL_FEATURE_FLASH_HAS_MULTIPLE_FLASH) && defined(FTFE_FACSSS_SGSIZE_S_MASK) |
||||||
|
#define FTFx_FLASH1_HAS_XACC_CONTROL (1U) |
||||||
|
#else |
||||||
|
#define FTFx_FLASH1_HAS_XACC_CONTROL (0U) |
||||||
|
#endif |
||||||
|
/*@}*/ |
||||||
|
|
||||||
|
#if FTFx_FLASH1_HAS_XACC_CONTROL || FTFx_FLASH1_HAS_PROT_CONTROL |
||||||
|
#define FTFx_FLASH1_IS_INDEPENDENT_BLOCK (1U) |
||||||
|
#else |
||||||
|
#define FTFx_FLASH1_IS_INDEPENDENT_BLOCK (0U) |
||||||
|
#endif |
||||||
|
|
||||||
|
/*! @}*/ |
||||||
|
|
||||||
|
#endif /* FSL_FTFX_FEATURES_H */ |
||||||
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,705 @@ |
|||||||
|
/*
|
||||||
|
* Copyright 2013-2016 Freescale Semiconductor, Inc. |
||||||
|
* Copyright 2016-2020 NXP |
||||||
|
* All rights reserved. |
||||||
|
* |
||||||
|
* SPDX-License-Identifier: BSD-3-Clause |
||||||
|
* |
||||||
|
*/ |
||||||
|
|
||||||
|
#ifndef FSL_FTFX_FLASH_H |
||||||
|
#define FSL_FTFX_FLASH_H |
||||||
|
|
||||||
|
#include "fsl_ftfx_controller.h" |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @addtogroup ftfx_flash_driver |
||||||
|
* @{ |
||||||
|
*/ |
||||||
|
/*******************************************************************************
|
||||||
|
* Definitions |
||||||
|
******************************************************************************/ |
||||||
|
#define kStatus_FLASH_Success kStatus_FTFx_Success |
||||||
|
#define kFLASH_ApiEraseKey kFTFx_ApiEraseKey |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @name Flash version |
||||||
|
* @{ |
||||||
|
*/ |
||||||
|
/*! @brief Flash driver version for SDK*/ |
||||||
|
#define FSL_FLASH_DRIVER_VERSION (MAKE_VERSION(3U, 1U, 2U)) /*!< Version 3.1.2. */ |
||||||
|
|
||||||
|
/*! @brief Flash driver version for ROM*/ |
||||||
|
#define FSL_FLASH_DRIVER_VERSION_ROM (MAKE_VERSION(3U, 0U, 0U)) /*!< Version 3.0.0. */ |
||||||
|
|
||||||
|
/*@}*/ |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Enumeration for the three possible flash protection levels. |
||||||
|
*/ |
||||||
|
typedef enum _flash_protection_state |
||||||
|
{ |
||||||
|
kFLASH_ProtectionStateUnprotected, /*!< Flash region is not protected.*/ |
||||||
|
kFLASH_ProtectionStateProtected, /*!< Flash region is protected.*/ |
||||||
|
kFLASH_ProtectionStateMixed /*!< Flash is mixed with protected and unprotected region.*/ |
||||||
|
} flash_prot_state_t; |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief PFlash protection status |
||||||
|
*/ |
||||||
|
typedef union _pflash_protection_status |
||||||
|
{ |
||||||
|
uint32_t protl; /*!< PROT[31:0] .*/ |
||||||
|
uint32_t proth; /*!< PROT[63:32].*/ |
||||||
|
uint8_t protsl; /*!< PROTS[7:0] .*/ |
||||||
|
uint8_t protsh; /*!< PROTS[15:8] .*/ |
||||||
|
uint8_t reserved[2]; |
||||||
|
} pflash_prot_status_t; |
||||||
|
|
||||||
|
#if defined(FSL_FEATURE_FLASH_HAS_ACCESS_CONTROL) && FSL_FEATURE_FLASH_HAS_ACCESS_CONTROL |
||||||
|
/*!
|
||||||
|
* @brief Enumeration for the three possible flash execute access levels. |
||||||
|
*/ |
||||||
|
typedef enum _flash_execute_only_access_state |
||||||
|
{ |
||||||
|
kFLASH_AccessStateUnLimited, /*!< Flash region is unlimited.*/ |
||||||
|
kFLASH_AccessStateExecuteOnly, /*!< Flash region is execute only.*/ |
||||||
|
kFLASH_AccessStateMixed /*!< Flash is mixed with unlimited and execute only region.*/ |
||||||
|
} flash_xacc_state_t; |
||||||
|
#endif /* not define FSL_FEATURE_FLASH_HAS_ACCESS_CONTROL */ |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Enumeration for various flash properties. |
||||||
|
*/ |
||||||
|
typedef enum _flash_property_tag |
||||||
|
{ |
||||||
|
kFLASH_PropertyPflash0SectorSize = 0x00U, /*!< Pflash sector size property.*/ |
||||||
|
kFLASH_PropertyPflash0TotalSize = 0x01U, /*!< Pflash total size property.*/ |
||||||
|
kFLASH_PropertyPflash0BlockSize = 0x02U, /*!< Pflash block size property.*/ |
||||||
|
kFLASH_PropertyPflash0BlockCount = 0x03U, /*!< Pflash block count property.*/ |
||||||
|
kFLASH_PropertyPflash0BlockBaseAddr = 0x04U, /*!< Pflash block base address property.*/ |
||||||
|
kFLASH_PropertyPflash0FacSupport = 0x05U, /*!< Pflash fac support property.*/ |
||||||
|
kFLASH_PropertyPflash0AccessSegmentSize = 0x06U, /*!< Pflash access segment size property.*/ |
||||||
|
kFLASH_PropertyPflash0AccessSegmentCount = 0x07U, /*!< Pflash access segment count property.*/ |
||||||
|
|
||||||
|
kFLASH_PropertyPflash1SectorSize = 0x10U, /*!< Pflash sector size property.*/ |
||||||
|
kFLASH_PropertyPflash1TotalSize = 0x11U, /*!< Pflash total size property.*/ |
||||||
|
kFLASH_PropertyPflash1BlockSize = 0x12U, /*!< Pflash block size property.*/ |
||||||
|
kFLASH_PropertyPflash1BlockCount = 0x13U, /*!< Pflash block count property.*/ |
||||||
|
kFLASH_PropertyPflash1BlockBaseAddr = 0x14U, /*!< Pflash block base address property.*/ |
||||||
|
kFLASH_PropertyPflash1FacSupport = 0x15U, /*!< Pflash fac support property.*/ |
||||||
|
kFLASH_PropertyPflash1AccessSegmentSize = 0x16U, /*!< Pflash access segment size property.*/ |
||||||
|
kFLASH_PropertyPflash1AccessSegmentCount = 0x17U, /*!< Pflash access segment count property.*/ |
||||||
|
|
||||||
|
kFLASH_PropertyFlexRamBlockBaseAddr = 0x20U, /*!< FlexRam block base address property.*/ |
||||||
|
kFLASH_PropertyFlexRamTotalSize = 0x21U, /*!< FlexRam total size property.*/ |
||||||
|
} flash_property_tag_t; |
||||||
|
|
||||||
|
/*! @brief Flash driver state information.
|
||||||
|
* |
||||||
|
* An instance of this structure is allocated by the user of the flash driver and |
||||||
|
* passed into each of the driver APIs. |
||||||
|
*/ |
||||||
|
typedef struct _flash_config |
||||||
|
{ |
||||||
|
ftfx_config_t ftfxConfig[FTFx_FLASH_COUNT]; |
||||||
|
} flash_config_t; |
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* API |
||||||
|
******************************************************************************/ |
||||||
|
|
||||||
|
#if defined(__cplusplus) |
||||||
|
extern "C" { |
||||||
|
#endif |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @name Initialization |
||||||
|
* @{ |
||||||
|
*/ |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Initializes the global flash properties structure members. |
||||||
|
* |
||||||
|
* This function checks and initializes the Flash module for the other Flash APIs. |
||||||
|
* |
||||||
|
* @param config Pointer to the storage for the driver runtime state. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_Success API was executed successfully. |
||||||
|
* @retval #kStatus_FTFx_InvalidArgument An invalid argument is provided. |
||||||
|
* @retval #kStatus_FTFx_ExecuteInRamFunctionNotReady Execute-in-RAM function is not available. |
||||||
|
* @retval #kStatus_FTFx_PartitionStatusUpdateFailure Failed to update the partition status. |
||||||
|
*/ |
||||||
|
status_t FLASH_Init(flash_config_t *config); |
||||||
|
|
||||||
|
/*@}*/ |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @name Erasing |
||||||
|
* @{ |
||||||
|
*/ |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Erases the Dflash sectors encompassed by parameters passed into function. |
||||||
|
* |
||||||
|
* This function erases the appropriate number of flash sectors based on the |
||||||
|
* desired start address and length. |
||||||
|
* |
||||||
|
* @param config The pointer to the storage for the driver runtime state. |
||||||
|
* @param start The start address of the desired flash memory to be erased. |
||||||
|
* The start address does not need to be sector-aligned but must be word-aligned. |
||||||
|
* @param lengthInBytes The length, given in bytes (not words or long-words) |
||||||
|
* to be erased. Must be word-aligned. |
||||||
|
* @param key The value used to validate all flash erase APIs. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_Success API was executed successfully; the appropriate number of flash sectors based on the |
||||||
|
* desired start address and length were erased successfully. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_InvalidArgument An invalid argument is provided. |
||||||
|
* @retval #kStatus_FTFx_AlignmentError The parameter is not aligned with the specified baseline. |
||||||
|
* @retval #kStatus_FTFx_AddressError The address is out of range. |
||||||
|
* @retval #kStatus_FTFx_EraseKeyError The API erase key is invalid. |
||||||
|
* @retval #kStatus_FTFx_ExecuteInRamFunctionNotReady Execute-in-RAM function is not available. |
||||||
|
* @retval #kStatus_FTFx_AccessError Invalid instruction codes and out-of bounds addresses. |
||||||
|
* @retval #kStatus_FTFx_ProtectionViolation The program/erase operation is requested to execute on protected areas. |
||||||
|
* @retval #kStatus_FTFx_CommandFailure Run-time error during the command execution. |
||||||
|
*/ |
||||||
|
status_t FLASH_Erase(flash_config_t *config, uint32_t start, uint32_t lengthInBytes, uint32_t key); |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Erases the Dflash sectors encompassed by parameters passed into function. |
||||||
|
* |
||||||
|
* This function erases one flash sector size based on the start address, and it is |
||||||
|
* executed asynchronously. |
||||||
|
* |
||||||
|
* NOTE: This function can only erase one flash sector at a time, and the other commands |
||||||
|
* can be executed after the previous command has been completed. |
||||||
|
* |
||||||
|
* @param config The pointer to the storage for the driver runtime state. |
||||||
|
* @param start The start address of the desired flash memory to be erased. |
||||||
|
* The start address does not need to be sector-aligned but must be word-aligned. |
||||||
|
* @param key The value used to validate all flash erase APIs. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_Success API was executed successfully. |
||||||
|
* @retval #kStatus_FTFx_InvalidArgument An invalid argument is provided. |
||||||
|
* @retval #kStatus_FTFx_AlignmentError The parameter is not aligned with the specified baseline. |
||||||
|
* @retval #kStatus_FTFx_AddressError The address is out of range. |
||||||
|
* @retval #kStatus_FTFx_EraseKeyError The API erase key is invalid. |
||||||
|
*/ |
||||||
|
status_t FLASH_EraseSectorNonBlocking(flash_config_t *config, uint32_t start, uint32_t key); |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Erases entire flexnvm |
||||||
|
* |
||||||
|
* @param config Pointer to the storage for the driver runtime state. |
||||||
|
* @param key A value used to validate all flash erase APIs. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_Success API was executed successfully; the all pflash and flexnvm were erased successfully, |
||||||
|
* the swap and eeprom have been reset to unconfigured state. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_InvalidArgument An invalid argument is provided. |
||||||
|
* @retval #kStatus_FTFx_EraseKeyError API erase key is invalid. |
||||||
|
* @retval #kStatus_FTFx_ExecuteInRamFunctionNotReady Execute-in-RAM function is not available. |
||||||
|
* @retval #kStatus_FTFx_AccessError Invalid instruction codes and out-of bounds addresses. |
||||||
|
* @retval #kStatus_FTFx_ProtectionViolation The program/erase operation is requested to execute on protected areas. |
||||||
|
* @retval #kStatus_FTFx_CommandFailure Run-time error during command execution. |
||||||
|
* @retval #kStatus_FTFx_PartitionStatusUpdateFailure Failed to update the partition status. |
||||||
|
*/ |
||||||
|
status_t FLASH_EraseAll(flash_config_t *config, uint32_t key); |
||||||
|
|
||||||
|
#if defined(FSL_FEATURE_FLASH_HAS_ERASE_ALL_BLOCKS_UNSECURE_CMD) && FSL_FEATURE_FLASH_HAS_ERASE_ALL_BLOCKS_UNSECURE_CMD |
||||||
|
/*!
|
||||||
|
* @brief Erases the entire flexnvm, including protected sectors. |
||||||
|
* |
||||||
|
* @param config Pointer to the storage for the driver runtime state. |
||||||
|
* @param key A value used to validate all flash erase APIs. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_Success API was executed successfully; |
||||||
|
* the protected sectors of flash were reset to unprotected status. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_InvalidArgument An invalid argument is provided. |
||||||
|
* @retval #kStatus_FTFx_EraseKeyError API erase key is invalid. |
||||||
|
* @retval #kStatus_FTFx_ExecuteInRamFunctionNotReady Execute-in-RAM function is not available. |
||||||
|
* @retval #kStatus_FTFx_AccessError Invalid instruction codes and out-of bounds addresses. |
||||||
|
* @retval #kStatus_FTFx_ProtectionViolation The program/erase operation is requested to execute on protected areas. |
||||||
|
* @retval #kStatus_FTFx_CommandFailure Run-time error during command execution. |
||||||
|
* @retval #kStatus_FTFx_PartitionStatusUpdateFailure Failed to update the partition status. |
||||||
|
*/ |
||||||
|
status_t FLASH_EraseAllUnsecure(flash_config_t *config, uint32_t key); |
||||||
|
#endif /* FSL_FEATURE_FLASH_HAS_ERASE_ALL_BLOCKS_UNSECURE_CMD */ |
||||||
|
|
||||||
|
/*@}*/ |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @name Programming |
||||||
|
* @{ |
||||||
|
*/ |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Programs flash with data at locations passed in through parameters. |
||||||
|
* |
||||||
|
* This function programs the flash memory with the desired data for a given |
||||||
|
* flash area as determined by the start address and the length. |
||||||
|
* |
||||||
|
* @param config A pointer to the storage for the driver runtime state. |
||||||
|
* @param start The start address of the desired flash memory to be programmed. Must be |
||||||
|
* word-aligned. |
||||||
|
* @param src A pointer to the source buffer of data that is to be programmed |
||||||
|
* into the flash. |
||||||
|
* @param lengthInBytes The length, given in bytes (not words or long-words), |
||||||
|
* to be programmed. Must be word-aligned. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_Success API was executed successfully; the desired data were programed successfully |
||||||
|
* into flash based on desired start address and length. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_InvalidArgument An invalid argument is provided. |
||||||
|
* @retval #kStatus_FTFx_AlignmentError Parameter is not aligned with the specified baseline. |
||||||
|
* @retval #kStatus_FTFx_AddressError Address is out of range. |
||||||
|
* @retval #kStatus_FTFx_ExecuteInRamFunctionNotReady Execute-in-RAM function is not available. |
||||||
|
* @retval #kStatus_FTFx_AccessError Invalid instruction codes and out-of bounds addresses. |
||||||
|
* @retval #kStatus_FTFx_ProtectionViolation The program/erase operation is requested to execute on protected areas. |
||||||
|
* @retval #kStatus_FTFx_CommandFailure Run-time error during the command execution. |
||||||
|
*/ |
||||||
|
status_t FLASH_Program(flash_config_t *config, uint32_t start, uint8_t *src, uint32_t lengthInBytes); |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Program the Program-Once-Field through parameters. |
||||||
|
* |
||||||
|
* This function Program the Program-once-feild with given index and length. |
||||||
|
* |
||||||
|
* @param config A pointer to the storage for the driver runtime state. |
||||||
|
* @param index The index indicating the area of program once field to be read. |
||||||
|
* @param src A pointer to the source buffer of data that is used to store |
||||||
|
* data to be write. |
||||||
|
* @param lengthInBytes The length, given in bytes (not words or long-words), |
||||||
|
* to be programmed. Must be word-aligned. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_Success API was executed successfully; The index indicating the area |
||||||
|
* of program once field was programed successfully. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_InvalidArgument An invalid argument is provided. |
||||||
|
* @retval #kStatus_FTFx_ExecuteInRamFunctionNotReady Execute-in-RAM function is not available. |
||||||
|
* @retval #kStatus_FTFx_AccessError Invalid instruction codes and out-of bounds addresses. |
||||||
|
* @retval #kStatus_FTFx_ProtectionViolation The program/erase operation is requested to execute on protected areas. |
||||||
|
* @retval #kStatus_FTFx_CommandFailure Run-time error during the command execution. |
||||||
|
*/ |
||||||
|
status_t FLASH_ProgramOnce(flash_config_t *config, uint32_t index, uint8_t *src, uint32_t lengthInBytes); |
||||||
|
|
||||||
|
#if defined(FSL_FEATURE_FLASH_HAS_PROGRAM_SECTION_CMD) && FSL_FEATURE_FLASH_HAS_PROGRAM_SECTION_CMD |
||||||
|
/*!
|
||||||
|
* @brief Programs flash with data at locations passed in through parameters via the Program Section command. |
||||||
|
* |
||||||
|
* This function programs the flash memory with the desired data for a given |
||||||
|
* flash area as determined by the start address and length. |
||||||
|
* |
||||||
|
* @param config A pointer to the storage for the driver runtime state. |
||||||
|
* @param start The start address of the desired flash memory to be programmed. Must be |
||||||
|
* word-aligned. |
||||||
|
* @param src A pointer to the source buffer of data that is to be programmed |
||||||
|
* into the flash. |
||||||
|
* @param lengthInBytes The length, given in bytes (not words or long-words), |
||||||
|
* to be programmed. Must be word-aligned. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_Success API was executed successfully; the desired data have been programed successfully into |
||||||
|
* flash based on start address and length. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_InvalidArgument An invalid argument is provided. |
||||||
|
* @retval #kStatus_FTFx_AlignmentError Parameter is not aligned with specified baseline. |
||||||
|
* @retval #kStatus_FTFx_AddressError Address is out of range. |
||||||
|
* @retval #kStatus_FTFx_SetFlexramAsRamError Failed to set flexram as RAM. |
||||||
|
* @retval #kStatus_FTFx_ExecuteInRamFunctionNotReady Execute-in-RAM function is not available. |
||||||
|
* @retval #kStatus_FTFx_AccessError Invalid instruction codes and out-of bounds addresses. |
||||||
|
* @retval #kStatus_FTFx_ProtectionViolation The program/erase operation is requested to execute on protected areas. |
||||||
|
* @retval #kStatus_FTFx_CommandFailure Run-time error during command execution. |
||||||
|
* @retval #kStatus_FTFx_RecoverFlexramAsEepromError Failed to recover FlexRAM as EEPROM. |
||||||
|
*/ |
||||||
|
status_t FLASH_ProgramSection(flash_config_t *config, uint32_t start, uint8_t *src, uint32_t lengthInBytes); |
||||||
|
#endif /* FSL_FEATURE_FLASH_HAS_PROGRAM_SECTION_CMD */ |
||||||
|
|
||||||
|
/*@}*/ |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @name Reading |
||||||
|
* @{ |
||||||
|
*/ |
||||||
|
|
||||||
|
#if defined(FSL_FEATURE_FLASH_HAS_READ_RESOURCE_CMD) && FSL_FEATURE_FLASH_HAS_READ_RESOURCE_CMD |
||||||
|
/*!
|
||||||
|
* @brief Reads the resource with data at locations passed in through parameters. |
||||||
|
* |
||||||
|
* This function reads the flash memory with the desired location for a given |
||||||
|
* flash area as determined by the start address and length. |
||||||
|
* |
||||||
|
* @param config A pointer to the storage for the driver runtime state. |
||||||
|
* @param start The start address of the desired flash memory to be programmed. Must be |
||||||
|
* word-aligned. |
||||||
|
* @param dst A pointer to the destination buffer of data that is used to store |
||||||
|
* data to be read. |
||||||
|
* @param lengthInBytes The length, given in bytes (not words or long-words), |
||||||
|
* to be read. Must be word-aligned. |
||||||
|
* @param option The resource option which indicates which area should be read back. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_Success API was executed successfully; the data have been read successfully from |
||||||
|
* program flash IFR, data flash IFR space, and the Version ID field. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_InvalidArgument An invalid argument is provided. |
||||||
|
* @retval #kStatus_FTFx_AlignmentError Parameter is not aligned with the specified baseline. |
||||||
|
* @retval #kStatus_FTFx_ExecuteInRamFunctionNotReady Execute-in-RAM function is not available. |
||||||
|
* @retval #kStatus_FTFx_AccessError Invalid instruction codes and out-of bounds addresses. |
||||||
|
* @retval #kStatus_FTFx_ProtectionViolation The program/erase operation is requested to execute on protected areas. |
||||||
|
* @retval #kStatus_FTFx_CommandFailure Run-time error during the command execution. |
||||||
|
*/ |
||||||
|
status_t FLASH_ReadResource( |
||||||
|
flash_config_t *config, uint32_t start, uint8_t *dst, uint32_t lengthInBytes, ftfx_read_resource_opt_t option); |
||||||
|
#endif /* FSL_FEATURE_FLASH_HAS_READ_RESOURCE_CMD */ |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Reads the Program Once Field through parameters. |
||||||
|
* |
||||||
|
* This function reads the read once feild with given index and length. |
||||||
|
* |
||||||
|
* @param config A pointer to the storage for the driver runtime state. |
||||||
|
* @param index The index indicating the area of program once field to be read. |
||||||
|
* @param dst A pointer to the destination buffer of data that is used to store |
||||||
|
* data to be read. |
||||||
|
* @param lengthInBytes The length, given in bytes (not words or long-words), |
||||||
|
* to be programmed. Must be word-aligned. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_Success API was executed successfully; the data have been successfuly |
||||||
|
* read form Program flash0 IFR map and Program Once field based on index and length. |
||||||
|
|
||||||
|
* @retval #kStatus_FTFx_InvalidArgument An invalid argument is provided. |
||||||
|
* @retval #kStatus_FTFx_ExecuteInRamFunctionNotReady Execute-in-RAM function is not available. |
||||||
|
* @retval #kStatus_FTFx_AccessError Invalid instruction codes and out-of bounds addresses. |
||||||
|
* @retval #kStatus_FTFx_ProtectionViolation The program/erase operation is requested to execute on protected areas. |
||||||
|
* @retval #kStatus_FTFx_CommandFailure Run-time error during the command execution. |
||||||
|
*/ |
||||||
|
status_t FLASH_ReadOnce(flash_config_t *config, uint32_t index, uint8_t *dst, uint32_t lengthInBytes); |
||||||
|
|
||||||
|
/*@}*/ |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @name Verification |
||||||
|
* @{ |
||||||
|
*/ |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Verifies an erasure of the desired flash area at a specified margin level. |
||||||
|
* |
||||||
|
* This function checks the appropriate number of flash sectors based on |
||||||
|
* the desired start address and length to check whether the flash is erased |
||||||
|
* to the specified read margin level. |
||||||
|
* |
||||||
|
* @param config A pointer to the storage for the driver runtime state. |
||||||
|
* @param start The start address of the desired flash memory to be verified. |
||||||
|
* The start address does not need to be sector-aligned but must be word-aligned. |
||||||
|
* @param lengthInBytes The length, given in bytes (not words or long-words), |
||||||
|
* to be verified. Must be word-aligned. |
||||||
|
* @param margin Read margin choice. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_Success API was executed successfully; the specified FLASH region has been erased. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_InvalidArgument An invalid argument is provided. |
||||||
|
* @retval #kStatus_FTFx_AlignmentError Parameter is not aligned with specified baseline. |
||||||
|
* @retval #kStatus_FTFx_AddressError Address is out of range. |
||||||
|
* @retval #kStatus_FTFx_ExecuteInRamFunctionNotReady Execute-in-RAM function is not available. |
||||||
|
* @retval #kStatus_FTFx_AccessError Invalid instruction codes and out-of bounds addresses. |
||||||
|
* @retval #kStatus_FTFx_ProtectionViolation The program/erase operation is requested to execute on protected areas. |
||||||
|
* @retval #kStatus_FTFx_CommandFailure Run-time error during the command execution. |
||||||
|
*/ |
||||||
|
status_t FLASH_VerifyErase(flash_config_t *config, uint32_t start, uint32_t lengthInBytes, ftfx_margin_value_t margin); |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Verifies erasure of the entire flash at a specified margin level. |
||||||
|
* |
||||||
|
* This function checks whether the flash is erased to the |
||||||
|
* specified read margin level. |
||||||
|
* |
||||||
|
* @param config A pointer to the storage for the driver runtime state. |
||||||
|
* @param margin Read margin choice. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_Success API was executed successfully; all program flash and flexnvm were in erased state. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_InvalidArgument An invalid argument is provided. |
||||||
|
* @retval #kStatus_FTFx_ExecuteInRamFunctionNotReady Execute-in-RAM function is not available. |
||||||
|
* @retval #kStatus_FTFx_AccessError Invalid instruction codes and out-of bounds addresses. |
||||||
|
* @retval #kStatus_FTFx_ProtectionViolation The program/erase operation is requested to execute on protected areas. |
||||||
|
* @retval #kStatus_FTFx_CommandFailure Run-time error during the command execution. |
||||||
|
*/ |
||||||
|
status_t FLASH_VerifyEraseAll(flash_config_t *config, ftfx_margin_value_t margin); |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Verifies programming of the desired flash area at a specified margin level. |
||||||
|
* |
||||||
|
* This function verifies the data programmed in the flash memory using the |
||||||
|
* Flash Program Check Command and compares it to the expected data for a given |
||||||
|
* flash area as determined by the start address and length. |
||||||
|
* |
||||||
|
* @param config A pointer to the storage for the driver runtime state. |
||||||
|
* @param start The start address of the desired flash memory to be verified. Must be word-aligned. |
||||||
|
* @param lengthInBytes The length, given in bytes (not words or long-words), |
||||||
|
* to be verified. Must be word-aligned. |
||||||
|
* @param expectedData A pointer to the expected data that is to be |
||||||
|
* verified against. |
||||||
|
* @param margin Read margin choice. |
||||||
|
* @param failedAddress A pointer to the returned failing address. |
||||||
|
* @param failedData A pointer to the returned failing data. Some derivatives do |
||||||
|
* not include failed data as part of the FCCOBx registers. In this |
||||||
|
* case, zeros are returned upon failure. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_Success API was executed successfully; the desired data have been successfully programed into |
||||||
|
* specified FLASH region. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_InvalidArgument An invalid argument is provided. |
||||||
|
* @retval #kStatus_FTFx_AlignmentError Parameter is not aligned with specified baseline. |
||||||
|
* @retval #kStatus_FTFx_AddressError Address is out of range. |
||||||
|
* @retval #kStatus_FTFx_ExecuteInRamFunctionNotReady Execute-in-RAM function is not available. |
||||||
|
* @retval #kStatus_FTFx_AccessError Invalid instruction codes and out-of bounds addresses. |
||||||
|
* @retval #kStatus_FTFx_ProtectionViolation The program/erase operation is requested to execute on protected areas. |
||||||
|
* @retval #kStatus_FTFx_CommandFailure Run-time error during the command execution. |
||||||
|
*/ |
||||||
|
status_t FLASH_VerifyProgram(flash_config_t *config, |
||||||
|
uint32_t start, |
||||||
|
uint32_t lengthInBytes, |
||||||
|
const uint8_t *expectedData, |
||||||
|
ftfx_margin_value_t margin, |
||||||
|
uint32_t *failedAddress, |
||||||
|
uint32_t *failedData); |
||||||
|
|
||||||
|
/*@}*/ |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @name Security |
||||||
|
* @{ |
||||||
|
*/ |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Returns the security state via the pointer passed into the function. |
||||||
|
* |
||||||
|
* This function retrieves the current flash security status, including the |
||||||
|
* security enabling state and the backdoor key enabling state. |
||||||
|
* |
||||||
|
* @param config A pointer to storage for the driver runtime state. |
||||||
|
* @param state A pointer to the value returned for the current security status code: |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_Success API was executed successfully; the security state of flash was stored to state. |
||||||
|
* @retval #kStatus_FTFx_InvalidArgument An invalid argument is provided. |
||||||
|
*/ |
||||||
|
status_t FLASH_GetSecurityState(flash_config_t *config, ftfx_security_state_t *state); |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Allows users to bypass security with a backdoor key. |
||||||
|
* |
||||||
|
* If the MCU is in secured state, this function unsecures the MCU by |
||||||
|
* comparing the provided backdoor key with ones in the flash configuration |
||||||
|
* field. |
||||||
|
* |
||||||
|
* @param config A pointer to the storage for the driver runtime state. |
||||||
|
* @param backdoorKey A pointer to the user buffer containing the backdoor key. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_Success API was executed successfully. |
||||||
|
* @retval #kStatus_FTFx_InvalidArgument An invalid argument is provided. |
||||||
|
* @retval #kStatus_FTFx_ExecuteInRamFunctionNotReady Execute-in-RAM function is not available. |
||||||
|
* @retval #kStatus_FTFx_AccessError Invalid instruction codes and out-of bounds addresses. |
||||||
|
* @retval #kStatus_FTFx_ProtectionViolation The program/erase operation is requested to execute on protected areas. |
||||||
|
* @retval #kStatus_FTFx_CommandFailure Run-time error during the command execution. |
||||||
|
*/ |
||||||
|
status_t FLASH_SecurityBypass(flash_config_t *config, const uint8_t *backdoorKey); |
||||||
|
|
||||||
|
/*@}*/ |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @name FlexRAM |
||||||
|
* @{ |
||||||
|
*/ |
||||||
|
|
||||||
|
#if defined(FSL_FEATURE_FLASH_HAS_SET_FLEXRAM_FUNCTION_CMD) && FSL_FEATURE_FLASH_HAS_SET_FLEXRAM_FUNCTION_CMD |
||||||
|
/*!
|
||||||
|
* @brief Sets the FlexRAM function command. |
||||||
|
* |
||||||
|
* @param config A pointer to the storage for the driver runtime state. |
||||||
|
* @param option The option used to set the work mode of FlexRAM. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_Success API was executed successfully; the FlexRAM has been successfully configured as RAM or |
||||||
|
* EEPROM. |
||||||
|
* @retval #kStatus_FTFx_InvalidArgument An invalid argument is provided. |
||||||
|
* @retval #kStatus_FTFx_ExecuteInRamFunctionNotReady Execute-in-RAM function is not available. |
||||||
|
* @retval #kStatus_FTFx_AccessError Invalid instruction codes and out-of bounds addresses. |
||||||
|
* @retval #kStatus_FTFx_ProtectionViolation The program/erase operation is requested to execute on protected areas. |
||||||
|
* @retval #kStatus_FTFx_CommandFailure Run-time error during the command execution. |
||||||
|
*/ |
||||||
|
status_t FLASH_SetFlexramFunction(flash_config_t *config, ftfx_flexram_func_opt_t option); |
||||||
|
#endif /* FSL_FEATURE_FLASH_HAS_SET_FLEXRAM_FUNCTION_CMD */ |
||||||
|
|
||||||
|
/*@}*/ |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @name Swap |
||||||
|
* @{ |
||||||
|
*/ |
||||||
|
|
||||||
|
#if defined(FSL_FEATURE_FLASH_HAS_PFLASH_BLOCK_SWAP) && FSL_FEATURE_FLASH_HAS_PFLASH_BLOCK_SWAP |
||||||
|
/*!
|
||||||
|
* @brief Swaps the lower half flash with the higher half flash. |
||||||
|
* |
||||||
|
* @param config A pointer to the storage for the driver runtime state. |
||||||
|
* @param address Address used to configure the flash swap function |
||||||
|
* @param isSetEnable The possible option used to configure the Flash Swap function or check the flash Swap status. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_Success API was executed successfully; the lower half flash and higher half flash have been |
||||||
|
* swaped. |
||||||
|
* @retval #kStatus_FTFx_InvalidArgument An invalid argument is provided. |
||||||
|
* @retval #kStatus_FTFx_AlignmentError Parameter is not aligned with specified baseline. |
||||||
|
* @retval #kStatus_FTFx_SwapIndicatorAddressError Swap indicator address is invalid. |
||||||
|
* @retval #kStatus_FTFx_ExecuteInRamFunctionNotReady Execute-in-RAM function is not available. |
||||||
|
* @retval #kStatus_FTFx_AccessError Invalid instruction codes and out-of bounds addresses. |
||||||
|
* @retval #kStatus_FTFx_ProtectionViolation The program/erase operation is requested to execute on protected areas. |
||||||
|
* @retval #kStatus_FTFx_CommandFailure Run-time error during command execution. |
||||||
|
* @retval #kStatus_FTFx_SwapSystemNotInUninitialized Swap system is not in an uninitialized state. |
||||||
|
*/ |
||||||
|
status_t FLASH_Swap(flash_config_t *config, uint32_t address, bool isSetEnable); |
||||||
|
#endif /* FSL_FEATURE_FLASH_HAS_PFLASH_BLOCK_SWAP */ |
||||||
|
|
||||||
|
/*@}*/ |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @name Protection |
||||||
|
* @{ |
||||||
|
*/ |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Returns the protection state of the desired flash area via the pointer passed into the function. |
||||||
|
* |
||||||
|
* This function retrieves the current flash protect status for a given |
||||||
|
* flash area as determined by the start address and length. |
||||||
|
* |
||||||
|
* @param config A pointer to the storage for the driver runtime state. |
||||||
|
* @param start The start address of the desired flash memory to be checked. Must be word-aligned. |
||||||
|
* @param lengthInBytes The length, given in bytes (not words or long-words) |
||||||
|
* to be checked. Must be word-aligned. |
||||||
|
* @param protection_state A pointer to the value returned for the current |
||||||
|
* protection status code for the desired flash area. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_Success API was executed successfully; the protection state of specified FLASH region was |
||||||
|
* stored to protection_state. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_InvalidArgument An invalid argument is provided. |
||||||
|
* @retval #kStatus_FTFx_AlignmentError Parameter is not aligned with specified baseline. |
||||||
|
* @retval #kStatus_FTFx_AddressError The address is out of range. |
||||||
|
*/ |
||||||
|
status_t FLASH_IsProtected(flash_config_t *config, |
||||||
|
uint32_t start, |
||||||
|
uint32_t lengthInBytes, |
||||||
|
flash_prot_state_t *protection_state); |
||||||
|
|
||||||
|
#if defined(FSL_FEATURE_FLASH_HAS_ACCESS_CONTROL) && FSL_FEATURE_FLASH_HAS_ACCESS_CONTROL |
||||||
|
/*!
|
||||||
|
* @brief Returns the access state of the desired flash area via the pointer passed into the function. |
||||||
|
* |
||||||
|
* This function retrieves the current flash access status for a given |
||||||
|
* flash area as determined by the start address and length. |
||||||
|
* |
||||||
|
* @param config A pointer to the storage for the driver runtime state. |
||||||
|
* @param start The start address of the desired flash memory to be checked. Must be word-aligned. |
||||||
|
* @param lengthInBytes The length, given in bytes (not words or long-words), |
||||||
|
* to be checked. Must be word-aligned. |
||||||
|
* @param access_state A pointer to the value returned for the current |
||||||
|
* access status code for the desired flash area. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_Success API was executed successfully; the executeOnly state of specified FLASH region was |
||||||
|
* stored to access_state. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_InvalidArgument An invalid argument is provided. |
||||||
|
* @retval #kStatus_FTFx_AlignmentError The parameter is not aligned to the specified baseline. |
||||||
|
* @retval #kStatus_FTFx_AddressError The address is out of range. |
||||||
|
*/ |
||||||
|
status_t FLASH_IsExecuteOnly(flash_config_t *config, |
||||||
|
uint32_t start, |
||||||
|
uint32_t lengthInBytes, |
||||||
|
flash_xacc_state_t *access_state); |
||||||
|
#endif /* FSL_FEATURE_FLASH_HAS_ACCESS_CONTROL */ |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Sets the PFlash Protection to the intended protection status. |
||||||
|
* |
||||||
|
* @param config A pointer to storage for the driver runtime state. |
||||||
|
* @param protectStatus The expected protect status to set to the PFlash protection register. Each bit is |
||||||
|
* corresponding to protection of 1/32(64) of the total PFlash. The least significant bit is corresponding to the lowest |
||||||
|
* address area of PFlash. The most significant bit is corresponding to the highest address area of PFlash. There are |
||||||
|
* two possible cases as shown below: |
||||||
|
* 0: this area is protected. |
||||||
|
* 1: this area is unprotected. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_Success API was executed successfully; the specified FLASH region is protected. |
||||||
|
* @retval #kStatus_FTFx_InvalidArgument An invalid argument is provided. |
||||||
|
* @retval #kStatus_FTFx_CommandFailure Run-time error during command execution. |
||||||
|
*/ |
||||||
|
status_t FLASH_PflashSetProtection(flash_config_t *config, pflash_prot_status_t *protectStatus); |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Gets the PFlash protection status. |
||||||
|
* |
||||||
|
* @param config A pointer to the storage for the driver runtime state. |
||||||
|
* @param protectStatus Protect status returned by the PFlash IP. Each bit is corresponding to the protection of |
||||||
|
* 1/32(64) |
||||||
|
* of the |
||||||
|
* total PFlash. The least significant bit corresponds to the lowest address area of the PFlash. The most significant |
||||||
|
* bit corresponds to the highest address area of PFlash. There are two possible cases as shown below: |
||||||
|
* 0: this area is protected. |
||||||
|
* 1: this area is unprotected. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_Success API was executed successfully; the Protection state was stored to protectStatus; |
||||||
|
* @retval #kStatus_FTFx_InvalidArgument An invalid argument is provided. |
||||||
|
*/ |
||||||
|
status_t FLASH_PflashGetProtection(flash_config_t *config, pflash_prot_status_t *protectStatus); |
||||||
|
|
||||||
|
/*@}*/ |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @name Properties |
||||||
|
* @{ |
||||||
|
*/ |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Returns the desired flash property. |
||||||
|
* |
||||||
|
* @param config A pointer to the storage for the driver runtime state. |
||||||
|
* @param whichProperty The desired property from the list of properties in |
||||||
|
* enum flash_property_tag_t |
||||||
|
* @param value A pointer to the value returned for the desired flash property. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_Success API was executed successfully; the flash property was stored to value. |
||||||
|
* @retval #kStatus_FTFx_InvalidArgument An invalid argument is provided. |
||||||
|
* @retval #kStatus_FTFx_UnknownProperty An unknown property tag. |
||||||
|
*/ |
||||||
|
status_t FLASH_GetProperty(flash_config_t *config, flash_property_tag_t whichProperty, uint32_t *value); |
||||||
|
|
||||||
|
/*@}*/ |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @name commantStatus |
||||||
|
* @{ |
||||||
|
*/ |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Get previous command status. |
||||||
|
* |
||||||
|
* This function is used to obtain the execution status of the previous command. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_Success The previous command is executed successfully. |
||||||
|
* @retval #kStatus_FTFx_ExecuteInRamFunctionNotReady Execute-in-RAM function is not available. |
||||||
|
* @retval #kStatus_FTFx_AccessError Invalid instruction codes and out-of bounds addresses. |
||||||
|
* @retval #kStatus_FTFx_ProtectionViolation The program/erase operation is requested to execute on protected areas. |
||||||
|
* @retval #kStatus_FTFx_CommandFailure Run-time error during the command execution. |
||||||
|
*/ |
||||||
|
status_t FLASH_GetCommandState(void); |
||||||
|
|
||||||
|
/*@}*/ |
||||||
|
|
||||||
|
#if defined(__cplusplus) |
||||||
|
} |
||||||
|
#endif |
||||||
|
|
||||||
|
/*! @}*/ |
||||||
|
|
||||||
|
#endif /* FSL_FTFX_FLASH_H */ |
||||||
@ -0,0 +1,511 @@ |
|||||||
|
/*
|
||||||
|
* Copyright 2013-2016 Freescale Semiconductor, Inc. |
||||||
|
* Copyright 2016-2020 NXP |
||||||
|
* All rights reserved. |
||||||
|
* |
||||||
|
* SPDX-License-Identifier: BSD-3-Clause |
||||||
|
* |
||||||
|
*/ |
||||||
|
|
||||||
|
#include "fsl_ftfx_flexnvm.h" |
||||||
|
|
||||||
|
#if FSL_FEATURE_FLASH_HAS_FLEX_NVM |
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Definitions |
||||||
|
******************************************************************************/ |
||||||
|
|
||||||
|
/* Component ID definition, used by tools. */ |
||||||
|
#ifndef FSL_COMPONENT_ID |
||||||
|
#define FSL_COMPONENT_ID "platform.drivers.flash" |
||||||
|
#endif |
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Prototypes |
||||||
|
******************************************************************************/ |
||||||
|
|
||||||
|
/*! @brief Convert address for Flexnvm dflash.*/ |
||||||
|
static status_t flexnvm_convert_start_address(flexnvm_config_t *config, uint32_t start); |
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Variables |
||||||
|
******************************************************************************/ |
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Code |
||||||
|
******************************************************************************/ |
||||||
|
|
||||||
|
status_t FLEXNVM_Init(flexnvm_config_t *config) |
||||||
|
{ |
||||||
|
status_t returnCode; |
||||||
|
|
||||||
|
if (config == NULL) |
||||||
|
{ |
||||||
|
return kStatus_FTFx_InvalidArgument; |
||||||
|
} |
||||||
|
|
||||||
|
config->ftfxConfig.flashDesc.type = (uint8_t)kFTFx_MemTypeFlexnvm; |
||||||
|
config->ftfxConfig.flashDesc.index = 0U; |
||||||
|
|
||||||
|
/* Set Flexnvm memory operation parameters */ |
||||||
|
config->ftfxConfig.opsConfig.addrAligment.blockWriteUnitSize = FSL_FEATURE_FLASH_FLEX_NVM_BLOCK_WRITE_UNIT_SIZE; |
||||||
|
config->ftfxConfig.opsConfig.addrAligment.sectorCmd = FSL_FEATURE_FLASH_FLEX_NVM_SECTOR_CMD_ADDRESS_ALIGMENT; |
||||||
|
config->ftfxConfig.opsConfig.addrAligment.sectionCmd = FSL_FEATURE_FLASH_FLEX_NVM_SECTION_CMD_ADDRESS_ALIGMENT; |
||||||
|
config->ftfxConfig.opsConfig.addrAligment.resourceCmd = FSL_FEATURE_FLASH_FLEX_NVM_RESOURCE_CMD_ADDRESS_ALIGMENT; |
||||||
|
config->ftfxConfig.opsConfig.addrAligment.checkCmd = FSL_FEATURE_FLASH_FLEX_NVM_CHECK_CMD_ADDRESS_ALIGMENT; |
||||||
|
|
||||||
|
/* Set Flexnvm memory properties */ |
||||||
|
config->ftfxConfig.flashDesc.blockBase = FSL_FEATURE_FLASH_FLEX_NVM_START_ADDRESS; |
||||||
|
#if defined(FSL_FEATURE_FLASH_HAS_FLEX_NVM_ALIAS) && FSL_FEATURE_FLASH_HAS_FLEX_NVM_ALIAS |
||||||
|
config->ftfxConfig.flashDesc.aliasBlockBase = FSL_FEATURE_FLASH_FLEX_NVM_ALIAS_START_ADDRESS; |
||||||
|
#endif |
||||||
|
config->ftfxConfig.flashDesc.sectorSize = FSL_FEATURE_FLASH_FLEX_NVM_BLOCK_SECTOR_SIZE; |
||||||
|
config->ftfxConfig.flashDesc.blockCount = FSL_FEATURE_FLASH_FLEX_NVM_BLOCK_COUNT; |
||||||
|
|
||||||
|
/* Init FTFx Kernel */ |
||||||
|
FTFx_API_Init(&config->ftfxConfig); |
||||||
|
|
||||||
|
returnCode = FTFx_API_UpdateFlexnvmPartitionStatus(&config->ftfxConfig); |
||||||
|
if (returnCode != kStatus_FTFx_Success) |
||||||
|
{ |
||||||
|
return returnCode; |
||||||
|
} |
||||||
|
|
||||||
|
return kStatus_FTFx_Success; |
||||||
|
} |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Erases the Dflash sectors encompassed by parameters passed into function. |
||||||
|
*/ |
||||||
|
status_t FLEXNVM_DflashErase(flexnvm_config_t *config, uint32_t start, uint32_t lengthInBytes, uint32_t key) |
||||||
|
{ |
||||||
|
status_t returnCode; |
||||||
|
returnCode = flexnvm_convert_start_address(config, start); |
||||||
|
if (returnCode != kStatus_FTFx_Success) |
||||||
|
{ |
||||||
|
return returnCode; |
||||||
|
} |
||||||
|
|
||||||
|
return FTFx_CMD_Erase(&config->ftfxConfig, start, lengthInBytes, key); |
||||||
|
} |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Erases entire flexnvm |
||||||
|
*/ |
||||||
|
status_t FLEXNVM_EraseAll(flexnvm_config_t *config, uint32_t key) |
||||||
|
{ |
||||||
|
return FTFx_CMD_EraseAll(&config->ftfxConfig, key); |
||||||
|
} |
||||||
|
|
||||||
|
#if defined(FSL_FEATURE_FLASH_HAS_ERASE_ALL_BLOCKS_UNSECURE_CMD) && FSL_FEATURE_FLASH_HAS_ERASE_ALL_BLOCKS_UNSECURE_CMD |
||||||
|
/*!
|
||||||
|
* @brief Erases the entire flexnvm, including protected sectors. |
||||||
|
*/ |
||||||
|
status_t FLEXNVM_EraseAllUnsecure(flexnvm_config_t *config, uint32_t key) |
||||||
|
{ |
||||||
|
return FTFx_CMD_EraseAllUnsecure(&config->ftfxConfig, key); |
||||||
|
} |
||||||
|
#endif /* FSL_FEATURE_FLASH_HAS_ERASE_ALL_BLOCKS_UNSECURE_CMD */ |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Programs flash with data at locations passed in through parameters. |
||||||
|
*/ |
||||||
|
status_t FLEXNVM_DflashProgram(flexnvm_config_t *config, uint32_t start, uint8_t *src, uint32_t lengthInBytes) |
||||||
|
{ |
||||||
|
status_t returnCode; |
||||||
|
returnCode = flexnvm_convert_start_address(config, start); |
||||||
|
if (returnCode != kStatus_FTFx_Success) |
||||||
|
{ |
||||||
|
return returnCode; |
||||||
|
} |
||||||
|
|
||||||
|
return FTFx_CMD_Program(&config->ftfxConfig, start, src, lengthInBytes); |
||||||
|
} |
||||||
|
|
||||||
|
#if defined(FSL_FEATURE_FLASH_HAS_PROGRAM_SECTION_CMD) && FSL_FEATURE_FLASH_HAS_PROGRAM_SECTION_CMD |
||||||
|
/*!
|
||||||
|
* @brief Programs flash with data at locations passed in through parameters via the Program Section command. |
||||||
|
*/ |
||||||
|
status_t FLEXNVM_DflashProgramSection(flexnvm_config_t *config, uint32_t start, uint8_t *src, uint32_t lengthInBytes) |
||||||
|
{ |
||||||
|
status_t returnCode; |
||||||
|
/* Convert address for Flexnvm dflash */ |
||||||
|
returnCode = flexnvm_convert_start_address(config, start); |
||||||
|
if (returnCode != kStatus_FTFx_Success) |
||||||
|
{ |
||||||
|
return returnCode; |
||||||
|
} |
||||||
|
|
||||||
|
return FTFx_CMD_ProgramSection(&config->ftfxConfig, start, src, lengthInBytes); |
||||||
|
} |
||||||
|
#endif /* FSL_FEATURE_FLASH_HAS_PROGRAM_SECTION_CMD */ |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Prepares the FlexNVM block for use as data flash, EEPROM backup, or a combination |
||||||
|
* of both and initializes the FlexRAM. |
||||||
|
*/ |
||||||
|
status_t FLEXNVM_ProgramPartition(flexnvm_config_t *config, |
||||||
|
ftfx_partition_flexram_load_opt_t option, |
||||||
|
uint32_t eepromDataSizeCode, |
||||||
|
uint32_t flexnvmPartitionCode) |
||||||
|
{ |
||||||
|
return FTFx_CMD_ProgramPartition(&config->ftfxConfig, option, eepromDataSizeCode, flexnvmPartitionCode); |
||||||
|
} |
||||||
|
|
||||||
|
#if defined(FSL_FEATURE_FLASH_HAS_READ_RESOURCE_CMD) && FSL_FEATURE_FLASH_HAS_READ_RESOURCE_CMD |
||||||
|
/*!
|
||||||
|
* @brief Reads the resource with data at locations passed in through parameters. |
||||||
|
*/ |
||||||
|
status_t FLEXNVM_ReadResource( |
||||||
|
flexnvm_config_t *config, uint32_t start, uint8_t *dst, uint32_t lengthInBytes, ftfx_read_resource_opt_t option) |
||||||
|
{ |
||||||
|
return FTFx_CMD_ReadResource(&config->ftfxConfig, start, dst, lengthInBytes, option); |
||||||
|
} |
||||||
|
#endif /* FSL_FEATURE_FLASH_HAS_READ_RESOURCE_CMD */ |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Verifies an erasure of the desired flash area at a specified margin level. |
||||||
|
*/ |
||||||
|
status_t FLEXNVM_DflashVerifyErase(flexnvm_config_t *config, |
||||||
|
uint32_t start, |
||||||
|
uint32_t lengthInBytes, |
||||||
|
ftfx_margin_value_t margin) |
||||||
|
{ |
||||||
|
status_t returnCode; |
||||||
|
returnCode = flexnvm_convert_start_address(config, start); |
||||||
|
if (returnCode != kStatus_FTFx_Success) |
||||||
|
{ |
||||||
|
return returnCode; |
||||||
|
} |
||||||
|
|
||||||
|
return FTFx_CMD_VerifyErase(&config->ftfxConfig, start, lengthInBytes, margin); |
||||||
|
} |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Verifies erasure of the entire flash at a specified margin level. |
||||||
|
*/ |
||||||
|
status_t FLEXNVM_VerifyEraseAll(flexnvm_config_t *config, ftfx_margin_value_t margin) |
||||||
|
{ |
||||||
|
return FTFx_CMD_VerifyEraseAll(&config->ftfxConfig, margin); |
||||||
|
} |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Verifies programming of the desired flash area at a specified margin level. |
||||||
|
*/ |
||||||
|
status_t FLEXNVM_DflashVerifyProgram(flexnvm_config_t *config, |
||||||
|
uint32_t start, |
||||||
|
uint32_t lengthInBytes, |
||||||
|
const uint8_t *expectedData, |
||||||
|
ftfx_margin_value_t margin, |
||||||
|
uint32_t *failedAddress, |
||||||
|
uint32_t *failedData) |
||||||
|
{ |
||||||
|
status_t returnCode; |
||||||
|
returnCode = flexnvm_convert_start_address(config, start); |
||||||
|
if (returnCode != kStatus_FTFx_Success) |
||||||
|
{ |
||||||
|
return returnCode; |
||||||
|
} |
||||||
|
|
||||||
|
return FTFx_CMD_VerifyProgram(&config->ftfxConfig, start, lengthInBytes, expectedData, margin, failedAddress, |
||||||
|
failedData); |
||||||
|
} |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Returns the security state via the pointer passed into the function. |
||||||
|
*/ |
||||||
|
status_t FLEXNVM_GetSecurityState(flexnvm_config_t *config, ftfx_security_state_t *state) |
||||||
|
{ |
||||||
|
return FTFx_REG_GetSecurityState(&config->ftfxConfig, state); |
||||||
|
} |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Allows users to bypass security with a backdoor key. |
||||||
|
*/ |
||||||
|
status_t FLEXNVM_SecurityBypass(flexnvm_config_t *config, const uint8_t *backdoorKey) |
||||||
|
{ |
||||||
|
return FTFx_CMD_SecurityBypass(&config->ftfxConfig, backdoorKey); |
||||||
|
} |
||||||
|
|
||||||
|
#if defined(FSL_FEATURE_FLASH_HAS_SET_FLEXRAM_FUNCTION_CMD) && FSL_FEATURE_FLASH_HAS_SET_FLEXRAM_FUNCTION_CMD |
||||||
|
/*!
|
||||||
|
* @brief Sets the FlexRAM function command. |
||||||
|
*/ |
||||||
|
status_t FLEXNVM_SetFlexramFunction(flexnvm_config_t *config, ftfx_flexram_func_opt_t option) |
||||||
|
{ |
||||||
|
return FTFx_CMD_SetFlexramFunction(&config->ftfxConfig, option); |
||||||
|
} |
||||||
|
#endif /* FSL_FEATURE_FLASH_HAS_SET_FLEXRAM_FUNCTION_CMD */ |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Programs the EEPROM with data at locations passed in through parameters. |
||||||
|
*/ |
||||||
|
status_t FLEXNVM_EepromWrite(flexnvm_config_t *config, uint32_t start, uint8_t *src, uint32_t lengthInBytes) |
||||||
|
{ |
||||||
|
status_t returnCode; |
||||||
|
bool needSwitchFlexRamMode = false; |
||||||
|
|
||||||
|
if (config == NULL) |
||||||
|
{ |
||||||
|
return kStatus_FTFx_InvalidArgument; |
||||||
|
} |
||||||
|
|
||||||
|
/* Validates the range of the given address */ |
||||||
|
if ((start < config->ftfxConfig.flexramBlockBase) || |
||||||
|
((start + lengthInBytes) > (config->ftfxConfig.flexramBlockBase + config->ftfxConfig.eepromTotalSize))) |
||||||
|
{ |
||||||
|
return kStatus_FTFx_AddressError; |
||||||
|
} |
||||||
|
|
||||||
|
returnCode = kStatus_FTFx_Success; |
||||||
|
|
||||||
|
/* Switch function of FlexRAM if needed */ |
||||||
|
if (0U == (FTFx->FCNFG & FTFx_FCNFG_EEERDY_MASK)) |
||||||
|
{ |
||||||
|
needSwitchFlexRamMode = true; |
||||||
|
|
||||||
|
returnCode = FTFx_CMD_SetFlexramFunction(&config->ftfxConfig, kFTFx_FlexramFuncOptAvailableForEeprom); |
||||||
|
if (returnCode != kStatus_FTFx_Success) |
||||||
|
{ |
||||||
|
return kStatus_FTFx_SetFlexramAsEepromError; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/* Write data to FlexRAM when it is used as EEPROM emulator */ |
||||||
|
while (lengthInBytes > 0U) |
||||||
|
{ |
||||||
|
if ((0U == (start & 0x3U)) && (0U == ((uint32_t)src & 0x3U)) && (lengthInBytes >= 4U)) |
||||||
|
{ |
||||||
|
*(uint32_t *)start = *(uint32_t *)(uint32_t)src; |
||||||
|
start += 4U; |
||||||
|
src = &src[4]; |
||||||
|
lengthInBytes -= 4U; |
||||||
|
} |
||||||
|
else if ((0U == (start & 0x1U)) && (0U == ((uint32_t)src & 0x1U)) && (lengthInBytes >= 2U)) |
||||||
|
{ |
||||||
|
*(uint16_t *)start = *(uint16_t *)(uint32_t)src; |
||||||
|
start += 2U; |
||||||
|
src = &src[2]; |
||||||
|
lengthInBytes -= 2U; |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
*(uint8_t *)start = *src; |
||||||
|
start += 1U; |
||||||
|
src = &src[1]; |
||||||
|
lengthInBytes -= 1U; |
||||||
|
} |
||||||
|
/* Wait till EEERDY bit is set */ |
||||||
|
while (0U == (FTFx->FCNFG & FTFx_FCNFG_EEERDY_MASK)) |
||||||
|
{ |
||||||
|
} |
||||||
|
|
||||||
|
/* Check for protection violation error */ |
||||||
|
if (0U != (FTFx->FSTAT & FTFx_FSTAT_FPVIOL_MASK)) |
||||||
|
{ |
||||||
|
return kStatus_FTFx_ProtectionViolation; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/* Switch function of FlexRAM if needed */ |
||||||
|
if (needSwitchFlexRamMode) |
||||||
|
{ |
||||||
|
returnCode = FTFx_CMD_SetFlexramFunction(&config->ftfxConfig, kFTFx_FlexramFuncOptAvailableAsRam); |
||||||
|
if (returnCode != kStatus_FTFx_Success) |
||||||
|
{ |
||||||
|
return kStatus_FTFx_RecoverFlexramAsRamError; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
return returnCode; |
||||||
|
} |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Sets the DFlash protection to the intended protection status. |
||||||
|
*/ |
||||||
|
status_t FLEXNVM_DflashSetProtection(flexnvm_config_t *config, uint8_t protectStatus) |
||||||
|
{ |
||||||
|
if (config == NULL) |
||||||
|
{ |
||||||
|
return kStatus_FTFx_InvalidArgument; |
||||||
|
} |
||||||
|
|
||||||
|
if ((config->ftfxConfig.flashDesc.totalSize == 0U) || (config->ftfxConfig.flashDesc.totalSize == 0xFFFFFFFFU)) |
||||||
|
{ |
||||||
|
return kStatus_FTFx_CommandNotSupported; |
||||||
|
} |
||||||
|
|
||||||
|
/* Individual data flash regions will be protected from program and erase operations by setting the
|
||||||
|
* associated DPROT bit to the protected state. Each FDPROT bit only be changed from 1s to 0s, |
||||||
|
* meaning the protection can only be increased */ |
||||||
|
FTFx->FDPROT = protectStatus; |
||||||
|
|
||||||
|
if (FTFx->FDPROT != protectStatus) |
||||||
|
{ |
||||||
|
return kStatus_FTFx_CommandFailure; |
||||||
|
} |
||||||
|
|
||||||
|
return kStatus_FTFx_Success; |
||||||
|
} |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Gets the DFlash protection status. |
||||||
|
*/ |
||||||
|
status_t FLEXNVM_DflashGetProtection(flexnvm_config_t *config, uint8_t *protectStatus) |
||||||
|
{ |
||||||
|
if ((config == NULL) || (protectStatus == NULL)) |
||||||
|
{ |
||||||
|
return kStatus_FTFx_InvalidArgument; |
||||||
|
} |
||||||
|
|
||||||
|
if ((config->ftfxConfig.flashDesc.totalSize == 0U) || (config->ftfxConfig.flashDesc.totalSize == 0xFFFFFFFFU)) |
||||||
|
{ |
||||||
|
return kStatus_FTFx_CommandNotSupported; |
||||||
|
} |
||||||
|
|
||||||
|
/* return the flexnvm DFlash protection status */ |
||||||
|
*protectStatus = FTFx->FDPROT; |
||||||
|
|
||||||
|
return kStatus_FTFx_Success; |
||||||
|
} |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Sets the EEPROM protection to the intended protection status. |
||||||
|
*/ |
||||||
|
status_t FLEXNVM_EepromSetProtection(flexnvm_config_t *config, uint8_t protectStatus) |
||||||
|
{ |
||||||
|
if (config == NULL) |
||||||
|
{ |
||||||
|
return kStatus_FTFx_InvalidArgument; |
||||||
|
} |
||||||
|
|
||||||
|
if ((config->ftfxConfig.eepromTotalSize == 0U) || (config->ftfxConfig.eepromTotalSize == 0xFFFFU)) |
||||||
|
{ |
||||||
|
return kStatus_FTFx_CommandNotSupported; |
||||||
|
} |
||||||
|
/* Individual data flash regions will be protected from program and erase operations by setting the
|
||||||
|
* associated FEPROT bit to the protected state; Each FEPROT bit only be changed from 1s to 0s, |
||||||
|
* meaning the protection can only be increased. */ |
||||||
|
FTFx->FEPROT = protectStatus; |
||||||
|
|
||||||
|
if (FTFx->FEPROT != protectStatus) |
||||||
|
{ |
||||||
|
return kStatus_FTFx_CommandFailure; |
||||||
|
} |
||||||
|
|
||||||
|
return kStatus_FTFx_Success; |
||||||
|
} |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Gets the EEPROM protection status. |
||||||
|
*/ |
||||||
|
status_t FLEXNVM_EepromGetProtection(flexnvm_config_t *config, uint8_t *protectStatus) |
||||||
|
{ |
||||||
|
if ((config == NULL) || (protectStatus == NULL)) |
||||||
|
{ |
||||||
|
return kStatus_FTFx_InvalidArgument; |
||||||
|
} |
||||||
|
|
||||||
|
if ((config->ftfxConfig.eepromTotalSize == 0U) || (config->ftfxConfig.eepromTotalSize == 0xFFFFU)) |
||||||
|
{ |
||||||
|
return kStatus_FTFx_CommandNotSupported; |
||||||
|
} |
||||||
|
|
||||||
|
/* return EEPROM protection status */ |
||||||
|
*protectStatus = FTFx->FEPROT; |
||||||
|
|
||||||
|
return kStatus_FTFx_Success; |
||||||
|
} |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Returns the desired flexnvm property. |
||||||
|
*/ |
||||||
|
status_t FLEXNVM_GetProperty(flexnvm_config_t *config, flexnvm_property_tag_t whichProperty, uint32_t *value) |
||||||
|
{ |
||||||
|
if ((config == NULL) || (value == NULL)) |
||||||
|
{ |
||||||
|
return kStatus_FTFx_InvalidArgument; |
||||||
|
} |
||||||
|
|
||||||
|
status_t status = kStatus_FTFx_Success; |
||||||
|
|
||||||
|
switch (whichProperty) |
||||||
|
{ |
||||||
|
/* get flexnvm date flash sector size */ |
||||||
|
case kFLEXNVM_PropertyDflashSectorSize: |
||||||
|
*value = config->ftfxConfig.flashDesc.sectorSize; |
||||||
|
break; |
||||||
|
/* get flexnvm date flash total size */ |
||||||
|
case kFLEXNVM_PropertyDflashTotalSize: |
||||||
|
*value = config->ftfxConfig.flashDesc.totalSize; |
||||||
|
break; |
||||||
|
/* get flexnvm date flash block size */ |
||||||
|
case kFLEXNVM_PropertyDflashBlockSize: |
||||||
|
*value = config->ftfxConfig.flashDesc.totalSize / config->ftfxConfig.flashDesc.blockCount; |
||||||
|
break; |
||||||
|
/* get flexnvm date flash block cont */ |
||||||
|
case kFLEXNVM_PropertyDflashBlockCount: |
||||||
|
*value = config->ftfxConfig.flashDesc.blockCount; |
||||||
|
break; |
||||||
|
/* get flexnvm date flash block base address */ |
||||||
|
case kFLEXNVM_PropertyDflashBlockBaseAddr: |
||||||
|
*value = config->ftfxConfig.flashDesc.blockBase; |
||||||
|
break; |
||||||
|
#if defined(FSL_FEATURE_FLASH_HAS_FLEX_NVM_ALIAS) && FSL_FEATURE_FLASH_HAS_FLEX_NVM_ALIAS |
||||||
|
case kFLEXNVM_PropertyAliasDflashBlockBaseAddr: |
||||||
|
*value = config->ftfxConfig.flashDesc.aliasBlockBase; |
||||||
|
break; |
||||||
|
#endif /* FSL_FEATURE_FLASH_HAS_FLEX_NVM_ALIAS */ |
||||||
|
case kFLEXNVM_PropertyFlexRamBlockBaseAddr: |
||||||
|
*value = config->ftfxConfig.flexramBlockBase; |
||||||
|
break; |
||||||
|
/* get flexram total size */ |
||||||
|
case kFLEXNVM_PropertyFlexRamTotalSize: |
||||||
|
*value = config->ftfxConfig.flexramTotalSize; |
||||||
|
break; |
||||||
|
/* get flexnvm eeprom total size */ |
||||||
|
case kFLEXNVM_PropertyEepromTotalSize: |
||||||
|
*value = config->ftfxConfig.eepromTotalSize; |
||||||
|
break; |
||||||
|
/* catch inputs that are not recognized */ |
||||||
|
default: |
||||||
|
status = kStatus_FTFx_UnknownProperty; |
||||||
|
break; |
||||||
|
} |
||||||
|
return status; |
||||||
|
} |
||||||
|
|
||||||
|
/*! @brief Convert address for Flexnvm dflash.*/ |
||||||
|
static status_t flexnvm_convert_start_address(flexnvm_config_t *config, uint32_t start) |
||||||
|
{ |
||||||
|
status_t status = kStatus_FTFx_AddressError; |
||||||
|
|
||||||
|
if (config == NULL) |
||||||
|
{ |
||||||
|
return kStatus_FTFx_InvalidArgument; |
||||||
|
} |
||||||
|
|
||||||
|
/* From Spec: When required by the command, address bit 23 selects between program flash memory
|
||||||
|
* (=0) and data flash memory (=1).*/ |
||||||
|
if (start >= config->ftfxConfig.flashDesc.blockBase) |
||||||
|
{ |
||||||
|
config->ftfxConfig.opsConfig.convertedAddress = start - config->ftfxConfig.flashDesc.blockBase + 0x800000U; |
||||||
|
status = kStatus_FTFx_Success; |
||||||
|
} |
||||||
|
#if defined(FSL_FEATURE_FLASH_HAS_FLEX_NVM_ALIAS) && FSL_FEATURE_FLASH_HAS_FLEX_NVM_ALIAS |
||||||
|
/* for MKW39/38/37 which have alias blockBase */ |
||||||
|
else if (start >= config->ftfxConfig.flashDesc.aliasBlockBase) |
||||||
|
{ |
||||||
|
config->ftfxConfig.opsConfig.convertedAddress = start - config->ftfxConfig.flashDesc.aliasBlockBase + 0x800000U; |
||||||
|
status = kStatus_FTFx_Success; |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
status = kStatus_FTFx_Success; |
||||||
|
} |
||||||
|
#endif /* FSL_FEATURE_FLASH_HAS_FLEX_NVM_ALIAS */ |
||||||
|
|
||||||
|
return status; |
||||||
|
} |
||||||
|
|
||||||
|
#endif /* FSL_FEATURE_FLASH_HAS_FLEX_NVM */ |
||||||
@ -0,0 +1,564 @@ |
|||||||
|
/*
|
||||||
|
* Copyright 2013-2016 Freescale Semiconductor, Inc. |
||||||
|
* Copyright 2016-2020 NXP |
||||||
|
* All rights reserved. |
||||||
|
* |
||||||
|
* SPDX-License-Identifier: BSD-3-Clause |
||||||
|
* |
||||||
|
*/ |
||||||
|
|
||||||
|
#ifndef FSL_FTFX_FLEXNVM_H |
||||||
|
#define FSL_FTFX_FLEXNVM_H |
||||||
|
|
||||||
|
#include "fsl_ftfx_controller.h" |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @addtogroup ftfx_flexnvm_driver |
||||||
|
* @{ |
||||||
|
*/ |
||||||
|
/*******************************************************************************
|
||||||
|
* Definitions |
||||||
|
******************************************************************************/ |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Enumeration for various flexnvm properties. |
||||||
|
*/ |
||||||
|
typedef enum _flexnvm_property_tag |
||||||
|
{ |
||||||
|
kFLEXNVM_PropertyDflashSectorSize = 0x00U, /*!< Dflash sector size property.*/ |
||||||
|
kFLEXNVM_PropertyDflashTotalSize = 0x01U, /*!< Dflash total size property.*/ |
||||||
|
kFLEXNVM_PropertyDflashBlockSize = 0x02U, /*!< Dflash block size property.*/ |
||||||
|
kFLEXNVM_PropertyDflashBlockCount = 0x03U, /*!< Dflash block count property.*/ |
||||||
|
kFLEXNVM_PropertyDflashBlockBaseAddr = 0x04U, /*!< Dflash block base address property.*/ |
||||||
|
kFLEXNVM_PropertyAliasDflashBlockBaseAddr = 0x05U, /*!< Dflash block base address Alias property.*/ |
||||||
|
kFLEXNVM_PropertyFlexRamBlockBaseAddr = 0x06U, /*!< FlexRam block base address property.*/ |
||||||
|
kFLEXNVM_PropertyFlexRamTotalSize = 0x07U, /*!< FlexRam total size property.*/ |
||||||
|
kFLEXNVM_PropertyEepromTotalSize = 0x08U, /*!< EEPROM total size property.*/ |
||||||
|
} flexnvm_property_tag_t; |
||||||
|
|
||||||
|
/*! @brief Flexnvm driver state information.
|
||||||
|
* |
||||||
|
* An instance of this structure is allocated by the user of the Flexnvm driver and |
||||||
|
* passed into each of the driver APIs. |
||||||
|
*/ |
||||||
|
typedef struct _flexnvm_config |
||||||
|
{ |
||||||
|
ftfx_config_t ftfxConfig; |
||||||
|
} flexnvm_config_t; |
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* API |
||||||
|
******************************************************************************/ |
||||||
|
|
||||||
|
#if defined(__cplusplus) |
||||||
|
extern "C" { |
||||||
|
#endif |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @name Initialization |
||||||
|
* @{ |
||||||
|
*/ |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Initializes the global flash properties structure members. |
||||||
|
* |
||||||
|
* This function checks and initializes the Flash module for the other Flash APIs. |
||||||
|
* |
||||||
|
* @param config Pointer to the storage for the driver runtime state. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_Success API was executed successfully. |
||||||
|
* @retval #kStatus_FTFx_InvalidArgument An invalid argument is provided. |
||||||
|
* @retval #kStatus_FTFx_ExecuteInRamFunctionNotReady Execute-in-RAM function is not available. |
||||||
|
* @retval #kStatus_FTFx_PartitionStatusUpdateFailure Failed to update the partition status. |
||||||
|
*/ |
||||||
|
status_t FLEXNVM_Init(flexnvm_config_t *config); |
||||||
|
|
||||||
|
/*@}*/ |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @name Erasing |
||||||
|
* @{ |
||||||
|
*/ |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Erases the Dflash sectors encompassed by parameters passed into function. |
||||||
|
* |
||||||
|
* This function erases the appropriate number of flash sectors based on the |
||||||
|
* desired start address and length. |
||||||
|
* |
||||||
|
* @param config The pointer to the storage for the driver runtime state. |
||||||
|
* @param start The start address of the desired flash memory to be erased. |
||||||
|
* The start address does not need to be sector-aligned but must be word-aligned. |
||||||
|
* @param lengthInBytes The length, given in bytes (not words or long-words) |
||||||
|
* to be erased. Must be word-aligned. |
||||||
|
* @param key The value used to validate all flash erase APIs. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_Success API was executed successfully; the appropriate number of date flash sectors based on |
||||||
|
* the desired start address and length were erased successfully. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_InvalidArgument An invalid argument is provided. |
||||||
|
* @retval #kStatus_FTFx_AlignmentError The parameter is not aligned with the specified baseline. |
||||||
|
* @retval #kStatus_FTFx_AddressError The address is out of range. |
||||||
|
* @retval #kStatus_FTFx_EraseKeyError The API erase key is invalid. |
||||||
|
* @retval #kStatus_FTFx_ExecuteInRamFunctionNotReady Execute-in-RAM function is not available. |
||||||
|
* @retval #kStatus_FTFx_AccessError Invalid instruction codes and out-of bounds addresses. |
||||||
|
* @retval #kStatus_FTFx_ProtectionViolation The program/erase operation is requested to execute on protected areas. |
||||||
|
* @retval #kStatus_FTFx_CommandFailure Run-time error during the command execution. |
||||||
|
*/ |
||||||
|
status_t FLEXNVM_DflashErase(flexnvm_config_t *config, uint32_t start, uint32_t lengthInBytes, uint32_t key); |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Erases entire flexnvm |
||||||
|
* |
||||||
|
* @param config Pointer to the storage for the driver runtime state. |
||||||
|
* @param key A value used to validate all flash erase APIs. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_Success API was executed successfully; the entire flexnvm has been erased successfully. |
||||||
|
* @retval #kStatus_FTFx_InvalidArgument An invalid argument is provided. |
||||||
|
* @retval #kStatus_FTFx_EraseKeyError API erase key is invalid. |
||||||
|
* @retval #kStatus_FTFx_ExecuteInRamFunctionNotReady Execute-in-RAM function is not available. |
||||||
|
* @retval #kStatus_FTFx_AccessError Invalid instruction codes and out-of bounds addresses. |
||||||
|
* @retval #kStatus_FTFx_ProtectionViolation The program/erase operation is requested to execute on protected areas. |
||||||
|
* @retval #kStatus_FTFx_CommandFailure Run-time error during command execution. |
||||||
|
* @retval #kStatus_FTFx_PartitionStatusUpdateFailure Failed to update the partition status. |
||||||
|
*/ |
||||||
|
status_t FLEXNVM_EraseAll(flexnvm_config_t *config, uint32_t key); |
||||||
|
|
||||||
|
#if defined(FSL_FEATURE_FLASH_HAS_ERASE_ALL_BLOCKS_UNSECURE_CMD) && FSL_FEATURE_FLASH_HAS_ERASE_ALL_BLOCKS_UNSECURE_CMD |
||||||
|
/*!
|
||||||
|
* @brief Erases the entire flexnvm, including protected sectors. |
||||||
|
* |
||||||
|
* @param config Pointer to the storage for the driver runtime state. |
||||||
|
* @param key A value used to validate all flash erase APIs. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_Success API was executed successfully; the flexnvm is not in securityi state. |
||||||
|
* @retval #kStatus_FTFx_InvalidArgument An invalid argument is provided. |
||||||
|
* @retval #kStatus_FTFx_EraseKeyError API erase key is invalid. |
||||||
|
* @retval #kStatus_FTFx_ExecuteInRamFunctionNotReady Execute-in-RAM function is not available. |
||||||
|
* @retval #kStatus_FTFx_AccessError Invalid instruction codes and out-of bounds addresses. |
||||||
|
* @retval #kStatus_FTFx_ProtectionViolation The program/erase operation is requested to execute on protected areas. |
||||||
|
* @retval #kStatus_FTFx_CommandFailure Run-time error during command execution. |
||||||
|
* @retval #kStatus_FTFx_PartitionStatusUpdateFailure Failed to update the partition status. |
||||||
|
*/ |
||||||
|
status_t FLEXNVM_EraseAllUnsecure(flexnvm_config_t *config, uint32_t key); |
||||||
|
#endif /* FSL_FEATURE_FLASH_HAS_ERASE_ALL_BLOCKS_UNSECURE_CMD */ |
||||||
|
|
||||||
|
/*@}*/ |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @name Programming |
||||||
|
* @{ |
||||||
|
*/ |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Programs flash with data at locations passed in through parameters. |
||||||
|
* |
||||||
|
* This function programs the flash memory with the desired data for a given |
||||||
|
* flash area as determined by the start address and the length. |
||||||
|
* |
||||||
|
* @param config A pointer to the storage for the driver runtime state. |
||||||
|
* @param start The start address of the desired flash memory to be programmed. Must be |
||||||
|
* word-aligned. |
||||||
|
* @param src A pointer to the source buffer of data that is to be programmed |
||||||
|
* into the flash. |
||||||
|
* @param lengthInBytes The length, given in bytes (not words or long-words), |
||||||
|
* to be programmed. Must be word-aligned. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_Success API was executed successfully; the desired date have been successfully |
||||||
|
* programed into specified date flash region. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_InvalidArgument An invalid argument is provided. |
||||||
|
* @retval #kStatus_FTFx_AlignmentError Parameter is not aligned with the specified baseline. |
||||||
|
* @retval #kStatus_FTFx_AddressError Address is out of range. |
||||||
|
* @retval #kStatus_FTFx_ExecuteInRamFunctionNotReady Execute-in-RAM function is not available. |
||||||
|
* @retval #kStatus_FTFx_AccessError Invalid instruction codes and out-of bounds addresses. |
||||||
|
* @retval #kStatus_FTFx_ProtectionViolation The program/erase operation is requested to execute on protected areas. |
||||||
|
* @retval #kStatus_FTFx_CommandFailure Run-time error during the command execution. |
||||||
|
*/ |
||||||
|
status_t FLEXNVM_DflashProgram(flexnvm_config_t *config, uint32_t start, uint8_t *src, uint32_t lengthInBytes); |
||||||
|
|
||||||
|
#if defined(FSL_FEATURE_FLASH_HAS_PROGRAM_SECTION_CMD) && FSL_FEATURE_FLASH_HAS_PROGRAM_SECTION_CMD |
||||||
|
/*!
|
||||||
|
* @brief Programs flash with data at locations passed in through parameters via the Program Section command. |
||||||
|
* |
||||||
|
* This function programs the flash memory with the desired data for a given |
||||||
|
* flash area as determined by the start address and length. |
||||||
|
* |
||||||
|
* @param config A pointer to the storage for the driver runtime state. |
||||||
|
* @param start The start address of the desired flash memory to be programmed. Must be |
||||||
|
* word-aligned. |
||||||
|
* @param src A pointer to the source buffer of data that is to be programmed |
||||||
|
* into the flash. |
||||||
|
* @param lengthInBytes The length, given in bytes (not words or long-words), |
||||||
|
* to be programmed. Must be word-aligned. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_Success API was executed successfully; the desired date have been successfully |
||||||
|
* programed into specified date flash area. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_InvalidArgument An invalid argument is provided. |
||||||
|
* @retval #kStatus_FTFx_AlignmentError Parameter is not aligned with specified baseline. |
||||||
|
* @retval #kStatus_FTFx_AddressError Address is out of range. |
||||||
|
* @retval #kStatus_FTFx_SetFlexramAsRamError Failed to set flexram as RAM. |
||||||
|
* @retval #kStatus_FTFx_ExecuteInRamFunctionNotReady Execute-in-RAM function is not available. |
||||||
|
* @retval #kStatus_FTFx_AccessError Invalid instruction codes and out-of bounds addresses. |
||||||
|
* @retval #kStatus_FTFx_ProtectionViolation The program/erase operation is requested to execute on protected areas. |
||||||
|
* @retval #kStatus_FTFx_CommandFailure Run-time error during command execution. |
||||||
|
* @retval #kStatus_FTFx_RecoverFlexramAsEepromError Failed to recover FlexRAM as EEPROM. |
||||||
|
*/ |
||||||
|
status_t FLEXNVM_DflashProgramSection(flexnvm_config_t *config, uint32_t start, uint8_t *src, uint32_t lengthInBytes); |
||||||
|
#endif /* FSL_FEATURE_FLASH_HAS_PROGRAM_SECTION_CMD */ |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Prepares the FlexNVM block for use as data flash, EEPROM backup, or a combination of both and initializes the |
||||||
|
* FlexRAM. |
||||||
|
* |
||||||
|
* @param config Pointer to storage for the driver runtime state. |
||||||
|
* @param option The option used to set FlexRAM load behavior during reset. |
||||||
|
* @param eepromDataSizeCode Determines the amount of FlexRAM used in each of the available EEPROM subsystems. |
||||||
|
* @param flexnvmPartitionCode Specifies how to split the FlexNVM block between data flash memory and EEPROM backup |
||||||
|
* memory supporting EEPROM functions. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_Success API was executed successfully; the FlexNVM block for use as data flash, EEPROM backup, |
||||||
|
* or a combination of both have been Prepared. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_InvalidArgument Invalid argument is provided. |
||||||
|
* @retval #kStatus_FTFx_ExecuteInRamFunctionNotReady Execute-in-RAM function is not available. |
||||||
|
* @retval #kStatus_FTFx_AccessError Invalid instruction codes and out-of bounds addresses. |
||||||
|
* @retval #kStatus_FTFx_ProtectionViolation The program/erase operation is requested to execute on protected areas. |
||||||
|
* @retval #kStatus_FTFx_CommandFailure Run-time error during command execution. |
||||||
|
*/ |
||||||
|
status_t FLEXNVM_ProgramPartition(flexnvm_config_t *config, |
||||||
|
ftfx_partition_flexram_load_opt_t option, |
||||||
|
uint32_t eepromDataSizeCode, |
||||||
|
uint32_t flexnvmPartitionCode); |
||||||
|
|
||||||
|
/*@}*/ |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @name Reading |
||||||
|
* @{ |
||||||
|
*/ |
||||||
|
|
||||||
|
#if defined(FSL_FEATURE_FLASH_HAS_READ_RESOURCE_CMD) && FSL_FEATURE_FLASH_HAS_READ_RESOURCE_CMD |
||||||
|
/*!
|
||||||
|
* @brief Reads the resource with data at locations passed in through parameters. |
||||||
|
* |
||||||
|
* This function reads the flash memory with the desired location for a given |
||||||
|
* flash area as determined by the start address and length. |
||||||
|
* |
||||||
|
* @param config A pointer to the storage for the driver runtime state. |
||||||
|
* @param start The start address of the desired flash memory to be programmed. Must be |
||||||
|
* word-aligned. |
||||||
|
* @param dst A pointer to the destination buffer of data that is used to store |
||||||
|
* data to be read. |
||||||
|
* @param lengthInBytes The length, given in bytes (not words or long-words), |
||||||
|
* to be read. Must be word-aligned. |
||||||
|
* @param option The resource option which indicates which area should be read back. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_Success API was executed successfully; the data have been read successfully from |
||||||
|
* program flash IFR, data flash IFR space, and the Version ID field |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_InvalidArgument An invalid argument is provided. |
||||||
|
* @retval #kStatus_FTFx_AlignmentError Parameter is not aligned with the specified baseline. |
||||||
|
* @retval #kStatus_FTFx_ExecuteInRamFunctionNotReady Execute-in-RAM function is not available. |
||||||
|
* @retval #kStatus_FTFx_AccessError Invalid instruction codes and out-of bounds addresses. |
||||||
|
* @retval #kStatus_FTFx_ProtectionViolation The program/erase operation is requested to execute on protected areas. |
||||||
|
* @retval #kStatus_FTFx_CommandFailure Run-time error during the command execution. |
||||||
|
*/ |
||||||
|
status_t FLEXNVM_ReadResource( |
||||||
|
flexnvm_config_t *config, uint32_t start, uint8_t *dst, uint32_t lengthInBytes, ftfx_read_resource_opt_t option); |
||||||
|
#endif /* FSL_FEATURE_FLASH_HAS_READ_RESOURCE_CMD */ |
||||||
|
|
||||||
|
/*@}*/ |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @name Verification |
||||||
|
* @{ |
||||||
|
*/ |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Verifies an erasure of the desired flash area at a specified margin level. |
||||||
|
* |
||||||
|
* This function checks the appropriate number of flash sectors based on |
||||||
|
* the desired start address and length to check whether the flash is erased |
||||||
|
* to the specified read margin level. |
||||||
|
* |
||||||
|
* @param config A pointer to the storage for the driver runtime state. |
||||||
|
* @param start The start address of the desired flash memory to be verified. |
||||||
|
* The start address does not need to be sector-aligned but must be word-aligned. |
||||||
|
* @param lengthInBytes The length, given in bytes (not words or long-words), |
||||||
|
* to be verified. Must be word-aligned. |
||||||
|
* @param margin Read margin choice. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_Success API was executed successfully; the specified data flash region is in erased state. |
||||||
|
* @retval #kStatus_FTFx_InvalidArgument An invalid argument is provided. |
||||||
|
* @retval #kStatus_FTFx_AlignmentError Parameter is not aligned with specified baseline. |
||||||
|
* @retval #kStatus_FTFx_AddressError Address is out of range. |
||||||
|
* @retval #kStatus_FTFx_ExecuteInRamFunctionNotReady Execute-in-RAM function is not available. |
||||||
|
* @retval #kStatus_FTFx_AccessError Invalid instruction codes and out-of bounds addresses. |
||||||
|
* @retval #kStatus_FTFx_ProtectionViolation The program/erase operation is requested to execute on protected areas. |
||||||
|
* @retval #kStatus_FTFx_CommandFailure Run-time error during the command execution. |
||||||
|
*/ |
||||||
|
status_t FLEXNVM_DflashVerifyErase(flexnvm_config_t *config, |
||||||
|
uint32_t start, |
||||||
|
uint32_t lengthInBytes, |
||||||
|
ftfx_margin_value_t margin); |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Verifies erasure of the entire flash at a specified margin level. |
||||||
|
* |
||||||
|
* This function checks whether the flash is erased to the |
||||||
|
* specified read margin level. |
||||||
|
* |
||||||
|
* @param config A pointer to the storage for the driver runtime state. |
||||||
|
* @param margin Read margin choice. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_Success API was executed successfully; the entire flexnvm region is in erased state. |
||||||
|
* @retval #kStatus_FTFx_InvalidArgument An invalid argument is provided. |
||||||
|
* @retval #kStatus_FTFx_ExecuteInRamFunctionNotReady Execute-in-RAM function is not available. |
||||||
|
* @retval #kStatus_FTFx_AccessError Invalid instruction codes and out-of bounds addresses. |
||||||
|
* @retval #kStatus_FTFx_ProtectionViolation The program/erase operation is requested to execute on protected areas. |
||||||
|
* @retval #kStatus_FTFx_CommandFailure Run-time error during the command execution. |
||||||
|
*/ |
||||||
|
status_t FLEXNVM_VerifyEraseAll(flexnvm_config_t *config, ftfx_margin_value_t margin); |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Verifies programming of the desired flash area at a specified margin level. |
||||||
|
* |
||||||
|
* This function verifies the data programmed in the flash memory using the |
||||||
|
* Flash Program Check Command and compares it to the expected data for a given |
||||||
|
* flash area as determined by the start address and length. |
||||||
|
* |
||||||
|
* @param config A pointer to the storage for the driver runtime state. |
||||||
|
* @param start The start address of the desired flash memory to be verified. Must be word-aligned. |
||||||
|
* @param lengthInBytes The length, given in bytes (not words or long-words), |
||||||
|
* to be verified. Must be word-aligned. |
||||||
|
* @param expectedData A pointer to the expected data that is to be |
||||||
|
* verified against. |
||||||
|
* @param margin Read margin choice. |
||||||
|
* @param failedAddress A pointer to the returned failing address. |
||||||
|
* @param failedData A pointer to the returned failing data. Some derivatives do |
||||||
|
* not include failed data as part of the FCCOBx registers. In this |
||||||
|
* case, zeros are returned upon failure. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_Success API was executed successfully; the desired data hve been programed successfully into |
||||||
|
* specified data flash region. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_InvalidArgument An invalid argument is provided. |
||||||
|
* @retval #kStatus_FTFx_AlignmentError Parameter is not aligned with specified baseline. |
||||||
|
* @retval #kStatus_FTFx_AddressError Address is out of range. |
||||||
|
* @retval #kStatus_FTFx_ExecuteInRamFunctionNotReady Execute-in-RAM function is not available. |
||||||
|
* @retval #kStatus_FTFx_AccessError Invalid instruction codes and out-of bounds addresses. |
||||||
|
* @retval #kStatus_FTFx_ProtectionViolation The program/erase operation is requested to execute on protected areas. |
||||||
|
* @retval #kStatus_FTFx_CommandFailure Run-time error during the command execution. |
||||||
|
*/ |
||||||
|
status_t FLEXNVM_DflashVerifyProgram(flexnvm_config_t *config, |
||||||
|
uint32_t start, |
||||||
|
uint32_t lengthInBytes, |
||||||
|
const uint8_t *expectedData, |
||||||
|
ftfx_margin_value_t margin, |
||||||
|
uint32_t *failedAddress, |
||||||
|
uint32_t *failedData); |
||||||
|
|
||||||
|
/*@}*/ |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @name Security |
||||||
|
* @{ |
||||||
|
*/ |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Returns the security state via the pointer passed into the function. |
||||||
|
* |
||||||
|
* This function retrieves the current flash security status, including the |
||||||
|
* security enabling state and the backdoor key enabling state. |
||||||
|
* |
||||||
|
* @param config A pointer to storage for the driver runtime state. |
||||||
|
* @param state A pointer to the value returned for the current security status code: |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_Success API was executed successfully; |
||||||
|
* the security state of flexnvm was stored to state. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_InvalidArgument An invalid argument is provided. |
||||||
|
*/ |
||||||
|
status_t FLEXNVM_GetSecurityState(flexnvm_config_t *config, ftfx_security_state_t *state); |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Allows users to bypass security with a backdoor key. |
||||||
|
* |
||||||
|
* If the MCU is in secured state, this function unsecures the MCU by |
||||||
|
* comparing the provided backdoor key with ones in the flash configuration |
||||||
|
* field. |
||||||
|
* |
||||||
|
* @param config A pointer to the storage for the driver runtime state. |
||||||
|
* @param backdoorKey A pointer to the user buffer containing the backdoor key. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_Success API was executed successfully. |
||||||
|
* @retval #kStatus_FTFx_InvalidArgument An invalid argument is provided. |
||||||
|
* @retval #kStatus_FTFx_ExecuteInRamFunctionNotReady Execute-in-RAM function is not available. |
||||||
|
* @retval #kStatus_FTFx_AccessError Invalid instruction codes and out-of bounds addresses. |
||||||
|
* @retval #kStatus_FTFx_ProtectionViolation The program/erase operation is requested to execute on protected areas. |
||||||
|
* @retval #kStatus_FTFx_CommandFailure Run-time error during the command execution. |
||||||
|
*/ |
||||||
|
status_t FLEXNVM_SecurityBypass(flexnvm_config_t *config, const uint8_t *backdoorKey); |
||||||
|
|
||||||
|
/*@}*/ |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @name FlexRAM |
||||||
|
* @{ |
||||||
|
*/ |
||||||
|
|
||||||
|
#if defined(FSL_FEATURE_FLASH_HAS_SET_FLEXRAM_FUNCTION_CMD) && FSL_FEATURE_FLASH_HAS_SET_FLEXRAM_FUNCTION_CMD |
||||||
|
/*!
|
||||||
|
* @brief Sets the FlexRAM function command. |
||||||
|
* |
||||||
|
* @param config A pointer to the storage for the driver runtime state. |
||||||
|
* @param option The option used to set the work mode of FlexRAM. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_Success API was executed successfully; |
||||||
|
* the FlexRAM has been successfully configured as RAM or EEPROM |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_InvalidArgument An invalid argument is provided. |
||||||
|
* @retval #kStatus_FTFx_ExecuteInRamFunctionNotReady Execute-in-RAM function is not available. |
||||||
|
* @retval #kStatus_FTFx_AccessError Invalid instruction codes and out-of bounds addresses. |
||||||
|
* @retval #kStatus_FTFx_ProtectionViolation The program/erase operation is requested to execute on protected areas. |
||||||
|
* @retval #kStatus_FTFx_CommandFailure Run-time error during the command execution. |
||||||
|
*/ |
||||||
|
status_t FLEXNVM_SetFlexramFunction(flexnvm_config_t *config, ftfx_flexram_func_opt_t option); |
||||||
|
#endif /* FSL_FEATURE_FLASH_HAS_SET_FLEXRAM_FUNCTION_CMD */ |
||||||
|
|
||||||
|
/*@}*/ |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Programs the EEPROM with data at locations passed in through parameters. |
||||||
|
* |
||||||
|
* This function programs the emulated EEPROM with the desired data for a given |
||||||
|
* flash area as determined by the start address and length. |
||||||
|
* |
||||||
|
* @param config A pointer to the storage for the driver runtime state. |
||||||
|
* @param start The start address of the desired flash memory to be programmed. Must be |
||||||
|
* word-aligned. |
||||||
|
* @param src A pointer to the source buffer of data that is to be programmed |
||||||
|
* into the flash. |
||||||
|
* @param lengthInBytes The length, given in bytes (not words or long-words), |
||||||
|
* to be programmed. Must be word-aligned. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_Success API was executed successfully; the desires data have been successfully programed |
||||||
|
* into specified eeprom region. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_InvalidArgument An invalid argument is provided. |
||||||
|
* @retval #kStatus_FTFx_AddressError Address is out of range. |
||||||
|
* @retval #kStatus_FTFx_SetFlexramAsEepromError Failed to set flexram as eeprom. |
||||||
|
* @retval #kStatus_FTFx_ProtectionViolation The program/erase operation is requested to execute on protected areas. |
||||||
|
* @retval #kStatus_FTFx_RecoverFlexramAsRamError Failed to recover the FlexRAM as RAM. |
||||||
|
*/ |
||||||
|
status_t FLEXNVM_EepromWrite(flexnvm_config_t *config, uint32_t start, uint8_t *src, uint32_t lengthInBytes); |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @name Flash Protection Utilities |
||||||
|
* @{ |
||||||
|
*/ |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Sets the DFlash protection to the intended protection status. |
||||||
|
* |
||||||
|
* @param config A pointer to the storage for the driver runtime state. |
||||||
|
* @param protectStatus The expected protect status to set to the DFlash protection register. Each bit |
||||||
|
* corresponds to the protection of the 1/8 of the total DFlash. The least significant bit corresponds to the lowest |
||||||
|
* address area of the DFlash. The most significant bit corresponds to the highest address area of the DFlash. There |
||||||
|
* are |
||||||
|
* two possible cases as shown below: |
||||||
|
* 0: this area is protected. |
||||||
|
* 1: this area is unprotected. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_Success API was executed successfully; the specified DFlash region is protected. |
||||||
|
* @retval #kStatus_FTFx_InvalidArgument An invalid argument is provided. |
||||||
|
* @retval #kStatus_FTFx_CommandNotSupported Flash API is not supported. |
||||||
|
* @retval #kStatus_FTFx_CommandFailure Run-time error during command execution. |
||||||
|
*/ |
||||||
|
status_t FLEXNVM_DflashSetProtection(flexnvm_config_t *config, uint8_t protectStatus); |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Gets the DFlash protection status. |
||||||
|
* |
||||||
|
* @param config A pointer to the storage for the driver runtime state. |
||||||
|
* @param protectStatus DFlash Protect status returned by the PFlash IP. Each bit corresponds to the protection of the |
||||||
|
* 1/8 of |
||||||
|
* the total DFlash. The least significant bit corresponds to the lowest address area of the DFlash. The most |
||||||
|
* significant bit corresponds to the highest address area of the DFlash, and so on. There are two possible cases as |
||||||
|
* below: |
||||||
|
* 0: this area is protected. |
||||||
|
* 1: this area is unprotected. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_Success API was executed successfully. |
||||||
|
* @retval #kStatus_FTFx_InvalidArgument An invalid argument is provided. |
||||||
|
* @retval #kStatus_FTFx_CommandNotSupported Flash API is not supported. |
||||||
|
*/ |
||||||
|
status_t FLEXNVM_DflashGetProtection(flexnvm_config_t *config, uint8_t *protectStatus); |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Sets the EEPROM protection to the intended protection status. |
||||||
|
* |
||||||
|
* @param config A pointer to the storage for the driver runtime state. |
||||||
|
* @param protectStatus The expected protect status to set to the EEPROM protection register. Each bit |
||||||
|
* corresponds to the protection of the 1/8 of the total EEPROM. The least significant bit corresponds to the lowest |
||||||
|
* address area of the EEPROM. The most significant bit corresponds to the highest address area of EEPROM, and so on. |
||||||
|
* There are two possible cases as shown below: |
||||||
|
* 0: this area is protected. |
||||||
|
* 1: this area is unprotected. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_Success API was executed successfully. |
||||||
|
* @retval #kStatus_FTFx_InvalidArgument An invalid argument is provided. |
||||||
|
* @retval #kStatus_FTFx_CommandNotSupported Flash API is not supported. |
||||||
|
* @retval #kStatus_FTFx_CommandFailure Run-time error during command execution. |
||||||
|
*/ |
||||||
|
status_t FLEXNVM_EepromSetProtection(flexnvm_config_t *config, uint8_t protectStatus); |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Gets the EEPROM protection status. |
||||||
|
* |
||||||
|
* @param config A pointer to the storage for the driver runtime state. |
||||||
|
* @param protectStatus DFlash Protect status returned by the PFlash IP. Each bit corresponds to the protection of the |
||||||
|
* 1/8 of |
||||||
|
* the total EEPROM. The least significant bit corresponds to the lowest address area of the EEPROM. The most |
||||||
|
* significant bit corresponds to the highest address area of the EEPROM. There are two possible cases as below: |
||||||
|
* 0: this area is protected. |
||||||
|
* 1: this area is unprotected. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_Success API was executed successfully. |
||||||
|
* @retval #kStatus_FTFx_InvalidArgument An invalid argument is provided. |
||||||
|
* @retval #kStatus_FTFx_CommandNotSupported Flash API is not supported. |
||||||
|
*/ |
||||||
|
status_t FLEXNVM_EepromGetProtection(flexnvm_config_t *config, uint8_t *protectStatus); |
||||||
|
|
||||||
|
/*@}*/ |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @name Properties |
||||||
|
* @{ |
||||||
|
*/ |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @brief Returns the desired flexnvm property. |
||||||
|
* |
||||||
|
* @param config A pointer to the storage for the driver runtime state. |
||||||
|
* @param whichProperty The desired property from the list of properties in |
||||||
|
* enum flexnvm_property_tag_t |
||||||
|
* @param value A pointer to the value returned for the desired flexnvm property. |
||||||
|
* |
||||||
|
* @retval #kStatus_FTFx_Success API was executed successfully. |
||||||
|
* @retval #kStatus_FTFx_InvalidArgument An invalid argument is provided. |
||||||
|
* @retval #kStatus_FTFx_UnknownProperty An unknown property tag. |
||||||
|
*/ |
||||||
|
status_t FLEXNVM_GetProperty(flexnvm_config_t *config, flexnvm_property_tag_t whichProperty, uint32_t *value); |
||||||
|
|
||||||
|
/*@}*/ |
||||||
|
|
||||||
|
#if defined(__cplusplus) |
||||||
|
} |
||||||
|
#endif |
||||||
|
|
||||||
|
/*! @}*/ |
||||||
|
|
||||||
|
#endif /* FSL_FTFX_FLEXNVM_H */ |
||||||
@ -0,0 +1,70 @@ |
|||||||
|
/*
|
||||||
|
* Copyright 2017-2020 NXP |
||||||
|
* All rights reserved. |
||||||
|
* |
||||||
|
* SPDX-License-Identifier: BSD-3-Clause |
||||||
|
* |
||||||
|
*/ |
||||||
|
|
||||||
|
#ifndef FSL_FTFX_UTILITIES_H |
||||||
|
#define FSL_FTFX_UTILITIES_H |
||||||
|
|
||||||
|
/*!
|
||||||
|
* @addtogroup ftfx_utilities |
||||||
|
* @{ |
||||||
|
*/ |
||||||
|
/*******************************************************************************
|
||||||
|
* Definitions |
||||||
|
******************************************************************************/ |
||||||
|
|
||||||
|
/*! @brief Constructs the version number for drivers. */ |
||||||
|
#if !defined(MAKE_VERSION) |
||||||
|
#define MAKE_VERSION(major, minor, bugfix) (((major) << 16) | ((minor) << 8) | (bugfix)) |
||||||
|
#endif |
||||||
|
|
||||||
|
/*! @brief Constructs a status code value from a group and a code number. */ |
||||||
|
#if !defined(MAKE_STATUS) |
||||||
|
#define MAKE_STATUS(group, code) ((((group)*100) + (code))) |
||||||
|
#endif |
||||||
|
|
||||||
|
/*! @brief Constructs the four character code for the Flash driver API key. */ |
||||||
|
#if !defined(FOUR_CHAR_CODE) |
||||||
|
#define FOUR_CHAR_CODE(a, b, c, d) \ |
||||||
|
(((uint32_t)(d) << 24u) | ((uint32_t)(c) << 16u) | ((uint32_t)(b) << 8u) | ((uint32_t)(a))) |
||||||
|
#endif |
||||||
|
|
||||||
|
//! @name Alignment macros
|
||||||
|
//@{
|
||||||
|
/*! @brief Alignment(down) utility. */ |
||||||
|
#if !defined(ALIGN_DOWN) |
||||||
|
#define ALIGN_DOWN(x, a) (((uint32_t)(x)) & ~((uint32_t)(a)-1u)) |
||||||
|
#endif |
||||||
|
|
||||||
|
/*! @brief Alignment(up) utility. */ |
||||||
|
#if !defined(ALIGN_UP) |
||||||
|
#define ALIGN_UP(x, a) ALIGN_DOWN((uint32_t)(x) + (uint32_t)(a)-1u, a) |
||||||
|
#endif |
||||||
|
//@}
|
||||||
|
|
||||||
|
/*! @brief bytes2word utility. */ |
||||||
|
#define B1P4(b) (((uint32_t)(b)&0xFFU) << 24U) |
||||||
|
#define B1P3(b) (((uint32_t)(b)&0xFFU) << 16U) |
||||||
|
#define B1P2(b) (((uint32_t)(b)&0xFFU) << 8U) |
||||||
|
#define B1P1(b) ((uint32_t)(b)&0xFFU) |
||||||
|
#define B2P3(b) (((uint32_t)(b)&0xFFFFU) << 16U) |
||||||
|
#define B2P2(b) (((uint32_t)(b)&0xFFFFU) << 8U) |
||||||
|
#define B2P1(b) ((uint32_t)(b)&0xFFFFU) |
||||||
|
#define B3P2(b) (((uint32_t)(b)&0xFFFFFFU) << 8U) |
||||||
|
#define B3P1(b) ((uint32_t)(b)&0xFFFFFFU) |
||||||
|
|
||||||
|
#define BYTE2WORD_1_3(x, y) (B1P4(x) | B3P1(y)) |
||||||
|
#define BYTE2WORD_2_2(x, y) (B2P3(x) | B2P1(y)) |
||||||
|
#define BYTE2WORD_3_1(x, y) (B3P2(x) | B1P1(y)) |
||||||
|
#define BYTE2WORD_1_1_2(x, y, z) (B1P4(x) | B1P3(y) | B2P1(z)) |
||||||
|
#define BYTE2WORD_1_2_1(x, y, z) (B1P4(x) | B2P2(y) | B1P1(z)) |
||||||
|
#define BYTE2WORD_2_1_1(x, y, z) (B2P3(x) | B1P2(y) | B1P1(z)) |
||||||
|
#define BYTE2WORD_1_1_1_1(x, y, z, w) (B1P4(x) | B1P3(y) | B1P2(z) | B1P1(w)) |
||||||
|
|
||||||
|
/*! @}*/ |
||||||
|
|
||||||
|
#endif /* FSL_FTFX_UTILITIES_H */ |
||||||
@ -0,0 +1,238 @@ |
|||||||
|
/*
|
||||||
|
* Copyright (c) 2019-2022, Erich Styger |
||||||
|
* |
||||||
|
* SPDX-License-Identifier: BSD-3-Clause |
||||||
|
*/ |
||||||
|
|
||||||
|
#include "platform.h" |
||||||
|
#if PL_CONFIG_USE_NVMC |
||||||
|
#include "nvmc.h" |
||||||
|
#include <string.h> |
||||||
|
#if PL_CONFIG_USE_MININI |
||||||
|
#include "MinIni/McuMinINI.h" |
||||||
|
#endif |
||||||
|
#include "McuLib.h" |
||||||
|
#include "McuUtility.h" |
||||||
|
#include "Shell.h" |
||||||
|
#include "McuLog.h" |
||||||
|
|
||||||
|
#define NVMC_MININI_FILE_NAME "settings.ini" /* 'file' name used */ |
||||||
|
|
||||||
|
/* RS-485 bus settings */ |
||||||
|
#define NVMC_MININI_SECTION_RS485 "rs485" |
||||||
|
#define NVMC_MININI_KEY_RS485_ADDR "addr" /* long value: RS-485 address */ |
||||||
|
|
||||||
|
/* application settings */ |
||||||
|
#define NVMC_MININI_SECTION_APP "app" |
||||||
|
#define NVMC_MININI_KEY_APP_FLAGS "flags" /* long value: application flags */ |
||||||
|
|
||||||
|
/* motor settings */ |
||||||
|
#define NVMC_MININI_SECTION_MOTOR "motor" /* motor0, motor1, ... */ |
||||||
|
#define NVMC_MININI_KEY_MOTOR_ID "id" /* long value: stepper motor id/label */ |
||||||
|
#define NVMC_MININI_KEY_MOTOR_OFFSET "offs" /* long value: stepper motor offset */ |
||||||
|
#define NVMC_MININI_KEY_MOTOR_X "x" /* long value: x position of split-flap */ |
||||||
|
#define NVMC_MININI_KEY_MOTOR_Y "y" /* long value: y position of split-flap */ |
||||||
|
|
||||||
|
uint8_t NVMC_GetRS485Addr(uint8_t *addr) { |
||||||
|
#if PL_CONFIG_USE_MININI |
||||||
|
*addr = McuMinINI_ini_getl(NVMC_MININI_SECTION_RS485, NVMC_MININI_KEY_RS485_ADDR, 0x1, NVMC_MININI_FILE_NAME); |
||||||
|
return ERR_OK; |
||||||
|
#else |
||||||
|
*addr = 0x1; |
||||||
|
return ERR_OK; |
||||||
|
#endif |
||||||
|
} |
||||||
|
|
||||||
|
uint8_t NVMC_SetRS485Addr(uint8_t addr) { |
||||||
|
#if PL_CONFIG_USE_MININI && McuMinINI_CONFIG_READ_ONLY |
||||||
|
return ERR_FAILED; |
||||||
|
#elif PL_CONFIG_USE_MININI |
||||||
|
McuMinINI_ini_putl(NVMC_MININI_SECTION_RS485, NVMC_MININI_KEY_RS485_ADDR, addr, NVMC_MININI_FILE_NAME); |
||||||
|
return ERR_OK; |
||||||
|
#else |
||||||
|
return ERR_FAILED; |
||||||
|
#endif |
||||||
|
} |
||||||
|
|
||||||
|
uint8_t NVMC_GetFlags(uint32_t *flags) { |
||||||
|
#if PL_CONFIG_USE_MININI |
||||||
|
*flags = McuMinINI_ini_getl(NVMC_MININI_SECTION_APP, NVMC_MININI_KEY_APP_FLAGS, 0x0, NVMC_MININI_FILE_NAME); |
||||||
|
return ERR_OK; |
||||||
|
#else |
||||||
|
*flags = 0; |
||||||
|
return ERR_OK; |
||||||
|
#endif |
||||||
|
} |
||||||
|
|
||||||
|
uint8_t NVMC_SetFlags(uint32_t flags) { |
||||||
|
#if PL_CONFIG_USE_MININI && McuMinINI_CONFIG_READ_ONLY |
||||||
|
return ERR_FAILED; |
||||||
|
#elif PL_CONFIG_USE_MININI |
||||||
|
McuMinINI_ini_putl(NVMC_MININI_SECTION_APP, NVMC_MININI_KEY_APP_FLAGS, flags, NVMC_MININI_FILE_NAME); |
||||||
|
return ERR_OK; |
||||||
|
#else |
||||||
|
return ERR_FAILED; |
||||||
|
#endif |
||||||
|
} |
||||||
|
|
||||||
|
#if PL_CONFIG_USE_MININI |
||||||
|
static void BuildStepperSectionName(unsigned char *sectionName, size_t nameSize, uint8_t motorIdx) { |
||||||
|
McuUtility_strcpy(sectionName, nameSize, (unsigned char*)NVMC_MININI_SECTION_MOTOR); |
||||||
|
McuUtility_strcatNum8u(sectionName, nameSize, motorIdx); /* append motor index to section name */ |
||||||
|
} |
||||||
|
#endif |
||||||
|
|
||||||
|
uint8_t NVMC_GetStepperID(uint8_t motorIdx, int16_t *id) { |
||||||
|
#if PL_CONFIG_USE_MININI |
||||||
|
unsigned char sectionName[16]; |
||||||
|
|
||||||
|
BuildStepperSectionName(sectionName, sizeof(sectionName), motorIdx); |
||||||
|
*id = McuMinINI_ini_getl((char*)sectionName, NVMC_MININI_KEY_MOTOR_ID, -1, NVMC_MININI_FILE_NAME); |
||||||
|
return ERR_OK; |
||||||
|
#else |
||||||
|
*id = -1; |
||||||
|
return ERR_OK; |
||||||
|
#endif |
||||||
|
} |
||||||
|
|
||||||
|
uint8_t NVMC_SetStepperID(uint8_t motorIdx, uint16_t id) { |
||||||
|
#if PL_CONFIG_USE_MININI && McuMinINI_CONFIG_READ_ONLY |
||||||
|
return ERR_FAILED; |
||||||
|
#elif PL_CONFIG_USE_MININI |
||||||
|
unsigned char sectionName[16]; |
||||||
|
|
||||||
|
BuildStepperSectionName(sectionName, sizeof(sectionName), motorIdx); |
||||||
|
McuMinINI_ini_putl((char*)sectionName, NVMC_MININI_KEY_MOTOR_ID, id, NVMC_MININI_FILE_NAME); |
||||||
|
return ERR_OK; |
||||||
|
#else |
||||||
|
return ERR_FAILED; |
||||||
|
#endif |
||||||
|
} |
||||||
|
|
||||||
|
uint8_t NVMC_GetStepperPosition(uint8_t motorIdx, int16_t *xp, int16_t *yp) { |
||||||
|
#if PL_CONFIG_USE_MININI |
||||||
|
unsigned char sectionName[16]; |
||||||
|
|
||||||
|
BuildStepperSectionName(sectionName, sizeof(sectionName), motorIdx); |
||||||
|
*xp = McuMinINI_ini_getl((char*)sectionName, NVMC_MININI_KEY_MOTOR_X, -1, NVMC_MININI_FILE_NAME); |
||||||
|
*yp = McuMinINI_ini_getl((char*)sectionName, NVMC_MININI_KEY_MOTOR_Y, -1, NVMC_MININI_FILE_NAME); |
||||||
|
return ERR_OK; |
||||||
|
#else |
||||||
|
*xp = 0; |
||||||
|
*yp = 0; |
||||||
|
return ERR_OK; |
||||||
|
#endif |
||||||
|
} |
||||||
|
|
||||||
|
uint8_t NVMC_SetStepperPosition(uint8_t motorIdx, int16_t xPos, int16_t yPos) { |
||||||
|
#if PL_CONFIG_USE_MININI && McuMinINI_CONFIG_READ_ONLY |
||||||
|
return ERR_FAILED; |
||||||
|
#elif PL_CONFIG_USE_MININI |
||||||
|
unsigned char sectionName[16]; |
||||||
|
|
||||||
|
BuildStepperSectionName(sectionName, sizeof(sectionName), motorIdx); |
||||||
|
McuMinINI_ini_putl((char*)sectionName, NVMC_MININI_KEY_MOTOR_X, xPos, NVMC_MININI_FILE_NAME); |
||||||
|
McuMinINI_ini_putl((char*)sectionName, NVMC_MININI_KEY_MOTOR_Y, yPos, NVMC_MININI_FILE_NAME); |
||||||
|
return ERR_OK; |
||||||
|
#else |
||||||
|
return ERR_FAILED; |
||||||
|
#endif |
||||||
|
} |
||||||
|
|
||||||
|
int16_t NVMC_GetStepperZeroOffset(uint8_t motorIdx) { |
||||||
|
#if PL_CONFIG_USE_MININI |
||||||
|
unsigned char sectionName[16]; |
||||||
|
|
||||||
|
BuildStepperSectionName(sectionName, sizeof(sectionName), motorIdx); |
||||||
|
return McuMinINI_ini_getl((char*)sectionName, NVMC_MININI_KEY_MOTOR_OFFSET, 0, NVMC_MININI_FILE_NAME); |
||||||
|
#else |
||||||
|
return 0; |
||||||
|
#endif |
||||||
|
} |
||||||
|
|
||||||
|
uint8_t NVMC_SetStepperZeroOffset(uint8_t motorIdx, int16_t offset) { |
||||||
|
#if PL_CONFIG_USE_MININI && McuMinINI_CONFIG_READ_ONLY |
||||||
|
return ERR_FAILED; |
||||||
|
#elif PL_CONFIG_USE_MININI |
||||||
|
unsigned char sectionName[16]; |
||||||
|
|
||||||
|
BuildStepperSectionName(sectionName, sizeof(sectionName), motorIdx); |
||||||
|
McuMinINI_ini_putl((char*)sectionName, NVMC_MININI_KEY_MOTOR_OFFSET, offset, NVMC_MININI_FILE_NAME); |
||||||
|
return ERR_OK; |
||||||
|
#else |
||||||
|
return ERR_FAILED; |
||||||
|
#endif |
||||||
|
} |
||||||
|
|
||||||
|
static uint8_t PrintStatus(const McuShell_StdIOType *io) { |
||||||
|
uint8_t buf[64]; |
||||||
|
uint8_t res, addr; |
||||||
|
uint32_t flags; |
||||||
|
|
||||||
|
McuShell_SendStatusStr((unsigned char*)"nvmc", (unsigned char*)"Non-volatile memory configuration area\r\n", io->stdOut); |
||||||
|
|
||||||
|
res = NVMC_GetRS485Addr(&addr); |
||||||
|
if (res==ERR_OK) { |
||||||
|
McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"0x"); |
||||||
|
McuUtility_strcatNum8Hex(buf, sizeof(buf), addr); |
||||||
|
McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"\r\n"); |
||||||
|
} else { |
||||||
|
McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"ERROR\r\n"); |
||||||
|
} |
||||||
|
McuShell_SendStatusStr((unsigned char*)" RS-485 addr", buf, io->stdOut); |
||||||
|
|
||||||
|
res = NVMC_GetFlags(&flags); |
||||||
|
if (res==ERR_OK) { |
||||||
|
McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"0x"); |
||||||
|
McuUtility_strcatNum32Hex(buf, sizeof(buf), flags); |
||||||
|
McuUtility_strcat(buf, sizeof(buf), (unsigned char*)" mag: "); |
||||||
|
if (flags&NVMC_FLAGS_MAGNET_ENABLED) { |
||||||
|
McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"1"); |
||||||
|
} else { |
||||||
|
McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"0"); |
||||||
|
} |
||||||
|
McuUtility_strcat(buf, sizeof(buf), (unsigned char*)"\r\n"); |
||||||
|
} else { |
||||||
|
McuUtility_strcpy(buf, sizeof(buf), (unsigned char*)"ERROR\r\n"); |
||||||
|
} |
||||||
|
McuShell_SendStatusStr((unsigned char*)" flags", buf, io->stdOut); |
||||||
|
return ERR_OK; |
||||||
|
} |
||||||
|
|
||||||
|
static uint8_t PrintHelp(const McuShell_StdIOType *io) { |
||||||
|
McuShell_SendHelpStr((unsigned char*)"nvmc", (unsigned char*)"Group of NVMC commands\r\n", io->stdOut); |
||||||
|
McuShell_SendHelpStr((unsigned char*)" help|status", (unsigned char*)"Print help or status information\r\n", io->stdOut); |
||||||
|
McuShell_SendHelpStr((unsigned char*)" flags <val>", (unsigned char*)"Set flags\r\n", io->stdOut); |
||||||
|
return ERR_OK; |
||||||
|
} |
||||||
|
|
||||||
|
uint8_t NVMC_ParseCommand(const unsigned char *cmd, bool *handled, const McuShell_StdIOType *io) { |
||||||
|
if (McuUtility_strcmp((char*)cmd, McuShell_CMD_HELP)==0 || McuUtility_strcmp((char*)cmd, "nvmc help")==0) { |
||||||
|
*handled = true; |
||||||
|
return PrintHelp(io); |
||||||
|
} else if ((McuUtility_strcmp((char*)cmd, McuShell_CMD_STATUS)==0) || (McuUtility_strcmp((char*)cmd, "nvmc status")==0)) { |
||||||
|
*handled = true; |
||||||
|
return PrintStatus(io); |
||||||
|
} else if (McuUtility_strncmp((char*)cmd, "nvmc flags", sizeof("nvmc flags")-1)==0) { |
||||||
|
*handled = true; |
||||||
|
const unsigned char *p; |
||||||
|
int32_t val; |
||||||
|
|
||||||
|
p = cmd + sizeof("nvmc flags ")-1; |
||||||
|
if (McuUtility_xatoi(&p, &val)==ERR_OK) { |
||||||
|
return NVMC_SetFlags((uint32_t)val); |
||||||
|
} else { |
||||||
|
return ERR_FAILED; |
||||||
|
} |
||||||
|
} |
||||||
|
return ERR_OK; |
||||||
|
} |
||||||
|
|
||||||
|
void NVMC_Deinit(void) { |
||||||
|
/* nothing needed */ |
||||||
|
} |
||||||
|
|
||||||
|
void NVMC_Init(void){ |
||||||
|
/* nothing needed */ |
||||||
|
} |
||||||
|
#endif /* PL_CONFIG_USE_NVMC */ |
||||||
@ -0,0 +1,106 @@ |
|||||||
|
/*
|
||||||
|
* Copyright (c) 2019-2022, Erich Styger |
||||||
|
* |
||||||
|
* SPDX-License-Identifier: BSD-3-Clause |
||||||
|
*/ |
||||||
|
|
||||||
|
#ifndef NVMC_H_ |
||||||
|
#define NVMC_H_ |
||||||
|
|
||||||
|
#include "platform.h" |
||||||
|
#include <stdint.h> |
||||||
|
#include <stdbool.h> |
||||||
|
#include "McuShell.h" |
||||||
|
|
||||||
|
#ifdef __cplusplus |
||||||
|
extern "C" { |
||||||
|
#endif |
||||||
|
|
||||||
|
#define NVMC_FLAGS_MAGNET_ENABLED (1<<0) /* if magnets are enabled or not */ |
||||||
|
|
||||||
|
/*!
|
||||||
|
* \brief Provide the id/label of the stepper motor |
||||||
|
* \param motorIdx Motor index |
||||||
|
* \param id Where the id gets stored |
||||||
|
* \return Error code, ERR_OK for everything ok |
||||||
|
*/ |
||||||
|
uint8_t NVMC_GetStepperID(uint8_t motorIdx, int16_t *id); |
||||||
|
/*!
|
||||||
|
* \brief Set the id/label of the stepper motor |
||||||
|
* \param motorIdx Motor index |
||||||
|
* \return Error code, ERR_OK for everything ok |
||||||
|
*/ |
||||||
|
uint8_t NVMC_SetStepperID(uint8_t motorIdx, uint16_t id); |
||||||
|
|
||||||
|
/*!
|
||||||
|
* \brief Provide the offset from the magnet position for a stepper motor |
||||||
|
* \param motorIdx Motor index |
||||||
|
* \return Stored offset |
||||||
|
*/ |
||||||
|
int16_t NVMC_GetStepperZeroOffset(uint8_t motorIdx); |
||||||
|
|
||||||
|
/*!
|
||||||
|
* \brief Store the offset from the magnet position for a stepper motor |
||||||
|
* \param motorIdx Motor index |
||||||
|
* \return Error code, ERR_OK for everything ok |
||||||
|
*/ |
||||||
|
uint8_t NVMC_SetStepperZeroOffset(uint8_t motorIdx, int16_t offset); |
||||||
|
|
||||||
|
/*!
|
||||||
|
* \brief Getter to get the RS-485 address |
||||||
|
* \param addr Where to store the address |
||||||
|
* \return Error code, ERR_OK for everything ok |
||||||
|
*/ |
||||||
|
uint8_t NVMC_GetRS485Addr(uint8_t *addr); |
||||||
|
|
||||||
|
/*!
|
||||||
|
* \brief Setter to set the RS-485 address. |
||||||
|
* \param addr Address to store |
||||||
|
* \return Error code, ERR_OK for everything ok |
||||||
|
*/ |
||||||
|
uint8_t NVMC_SetRS485Addr(uint8_t addr); |
||||||
|
|
||||||
|
/*!
|
||||||
|
* \brief Return for a given motor the character it is responsible for. |
||||||
|
* \param motorIdx Motor index number |
||||||
|
* \param xp Where to store the x coordinate, returns -1 for not attached motor |
||||||
|
* \param yp Where to store the y coordinate, returns -1 for not attached motor |
||||||
|
*/ |
||||||
|
uint8_t NVMC_GetStepperPosition(uint8_t motorIdx, int16_t *xp, int16_t *yp); |
||||||
|
|
||||||
|
/*!
|
||||||
|
* \brief Set position for a given motor the character it is responsible for. |
||||||
|
* \param motorIdx Motor index number |
||||||
|
* \param xp Where to store the x coordinate, returns -1 for not attached motor |
||||||
|
* \param yp Where to store the y coordinate, returns -1 for not attached motor |
||||||
|
*/ |
||||||
|
uint8_t NVMC_SetStepperPosition(uint8_t motorIdx, int16_t xPos, int16_t yPos); |
||||||
|
|
||||||
|
/*!
|
||||||
|
* \brief Getter to get the flags stored |
||||||
|
* \flags Where to store the flags |
||||||
|
* \return Error code, ERR_OK for everything ok |
||||||
|
*/ |
||||||
|
uint8_t NVMC_GetFlags(uint32_t *flags); |
||||||
|
|
||||||
|
/*!
|
||||||
|
* \brief Setter to set the flags in the configuration |
||||||
|
* \param flags The flags to be set |
||||||
|
* \return Error code, ERR_OK for everything ok |
||||||
|
*/ |
||||||
|
uint8_t NVMC_SetFlags(uint32_t flags); |
||||||
|
|
||||||
|
/*! \brief Command line shell parser interface */ |
||||||
|
uint8_t NVMC_ParseCommand(const unsigned char *cmd, bool *handled, const McuShell_StdIOType *io); |
||||||
|
|
||||||
|
/*! \brief Module de-initialization */ |
||||||
|
void NVMC_Deinit(void); |
||||||
|
|
||||||
|
/*! \brief Module initialization */ |
||||||
|
void NVMC_Init(void); |
||||||
|
|
||||||
|
#ifdef __cplusplus |
||||||
|
} /* extern "C" */ |
||||||
|
#endif |
||||||
|
|
||||||
|
#endif /* NVMC_H_ */ |
||||||
Loading…
Reference in new issue