154568cb3Sopenharmony_ci/* 254568cb3Sopenharmony_ci * Copyright (c) 2022-2022 Huawei Technologies Co., Ltd. All rights reserved. 354568cb3Sopenharmony_ci * 454568cb3Sopenharmony_ci * UniProton is licensed under Mulan PSL v2. 554568cb3Sopenharmony_ci * You can use this software according to the terms and conditions of the Mulan PSL v2. 654568cb3Sopenharmony_ci * You may obtain a copy of Mulan PSL v2 at: 754568cb3Sopenharmony_ci * http://license.coscl.org.cn/MulanPSL2 854568cb3Sopenharmony_ci * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, 954568cb3Sopenharmony_ci * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, 1054568cb3Sopenharmony_ci * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. 1154568cb3Sopenharmony_ci * See the Mulan PSL v2 for more details. 1254568cb3Sopenharmony_ci * Create: 2022-09-21 1354568cb3Sopenharmony_ci * Description: littlefs适配层代码 1454568cb3Sopenharmony_ci */ 1554568cb3Sopenharmony_ci#define _GNU_SOURCE 1 1654568cb3Sopenharmony_ci#include "lfs_adapter.h" 1754568cb3Sopenharmony_ci#include "prt_fs.h" 1854568cb3Sopenharmony_ci#include "vfs_files.h" 1954568cb3Sopenharmony_ci#include "vfs_operations.h" 2054568cb3Sopenharmony_ci#include "vfs_partition.h" 2154568cb3Sopenharmony_ci#include "vfs_maps.h" 2254568cb3Sopenharmony_ci#include "vfs_mount.h" 2354568cb3Sopenharmony_ci#include "securec.h" 2454568cb3Sopenharmony_ci 2554568cb3Sopenharmony_cistatic pthread_mutex_t g_fsLocalMutex = PTHREAD_MUTEX_INITIALIZER; 2654568cb3Sopenharmony_ci 2754568cb3Sopenharmony_cistatic struct PartitionCfg g_partitionCfg; 2854568cb3Sopenharmony_cistatic struct TagDeviceDesc *g_lfsDevice; 2954568cb3Sopenharmony_ci 3054568cb3Sopenharmony_cistatic uintptr_t OsLfsGetStartAddr(S32 partition) 3154568cb3Sopenharmony_ci{ 3254568cb3Sopenharmony_ci if (g_lfsDevice == NULL) { 3354568cb3Sopenharmony_ci struct TagDeviceDesc *device = NULL; 3454568cb3Sopenharmony_ci for (device = OsGetDeviceList(); device != NULL; device = device->dNext) { 3554568cb3Sopenharmony_ci if (strcmp(device->dFsType, "littlefs") == 0) { 3654568cb3Sopenharmony_ci g_lfsDevice = device; 3754568cb3Sopenharmony_ci break; 3854568cb3Sopenharmony_ci } 3954568cb3Sopenharmony_ci } 4054568cb3Sopenharmony_ci } 4154568cb3Sopenharmony_ci 4254568cb3Sopenharmony_ci if ((g_lfsDevice == NULL) || (partition >= g_lfsDevice->dPartNum)) { 4354568cb3Sopenharmony_ci return INVALID_DEVICE_ADDR; 4454568cb3Sopenharmony_ci } 4554568cb3Sopenharmony_ci 4654568cb3Sopenharmony_ci return g_lfsDevice->dAddrArray[partition]; 4754568cb3Sopenharmony_ci} 4854568cb3Sopenharmony_ci 4954568cb3Sopenharmony_cistatic S32 OsLfsBlockRead(const struct lfs_config *c, lfs_block_t block, 5054568cb3Sopenharmony_ci lfs_off_t off, void *dst, lfs_size_t size) 5154568cb3Sopenharmony_ci{ 5254568cb3Sopenharmony_ci uintptr_t startAddr = OsLfsGetStartAddr((S32)c->context); 5354568cb3Sopenharmony_ci if (startAddr == INVALID_DEVICE_ADDR) { 5454568cb3Sopenharmony_ci return -1; 5554568cb3Sopenharmony_ci } 5654568cb3Sopenharmony_ci startAddr += (c->block_size * block + off); 5754568cb3Sopenharmony_ci return (g_partitionCfg.readFunc)((S32)c->context, startAddr, dst, size); 5854568cb3Sopenharmony_ci} 5954568cb3Sopenharmony_ci 6054568cb3Sopenharmony_cistatic S32 OsLfsBlockWrite(const struct lfs_config *c, lfs_block_t block, 6154568cb3Sopenharmony_ci lfs_off_t off, const void *dst, lfs_size_t size) 6254568cb3Sopenharmony_ci{ 6354568cb3Sopenharmony_ci uintptr_t startAddr = OsLfsGetStartAddr((S32)c->context); 6454568cb3Sopenharmony_ci if (startAddr == INVALID_DEVICE_ADDR) { 6554568cb3Sopenharmony_ci return -1; 6654568cb3Sopenharmony_ci } 6754568cb3Sopenharmony_ci 6854568cb3Sopenharmony_ci startAddr += (c->block_size * block + off); 6954568cb3Sopenharmony_ci return (g_partitionCfg.writeFunc)((S32)c->context, startAddr, dst, size); 7054568cb3Sopenharmony_ci} 7154568cb3Sopenharmony_ci 7254568cb3Sopenharmony_cistatic S32 OsLfsBlockErase(const struct lfs_config *c, lfs_block_t block) 7354568cb3Sopenharmony_ci{ 7454568cb3Sopenharmony_ci uintptr_t startAddr = OsLfsGetStartAddr((S32)c->context); 7554568cb3Sopenharmony_ci if (startAddr == INVALID_DEVICE_ADDR) { 7654568cb3Sopenharmony_ci return -1; 7754568cb3Sopenharmony_ci } 7854568cb3Sopenharmony_ci 7954568cb3Sopenharmony_ci startAddr += (c->block_size * block); 8054568cb3Sopenharmony_ci return (g_partitionCfg.eraseFunc)((S32)c->context, startAddr, c->block_size); 8154568cb3Sopenharmony_ci} 8254568cb3Sopenharmony_ci 8354568cb3Sopenharmony_cistatic S32 OsLfsBlockSync(const struct lfs_config *c) 8454568cb3Sopenharmony_ci{ 8554568cb3Sopenharmony_ci (void)c; 8654568cb3Sopenharmony_ci return 0; 8754568cb3Sopenharmony_ci} 8854568cb3Sopenharmony_ci 8954568cb3Sopenharmony_cistatic S32 OsConvertFlagToLfsOpenFlag(S32 oflags) 9054568cb3Sopenharmony_ci{ 9154568cb3Sopenharmony_ci S32 lfsOpenFlag = 0; 9254568cb3Sopenharmony_ci 9354568cb3Sopenharmony_ci if (oflags & O_CREAT) { 9454568cb3Sopenharmony_ci lfsOpenFlag |= LFS_O_CREAT; 9554568cb3Sopenharmony_ci } 9654568cb3Sopenharmony_ci 9754568cb3Sopenharmony_ci if (oflags & O_EXCL) { 9854568cb3Sopenharmony_ci lfsOpenFlag |= LFS_O_EXCL; 9954568cb3Sopenharmony_ci } 10054568cb3Sopenharmony_ci 10154568cb3Sopenharmony_ci if (oflags & O_TRUNC) { 10254568cb3Sopenharmony_ci lfsOpenFlag |= LFS_O_TRUNC; 10354568cb3Sopenharmony_ci } 10454568cb3Sopenharmony_ci 10554568cb3Sopenharmony_ci if (oflags & O_APPEND) { 10654568cb3Sopenharmony_ci lfsOpenFlag |= LFS_O_APPEND; 10754568cb3Sopenharmony_ci } 10854568cb3Sopenharmony_ci 10954568cb3Sopenharmony_ci if (oflags & O_RDWR) { 11054568cb3Sopenharmony_ci lfsOpenFlag |= LFS_O_RDWR; 11154568cb3Sopenharmony_ci } 11254568cb3Sopenharmony_ci 11354568cb3Sopenharmony_ci if (oflags & O_WRONLY) { 11454568cb3Sopenharmony_ci lfsOpenFlag |= LFS_O_WRONLY; 11554568cb3Sopenharmony_ci } 11654568cb3Sopenharmony_ci 11754568cb3Sopenharmony_ci if (oflags == O_RDONLY) { 11854568cb3Sopenharmony_ci lfsOpenFlag |= LFS_O_RDONLY; 11954568cb3Sopenharmony_ci } 12054568cb3Sopenharmony_ci 12154568cb3Sopenharmony_ci return lfsOpenFlag; 12254568cb3Sopenharmony_ci} 12354568cb3Sopenharmony_ci 12454568cb3Sopenharmony_cistatic S32 OsLfsErrno(S32 result) 12554568cb3Sopenharmony_ci{ 12654568cb3Sopenharmony_ci return (result < 0) ? -result : result; 12754568cb3Sopenharmony_ci} 12854568cb3Sopenharmony_ci 12954568cb3Sopenharmony_cistatic void OsLfsConfigAdapter(struct PartitionCfg *pCfg, struct lfs_config *lfsCfg) 13054568cb3Sopenharmony_ci{ 13154568cb3Sopenharmony_ci lfsCfg->context = (void *)pCfg->partNo; 13254568cb3Sopenharmony_ci 13354568cb3Sopenharmony_ci lfsCfg->read_size = pCfg->readSize; 13454568cb3Sopenharmony_ci lfsCfg->prog_size = pCfg->writeSize; 13554568cb3Sopenharmony_ci lfsCfg->cache_size = pCfg->cacheSize; 13654568cb3Sopenharmony_ci lfsCfg->block_cycles = pCfg->blockCycles; 13754568cb3Sopenharmony_ci lfsCfg->lookahead_size = pCfg->lookaheadSize; 13854568cb3Sopenharmony_ci lfsCfg->block_size = pCfg->blockSize; 13954568cb3Sopenharmony_ci lfsCfg->block_count = pCfg->blockCount; 14054568cb3Sopenharmony_ci 14154568cb3Sopenharmony_ci lfsCfg->read = OsLfsBlockRead; 14254568cb3Sopenharmony_ci lfsCfg->prog = OsLfsBlockWrite; 14354568cb3Sopenharmony_ci lfsCfg->erase = OsLfsBlockErase; 14454568cb3Sopenharmony_ci lfsCfg->sync = OsLfsBlockSync; 14554568cb3Sopenharmony_ci 14654568cb3Sopenharmony_ci g_partitionCfg.readFunc = pCfg->readFunc; 14754568cb3Sopenharmony_ci g_partitionCfg.writeFunc = pCfg->writeFunc; 14854568cb3Sopenharmony_ci g_partitionCfg.eraseFunc = pCfg->eraseFunc; 14954568cb3Sopenharmony_ci} 15054568cb3Sopenharmony_ci 15154568cb3Sopenharmony_cistatic S32 OsLfsMount(struct TagMountPoint *mp, uintptr_t mountflags, const void *data) 15254568cb3Sopenharmony_ci{ 15354568cb3Sopenharmony_ci S32 ret; 15454568cb3Sopenharmony_ci S32 size; 15554568cb3Sopenharmony_ci lfs_t *mountHdl = NULL; 15654568cb3Sopenharmony_ci struct lfs_config *cfg = NULL; 15754568cb3Sopenharmony_ci 15854568cb3Sopenharmony_ci if ((mp == NULL) || (mp->mPath == NULL) || (data == NULL)) { 15954568cb3Sopenharmony_ci errno = EFAULT; 16054568cb3Sopenharmony_ci return FS_NOK; 16154568cb3Sopenharmony_ci } 16254568cb3Sopenharmony_ci 16354568cb3Sopenharmony_ci size = sizeof(lfs_t) + sizeof(struct lfs_config); 16454568cb3Sopenharmony_ci mountHdl = (lfs_t *)malloc(size); 16554568cb3Sopenharmony_ci if (mountHdl == NULL) { 16654568cb3Sopenharmony_ci errno = ENODEV; 16754568cb3Sopenharmony_ci return FS_NOK; 16854568cb3Sopenharmony_ci } 16954568cb3Sopenharmony_ci if (memset_s(mountHdl, size, 0, size) != EOK) { 17054568cb3Sopenharmony_ci free(mountHdl); 17154568cb3Sopenharmony_ci errno = EBADF; 17254568cb3Sopenharmony_ci return FS_NOK; 17354568cb3Sopenharmony_ci } 17454568cb3Sopenharmony_ci mp->mData = (void *)mountHdl; 17554568cb3Sopenharmony_ci cfg = (struct lfs_config *)((uintptr_t)mountHdl + sizeof(lfs_t)); 17654568cb3Sopenharmony_ci 17754568cb3Sopenharmony_ci OsLfsConfigAdapter((struct PartitionCfg *)data, cfg); 17854568cb3Sopenharmony_ci 17954568cb3Sopenharmony_ci ret = lfs_mount((lfs_t *)mp->mData, cfg); 18054568cb3Sopenharmony_ci if (ret != 0) { 18154568cb3Sopenharmony_ci ret = lfs_format((lfs_t *)mp->mData, cfg); 18254568cb3Sopenharmony_ci if (ret == 0) { 18354568cb3Sopenharmony_ci ret = lfs_mount((lfs_t *)mp->mData, cfg); 18454568cb3Sopenharmony_ci } 18554568cb3Sopenharmony_ci } 18654568cb3Sopenharmony_ci if (ret != 0) { 18754568cb3Sopenharmony_ci free(mountHdl); 18854568cb3Sopenharmony_ci errno = OsLfsErrno(ret); 18954568cb3Sopenharmony_ci return FS_NOK; 19054568cb3Sopenharmony_ci } 19154568cb3Sopenharmony_ci return ret; 19254568cb3Sopenharmony_ci} 19354568cb3Sopenharmony_ci 19454568cb3Sopenharmony_cistatic S32 OsLfsUmount(struct TagMountPoint *mp) 19554568cb3Sopenharmony_ci{ 19654568cb3Sopenharmony_ci S32 ret; 19754568cb3Sopenharmony_ci 19854568cb3Sopenharmony_ci if (mp == NULL) { 19954568cb3Sopenharmony_ci errno = EFAULT; 20054568cb3Sopenharmony_ci return FS_NOK; 20154568cb3Sopenharmony_ci } 20254568cb3Sopenharmony_ci 20354568cb3Sopenharmony_ci if (mp->mData == NULL) { 20454568cb3Sopenharmony_ci errno = ENOENT; 20554568cb3Sopenharmony_ci return FS_NOK; 20654568cb3Sopenharmony_ci } 20754568cb3Sopenharmony_ci 20854568cb3Sopenharmony_ci ret = lfs_unmount((lfs_t *)mp->mData); 20954568cb3Sopenharmony_ci if (ret != 0) { 21054568cb3Sopenharmony_ci errno = OsLfsErrno(ret); 21154568cb3Sopenharmony_ci ret = FS_NOK; 21254568cb3Sopenharmony_ci } 21354568cb3Sopenharmony_ci 21454568cb3Sopenharmony_ci free(mp->mData); 21554568cb3Sopenharmony_ci mp->mData = NULL; 21654568cb3Sopenharmony_ci return ret; 21754568cb3Sopenharmony_ci} 21854568cb3Sopenharmony_ci 21954568cb3Sopenharmony_cistatic S32 OsLfsUnlink(struct TagMountPoint *mp, const char *fileName) 22054568cb3Sopenharmony_ci{ 22154568cb3Sopenharmony_ci S32 ret; 22254568cb3Sopenharmony_ci 22354568cb3Sopenharmony_ci if ((mp == NULL) || (fileName == NULL)) { 22454568cb3Sopenharmony_ci errno = EFAULT; 22554568cb3Sopenharmony_ci return FS_NOK; 22654568cb3Sopenharmony_ci } 22754568cb3Sopenharmony_ci 22854568cb3Sopenharmony_ci if (mp->mData == NULL) { 22954568cb3Sopenharmony_ci errno = ENOENT; 23054568cb3Sopenharmony_ci return FS_NOK; 23154568cb3Sopenharmony_ci } 23254568cb3Sopenharmony_ci 23354568cb3Sopenharmony_ci ret = lfs_remove((lfs_t *)mp->mData, fileName); 23454568cb3Sopenharmony_ci if (ret != 0) { 23554568cb3Sopenharmony_ci errno = OsLfsErrno(ret); 23654568cb3Sopenharmony_ci ret = FS_NOK; 23754568cb3Sopenharmony_ci } 23854568cb3Sopenharmony_ci 23954568cb3Sopenharmony_ci return ret; 24054568cb3Sopenharmony_ci} 24154568cb3Sopenharmony_ci 24254568cb3Sopenharmony_cistatic S32 OsLfsMkdir(struct TagMountPoint *mp, const char *dirName) 24354568cb3Sopenharmony_ci{ 24454568cb3Sopenharmony_ci S32 ret; 24554568cb3Sopenharmony_ci 24654568cb3Sopenharmony_ci if ((dirName == NULL) || (mp == NULL)) { 24754568cb3Sopenharmony_ci errno = EFAULT; 24854568cb3Sopenharmony_ci return FS_NOK; 24954568cb3Sopenharmony_ci } 25054568cb3Sopenharmony_ci 25154568cb3Sopenharmony_ci if (mp->mData == NULL) { 25254568cb3Sopenharmony_ci errno = ENOENT; 25354568cb3Sopenharmony_ci return FS_NOK; 25454568cb3Sopenharmony_ci } 25554568cb3Sopenharmony_ci 25654568cb3Sopenharmony_ci lfs_t *lfs = (lfs_t *)mp->mData; 25754568cb3Sopenharmony_ci 25854568cb3Sopenharmony_ci ret = lfs_mkdir(lfs, dirName); 25954568cb3Sopenharmony_ci if (ret != 0) { 26054568cb3Sopenharmony_ci errno = OsLfsErrno(ret); 26154568cb3Sopenharmony_ci ret = FS_NOK; 26254568cb3Sopenharmony_ci } 26354568cb3Sopenharmony_ci 26454568cb3Sopenharmony_ci return ret; 26554568cb3Sopenharmony_ci} 26654568cb3Sopenharmony_ci 26754568cb3Sopenharmony_cistatic S32 OsLfsRmdir(struct TagMountPoint *mp, const char *dirName) 26854568cb3Sopenharmony_ci{ 26954568cb3Sopenharmony_ci S32 ret; 27054568cb3Sopenharmony_ci lfs_t *lfs = NULL; 27154568cb3Sopenharmony_ci 27254568cb3Sopenharmony_ci if (mp == NULL) { 27354568cb3Sopenharmony_ci errno = EFAULT; 27454568cb3Sopenharmony_ci return FS_NOK; 27554568cb3Sopenharmony_ci } 27654568cb3Sopenharmony_ci 27754568cb3Sopenharmony_ci if (mp->mData == NULL) { 27854568cb3Sopenharmony_ci errno = ENOENT; 27954568cb3Sopenharmony_ci return FS_NOK; 28054568cb3Sopenharmony_ci } 28154568cb3Sopenharmony_ci 28254568cb3Sopenharmony_ci if (dirName == NULL) { 28354568cb3Sopenharmony_ci errno = EFAULT; 28454568cb3Sopenharmony_ci return FS_NOK; 28554568cb3Sopenharmony_ci } 28654568cb3Sopenharmony_ci 28754568cb3Sopenharmony_ci lfs = (lfs_t *)mp->mData; 28854568cb3Sopenharmony_ci ret = lfs_remove(lfs, dirName); 28954568cb3Sopenharmony_ci if (ret != 0) { 29054568cb3Sopenharmony_ci errno = OsLfsErrno(ret); 29154568cb3Sopenharmony_ci ret = FS_NOK; 29254568cb3Sopenharmony_ci } 29354568cb3Sopenharmony_ci return ret; 29454568cb3Sopenharmony_ci} 29554568cb3Sopenharmony_ci 29654568cb3Sopenharmony_cistatic S32 OsLfsOpendir(struct TagDir *dir, const char *dirName) 29754568cb3Sopenharmony_ci{ 29854568cb3Sopenharmony_ci S32 ret; 29954568cb3Sopenharmony_ci 30054568cb3Sopenharmony_ci if ((dir == NULL) || (dir->dMp == NULL) || (dir->dMp->mData == NULL)) { 30154568cb3Sopenharmony_ci errno = EFAULT; 30254568cb3Sopenharmony_ci return FS_NOK; 30354568cb3Sopenharmony_ci } 30454568cb3Sopenharmony_ci 30554568cb3Sopenharmony_ci lfs_t *lfs = (lfs_t *)dir->dMp->mData; 30654568cb3Sopenharmony_ci lfs_dir_t *dirInfo = (lfs_dir_t *)malloc(sizeof(lfs_dir_t)); 30754568cb3Sopenharmony_ci if (dirInfo == NULL) { 30854568cb3Sopenharmony_ci errno = ENOMEM; 30954568cb3Sopenharmony_ci return FS_NOK; 31054568cb3Sopenharmony_ci } 31154568cb3Sopenharmony_ci if (memset_s(dirInfo, sizeof(lfs_dir_t), 0, sizeof(lfs_dir_t)) != EOK) { 31254568cb3Sopenharmony_ci free(dirInfo); 31354568cb3Sopenharmony_ci errno = EBADF; 31454568cb3Sopenharmony_ci return FS_NOK; 31554568cb3Sopenharmony_ci } 31654568cb3Sopenharmony_ci 31754568cb3Sopenharmony_ci ret = lfs_dir_open(lfs, dirInfo, dirName); 31854568cb3Sopenharmony_ci if (ret != 0) { 31954568cb3Sopenharmony_ci free(dirInfo); 32054568cb3Sopenharmony_ci errno = OsLfsErrno(ret); 32154568cb3Sopenharmony_ci return FS_NOK; 32254568cb3Sopenharmony_ci } 32354568cb3Sopenharmony_ci 32454568cb3Sopenharmony_ci dir->dData = dirInfo; 32554568cb3Sopenharmony_ci dir->dOffset = 0; 32654568cb3Sopenharmony_ci return FS_OK; 32754568cb3Sopenharmony_ci} 32854568cb3Sopenharmony_ci 32954568cb3Sopenharmony_cistatic S32 OsLfsReaddir(struct TagDir *dir, struct dirent *dent) 33054568cb3Sopenharmony_ci{ 33154568cb3Sopenharmony_ci S32 ret; 33254568cb3Sopenharmony_ci struct lfs_info lfsInfo; 33354568cb3Sopenharmony_ci 33454568cb3Sopenharmony_ci if ((dir == NULL) || (dir->dMp == NULL) || (dir->dMp->mData == NULL) || 33554568cb3Sopenharmony_ci (dent == NULL)) { 33654568cb3Sopenharmony_ci errno = EFAULT; 33754568cb3Sopenharmony_ci return FS_NOK; 33854568cb3Sopenharmony_ci } 33954568cb3Sopenharmony_ci 34054568cb3Sopenharmony_ci if (dir->dData == NULL) { 34154568cb3Sopenharmony_ci errno = EBADF; 34254568cb3Sopenharmony_ci return FS_NOK; 34354568cb3Sopenharmony_ci } 34454568cb3Sopenharmony_ci 34554568cb3Sopenharmony_ci lfs_t *lfs = (lfs_t *)dir->dMp->mData; 34654568cb3Sopenharmony_ci lfs_dir_t *dirInfo = (lfs_dir_t *)dir->dData; 34754568cb3Sopenharmony_ci 34854568cb3Sopenharmony_ci ret = lfs_dir_read(lfs, dirInfo, &lfsInfo); 34954568cb3Sopenharmony_ci if (ret == TRUE) { 35054568cb3Sopenharmony_ci pthread_mutex_lock(&g_fsLocalMutex); 35154568cb3Sopenharmony_ci (void)strncpy_s(dent->d_name, sizeof(dent->d_name), lfsInfo.name, strlen(lfsInfo.name) + 1); 35254568cb3Sopenharmony_ci if (lfsInfo.type == LFS_TYPE_DIR) { 35354568cb3Sopenharmony_ci dent->d_type = DT_DIR; 35454568cb3Sopenharmony_ci } else if (lfsInfo.type == LFS_TYPE_REG) { 35554568cb3Sopenharmony_ci dent->d_type = DT_REG; 35654568cb3Sopenharmony_ci } 35754568cb3Sopenharmony_ci 35854568cb3Sopenharmony_ci dent->d_reclen = lfsInfo.size; 35954568cb3Sopenharmony_ci pthread_mutex_unlock(&g_fsLocalMutex); 36054568cb3Sopenharmony_ci 36154568cb3Sopenharmony_ci return FS_OK; 36254568cb3Sopenharmony_ci } 36354568cb3Sopenharmony_ci 36454568cb3Sopenharmony_ci if (ret != 0) { 36554568cb3Sopenharmony_ci errno = OsLfsErrno(ret); 36654568cb3Sopenharmony_ci } 36754568cb3Sopenharmony_ci 36854568cb3Sopenharmony_ci return FS_NOK; 36954568cb3Sopenharmony_ci} 37054568cb3Sopenharmony_ci 37154568cb3Sopenharmony_cistatic S32 OsLfsClosedir(struct TagDir *dir) 37254568cb3Sopenharmony_ci{ 37354568cb3Sopenharmony_ci S32 ret; 37454568cb3Sopenharmony_ci 37554568cb3Sopenharmony_ci if ((dir == NULL) || (dir->dMp == NULL) || (dir->dMp->mData == NULL)) { 37654568cb3Sopenharmony_ci errno = EFAULT; 37754568cb3Sopenharmony_ci return FS_NOK; 37854568cb3Sopenharmony_ci } 37954568cb3Sopenharmony_ci 38054568cb3Sopenharmony_ci if (dir->dData == NULL) { 38154568cb3Sopenharmony_ci errno = EBADF; 38254568cb3Sopenharmony_ci return FS_NOK; 38354568cb3Sopenharmony_ci } 38454568cb3Sopenharmony_ci 38554568cb3Sopenharmony_ci lfs_t *lfs = (lfs_t *)dir->dMp->mData; 38654568cb3Sopenharmony_ci lfs_dir_t *dirInfo = (lfs_dir_t *)dir->dData; 38754568cb3Sopenharmony_ci 38854568cb3Sopenharmony_ci ret = lfs_dir_close(lfs, dirInfo); 38954568cb3Sopenharmony_ci if (ret != 0) { 39054568cb3Sopenharmony_ci errno = OsLfsErrno(ret); 39154568cb3Sopenharmony_ci ret = FS_NOK; 39254568cb3Sopenharmony_ci } 39354568cb3Sopenharmony_ci 39454568cb3Sopenharmony_ci free(dirInfo); 39554568cb3Sopenharmony_ci dir->dData = NULL; 39654568cb3Sopenharmony_ci 39754568cb3Sopenharmony_ci return ret; 39854568cb3Sopenharmony_ci} 39954568cb3Sopenharmony_ci 40054568cb3Sopenharmony_cistatic S32 OsLfsOpen(struct TagFile *file, const char *pathName, S32 openFlag) 40154568cb3Sopenharmony_ci{ 40254568cb3Sopenharmony_ci S32 ret; 40354568cb3Sopenharmony_ci lfs_file_t *lfsHandle = NULL; 40454568cb3Sopenharmony_ci 40554568cb3Sopenharmony_ci if ((pathName == NULL) || (file == NULL) || (file->fMp == NULL) || 40654568cb3Sopenharmony_ci (file->fMp->mData == NULL)) { 40754568cb3Sopenharmony_ci errno = EFAULT; 40854568cb3Sopenharmony_ci return FS_NOK; 40954568cb3Sopenharmony_ci } 41054568cb3Sopenharmony_ci 41154568cb3Sopenharmony_ci lfsHandle = (lfs_file_t *)malloc(sizeof(lfs_file_t)); 41254568cb3Sopenharmony_ci if (lfsHandle == NULL) { 41354568cb3Sopenharmony_ci errno = ENOMEM; 41454568cb3Sopenharmony_ci return FS_NOK; 41554568cb3Sopenharmony_ci } 41654568cb3Sopenharmony_ci 41754568cb3Sopenharmony_ci S32 lfsOpenFlag = OsConvertFlagToLfsOpenFlag(openFlag); 41854568cb3Sopenharmony_ci ret = lfs_file_open((lfs_t *)file->fMp->mData, lfsHandle, pathName, lfsOpenFlag); 41954568cb3Sopenharmony_ci if (ret != 0) { 42054568cb3Sopenharmony_ci free(lfsHandle); 42154568cb3Sopenharmony_ci errno = OsLfsErrno(ret); 42254568cb3Sopenharmony_ci return INVALID_FD; 42354568cb3Sopenharmony_ci } 42454568cb3Sopenharmony_ci 42554568cb3Sopenharmony_ci file->fData = (void *)lfsHandle; 42654568cb3Sopenharmony_ci return ret; 42754568cb3Sopenharmony_ci} 42854568cb3Sopenharmony_ci 42954568cb3Sopenharmony_cistatic S32 OsLfsRead(struct TagFile *file, char *buf, size_t len) 43054568cb3Sopenharmony_ci{ 43154568cb3Sopenharmony_ci S32 ret; 43254568cb3Sopenharmony_ci struct TagMountPoint *mp = NULL; 43354568cb3Sopenharmony_ci lfs_file_t *lfsHandle = NULL; 43454568cb3Sopenharmony_ci 43554568cb3Sopenharmony_ci if (buf == NULL) { 43654568cb3Sopenharmony_ci errno = EFAULT; 43754568cb3Sopenharmony_ci return FS_NOK; 43854568cb3Sopenharmony_ci } 43954568cb3Sopenharmony_ci 44054568cb3Sopenharmony_ci if ((file == NULL) || (file->fData == NULL)) { 44154568cb3Sopenharmony_ci errno = EBADF; 44254568cb3Sopenharmony_ci return FS_NOK; 44354568cb3Sopenharmony_ci } 44454568cb3Sopenharmony_ci 44554568cb3Sopenharmony_ci lfsHandle = (lfs_file_t *)file->fData; 44654568cb3Sopenharmony_ci mp = file->fMp; 44754568cb3Sopenharmony_ci if ((mp == NULL) || (mp->mData == NULL)) { 44854568cb3Sopenharmony_ci errno = EFAULT; 44954568cb3Sopenharmony_ci return FS_NOK; 45054568cb3Sopenharmony_ci } 45154568cb3Sopenharmony_ci 45254568cb3Sopenharmony_ci ret = lfs_file_read((lfs_t *)mp->mData, lfsHandle, buf, len); 45354568cb3Sopenharmony_ci if (ret < 0) { 45454568cb3Sopenharmony_ci errno = OsLfsErrno(ret); 45554568cb3Sopenharmony_ci ret = FS_NOK; 45654568cb3Sopenharmony_ci } 45754568cb3Sopenharmony_ci return ret; 45854568cb3Sopenharmony_ci} 45954568cb3Sopenharmony_ci 46054568cb3Sopenharmony_cistatic S32 OsLfsWrite(struct TagFile *file, const char *buf, size_t len) 46154568cb3Sopenharmony_ci{ 46254568cb3Sopenharmony_ci S32 ret; 46354568cb3Sopenharmony_ci struct TagMountPoint *mp = NULL; 46454568cb3Sopenharmony_ci lfs_file_t *lfsHandle = NULL; 46554568cb3Sopenharmony_ci 46654568cb3Sopenharmony_ci if (buf == NULL) { 46754568cb3Sopenharmony_ci errno = EFAULT; 46854568cb3Sopenharmony_ci return FS_NOK; 46954568cb3Sopenharmony_ci } 47054568cb3Sopenharmony_ci 47154568cb3Sopenharmony_ci if ((file == NULL) || (file->fData == NULL)) { 47254568cb3Sopenharmony_ci errno = EBADF; 47354568cb3Sopenharmony_ci return FS_NOK; 47454568cb3Sopenharmony_ci } 47554568cb3Sopenharmony_ci 47654568cb3Sopenharmony_ci lfsHandle = (lfs_file_t *)file->fData; 47754568cb3Sopenharmony_ci mp = file->fMp; 47854568cb3Sopenharmony_ci if ((mp == NULL) || (mp->mData == NULL)) { 47954568cb3Sopenharmony_ci errno = EFAULT; 48054568cb3Sopenharmony_ci return FS_NOK; 48154568cb3Sopenharmony_ci } 48254568cb3Sopenharmony_ci 48354568cb3Sopenharmony_ci ret = lfs_file_write((lfs_t *)mp->mData, lfsHandle, buf, len); 48454568cb3Sopenharmony_ci if (ret < 0) { 48554568cb3Sopenharmony_ci errno = OsLfsErrno(ret); 48654568cb3Sopenharmony_ci ret = FS_NOK; 48754568cb3Sopenharmony_ci } 48854568cb3Sopenharmony_ci return ret; 48954568cb3Sopenharmony_ci} 49054568cb3Sopenharmony_ci 49154568cb3Sopenharmony_cistatic off_t OsLfsSeek(struct TagFile *file, off_t offset, S32 whence) 49254568cb3Sopenharmony_ci{ 49354568cb3Sopenharmony_ci off_t ret; 49454568cb3Sopenharmony_ci struct TagMountPoint *mp = NULL; 49554568cb3Sopenharmony_ci lfs_file_t *lfsHandle = NULL; 49654568cb3Sopenharmony_ci 49754568cb3Sopenharmony_ci if ((file == NULL) || (file->fData == NULL)) { 49854568cb3Sopenharmony_ci errno = EBADF; 49954568cb3Sopenharmony_ci return (off_t)FS_NOK; 50054568cb3Sopenharmony_ci } 50154568cb3Sopenharmony_ci 50254568cb3Sopenharmony_ci lfsHandle = (lfs_file_t *)file->fData; 50354568cb3Sopenharmony_ci mp = file->fMp; 50454568cb3Sopenharmony_ci if ((mp == NULL) || (mp->mData == NULL)) { 50554568cb3Sopenharmony_ci errno = EFAULT; 50654568cb3Sopenharmony_ci return (off_t)FS_NOK; 50754568cb3Sopenharmony_ci } 50854568cb3Sopenharmony_ci 50954568cb3Sopenharmony_ci ret = (off_t)lfs_file_seek((lfs_t *)mp->mData, lfsHandle, offset, whence); 51054568cb3Sopenharmony_ci if (ret < 0) { 51154568cb3Sopenharmony_ci errno = OsLfsErrno(ret); 51254568cb3Sopenharmony_ci ret = (off_t)FS_NOK; 51354568cb3Sopenharmony_ci } 51454568cb3Sopenharmony_ci 51554568cb3Sopenharmony_ci return ret; 51654568cb3Sopenharmony_ci} 51754568cb3Sopenharmony_ci 51854568cb3Sopenharmony_cistatic S32 OsLfsClose(struct TagFile *file) 51954568cb3Sopenharmony_ci{ 52054568cb3Sopenharmony_ci S32 ret; 52154568cb3Sopenharmony_ci struct TagMountPoint *mp = NULL; 52254568cb3Sopenharmony_ci lfs_file_t *lfsHandle = NULL; 52354568cb3Sopenharmony_ci 52454568cb3Sopenharmony_ci if ((file == NULL) || (file->fData == NULL)) { 52554568cb3Sopenharmony_ci errno = EBADF; 52654568cb3Sopenharmony_ci return FS_NOK; 52754568cb3Sopenharmony_ci } 52854568cb3Sopenharmony_ci 52954568cb3Sopenharmony_ci lfsHandle = (lfs_file_t *)file->fData; 53054568cb3Sopenharmony_ci mp = file->fMp; 53154568cb3Sopenharmony_ci if ((mp == NULL) || (mp->mData == NULL)) { 53254568cb3Sopenharmony_ci errno = EFAULT; 53354568cb3Sopenharmony_ci return FS_NOK; 53454568cb3Sopenharmony_ci } 53554568cb3Sopenharmony_ci 53654568cb3Sopenharmony_ci pthread_mutex_lock(&g_fsLocalMutex); 53754568cb3Sopenharmony_ci ret = lfs_file_close((lfs_t *)mp->mData, lfsHandle); 53854568cb3Sopenharmony_ci pthread_mutex_unlock(&g_fsLocalMutex); 53954568cb3Sopenharmony_ci 54054568cb3Sopenharmony_ci if (ret != 0) { 54154568cb3Sopenharmony_ci errno = OsLfsErrno(ret); 54254568cb3Sopenharmony_ci ret = FS_NOK; 54354568cb3Sopenharmony_ci } 54454568cb3Sopenharmony_ci 54554568cb3Sopenharmony_ci free(file->fData); 54654568cb3Sopenharmony_ci file->fData = NULL; 54754568cb3Sopenharmony_ci return ret; 54854568cb3Sopenharmony_ci} 54954568cb3Sopenharmony_ci 55054568cb3Sopenharmony_cistatic S32 OsLfsRename(struct TagMountPoint *mp, const char *oldName, const char *newName) 55154568cb3Sopenharmony_ci{ 55254568cb3Sopenharmony_ci S32 ret; 55354568cb3Sopenharmony_ci 55454568cb3Sopenharmony_ci if ((mp == NULL) || (oldName == NULL) || (newName == NULL)) { 55554568cb3Sopenharmony_ci errno = EFAULT; 55654568cb3Sopenharmony_ci return FS_NOK; 55754568cb3Sopenharmony_ci } 55854568cb3Sopenharmony_ci 55954568cb3Sopenharmony_ci if (mp->mData == NULL) { 56054568cb3Sopenharmony_ci errno = ENOENT; 56154568cb3Sopenharmony_ci return FS_NOK; 56254568cb3Sopenharmony_ci } 56354568cb3Sopenharmony_ci 56454568cb3Sopenharmony_ci ret = lfs_rename((lfs_t *)mp->mData, oldName, newName); 56554568cb3Sopenharmony_ci if (ret != 0) { 56654568cb3Sopenharmony_ci errno = OsLfsErrno(ret); 56754568cb3Sopenharmony_ci ret = FS_NOK; 56854568cb3Sopenharmony_ci } 56954568cb3Sopenharmony_ci 57054568cb3Sopenharmony_ci return ret; 57154568cb3Sopenharmony_ci} 57254568cb3Sopenharmony_ci 57354568cb3Sopenharmony_cistatic S32 OsLfsStat(struct TagMountPoint *mp, const char *path, struct stat *buf) 57454568cb3Sopenharmony_ci{ 57554568cb3Sopenharmony_ci S32 ret; 57654568cb3Sopenharmony_ci struct lfs_info info; 57754568cb3Sopenharmony_ci 57854568cb3Sopenharmony_ci if ((mp == NULL) || (path == NULL) || (buf == NULL)) { 57954568cb3Sopenharmony_ci errno = EFAULT; 58054568cb3Sopenharmony_ci return FS_NOK; 58154568cb3Sopenharmony_ci } 58254568cb3Sopenharmony_ci 58354568cb3Sopenharmony_ci if (mp->mData == NULL) { 58454568cb3Sopenharmony_ci errno = ENOENT; 58554568cb3Sopenharmony_ci return FS_NOK; 58654568cb3Sopenharmony_ci } 58754568cb3Sopenharmony_ci 58854568cb3Sopenharmony_ci ret = lfs_stat((lfs_t *)mp->mData, path, &info); 58954568cb3Sopenharmony_ci if (ret == 0) { 59054568cb3Sopenharmony_ci buf->st_size = info.size; 59154568cb3Sopenharmony_ci if (info.type == LFS_TYPE_REG) { 59254568cb3Sopenharmony_ci buf->st_mode = S_IFREG; 59354568cb3Sopenharmony_ci } else { 59454568cb3Sopenharmony_ci buf->st_mode = S_IFDIR; 59554568cb3Sopenharmony_ci } 59654568cb3Sopenharmony_ci } else { 59754568cb3Sopenharmony_ci errno = OsLfsErrno(ret); 59854568cb3Sopenharmony_ci ret = FS_NOK; 59954568cb3Sopenharmony_ci } 60054568cb3Sopenharmony_ci 60154568cb3Sopenharmony_ci return ret; 60254568cb3Sopenharmony_ci} 60354568cb3Sopenharmony_ci 60454568cb3Sopenharmony_cistatic S32 OsLfsSync(struct TagFile *file) 60554568cb3Sopenharmony_ci{ 60654568cb3Sopenharmony_ci S32 ret; 60754568cb3Sopenharmony_ci struct TagMountPoint *mp = NULL; 60854568cb3Sopenharmony_ci 60954568cb3Sopenharmony_ci if ((file == NULL) || (file->fData == NULL)) { 61054568cb3Sopenharmony_ci errno = EBADF; 61154568cb3Sopenharmony_ci return FS_NOK; 61254568cb3Sopenharmony_ci } 61354568cb3Sopenharmony_ci 61454568cb3Sopenharmony_ci if ((file->fMp == NULL) || (file->fMp->mData == NULL)) { 61554568cb3Sopenharmony_ci errno = EFAULT; 61654568cb3Sopenharmony_ci return FS_NOK; 61754568cb3Sopenharmony_ci } 61854568cb3Sopenharmony_ci 61954568cb3Sopenharmony_ci mp = file->fMp; 62054568cb3Sopenharmony_ci ret = lfs_file_sync((lfs_t *)mp->mData, (lfs_file_t *)file->fData); 62154568cb3Sopenharmony_ci if (ret != 0) { 62254568cb3Sopenharmony_ci errno = OsLfsErrno(ret); 62354568cb3Sopenharmony_ci ret = FS_NOK; 62454568cb3Sopenharmony_ci } 62554568cb3Sopenharmony_ci return ret; 62654568cb3Sopenharmony_ci} 62754568cb3Sopenharmony_ci 62854568cb3Sopenharmony_cistatic S32 OsLfsFormat(const char *partName, void *privData) 62954568cb3Sopenharmony_ci{ 63054568cb3Sopenharmony_ci S32 ret; 63154568cb3Sopenharmony_ci lfs_t lfs = {0}; 63254568cb3Sopenharmony_ci struct lfs_config cfg = {0}; 63354568cb3Sopenharmony_ci 63454568cb3Sopenharmony_ci (void)partName; 63554568cb3Sopenharmony_ci 63654568cb3Sopenharmony_ci OsLfsConfigAdapter((struct PartitionCfg *)privData, &cfg); 63754568cb3Sopenharmony_ci 63854568cb3Sopenharmony_ci ret = lfs_format(&lfs, &cfg); 63954568cb3Sopenharmony_ci if (ret != 0) { 64054568cb3Sopenharmony_ci errno = OsLfsErrno(ret); 64154568cb3Sopenharmony_ci ret = FS_NOK; 64254568cb3Sopenharmony_ci } 64354568cb3Sopenharmony_ci return ret; 64454568cb3Sopenharmony_ci} 64554568cb3Sopenharmony_ci 64654568cb3Sopenharmony_cistatic struct TagMountOps g_lfsMnt = { 64754568cb3Sopenharmony_ci .mount = OsLfsMount, 64854568cb3Sopenharmony_ci .umount = OsLfsUmount, 64954568cb3Sopenharmony_ci .umount2 = NULL, 65054568cb3Sopenharmony_ci .statfs = NULL, 65154568cb3Sopenharmony_ci}; 65254568cb3Sopenharmony_ci 65354568cb3Sopenharmony_cistatic struct TagFileOps g_lfsFops = { 65454568cb3Sopenharmony_ci .open = OsLfsOpen, 65554568cb3Sopenharmony_ci .close = OsLfsClose, 65654568cb3Sopenharmony_ci .read = OsLfsRead, 65754568cb3Sopenharmony_ci .write = OsLfsWrite, 65854568cb3Sopenharmony_ci .lseek = OsLfsSeek, 65954568cb3Sopenharmony_ci .stat = OsLfsStat, 66054568cb3Sopenharmony_ci .truncate = NULL, 66154568cb3Sopenharmony_ci .unlink = OsLfsUnlink, 66254568cb3Sopenharmony_ci .rename = OsLfsRename, 66354568cb3Sopenharmony_ci .ioctl = NULL, /* 不支持 */ 66454568cb3Sopenharmony_ci .sync = OsLfsSync, 66554568cb3Sopenharmony_ci .rmdir = OsLfsRmdir, 66654568cb3Sopenharmony_ci .opendir = OsLfsOpendir, 66754568cb3Sopenharmony_ci .readdir = OsLfsReaddir, 66854568cb3Sopenharmony_ci .closedir = OsLfsClosedir, 66954568cb3Sopenharmony_ci .mkdir = OsLfsMkdir, 67054568cb3Sopenharmony_ci}; 67154568cb3Sopenharmony_ci 67254568cb3Sopenharmony_cistatic struct TagFsManagement g_lfsMgt = { 67354568cb3Sopenharmony_ci .fdisk = NULL, 67454568cb3Sopenharmony_ci .format = OsLfsFormat, 67554568cb3Sopenharmony_ci}; 67654568cb3Sopenharmony_ci 67754568cb3Sopenharmony_civoid OsLfsInit(void) 67854568cb3Sopenharmony_ci{ 67954568cb3Sopenharmony_ci (void)OsFsRegister("littlefs", &g_lfsMnt, &g_lfsFops, &g_lfsMgt); 68054568cb3Sopenharmony_ci} 681