Filesystem library designed for flash devices

Dependents:   flash-fs-example Dragonfly_Filesystem_Example STM32F407VET6_SPIFlash Dragonfly_Filesystem_Example_mbed_5

Committer:
Mike Fiore
Date:
Mon Dec 29 14:10:45 2014 -0600
Revision:
2:de478b250060
Parent:
0:bb4e812f7c97
Child:
3:9adcf49bb77d
more changes to appease the IAR gods - fix void pointer arithmetic not allowed by IAR

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mfiore 0:bb4e812f7c97 1 /*
mfiore 0:bb4e812f7c97 2 * spiffs.h
mfiore 0:bb4e812f7c97 3 *
mfiore 0:bb4e812f7c97 4 * Created on: May 26, 2013
mfiore 0:bb4e812f7c97 5 * Author: petera
mfiore 0:bb4e812f7c97 6 */
mfiore 0:bb4e812f7c97 7
mfiore 0:bb4e812f7c97 8
mfiore 0:bb4e812f7c97 9
mfiore 0:bb4e812f7c97 10 #ifndef SPIFFS_H_
mfiore 0:bb4e812f7c97 11 #define SPIFFS_H_
mfiore 0:bb4e812f7c97 12
mfiore 0:bb4e812f7c97 13 #include "spiffs_config.h"
mfiore 0:bb4e812f7c97 14
mfiore 0:bb4e812f7c97 15 #ifdef __cplusplus
mfiore 0:bb4e812f7c97 16 extern "C"
mfiore 0:bb4e812f7c97 17 {
mfiore 0:bb4e812f7c97 18 #endif
mfiore 0:bb4e812f7c97 19
mfiore 0:bb4e812f7c97 20 #define SPIFFS_OK 0
mfiore 0:bb4e812f7c97 21 #define SPIFFS_ERR_NOT_MOUNTED -10000
mfiore 0:bb4e812f7c97 22 #define SPIFFS_ERR_FULL -10001
mfiore 0:bb4e812f7c97 23 #define SPIFFS_ERR_NOT_FOUND -10002
mfiore 0:bb4e812f7c97 24 #define SPIFFS_ERR_END_OF_OBJECT -10003
mfiore 0:bb4e812f7c97 25 #define SPIFFS_ERR_DELETED -10004
mfiore 0:bb4e812f7c97 26 #define SPIFFS_ERR_NOT_FINALIZED -10005
mfiore 0:bb4e812f7c97 27 #define SPIFFS_ERR_NOT_INDEX -10006
mfiore 0:bb4e812f7c97 28 #define SPIFFS_ERR_OUT_OF_FILE_DESCS -10007
mfiore 0:bb4e812f7c97 29 #define SPIFFS_ERR_FILE_CLOSED -10008
mfiore 0:bb4e812f7c97 30 #define SPIFFS_ERR_FILE_DELETED -10009
mfiore 0:bb4e812f7c97 31 #define SPIFFS_ERR_BAD_DESCRIPTOR -10010
mfiore 0:bb4e812f7c97 32 #define SPIFFS_ERR_IS_INDEX -10011
mfiore 0:bb4e812f7c97 33 #define SPIFFS_ERR_IS_FREE -10012
mfiore 0:bb4e812f7c97 34 #define SPIFFS_ERR_INDEX_SPAN_MISMATCH -10013
mfiore 0:bb4e812f7c97 35 #define SPIFFS_ERR_DATA_SPAN_MISMATCH -10014
mfiore 0:bb4e812f7c97 36 #define SPIFFS_ERR_INDEX_REF_FREE -10015
mfiore 0:bb4e812f7c97 37 #define SPIFFS_ERR_INDEX_REF_LU -10016
mfiore 0:bb4e812f7c97 38 #define SPIFFS_ERR_INDEX_REF_INVALID -10017
mfiore 0:bb4e812f7c97 39 #define SPIFFS_ERR_INDEX_FREE -10018
mfiore 0:bb4e812f7c97 40 #define SPIFFS_ERR_INDEX_LU -10019
mfiore 0:bb4e812f7c97 41 #define SPIFFS_ERR_INDEX_INVALID -10020
mfiore 0:bb4e812f7c97 42 #define SPIFFS_ERR_NOT_WRITABLE -10021
mfiore 0:bb4e812f7c97 43 #define SPIFFS_ERR_NOT_READABLE -10022
mfiore 0:bb4e812f7c97 44
mfiore 0:bb4e812f7c97 45 #define SPIFFS_ERR_INTERNAL -10050
mfiore 0:bb4e812f7c97 46
mfiore 0:bb4e812f7c97 47 #define SPIFFS_ERR_TEST -10100
mfiore 0:bb4e812f7c97 48
mfiore 0:bb4e812f7c97 49
mfiore 0:bb4e812f7c97 50 // spiffs file descriptor index type. must be signed
mfiore 0:bb4e812f7c97 51 typedef s16_t spiffs_file;
mfiore 0:bb4e812f7c97 52 // spiffs file descriptor flags
mfiore 0:bb4e812f7c97 53 typedef u16_t spiffs_flags;
mfiore 0:bb4e812f7c97 54 // spiffs file mode
mfiore 0:bb4e812f7c97 55 typedef u16_t spiffs_mode;
mfiore 0:bb4e812f7c97 56 // object type
mfiore 0:bb4e812f7c97 57 typedef u8_t spiffs_obj_type;
mfiore 0:bb4e812f7c97 58
mfiore 0:bb4e812f7c97 59 /* spi read call function type */
mfiore 0:bb4e812f7c97 60 typedef s32_t (*spiffs_read)(u32_t addr, u32_t size, u8_t *dst);
mfiore 0:bb4e812f7c97 61 /* spi write call function type */
mfiore 0:bb4e812f7c97 62 typedef s32_t (*spiffs_write)(u32_t addr, u32_t size, u8_t *src);
mfiore 0:bb4e812f7c97 63 /* spi erase call function type */
mfiore 0:bb4e812f7c97 64 typedef s32_t (*spiffs_erase)(u32_t addr, u32_t size);
mfiore 0:bb4e812f7c97 65
mfiore 0:bb4e812f7c97 66 /* file system check callback report operation */
mfiore 0:bb4e812f7c97 67 typedef enum {
mfiore 0:bb4e812f7c97 68 SPIFFS_CHECK_LOOKUP = 0,
mfiore 0:bb4e812f7c97 69 SPIFFS_CHECK_INDEX,
mfiore 0:bb4e812f7c97 70 SPIFFS_CHECK_PAGE
mfiore 0:bb4e812f7c97 71 } spiffs_check_type;
mfiore 0:bb4e812f7c97 72
mfiore 0:bb4e812f7c97 73 /* file system check callback report type */
mfiore 0:bb4e812f7c97 74 typedef enum {
mfiore 0:bb4e812f7c97 75 SPIFFS_CHECK_PROGRESS = 0,
mfiore 0:bb4e812f7c97 76 SPIFFS_CHECK_ERROR,
mfiore 0:bb4e812f7c97 77 SPIFFS_CHECK_FIX_INDEX,
mfiore 0:bb4e812f7c97 78 SPIFFS_CHECK_FIX_LOOKUP,
mfiore 0:bb4e812f7c97 79 SPIFFS_CHECK_DELETE_ORPHANED_INDEX,
mfiore 0:bb4e812f7c97 80 SPIFFS_CHECK_DELETE_PAGE,
mfiore 0:bb4e812f7c97 81 SPIFFS_CHECK_DELETE_BAD_FILE,
mfiore 0:bb4e812f7c97 82 } spiffs_check_report;
mfiore 0:bb4e812f7c97 83
mfiore 0:bb4e812f7c97 84 /* file system check callback function */
mfiore 0:bb4e812f7c97 85 typedef void (*spiffs_check_callback)(spiffs_check_type type, spiffs_check_report report,
mfiore 0:bb4e812f7c97 86 u32_t arg1, u32_t arg2);
mfiore 0:bb4e812f7c97 87
mfiore 0:bb4e812f7c97 88 #ifndef SPIFFS_DBG
mfiore 0:bb4e812f7c97 89 #define SPIFFS_DBG(...) \
mfiore 0:bb4e812f7c97 90 print(__VA_ARGS__)
mfiore 0:bb4e812f7c97 91 #endif
mfiore 0:bb4e812f7c97 92 #ifndef SPIFFS_GC_DBG
mfiore 0:bb4e812f7c97 93 #define SPIFFS_GC_DBG(...) printf(__VA_ARGS__)
mfiore 0:bb4e812f7c97 94 #endif
mfiore 0:bb4e812f7c97 95 #ifndef SPIFFS_CACHE_DBG
mfiore 0:bb4e812f7c97 96 #define SPIFFS_CACHE_DBG(...) printf(__VA_ARGS__)
mfiore 0:bb4e812f7c97 97 #endif
mfiore 0:bb4e812f7c97 98 #ifndef SPIFFS_CHECK_DBG
mfiore 0:bb4e812f7c97 99 #define SPIFFS_CHECK_DBG(...) printf(__VA_ARGS__)
mfiore 0:bb4e812f7c97 100 #endif
mfiore 0:bb4e812f7c97 101
mfiore 0:bb4e812f7c97 102 /* Any write to the filehandle is appended to end of the file */
mfiore 0:bb4e812f7c97 103 #define SPIFFS_APPEND (1<<0)
mfiore 0:bb4e812f7c97 104 /* If the opened file exists, it will be truncated to zero length before opened */
mfiore 0:bb4e812f7c97 105 #define SPIFFS_TRUNC (1<<1)
mfiore 0:bb4e812f7c97 106 /* If the opened file does not exist, it will be created before opened */
mfiore 0:bb4e812f7c97 107 #define SPIFFS_CREAT (1<<2)
mfiore 0:bb4e812f7c97 108 /* The opened file may only be read */
mfiore 0:bb4e812f7c97 109 #define SPIFFS_RDONLY (1<<3)
mfiore 0:bb4e812f7c97 110 /* The opened file may only be writted */
mfiore 0:bb4e812f7c97 111 #define SPIFFS_WRONLY (1<<4)
mfiore 0:bb4e812f7c97 112 /* The opened file may be both read and writted */
mfiore 0:bb4e812f7c97 113 #define SPIFFS_RDWR (SPIFFS_RDONLY | SPIFFS_WRONLY)
mfiore 0:bb4e812f7c97 114 /* Any writes to the filehandle will never be cached */
mfiore 0:bb4e812f7c97 115 #define SPIFFS_DIRECT (1<<5)
mfiore 0:bb4e812f7c97 116
mfiore 0:bb4e812f7c97 117 #define SPIFFS_SEEK_SET (0)
mfiore 0:bb4e812f7c97 118 #define SPIFFS_SEEK_CUR (1)
mfiore 0:bb4e812f7c97 119 #define SPIFFS_SEEK_END (2)
mfiore 0:bb4e812f7c97 120
mfiore 0:bb4e812f7c97 121 #define SPIFFS_TYPE_FILE (1)
mfiore 0:bb4e812f7c97 122 #define SPIFFS_TYPE_DIR (2)
mfiore 0:bb4e812f7c97 123 #define SPIFFS_TYPE_HARD_LINK (3)
mfiore 0:bb4e812f7c97 124 #define SPIFFS_TYPE_SOFT_LINK (4)
mfiore 0:bb4e812f7c97 125
mfiore 0:bb4e812f7c97 126 #ifndef SPIFFS_LOCK
mfiore 0:bb4e812f7c97 127 #define SPIFFS_LOCK(fs)
mfiore 0:bb4e812f7c97 128 #endif
mfiore 0:bb4e812f7c97 129
mfiore 0:bb4e812f7c97 130 #ifndef SPIFFS_UNLOCK
mfiore 0:bb4e812f7c97 131 #define SPIFFS_UNLOCK(fs)
mfiore 0:bb4e812f7c97 132 #endif
mfiore 0:bb4e812f7c97 133
mfiore 0:bb4e812f7c97 134 // phys structs
mfiore 0:bb4e812f7c97 135
mfiore 0:bb4e812f7c97 136 // spiffs spi configuration struct
mfiore 0:bb4e812f7c97 137 typedef struct {
mfiore 0:bb4e812f7c97 138 // physical read function
mfiore 0:bb4e812f7c97 139 spiffs_read hal_read_f;
mfiore 0:bb4e812f7c97 140 // physical write function
mfiore 0:bb4e812f7c97 141 spiffs_write hal_write_f;
mfiore 0:bb4e812f7c97 142 // physical erase function
mfiore 0:bb4e812f7c97 143 spiffs_erase hal_erase_f;
mfiore 0:bb4e812f7c97 144 #if SPIFFS_SINGLETON == 0
mfiore 0:bb4e812f7c97 145 // physical size of the spi flash
mfiore 0:bb4e812f7c97 146 u32_t phys_size;
mfiore 0:bb4e812f7c97 147 // physical offset in spi flash used for spiffs,
mfiore 0:bb4e812f7c97 148 // must be on block boundary
mfiore 0:bb4e812f7c97 149 u32_t phys_addr;
mfiore 0:bb4e812f7c97 150 // physical size when erasing a block
mfiore 0:bb4e812f7c97 151 u32_t phys_erase_block;
mfiore 0:bb4e812f7c97 152
mfiore 0:bb4e812f7c97 153 // logical size of a block, must be on physical
mfiore 0:bb4e812f7c97 154 // block size boundary and must never be less than
mfiore 0:bb4e812f7c97 155 // a physical block
mfiore 0:bb4e812f7c97 156 u32_t log_block_size;
mfiore 0:bb4e812f7c97 157 // logical size of a page, must be at least
mfiore 0:bb4e812f7c97 158 // log_block_size / 8
mfiore 0:bb4e812f7c97 159 u32_t log_page_size;
mfiore 0:bb4e812f7c97 160 #endif
mfiore 0:bb4e812f7c97 161 } spiffs_config;
mfiore 0:bb4e812f7c97 162
mfiore 0:bb4e812f7c97 163 typedef struct {
mfiore 0:bb4e812f7c97 164 // file system configuration
mfiore 0:bb4e812f7c97 165 spiffs_config cfg;
mfiore 0:bb4e812f7c97 166 // number of logical blocks
mfiore 0:bb4e812f7c97 167 u32_t block_count;
mfiore 0:bb4e812f7c97 168
mfiore 0:bb4e812f7c97 169 // cursor for free blocks, block index
mfiore 0:bb4e812f7c97 170 spiffs_block_ix free_cursor_block_ix;
mfiore 0:bb4e812f7c97 171 // cursor for free blocks, entry index
mfiore 0:bb4e812f7c97 172 int free_cursor_obj_lu_entry;
mfiore 0:bb4e812f7c97 173 // cursor when searching, block index
mfiore 0:bb4e812f7c97 174 spiffs_block_ix cursor_block_ix;
mfiore 0:bb4e812f7c97 175 // cursor when searching, entry index
mfiore 0:bb4e812f7c97 176 int cursor_obj_lu_entry;
mfiore 0:bb4e812f7c97 177
mfiore 0:bb4e812f7c97 178 // primary work buffer, size of a logical page
mfiore 0:bb4e812f7c97 179 u8_t *lu_work;
mfiore 0:bb4e812f7c97 180 // secondary work buffer, size of a logical page
mfiore 0:bb4e812f7c97 181 u8_t *work;
mfiore 0:bb4e812f7c97 182 // file descriptor memory area
mfiore 0:bb4e812f7c97 183 u8_t *fd_space;
mfiore 0:bb4e812f7c97 184 // available file descriptors
mfiore 0:bb4e812f7c97 185 u32_t fd_count;
mfiore 0:bb4e812f7c97 186
mfiore 0:bb4e812f7c97 187 // last error
mfiore 0:bb4e812f7c97 188 s32_t errno;
mfiore 0:bb4e812f7c97 189
mfiore 0:bb4e812f7c97 190 // current number of free blocks
mfiore 0:bb4e812f7c97 191 u32_t free_blocks;
mfiore 0:bb4e812f7c97 192 // current number of busy pages
mfiore 0:bb4e812f7c97 193 u32_t stats_p_allocated;
mfiore 0:bb4e812f7c97 194 // current number of deleted pages
mfiore 0:bb4e812f7c97 195 u32_t stats_p_deleted;
mfiore 0:bb4e812f7c97 196 // flag indicating that garbage collector is cleaning
mfiore 0:bb4e812f7c97 197 u8_t cleaning;
mfiore 0:bb4e812f7c97 198 // max erase count amongst all blocks
mfiore 0:bb4e812f7c97 199 spiffs_obj_id max_erase_count;
mfiore 0:bb4e812f7c97 200
mfiore 0:bb4e812f7c97 201 #if SPIFFS_GC_STATS
mfiore 0:bb4e812f7c97 202 u32_t stats_gc_runs;
mfiore 0:bb4e812f7c97 203 #endif
mfiore 0:bb4e812f7c97 204
mfiore 0:bb4e812f7c97 205 #if SPIFFS_CACHE
mfiore 0:bb4e812f7c97 206 // cache memory
Mike Fiore 2:de478b250060 207 u8_t *cache;
mfiore 0:bb4e812f7c97 208 // cache size
mfiore 0:bb4e812f7c97 209 u32_t cache_size;
mfiore 0:bb4e812f7c97 210 #if SPIFFS_CACHE_STATS
mfiore 0:bb4e812f7c97 211 u32_t cache_hits;
mfiore 0:bb4e812f7c97 212 u32_t cache_misses;
mfiore 0:bb4e812f7c97 213 #endif
mfiore 0:bb4e812f7c97 214 #endif
mfiore 0:bb4e812f7c97 215
mfiore 0:bb4e812f7c97 216 // check callback function
mfiore 0:bb4e812f7c97 217 spiffs_check_callback check_cb_f;
mfiore 0:bb4e812f7c97 218 } spiffs;
mfiore 0:bb4e812f7c97 219
mfiore 0:bb4e812f7c97 220 /* spiffs file status struct */
mfiore 0:bb4e812f7c97 221 typedef struct {
mfiore 0:bb4e812f7c97 222 spiffs_obj_id obj_id;
mfiore 0:bb4e812f7c97 223 u32_t size;
mfiore 0:bb4e812f7c97 224 spiffs_obj_type type;
mfiore 0:bb4e812f7c97 225 u8_t name[SPIFFS_OBJ_NAME_LEN];
mfiore 0:bb4e812f7c97 226 } spiffs_stat;
mfiore 0:bb4e812f7c97 227
mfiore 0:bb4e812f7c97 228 struct spiffs_dirent {
mfiore 0:bb4e812f7c97 229 spiffs_obj_id obj_id;
mfiore 0:bb4e812f7c97 230 u8_t name[SPIFFS_OBJ_NAME_LEN];
mfiore 0:bb4e812f7c97 231 spiffs_obj_type type;
mfiore 0:bb4e812f7c97 232 u32_t size;
mfiore 0:bb4e812f7c97 233 };
mfiore 0:bb4e812f7c97 234
mfiore 0:bb4e812f7c97 235 typedef struct {
mfiore 0:bb4e812f7c97 236 spiffs *fs;
mfiore 0:bb4e812f7c97 237 spiffs_block_ix block;
mfiore 0:bb4e812f7c97 238 int entry;
mfiore 0:bb4e812f7c97 239 } spiffs_DIR;
mfiore 0:bb4e812f7c97 240
mfiore 0:bb4e812f7c97 241 // functions
mfiore 0:bb4e812f7c97 242
mfiore 0:bb4e812f7c97 243 /**
mfiore 0:bb4e812f7c97 244 * Initializes the file system dynamic parameters and mounts the filesystem
mfiore 0:bb4e812f7c97 245 * @param fs the file system struct
mfiore 0:bb4e812f7c97 246 * @param config the physical and logical configuration of the file system
mfiore 0:bb4e812f7c97 247 * @param work a memory work buffer comprising 2*config->log_page_size
mfiore 0:bb4e812f7c97 248 * bytes used throughout all file system operations
mfiore 0:bb4e812f7c97 249 * @param fd_space memory for file descriptors
mfiore 0:bb4e812f7c97 250 * @param fd_space_size memory size of file descriptors
mfiore 0:bb4e812f7c97 251 * @param cache memory for cache, may be null
mfiore 0:bb4e812f7c97 252 * @param cache_size memory size of cache
mfiore 0:bb4e812f7c97 253 * @param check_cb_f callback function for reporting during consistency checks
mfiore 0:bb4e812f7c97 254 */
mfiore 0:bb4e812f7c97 255 s32_t SPIFFS_mount(spiffs *fs, spiffs_config *config, u8_t *work,
mfiore 0:bb4e812f7c97 256 u8_t *fd_space, u32_t fd_space_size,
Mike Fiore 2:de478b250060 257 u8_t *cache, u32_t cache_size,
mfiore 0:bb4e812f7c97 258 spiffs_check_callback check_cb_f);
mfiore 0:bb4e812f7c97 259
mfiore 0:bb4e812f7c97 260 /**
mfiore 0:bb4e812f7c97 261 * Unmounts the file system. All file handles will be flushed of any
mfiore 0:bb4e812f7c97 262 * cached writes and closed.
mfiore 0:bb4e812f7c97 263 * @param fs the file system struct
mfiore 0:bb4e812f7c97 264 */
mfiore 0:bb4e812f7c97 265 void SPIFFS_unmount(spiffs *fs);
mfiore 0:bb4e812f7c97 266
mfiore 0:bb4e812f7c97 267 /**
mfiore 0:bb4e812f7c97 268 * Creates a new file.
mfiore 0:bb4e812f7c97 269 * @param fs the file system struct
mfiore 0:bb4e812f7c97 270 * @param path the path of the new file
mfiore 0:bb4e812f7c97 271 * @param mode ignored, for posix compliance
mfiore 0:bb4e812f7c97 272 */
mfiore 0:bb4e812f7c97 273 s32_t SPIFFS_creat(spiffs *fs, const char *path, spiffs_mode mode);
mfiore 0:bb4e812f7c97 274
mfiore 0:bb4e812f7c97 275 /**
mfiore 0:bb4e812f7c97 276 * Opens/creates a file.
mfiore 0:bb4e812f7c97 277 * @param fs the file system struct
mfiore 0:bb4e812f7c97 278 * @param path the path of the new file
mfiore 0:bb4e812f7c97 279 * @param flags the flags for the open command, can be combinations of
mfiore 0:bb4e812f7c97 280 * SPIFFS_APPEND, SPIFFS_TRUNC, SPIFFS_CREAT, SPIFFS_RD_ONLY,
mfiore 0:bb4e812f7c97 281 * SPIFFS_WR_ONLY, SPIFFS_RDWR, SPIFFS_DIRECT
mfiore 0:bb4e812f7c97 282 * @param mode ignored, for posix compliance
mfiore 0:bb4e812f7c97 283 */
mfiore 0:bb4e812f7c97 284 spiffs_file SPIFFS_open(spiffs *fs, const char *path, spiffs_flags flags, spiffs_mode mode);
mfiore 0:bb4e812f7c97 285
mfiore 0:bb4e812f7c97 286 /**
mfiore 0:bb4e812f7c97 287 * Reads from given filehandle.
mfiore 0:bb4e812f7c97 288 * @param fs the file system struct
mfiore 0:bb4e812f7c97 289 * @param fh the filehandle
mfiore 0:bb4e812f7c97 290 * @param buf where to put read data
mfiore 0:bb4e812f7c97 291 * @param len how much to read
mfiore 0:bb4e812f7c97 292 * @returns number of bytes read, or -1 if error
mfiore 0:bb4e812f7c97 293 */
mfiore 0:bb4e812f7c97 294 s32_t SPIFFS_read(spiffs *fs, spiffs_file fh, void *buf, s32_t len);
mfiore 0:bb4e812f7c97 295
mfiore 0:bb4e812f7c97 296 /**
mfiore 0:bb4e812f7c97 297 * Writes to given filehandle.
mfiore 0:bb4e812f7c97 298 * @param fs the file system struct
mfiore 0:bb4e812f7c97 299 * @param fh the filehandle
mfiore 0:bb4e812f7c97 300 * @param buf the data to write
mfiore 0:bb4e812f7c97 301 * @param len how much to write
mfiore 0:bb4e812f7c97 302 * @returns number of bytes written, or -1 if error
mfiore 0:bb4e812f7c97 303 */
mfiore 0:bb4e812f7c97 304 s32_t SPIFFS_write(spiffs *fs, spiffs_file fh, void *buf, s32_t len);
mfiore 0:bb4e812f7c97 305
mfiore 0:bb4e812f7c97 306 /**
mfiore 0:bb4e812f7c97 307 * Moves the read/write file offset
mfiore 0:bb4e812f7c97 308 * @param fs the file system struct
mfiore 0:bb4e812f7c97 309 * @param fh the filehandle
mfiore 0:bb4e812f7c97 310 * @param offs how much/where to move the offset
mfiore 0:bb4e812f7c97 311 * @param whence if SPIFFS_SEEK_SET, the file offset shall be set to offset bytes
mfiore 0:bb4e812f7c97 312 * if SPIFFS_SEEK_CUR, the file offset shall be set to its current location plus offset
mfiore 0:bb4e812f7c97 313 * if SPIFFS_SEEK_END, the file offset shall be set to the size of the file plus offset
mfiore 0:bb4e812f7c97 314 */
mfiore 0:bb4e812f7c97 315 s32_t SPIFFS_lseek(spiffs *fs, spiffs_file fh, s32_t offs, int whence);
mfiore 0:bb4e812f7c97 316
mfiore 0:bb4e812f7c97 317 /**
mfiore 0:bb4e812f7c97 318 * Removes a file by path
mfiore 0:bb4e812f7c97 319 * @param fs the file system struct
mfiore 0:bb4e812f7c97 320 * @param path the path of the file to remove
mfiore 0:bb4e812f7c97 321 */
mfiore 0:bb4e812f7c97 322 s32_t SPIFFS_remove(spiffs *fs, const char *path);
mfiore 0:bb4e812f7c97 323
mfiore 0:bb4e812f7c97 324 /**
mfiore 0:bb4e812f7c97 325 * Removes a file by filehandle
mfiore 0:bb4e812f7c97 326 * @param fs the file system struct
mfiore 0:bb4e812f7c97 327 * @param fh the filehandle of the file to remove
mfiore 0:bb4e812f7c97 328 */
mfiore 0:bb4e812f7c97 329 s32_t SPIFFS_fremove(spiffs *fs, spiffs_file fh);
mfiore 0:bb4e812f7c97 330
mfiore 0:bb4e812f7c97 331 /**
mfiore 0:bb4e812f7c97 332 * Gets file status by path
mfiore 0:bb4e812f7c97 333 * @param fs the file system struct
mfiore 0:bb4e812f7c97 334 * @param path the path of the file to stat
mfiore 0:bb4e812f7c97 335 * @param s the stat struct to populate
mfiore 0:bb4e812f7c97 336 */
mfiore 0:bb4e812f7c97 337 s32_t SPIFFS_stat(spiffs *fs, const char *path, spiffs_stat *s);
mfiore 0:bb4e812f7c97 338
mfiore 0:bb4e812f7c97 339 /**
mfiore 0:bb4e812f7c97 340 * Gets file status by filehandle
mfiore 0:bb4e812f7c97 341 * @param fs the file system struct
mfiore 0:bb4e812f7c97 342 * @param fh the filehandle of the file to stat
mfiore 0:bb4e812f7c97 343 * @param s the stat struct to populate
mfiore 0:bb4e812f7c97 344 */
mfiore 0:bb4e812f7c97 345 s32_t SPIFFS_fstat(spiffs *fs, spiffs_file fh, spiffs_stat *s);
mfiore 0:bb4e812f7c97 346
mfiore 0:bb4e812f7c97 347 /**
mfiore 0:bb4e812f7c97 348 * Flushes all pending write operations from cache for given file
mfiore 0:bb4e812f7c97 349 * @param fs the file system struct
mfiore 0:bb4e812f7c97 350 * @param fh the filehandle of the file to flush
mfiore 0:bb4e812f7c97 351 */
mfiore 0:bb4e812f7c97 352 s32_t SPIFFS_fflush(spiffs *fs, spiffs_file fh);
mfiore 0:bb4e812f7c97 353
mfiore 0:bb4e812f7c97 354 /**
mfiore 0:bb4e812f7c97 355 * Closes a filehandle. If there are pending write operations, these are finalized before closing.
mfiore 0:bb4e812f7c97 356 * @param fs the file system struct
mfiore 0:bb4e812f7c97 357 * @param fh the filehandle of the file to close
mfiore 0:bb4e812f7c97 358 */
mfiore 0:bb4e812f7c97 359 void SPIFFS_close(spiffs *fs, spiffs_file fh);
mfiore 0:bb4e812f7c97 360
mfiore 0:bb4e812f7c97 361 /**
mfiore 0:bb4e812f7c97 362 * Returns last error of last file operation.
mfiore 0:bb4e812f7c97 363 * @param fs the file system struct
mfiore 0:bb4e812f7c97 364 */
mfiore 0:bb4e812f7c97 365 s32_t SPIFFS_errno(spiffs *fs);
mfiore 0:bb4e812f7c97 366
mfiore 0:bb4e812f7c97 367 /**
mfiore 0:bb4e812f7c97 368 * Opens a directory stream corresponding to the given name.
mfiore 0:bb4e812f7c97 369 * The stream is positioned at the first entry in the directory.
mfiore 0:bb4e812f7c97 370 * On hydrogen builds the name argument is ignored as hydrogen builds always correspond
mfiore 0:bb4e812f7c97 371 * to a flat file structure - no directories.
mfiore 0:bb4e812f7c97 372 * @param fs the file system struct
mfiore 0:bb4e812f7c97 373 * @param name the name of the directory
mfiore 0:bb4e812f7c97 374 * @param d pointer the directory stream to be populated
mfiore 0:bb4e812f7c97 375 */
mfiore 0:bb4e812f7c97 376 spiffs_DIR *SPIFFS_opendir(spiffs *fs, const char *name, spiffs_DIR *d);
mfiore 0:bb4e812f7c97 377
mfiore 0:bb4e812f7c97 378 /**
mfiore 0:bb4e812f7c97 379 * Closes a directory stream
mfiore 0:bb4e812f7c97 380 * @param d the directory stream to close
mfiore 0:bb4e812f7c97 381 */
mfiore 0:bb4e812f7c97 382 s32_t SPIFFS_closedir(spiffs_DIR *d);
mfiore 0:bb4e812f7c97 383
mfiore 0:bb4e812f7c97 384 /**
mfiore 0:bb4e812f7c97 385 * Reads a directory into given spifs_dirent struct.
mfiore 0:bb4e812f7c97 386 * @param d pointer to the directory stream
mfiore 0:bb4e812f7c97 387 * @param e the dirent struct to be populated
mfiore 0:bb4e812f7c97 388 * @returns null if error or end of stream, else given dirent is returned
mfiore 0:bb4e812f7c97 389 */
mfiore 0:bb4e812f7c97 390 struct spiffs_dirent *SPIFFS_readdir(spiffs_DIR *d, struct spiffs_dirent *e);
mfiore 0:bb4e812f7c97 391
mfiore 0:bb4e812f7c97 392 /**
mfiore 0:bb4e812f7c97 393 * Runs a consistency check on given filesystem.
mfiore 0:bb4e812f7c97 394 * @param fs the file system struct
mfiore 0:bb4e812f7c97 395 */
mfiore 0:bb4e812f7c97 396 s32_t SPIFFS_check(spiffs *fs);
mfiore 0:bb4e812f7c97 397
mfiore 0:bb4e812f7c97 398 #if SPIFFS_TEST_VISUALISATION
mfiore 0:bb4e812f7c97 399 /**
mfiore 0:bb4e812f7c97 400 * Prints out a visualization of the filesystem.
mfiore 0:bb4e812f7c97 401 * @param fs the file system struct
mfiore 0:bb4e812f7c97 402 */
mfiore 0:bb4e812f7c97 403 s32_t SPIFFS_vis(spiffs *fs);
mfiore 0:bb4e812f7c97 404 #endif
mfiore 0:bb4e812f7c97 405
mfiore 0:bb4e812f7c97 406 #if SPIFFS_BUFFER_HELP
mfiore 0:bb4e812f7c97 407 /**
mfiore 0:bb4e812f7c97 408 * Returns number of bytes needed for the filedescriptor buffer given
mfiore 0:bb4e812f7c97 409 * amount of file descriptors.
mfiore 0:bb4e812f7c97 410 */
mfiore 0:bb4e812f7c97 411 u32_t SPIFFS_buffer_bytes_for_filedescs(spiffs *fs, u32_t num_descs);
mfiore 0:bb4e812f7c97 412
mfiore 0:bb4e812f7c97 413 #if SPIFFS_CACHE
mfiore 0:bb4e812f7c97 414 /**
mfiore 0:bb4e812f7c97 415 * Returns number of bytes needed for the cache buffer given
mfiore 0:bb4e812f7c97 416 * amount of cache pages.
mfiore 0:bb4e812f7c97 417 */
mfiore 0:bb4e812f7c97 418 u32_t SPIFFS_buffer_bytes_for_cache(spiffs *fs, u32_t num_pages);
mfiore 0:bb4e812f7c97 419 #endif
mfiore 0:bb4e812f7c97 420 #endif
mfiore 0:bb4e812f7c97 421
mfiore 0:bb4e812f7c97 422 #if SPIFFS_CHACHE
mfiore 0:bb4e812f7c97 423 #endif
mfiore 0:bb4e812f7c97 424
mfiore 0:bb4e812f7c97 425 #ifdef __cplusplus
mfiore 0:bb4e812f7c97 426 }
mfiore 0:bb4e812f7c97 427 #endif
mfiore 0:bb4e812f7c97 428
Mike Fiore 2:de478b250060 429 #endif /* SPIFFS_H_ */