/** * \file * \brief Implementation of Non-Volatile-Memory storage * \author Erich Styger * \license SPDX-License-Identifier: BSD-3-Clause * This provides an implementation to store and retrieve data from the on-chip memory. */ #include "platform.h" #if PL_CONFIG_HAS_NVM_CONFIG #include "McuLib.h" #include "NVM_Config.h" #include #include "fsl_flash.h" /*! @brief Flash driver Structure */ static flash_config_t s_flashDriver; static bool isErased(uint8_t *ptr, int nofBytes) { while (nofBytes>0) { if (*ptr!=0xFF) { return false; /* byte not erased */ } ptr++; nofBytes--; } return true; } uint8_t NVMC_SetBlockFlash(uint32_t addr, void *data, size_t dataSize) { static uint32_t buf[NVMC_FLASH_BLOCK_SIZE/4]; /* backup buffer */ unsigned int i; status_t status; uint8_t *p, *q; /* make backup of current content */ for(i=0;iNVMC_REFLECTANCE_DATA_SIZE) { return ERR_OVERFLOW; } return NVMC_SetBlockFlash(NVMC_REFLECTANCE_DATA_START_ADDR, data, dataSize); } void *NVMC_GetReflectanceData(void) { if (isErased((uint8_t*)NVMC_REFLECTANCE_DATA_START_ADDR, NVMC_REFLECTANCE_DATA_SIZE)) { return NULL; } return (void*)NVMC_REFLECTANCE_DATA_START_ADDR; } #if PL_CONFIG_APP_SUMO uint8_t NVMC_SaveSumoData(void *data, uint16_t dataSize) { if (dataSize>NVMC_SUMO_DATA_SIZE) { return ERR_OVERFLOW; } return NVMC_SetBlockFlash(NVMC_SUMO_DATA_START_ADDR, data, dataSize); } void *NVMC_GetSumoData(void) { if (isErased((uint8_t*)NVMC_SUMO_DATA_START_ADDR, NVMC_SUMO_DATA_SIZE)) { return NULL; } return (void*)NVMC_SUMO_DATA_START_ADDR; } #endif /* PL_CONFIG_APP_SUMO */ uint8_t NVMC_SaveRobotData(NVMC_RobotData *data) { return NVMC_SetBlockFlash(NVMC_ROBOT_DATA_START_ADDR, data, sizeof(NVMC_RobotData)); } const NVMC_RobotData *NVMC_GetRobotData(void) { if (isErased((uint8_t*)NVMC_ROBOT_DATA_START_ADDR, sizeof(NVMC_RobotData))) { return NULL; } return (void*)NVMC_ROBOT_DATA_START_ADDR; } void NVMC_Deinit(void) { } void NVMC_Init(void) { status_t status; memset(&s_flashDriver, 0, sizeof(flash_config_t)); status = FLASH_Init(&s_flashDriver); if (status!=kStatus_FLASH_Success) { for(;;) {} /* error */ } } #endif /* PL_CONFIG_HAS_NVM_CONFIG */