diff options
author | Christopher Haster <chaster@utexas.edu> | 2017-04-22 21:30:40 +0300 |
---|---|---|
committer | Christopher Haster <chaster@utexas.edu> | 2017-04-23 00:00:40 +0300 |
commit | 7050922623d4596ffeb8d6f431fbd3d4e8d6d840 (patch) | |
tree | 6c12456f8a473c4831974035dca1f66fbcffc4b4 /lfs.h | |
parent | 789286a25748649f46afebec6566d00763a0074e (diff) |
Added optional block-level caching
This adds caching of the most recent read/program blocks, allowing
support of devices that don't have byte-level read+writes, along
with reduced device access on devices that do support byte-level
read+writes.
Note: The current implementation is a bit eager to drop caches where
it simplifies the cache layer. This layer is already complex enough.
Note: It may be worthwhile to add a compile switch for caching to
reduce code size, note sure.
Note: This does add a dependency on malloc, which could have a porting
layer, but I'm just using the functions from stdlib for now. These can be
overwritten with noops if the user controls the system, and keeps things
simple for now.
Diffstat (limited to 'lfs.h')
-rw-r--r-- | lfs.h | 13 |
1 files changed, 13 insertions, 0 deletions
@@ -20,6 +20,7 @@ enum lfs_error { LFS_ERROR_IS_DIR = -7, LFS_ERROR_INVALID = -8, LFS_ERROR_NO_SPACE = -9, + LFS_ERROR_NO_MEM = -10, }; enum lfs_type { @@ -74,6 +75,12 @@ struct lfs_config { // Number of erasable blocks on the device. lfs_size_t block_count; + + // Optional, statically allocated read buffer. Must be read sized. + void *read_buffer; + + // Optional, statically allocated program buffer. Must be program sized. + void *prog_buffer; }; // File info structure @@ -159,6 +166,12 @@ typedef struct lfs { lfs_block_t end; } free; + struct { + lfs_block_t block; + lfs_off_t off; + uint8_t *buffer; + } rcache, pcache; + uint32_t lookahead[LFS_CFG_LOOKAHEAD/32]; } lfs_t; |