MCUXpresso_MIMXRT1052xxxxB/boards/evkbimxrt1050/littlefs_examples/littlefs_shell/lfs_mflash.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;
}