forked from Imagelibrary/littlefs
Yes this is more expensive, since small programs need to rewrite the whole block in order to conform to the block device API. However, it reduces code duplication and keeps all of the test-related block device emulation in lfs_testbd. Some people have used lfs_filebd/lfs_rambd as a starting point for new block devices and I think it should be clear that erase does not need to have side effects. Though to be fair this also just means we should have more examples of block devices...
66 lines
1.4 KiB
C
66 lines
1.4 KiB
C
/*
|
|
* Block device emulated in a file
|
|
*
|
|
* Copyright (c) 2022, The littlefs authors.
|
|
* Copyright (c) 2017, Arm Limited. All rights reserved.
|
|
* SPDX-License-Identifier: BSD-3-Clause
|
|
*/
|
|
#ifndef LFS_FILEBD_H
|
|
#define LFS_FILEBD_H
|
|
|
|
#include "lfs.h"
|
|
#include "lfs_util.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C"
|
|
{
|
|
#endif
|
|
|
|
|
|
// Block device specific tracing
|
|
#ifndef LFS_FILEBD_TRACE
|
|
#ifdef LFS_FILEBD_YES_TRACE
|
|
#define LFS_FILEBD_TRACE(...) LFS_TRACE(__VA_ARGS__)
|
|
#else
|
|
#define LFS_FILEBD_TRACE(...)
|
|
#endif
|
|
#endif
|
|
|
|
// filebd state
|
|
typedef struct lfs_filebd {
|
|
int fd;
|
|
} lfs_filebd_t;
|
|
|
|
|
|
// Create a file block device using the geometry in lfs_config
|
|
int lfs_filebd_create(const struct lfs_config *cfg, const char *path);
|
|
|
|
// Clean up memory associated with block device
|
|
int lfs_filebd_destroy(const struct lfs_config *cfg);
|
|
|
|
// Read a block
|
|
int lfs_filebd_read(const struct lfs_config *cfg, lfs_block_t block,
|
|
lfs_off_t off, void *buffer, lfs_size_t size);
|
|
|
|
// Program a block
|
|
//
|
|
// The block must have previously been erased.
|
|
int lfs_filebd_prog(const struct lfs_config *cfg, lfs_block_t block,
|
|
lfs_off_t off, const void *buffer, lfs_size_t size);
|
|
|
|
// Erase a block
|
|
//
|
|
// A block must be erased before being programmed. The
|
|
// state of an erased block is undefined.
|
|
int lfs_filebd_erase(const struct lfs_config *cfg, lfs_block_t block);
|
|
|
|
// Sync the block device
|
|
int lfs_filebd_sync(const struct lfs_config *cfg);
|
|
|
|
|
|
#ifdef __cplusplus
|
|
} /* extern "C" */
|
|
#endif
|
|
|
|
#endif
|