#include <string.h>
#include "fsl_flash.h"
#include "board.h"
#include "flash.h"
static flash_config_t flash_driver = {0};
static ftfx_cache_config_t cache_driver = {0};
static uint32_t flash_base;
static uint32_t flash_total_size;
static uint32_t flash_sector_size;
int32_t flash_init(void)
{
status_t ret;
// Init flash management structure
ret = FLASH_Init(&flash_driver);
if (kStatus_FTFx_Success != ret)
return -1;
// Init cache
ret = FTFx_CACHE_Init(&cache_driver);
if (kStatus_FTFx_Success != ret)
return -1;
// Query information about this particular flash
FLASH_GetProperty(&flash_driver, kFLASH_PropertyPflash0BlockBaseAddr, &flash_base);
FLASH_GetProperty(&flash_driver, kFLASH_PropertyPflash0TotalSize, &flash_total_size);
FLASH_GetProperty(&flash_driver, kFLASH_PropertyPflash0SectorSize, &flash_sector_size);
#if 0
// Default state is insecure
{
ftfx_security_state_t securityStatus;
ret = FLASH_GetSecurityState(&flash_driver, &securityStatus);
if (kStatus_FTFx_Success != ret)
return -1;
}
#endif
#if 0
// Default state is unprotected
{
flash_prot_state_t protection_state;
ret = FLASH_IsProtected(&flash_driver, 0x7C00, 0x400, &protection_state);
if (kStatus_FTFx_Success != ret)
return -1;
}
#endif
return 0;
}
int32_t flash_get_sector_count(void)
{
return flash_total_size / flash_sector_size;
}
int32_t flash_erase_sector(uint32_t sect)
{
status_t ret;
uint32_t dest_addr = flash_base + (sect * flash_sector_size);
// Erase...
ret = FLASH_Erase(&flash_driver, dest_addr, flash_sector_size, kFTFx_ApiEraseKey);
if (kStatus_FTFx_Success != ret)
return -1;
// ...and verify
ret = FLASH_VerifyErase(&flash_driver, dest_addr, flash_sector_size, kFTFx_MarginValueUser);
if (kStatus_FTFx_Success != ret)
return -1;
return 0;
}
int32_t flash_write_sector(uint32_t sect, uint8_t *buf, uint32_t sz)
{
status_t ret;
int32_t retval = 0;
uint32_t dest_addr = flash_base + (sect * flash_sector_size);
// DEBUG
#if 0
// Reports unprotected
flash_prot_state_t protection_state;
ret = FLASH_IsProtected(&flash_driver, dest_addr, sz, &protection_state);
if (kStatus_FTFx_Success != ret)
return -1;
#endif
FTFx_CACHE_ClearCachePrefetchSpeculation(&cache_driver, true);
// Program...
ret = FLASH_Program(&flash_driver, dest_addr, buf, sz);
if (kStatus_FTFx_Success != ret) {
retval = -1;
goto err_exit;
}
// ...and verify
ret = FLASH_VerifyProgram(&flash_driver, dest_addr, sz, buf, kFTFx_MarginValueUser, NULL, NULL);
if (kStatus_FTFx_Success != ret) {
retval = -1;
goto err_exit;
}
err_exit:
FTFx_CACHE_ClearCachePrefetchSpeculation(&cache_driver, false);
return retval;
}
int32_t flash_read_sector(uint32_t sect, uint8_t *buf, uint32_t sz)
{
uint32_t src_addr = flash_base + (sect * flash_sector_size);
memcpy(buf, (uint8_t *)src_addr, sz);
return 0;
}#include <string.h>
#include "fsl_flash.h"
#include "board.h"
#include "flash.h"
static flash_config_t flash_driver = {0};
static ftfx_cache_config_t cache_driver = {0};
static uint32_t flash_base;
static uint32_t flash_total_size;
static uint32_t flash_sector_size;
int32_t flash_init(void)
{
status_t ret;
// Init flash management structure
ret = FLASH_Init(&flash_driver);
if (kStatus_FTFx_Success != ret)
return -1;
// Init cache
ret = FTFx_CACHE_Init(&cache_driver);
if (kStatus_FTFx_Success != ret)
return -1;
// Query information about this particular flash
FLASH_GetProperty(&flash_driver, kFLASH_PropertyPflash0BlockBaseAddr, &flash_base);
FLASH_GetProperty(&flash_driver, kFLASH_PropertyPflash0TotalSize, &flash_total_size);
FLASH_GetProperty(&flash_driver, kFLASH_PropertyPflash0SectorSize, &flash_sector_size);
#if 0
// Default state is insecure
{
ftfx_security_state_t securityStatus;
ret = FLASH_GetSecurityState(&flash_driver, &securityStatus);
if (kStatus_FTFx_Success != ret)
return -1;
}
#endif
#if 0
// Default state is unprotected
{
flash_prot_state_t protection_state;
ret = FLASH_IsProtected(&flash_driver, 0x7C00, 0x400, &protection_state);
if (kStatus_FTFx_Success != ret)
return -1;
}
#endif
return 0;
}
int32_t flash_get_sector_count(void)
{
return flash_total_size / flash_sector_size;
}
int32_t flash_erase_sector(uint32_t sect)
{
status_t ret;
uint32_t dest_addr = flash_base + (sect * flash_sector_size);
// Erase...
ret = FLASH_Erase(&flash_driver, dest_addr, flash_sector_size, kFTFx_ApiEraseKey);
if (kStatus_FTFx_Success != ret)
return -1;
// ...and verify
ret = FLASH_VerifyErase(&flash_driver, dest_addr, flash_sector_size, kFTFx_MarginValueUser);
if (kStatus_FTFx_Success != ret)
return -1;
return 0;
}
int32_t flash_write_sector(uint32_t sect, uint8_t *buf, uint32_t sz)
{
status_t ret;
int32_t retval = 0;
uint32_t dest_addr = flash_base + (sect * flash_sector_size);
// DEBUG
#if 0
// Reports unprotected
flash_prot_state_t protection_state;
ret = FLASH_IsProtected(&flash_driver, dest_addr, sz, &protection_state);
if (kStatus_FTFx_Success != ret)
return -1;
#endif
FTFx_CACHE_ClearCachePrefetchSpeculation(&cache_driver, true);
// Program...
ret = FLASH_Program(&flash_driver, dest_addr, buf, sz);
if (kStatus_FTFx_Success != ret) {
retval = -1;
goto err_exit;
}
// ...and verify
ret = FLASH_VerifyProgram(&flash_driver, dest_addr, sz, buf, kFTFx_MarginValueUser, NULL, NULL);
if (kStatus_FTFx_Success != ret) {
retval = -1;
goto err_exit;
}
err_exit:
FTFx_CACHE_ClearCachePrefetchSpeculation(&cache_driver, false);
return retval;
}
int32_t flash_read_sector(uint32_t sect, uint8_t *buf, uint32_t sz)
{
uint32_t src_addr = flash_base + (sect * flash_sector_size);
memcpy(buf, (uint8_t *)src_addr, sz);
return 0;
}