修复littlefs挂载错误

Signed-off-by: lizhiwei <lizhiwei@talkweb.com.cn>
Change-Id: I74f6c187d050de32ec52f01577ef0f20072bf50a
This commit is contained in:
lizhiwei
2022-08-18 16:03:07 +08:00
parent d0bce342a6
commit 94bf90d8b6
3 changed files with 83 additions and 106 deletions
@@ -35,11 +35,6 @@
void* __attribute__((weak)) OHOS_APP_FUNC_ENTRY = NULL;
void* __attribute__((weak)) BEFORE_OHOS_RUN_FUNC_ENTRY = NULL;
void __attribute__((weak)) OHOS_SystemInit(void)
{
return 0;
}
int __attribute__((weak)) DeviceManagerStart(void)
{
return 0;
@@ -21,13 +21,13 @@
#include "los_compiler.h"
#include "los_memory.h"
#include "los_task.h"
#include "los_fs.h"
#include "ohos_init.h"
#include "ohos_types.h"
static const char *LITTLEFS_MOUNT_POINT = "/Openvalley";
static const char TAG[] = {"Littlefs"};
#define LFS_LOG printf
#define LSF_ERROR (-1)
#include "esp_partition.h"
/* ESP32的分区类型, 0x00-0x3F系统保留分区类型,0x40-0xFE自定义分区 */
@@ -57,84 +57,75 @@ const char *GetLittlefsMountPoint(void)
}
/* lfs读接口 */
static int LittlefsRead(const struct lfs_config *cfg, lfs_block_t block,
int littlefs_block_read(const struct lfs_config *cfg, lfs_block_t block,
lfs_off_t off, char *buffer, lfs_size_t size)
{
return spi_flash_read((size_t)cfg->context + cfg->block_size * block + off, buffer, size);
}
/* lfs写接口 */
static int LittlefsProg(const struct lfs_config *cfg, lfs_block_t block,
lfs_off_t off, const char *buffer, lfs_size_t size)
int littlefs_block_write(const struct lfs_config *cfg, lfs_block_t block,
lfs_off_t off, const void *buffer, lfs_size_t size)
{
return spi_flash_write((size_t)cfg->context + cfg->block_size * block + off, buffer, size);
}
/* lfs擦除接口 */
static int LittlefsErase(const struct lfs_config *cfg, lfs_block_t block)
int littlefs_block_erase(const struct lfs_config *cfg, lfs_block_t block)
{
return spi_flash_erase_range((size_t)cfg->context + cfg->block_size * block, cfg->block_size);
}
/* lfs同步接口 */
static int LittlefsSync(const struct lfs_config *cfg)
int littlefs_block_sync(const struct lfs_config *cfg)
{
return LFS_ERR_OK;
}
/* 接口兼容 */
int __attribute__((weak)) SetDefaultMountPath(int pathNameIndex, const char *target)
static int littlefs_config(struct PartitionCfg *pCfg)
{
return LOS_OK;
}
/* lfs初始化 */
static INT32 LittlefsInit(void)
{
int err = 0;
static struct lfs_config s_lfsConfig = {0}; /* lfs配置变量,必须是全局内存或静态内存 */
s_lfsConfig.read = LittlefsRead; /* lfs 读接口 */
s_lfsConfig.prog = LittlefsProg; /* lfs 写接口 */
s_lfsConfig.erase = LittlefsErase; /* lfs 擦除接口 */
s_lfsConfig.sync = LittlefsSync; /* lfs 同步接口 */
#if defined(LITTLEFS_PHYS_ADDR) && defined(BLOCK_COUNT)
s_lfsConfig.context = (void *)LITTLEFS_PHYS_ADDR;
s_lfsConfig.block_count = BLOCK_COUNT,
pCfg->partNo = (void *)LITTLEFS_PHYS_ADDR;
pCfg->blockCount = BLOCK_COUNT,
#else
const esp_partition_t *part;
part = esp_partition_find_first(LITTLEFS_PARTITION_TYPE, LITTLEFS_PARTITION_SUBTYPE, LITTLEFS_PARTITION_NAME);
if (!part) {
LFS_LOG("Error %s.esp_partition_find_first\n", TAG);
return LSF_ERROR;
return LOS_NOK;
}
s_lfsConfig.context = (void *)part->address;
s_lfsConfig.block_count = part->size / BLOCK_SIZE;
pCfg->partNo = (void *)part->address;
pCfg->blockCount = part->size / BLOCK_SIZE;
#endif
s_lfsConfig.read_size = READ_SIZE;
s_lfsConfig.prog_size = PROG_SIZE;
s_lfsConfig.block_size = BLOCK_SIZE;
s_lfsConfig.cache_size = CACHE_SIZE;
s_lfsConfig.lookahead_size = LOOKAHEAD_SIZE;
s_lfsConfig.block_cycles = BLOCK_CYCLES;
s_lfsConfig.read_buffer = NULL;
s_lfsConfig.prog_buffer = NULL;
s_lfsConfig.lookahead_buffer = NULL;
s_lfsConfig.name_max = 0;
s_lfsConfig.file_max = 0;
s_lfsConfig.attr_max = 0;
err = SetDefaultMountPath(0, LITTLEFS_MOUNT_POINT); /* 设置缺省挂载点 */
if (err != LOS_OK) {
LFS_LOG("Error %s.SetDefaultMountPath=0x%X\n", TAG, err);
return LSF_ERROR;
}
err = mount(NULL, LITTLEFS_MOUNT_POINT, "littlefs", 0, &s_lfsConfig); /* 设置挂载Littlefs */
if (err != LOS_OK) {
LFS_LOG("Error %s.mount=0x%X\n", TAG, err);
return LSF_ERROR;
}
LFS_LOG("%s.mount=%s addr=0x%X size=%dK OK!!!\n", TAG, LITTLEFS_MOUNT_POINT, (size_t)s_lfsConfig.context,
calc_lfs_size(s_lfsConfig.block_count, s_lfsConfig.block_size));
return 0;
pCfg->readSize = READ_SIZE;
pCfg->writeSize = PROG_SIZE;
pCfg->cacheSize = CACHE_SIZE;
pCfg->blockCycles = BLOCK_CYCLES;
pCfg->lookaheadSize = LOOKAHEAD_SIZE;
pCfg->blockSize = BLOCK_SIZE;
pCfg->readFunc = NULL;
pCfg->writeFunc = NULL;
pCfg->eraseFunc = NULL;
return LOS_OK;
}
SYS_SERVICE_INIT(LittlefsInit);
/* lfs初始化 */
INT32 LittlefsInit(void)
{
int err = 0;
struct PartitionCfg cfg = {0};
if (littlefs_config(&cfg) == LOS_NOK) {
return LOS_NOK;
}
/* 设置挂载Littlefs */
err = mount(NULL, LITTLEFS_MOUNT_POINT, "littlefs", 0, &cfg);
if (err != LOS_OK) {
LFS_LOG("Error %s.mount=0x%X\n", TAG, err);
return LOS_NOK;
}
LFS_LOG("%s.mount=%s addr=0x%X size=%dK OK!!!\n", TAG, LITTLEFS_MOUNT_POINT, (size_t)cfg.partNo,
calc_lfs_size(cfg.blockCount, cfg.blockSize));
return LOS_OK;
}
SYS_FEATURE_INIT(LittlefsInit);
@@ -23,6 +23,7 @@
#include "los_memory.h"
#include "los_task.h"
#include "los_compiler.h"
#include "los_fs.h"
#include "ohos_init.h"
#include "ohos_types.h"
@@ -32,7 +33,6 @@ static const char TAG[] = { "Littlefs" };
#define LFS_LOG printf
#define RAM_BUF_SIZE (22*1024) /* 可以被擦除的块数量,实际大小=BLOCK_SIZE*BLOCK_COUNT字节 */
#define LFS_FAIL (-1)
#define READ_SIZE 32 /* 最小读取字节数,所有的读取操作字节数必须是它的倍数(影响内存消耗) */
#define PROG_SIZE READ_SIZE /* 最小写入字节数,所有的写入操作字节数必须是它的倍数(影响内存消耗) */
#define BLOCK_SIZE 128 /* 擦除块字节数,不会影响内存消耗,每个文件至少占用一个块,必须是READ_SIZE/PROG_SIZE的倍数 */
@@ -42,61 +42,58 @@ static const char TAG[] = { "Littlefs" };
/* lfs配置变量,必须是全局内存或静态内存 */
static struct lfs_config s_lfsConfig = {0};
static char LittlefsRamBuf[RAM_BUF_SIZE];
/* lfs读接口 */
static int LittlefsRead(const struct lfs_config* cfg, lfs_block_t block,
lfs_off_t off, char* buffer, lfs_size_t size)
int littlefs_block_read(const struct lfs_config *cfg, lfs_block_t block,
lfs_off_t off, char *buffer, lfs_size_t size)
{
int ret;
off = cfg->block_size * block + off;
if ((off + size) > RAM_BUF_SIZE) {
return LFS_FAIL;
return LOS_NOK;
}
ret = memcpy_s(buffer, size, (char*)cfg->context + off, size);
if (ret != 0) {
return LFS_FAIL;
return LOS_NOK;
}
return 0;
return LOS_OK;
}
/* lfs写接口 */
static int LittlefsProg(const struct lfs_config* cfg, lfs_block_t block,
lfs_off_t off, const char* buffer, lfs_size_t size)
int littlefs_block_write(const struct lfs_config *cfg, lfs_block_t block,
lfs_off_t off, const void *buffer, lfs_size_t size)
{
int ret;
off = cfg->block_size * block + off;
if ((off + size) > RAM_BUF_SIZE) {
return LFS_FAIL;
return LOS_NOK;
}
ret = memcpy_s((char*)cfg->context + off, size, buffer, size);
if (ret != 0) {
return LFS_FAIL;
return LOS_NOK;
}
return 0;
return LOS_OK;
}
/* lfs擦除接口 */
static int LittlefsErase(const struct lfs_config* cfg, lfs_block_t block)
int littlefs_block_erase(const struct lfs_config *cfg, lfs_block_t block)
{
lfs_off_t off = cfg->block_size * block;
if ((off + cfg->block_size) > RAM_BUF_SIZE) {
return LFS_FAIL;
return LOS_NOK;
}
int ret = memset_s((char*)cfg->context + off, cfg->block_size, 0xFF, cfg->block_size);
if (ret != 0) {
return LFS_FAIL;
return LOS_NOK;
}
return 0;
return LOS_OK;
}
/* lfs同步接口 */
static int LittlefsSync(const struct lfs_config* cfg)
// /* lfs同步接口 */
int littlefs_block_sync(const struct lfs_config *c)
{
if (!cfg) {
return LFS_FAIL;
}
(void)c;
return 0;
}
@@ -105,49 +102,43 @@ const char *GetLittlefsMountPoint(void)
return LITTLEFS_MOUNT_POINT;
}
static int littlefs_config(void)
static int littlefs_config(struct PartitionCfg *pCfg)
{
int ret;
ret = memset_s(&s_lfsConfig, sizeof(s_lfsConfig), 0, sizeof(s_lfsConfig));
pCfg->partNo = (void*)LittlefsRamBuf;
ret = memset_s(LittlefsRamBuf, RAM_BUF_SIZE, 0xFF, RAM_BUF_SIZE);
if (ret != 0) {
return LFS_FAIL;
return LOS_NOK;
}
s_lfsConfig.read = LittlefsRead; /* lfs 读接口 */
s_lfsConfig.prog = LittlefsProg; /* lfs 写接口 */
s_lfsConfig.erase = LittlefsErase; /* lfs 擦除接口 */
s_lfsConfig.sync = LittlefsSync; /* lfs 同步接口 */
s_lfsConfig.context = (void*)LittlefsRamBuf;
ret = memset_s(s_lfsConfig.context, RAM_BUF_SIZE, 0xFF, RAM_BUF_SIZE);
if (ret != 0) {
return LFS_FAIL;
}
s_lfsConfig.block_count = RAM_BUF_SIZE / BLOCK_SIZE,
s_lfsConfig.read_size = READ_SIZE;
s_lfsConfig.prog_size = PROG_SIZE;
s_lfsConfig.block_size = BLOCK_SIZE;
s_lfsConfig.cache_size = CACHE_SIZE;
s_lfsConfig.lookahead_size = LOOKAHEAD_SIZE;
s_lfsConfig.block_cycles = BLOCK_CYCLES;
return 0;
pCfg->blockCount = RAM_BUF_SIZE / BLOCK_SIZE;
pCfg->readSize = READ_SIZE;
pCfg->writeSize = PROG_SIZE;
pCfg->cacheSize = CACHE_SIZE;
pCfg->blockCycles = BLOCK_CYCLES;
pCfg->lookaheadSize = LOOKAHEAD_SIZE;
pCfg->blockSize = BLOCK_SIZE;
pCfg->readFunc = NULL;
pCfg->writeFunc = NULL;
pCfg->eraseFunc = NULL;
return LOS_OK;
}
/* lfs初始化 */
// /* lfs初始化 */
static INT32 LittlefsInit(void)
{
int err, ret;
DIR* dir;
if (littlefs_config() == LFS_FAIL) {
return LFS_FAIL;
struct PartitionCfg cfg = {0};
if (littlefs_config(&cfg) == LOS_NOK) {
return LOS_NOK;
}
/* 设置挂载Littlefs */
err = mount(NULL, LITTLEFS_MOUNT_POINT, "littlefs", 0, &s_lfsConfig);
err = mount(NULL, LITTLEFS_MOUNT_POINT, "littlefs", 0, &cfg);
if (err != LOS_OK) {
LFS_LOG("Error %s.mount=0x%X\n", TAG, err);
return LFS_FAIL;
return LOS_NOK;
}
mkdir(LITTLEFS_MOUNT_POINT, S_IRUSR | S_IWUSR);
return 0;
return LOS_OK;
}
SYS_SERVICE_INIT(LittlefsInit);
SYS_FEATURE_INIT(LittlefsInit);