112 lines
2.8 KiB
C
112 lines
2.8 KiB
C
/*
|
|
* Copyright 2018-2021 NXP
|
|
* All rights reserved.
|
|
*
|
|
* SPDX-License-Identifier: BSD-3-Clause
|
|
*/
|
|
|
|
#include "lfs_mflash.h"
|
|
#include "fsl_debug_console.h"
|
|
#include "peripherals.h"
|
|
|
|
/*******************************************************************************
|
|
* Variables
|
|
******************************************************************************/
|
|
|
|
struct lfs_mflash_ctx LittleFS_ctx = {LITTLEFS_START_ADDR};
|
|
|
|
/*******************************************************************************
|
|
* Code
|
|
******************************************************************************/
|
|
|
|
int lfs_mflash_read(const struct lfs_config *lfsc, lfs_block_t block, lfs_off_t off, void *buffer, lfs_size_t size)
|
|
{
|
|
struct lfs_mflash_ctx *ctx;
|
|
uint32_t flash_addr;
|
|
|
|
assert(lfsc);
|
|
ctx = (struct lfs_mflash_ctx *)lfsc->context;
|
|
assert(ctx);
|
|
|
|
flash_addr = ctx->start_addr + block * lfsc->block_size + off;
|
|
|
|
if (mflash_drv_read(flash_addr, buffer, size) != kStatus_Success)
|
|
return LFS_ERR_IO;
|
|
|
|
return LFS_ERR_OK;
|
|
}
|
|
|
|
int lfs_mflash_prog(
|
|
const struct lfs_config *lfsc, lfs_block_t block, lfs_off_t off, const void *buffer, lfs_size_t size)
|
|
{
|
|
status_t status = kStatus_Success;
|
|
struct lfs_mflash_ctx *ctx;
|
|
uint32_t flash_addr;
|
|
|
|
assert(lfsc);
|
|
ctx = (struct lfs_mflash_ctx *)lfsc->context;
|
|
assert(ctx);
|
|
|
|
flash_addr = ctx->start_addr + block * lfsc->block_size + off;
|
|
|
|
assert(mflash_drv_is_page_aligned(size));
|
|
|
|
for (uint32_t page_ofs = 0; page_ofs < size; page_ofs += MFLASH_PAGE_SIZE)
|
|
{
|
|
status = mflash_drv_page_program(flash_addr + page_ofs, (void *)((uintptr_t)buffer + page_ofs));
|
|
if (status != kStatus_Success)
|
|
break;
|
|
}
|
|
|
|
if (status != kStatus_Success)
|
|
return LFS_ERR_IO;
|
|
|
|
return LFS_ERR_OK;
|
|
}
|
|
|
|
int lfs_mflash_erase(const struct lfs_config *lfsc, lfs_block_t block)
|
|
{
|
|
status_t status = kStatus_Success;
|
|
struct lfs_mflash_ctx *ctx;
|
|
uint32_t flash_addr;
|
|
|
|
assert(lfsc);
|
|
ctx = (struct lfs_mflash_ctx *)lfsc->context;
|
|
assert(ctx);
|
|
|
|
flash_addr = ctx->start_addr + block * lfsc->block_size;
|
|
|
|
for (uint32_t sector_ofs = 0; sector_ofs < lfsc->block_size; sector_ofs += MFLASH_SECTOR_SIZE)
|
|
{
|
|
status = mflash_drv_sector_erase(flash_addr + sector_ofs);
|
|
if (status != kStatus_Success)
|
|
break;
|
|
}
|
|
|
|
if (status != kStatus_Success)
|
|
return LFS_ERR_IO;
|
|
|
|
return LFS_ERR_OK;
|
|
}
|
|
|
|
int lfs_mflash_sync(const struct lfs_config *lfsc)
|
|
{
|
|
return LFS_ERR_OK;
|
|
}
|
|
|
|
int lfs_get_default_config(struct lfs_config *lfsc)
|
|
{
|
|
*lfsc = LittleFS_config; /* copy pre-initialized lfs config structure */
|
|
return 0;
|
|
}
|
|
|
|
int lfs_storage_init(const struct lfs_config *lfsc)
|
|
{
|
|
status_t status;
|
|
|
|
/* initialize mflash */
|
|
status = mflash_drv_init();
|
|
|
|
return status;
|
|
}
|