MAX_CARLINK_A270S/MXC_A27-PCB4.5-270T/app/lfs_sfud.c

186 lines
4.0 KiB
C

#include "FreeRTOS.h"
#include "board.h"
#include "sfud.h"
#include "lfs.h"
static uint32_t lfs_startblk;
static lfs_t sufd_lfs;
static sfud_flash *lfs_sf;
static int lfs_sfud_read(const struct lfs_config *c, lfs_block_t block,
lfs_off_t off, void *buffer, lfs_size_t size)
{
block += lfs_startblk;
#if DEVICE_TYPE_SELECT != EMMC_FLASH
if (sfud_read(lfs_sf, block * c->block_size + off, size, buffer) == SFUD_SUCCESS)
return LFS_ERR_OK;
else
return LFS_ERR_IO;
#else
if (emmc_read(block * c->block_size + off, size, buffer) == SFUD_SUCCESS)
return LFS_ERR_OK;
else
return LFS_ERR_IO;
#endif
}
static int lfs_sfud_prog(const struct lfs_config *c, lfs_block_t block,
lfs_off_t off, const void *buffer, lfs_size_t size)
{
block += lfs_startblk;
#if DEVICE_TYPE_SELECT != EMMC_FLASH
if (sfud_write(lfs_sf, block * c->block_size + off, size, buffer) == SFUD_SUCCESS)
return LFS_ERR_OK;
else
return LFS_ERR_IO;
#endif
}
static int lfs_sfud_erase(const struct lfs_config *c, lfs_block_t block)
{
#if DEVICE_TYPE_SELECT == EMMC_FLASH
return LFS_ERR_OK;
#endif
block += lfs_startblk;
if (sfud_erase(lfs_sf, block * c->block_size, c->block_size) == SFUD_SUCCESS)
return LFS_ERR_OK;
else
return LFS_ERR_IO;
}
static int lfs_sfud_sync(const struct lfs_config* c)
{
return LFS_ERR_OK;
}
static struct lfs_config sfud_cfg =
{
.read = lfs_sfud_read,
.prog = lfs_sfud_prog,
.erase = lfs_sfud_erase,
.sync = lfs_sfud_sync,
.read_size = 256,
.prog_size = 256,
.block_size = 4096,
.block_count = OTA_MEDIA_SIZE / 4096,
.block_cycles = 500,
.cache_size = 4096,
.lookahead_size = 128,
};
int lfs_sfud_init(void)
{
int err = 0;
lfs_sf = sfud_get_device(0);
if (!lfs_sf)
return -1;
lfs_startblk = OTA_MEDIA_OFFSET / 4096;
err = lfs_mount(&sufd_lfs, &sfud_cfg);
if (err) {
lfs_format(&sufd_lfs, &sfud_cfg);
err = lfs_mount(&sufd_lfs, &sfud_cfg);
if (err)
printf("lfs mount fail. err=%d.\n", err);
else
printf("lfs mount ok.\n");
} else {
printf("lfs mount ok.\n");
}
return err;
}
#define TEST_FILE_SIZE 0x600000
#define TEST_READ_SIZE 16834
void lfs_demo(void)
{
int err;
lfs_file_t file;
uint32_t size;
uint32_t leftsize;
uint32_t time;
uint8_t *wbuf = NULL, *rbuf = NULL;
uint8_t *buf;
int i;
err = lfs_sfud_init();
if (err) {
printf("lfs_sfud_init fail.\n");
return;
}
wbuf = pvPortMalloc(TEST_FILE_SIZE);
if (!wbuf)
return;
rbuf = pvPortMalloc(TEST_FILE_SIZE);
if (!rbuf) {
vPortFree(wbuf);
return;
}
for (i = 0; i < TEST_FILE_SIZE; i++) {
wbuf[i] = rand();
rbuf[i] = 0;
}
err = lfs_file_open(&sufd_lfs, &file, "test.bin", LFS_O_RDONLY);
if (!err) {
lfs_file_close(&sufd_lfs, &file);
lfs_remove(&sufd_lfs, "test.bin");
}
err = lfs_file_open(&sufd_lfs, &file, "test.bin", LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC);
if (!err) {
buf = wbuf;
leftsize = TEST_FILE_SIZE;
while (leftsize > 0) {
int wsize;
size = leftsize > TEST_READ_SIZE ? TEST_READ_SIZE : leftsize;
time = get_timer(0);
wsize = lfs_file_write(&sufd_lfs, &file, buf, size);
time = get_timer(time);
printf("wtime %d us.\n", time);
if (wsize != size)
printf("lfs_file_write err=%d, leftsize=%d.\n", wsize, leftsize);
if (wsize > 0) {
leftsize -= wsize;
buf += wsize;
}
}
}
lfs_file_close(&sufd_lfs, &file);
err = lfs_file_open(&sufd_lfs, &file, "test.bin", LFS_O_RDONLY);
if (!err) {
buf = rbuf;
leftsize = TEST_FILE_SIZE;
while (leftsize > 0) {
int rsize;
size = leftsize > TEST_READ_SIZE ? TEST_READ_SIZE : leftsize;
time = get_timer(0);
rsize = lfs_file_read(&sufd_lfs, &file, buf, size);
time = get_timer(time);
printf("rtime %d us.\n", time);
if (rsize != size)
printf("lfs_file_read err=%d, leftsize=%d.\n", rsize, leftsize);
if (rsize > 0) {
leftsize -= rsize;
buf += rsize;
}
}
}
lfs_file_close(&sufd_lfs, &file);
for (i = 0; i < TEST_FILE_SIZE; i++) {
if (wbuf[i] != rbuf[i]) {
printf("lfs rw fail %d,0x%x,0x%x.\n", i, wbuf[i], rbuf[i]);
}
}
vPortFree(wbuf);
vPortFree(rbuf);
}