mirror of
https://gitlab.com/zephray/glider.git
synced 2026-01-16 15:54:41 +00:00
187 lines
8.2 KiB
Markdown
187 lines
8.2 KiB
Markdown
# SPIFFS (SPI Flash File System)
|
|
**V0.3.6**
|
|
|
|
[](https://travis-ci.org/pellepl/spiffs)
|
|
|
|
Copyright (c) 2013-2016 Peter Andersson (pelleplutt1976 at gmail.com)
|
|
|
|
For legal stuff, see [LICENSE](https://github.com/pellepl/spiffs/blob/master/LICENSE). Basically, you may do whatever you want with the source. Use, modify, sell, print it out, roll it and smoke it - as long as I won't be held responsible.
|
|
|
|
Love to hear feedback though!
|
|
|
|
|
|
## INTRODUCTION
|
|
|
|
Spiffs is a file system intended for SPI NOR flash devices on embedded targets.
|
|
|
|
Spiffs is designed with following characteristics in mind:
|
|
- Small (embedded) targets, sparse RAM without heap
|
|
- Only big areas of data (blocks) can be erased
|
|
- An erase will reset all bits in block to ones
|
|
- Writing pulls one to zeroes
|
|
- Zeroes can only be pulled to ones by erase
|
|
- Wear leveling
|
|
|
|
|
|
## FEATURES
|
|
|
|
What spiffs does:
|
|
- Specifically designed for low ram usage
|
|
- Uses statically sized ram buffers, independent of number of files
|
|
- Posix-like api: open, close, read, write, seek, stat, etc
|
|
- It can run on any NOR flash, not only SPI flash - theoretically also on embedded flash of a microprocessor
|
|
- Multiple spiffs configurations can run on same target - and even on same SPI flash device
|
|
- Implements static wear leveling
|
|
- Built in file system consistency checks
|
|
- Highly configurable
|
|
|
|
What spiffs does not:
|
|
- Presently, spiffs does not support directories. It produces a flat structure. Creating a file with path *tmp/myfile.txt* will create a file called *tmp/myfile.txt* instead of a *myfile.txt* under directory *tmp*.
|
|
- It is not a realtime stack. One write operation might last much longer than another.
|
|
- Poor scalability. Spiffs is intended for small memory devices - the normal sizes for SPI flashes. Going beyond ~128Mbyte is probably a bad idea. This is a side effect of the design goal to use as little ram as possible.
|
|
- Presently, it does not detect or handle bad blocks.
|
|
- One configuration, one binary. There's no generic spiffs binary that handles all types of configurations.
|
|
|
|
|
|
## MORE INFO
|
|
|
|
See the [wiki](https://github.com/pellepl/spiffs/wiki) for [configuring](https://github.com/pellepl/spiffs/wiki/Configure-spiffs), [integrating](https://github.com/pellepl/spiffs/wiki/Integrate-spiffs), [using](https://github.com/pellepl/spiffs/wiki/Using-spiffs), and [optimizing](https://github.com/pellepl/spiffs/wiki/Performance-and-Optimizing) spiffs.
|
|
|
|
For design, see [docs/TECH_SPEC](https://github.com/pellepl/spiffs/blob/master/docs/TECH_SPEC).
|
|
|
|
For a generic spi flash driver, see [this](https://github.com/pellepl/spiflash_driver).
|
|
|
|
## HISTORY
|
|
|
|
### 0.3.6
|
|
- Fix range bug in index memory mapping #98
|
|
- Add index memory mapping #97
|
|
- Optimize SPIFFS_read for large files #96
|
|
- Add temporal cache for opening files #95
|
|
- More robust gc #93 (thanks @dismirlian)
|
|
- Fixed a double write of same data in certain cache situations
|
|
- Fixed an open bug in READ_ONLY builds
|
|
- File not visible in SPIFFS_readdir #90 (thanks @benpicco-tmp)
|
|
- Cache load code cleanup #92 (thanks @niclash)
|
|
- Fixed lock/unlock asymmetry #88 #87 (thanks @JackJefferson, @dpruessner)
|
|
- Testframe updates
|
|
|
|
New API functions:
|
|
- `SPIFFS_ix_map` - map index meta data to memory for a file
|
|
- `SPIFFS_ix_unmap` - unmaps index meta data for a file
|
|
- `SPIFFS_ix_remap` - changes file offset for index metadata map
|
|
- `SPIFFS_bytes_to_ix_map_entries` - utility, get length of needed vector for given amount of bytes
|
|
- `SPIFFS_ix_map_entries_to_bytes` - utility, get number of bytes a vector can represent given length
|
|
|
|
New config defines:
|
|
- `SPIFFS_IX_MAP` - enable possibility to map index meta data to memory for reading faster
|
|
- `SPIFFS_TEMPORAL_FD_CACHE` - enable temporal cache for opening files faster
|
|
- `SPIFFS_TEMPORAL_CACHE_HIT_SCORE` - for tuning the temporal cache
|
|
|
|
### 0.3.5
|
|
- Fixed a bug in fs check
|
|
- API returns actual error codes #84) (thanks @Nails)
|
|
- Fix compiler warnings for non-gcc #83 #81 (thanks @Nails)
|
|
- Unable to recover from full fs #82 (thanks @rojer)
|
|
- Define SPIFFS_O_* flags #80
|
|
- Problem with long filenames #79 (thanks @psjg)
|
|
- Duplicate file name bug fix #74 (thanks @igrr)
|
|
- SPIFFS_eof and SPIFFS_tell return wrong value #72 (thanks @ArtemPisarenko)
|
|
- Bunch of testframe updates #77 #78 #86 (thanks @dpreussner, @psjg a.o)
|
|
|
|
### 0.3.4
|
|
- Added user callback file func.
|
|
- Fixed a stat bug with obj id.
|
|
- SPIFFS_probe_fs added
|
|
- Add possibility to compile a read-only version of spiffs
|
|
- Make magic dependent on fs length, if needed (see #59 & #66) (thanks @hreintke)
|
|
- Exposed SPIFFS_open_by_page_function
|
|
- Zero-size file cannot be seek #57 (thanks @lishen2)
|
|
- Add tell and eof functions #54 (thanks @raburton)
|
|
- Make api string params const #53 (thanks @raburton)
|
|
- Preserve user_data during mount() #51 (thanks @rojer)
|
|
|
|
New API functions:
|
|
- `SPIFFS_set_file_callback_func` - register a callback informing about file events
|
|
- `SPIFFS_probe_fs` - probe a spi flash trying to figure out size of fs
|
|
- `SPIFFS_open_by_page` - open a file by page index
|
|
- `SPIFFS_eof` - checks if end of file is reached
|
|
- `SPIFFS_tell` - returns current file offset
|
|
|
|
New config defines:
|
|
- `SPIFFS_READ_ONLY`
|
|
- `SPIFFS_USE_MAGIC_LENGTH`
|
|
|
|
### 0.3.3
|
|
**Might not be compatible with 0.3.2 structures. See issue #40**
|
|
- Possibility to add integer offset to file handles
|
|
- Truncate function presumes too few free pages #49
|
|
- Bug in truncate function #48 (thanks @PawelDefee)
|
|
- Update spiffs_gc.c - remove unnecessary parameter (thanks @PawelDefee)
|
|
- Update INTEGRATION docs (thanks @PawelDefee)
|
|
- Fix pointer truncation in 64-bit platforms (thanks @igrr)
|
|
- Zero-sized files cannot be read #44 (thanks @rojer)
|
|
- (More) correct calculation of max_id in obj_lu_find #42 #41 (thanks @lishen2)
|
|
- Check correct error code in obj_lu_find_free #41 (thanks @lishen2)
|
|
- Moar comments for SPIFFS_lseek (thanks @igrr)
|
|
- Fixed padding in spiffs_page_object_ix #40 (thanks @jmattsson @lishen2)
|
|
- Fixed gc_quick test (thanks @jmattsson)
|
|
- Add SPIFFS_EXCL flag #36
|
|
- SPIFFS_close may fail silently if cache is enabled #37
|
|
- User data in callbacks #34
|
|
- Ignoring SINGLETON build in cache setup (thanks Luca)
|
|
- Compilation error fixed #32 (thanks @chotasanjiv)
|
|
- Align cand_scores (thanks @hefloryd)
|
|
- Fix build warnings when SPIFFS_CACHE is 0 (thanks @ajaybhargav)
|
|
|
|
New config defines:
|
|
- `SPIFFS_FILEHDL_OFFSET`
|
|
|
|
### 0.3.2
|
|
- Limit cache size if too much cache is given (thanks pgeiem)
|
|
- New feature - Controlled erase. #23
|
|
- SPIFFS_rename leaks file descriptors #28 (thanks benpicco)
|
|
- moved dbg print defines in test framework to params_test.h
|
|
- lseek should return the resulting offset (thanks hefloryd)
|
|
- fixed type on dbg ifdefs
|
|
- silence warning about signed/unsigned comparison when spiffs_obj_id is 32 bit (thanks benpicco)
|
|
- Possible error in test_spiffs.c #21 (thanks yihcdaso-yeskela)
|
|
- Cache might writethrough too often #16
|
|
- even moar testrunner updates
|
|
- Test framework update and some added tests
|
|
- Some thoughts for next gen
|
|
- Test sigsevs when having too many sectors #13 (thanks alonewolfx2)
|
|
- GC might be suboptimal #11
|
|
- Fix eternal readdir when objheader at last block, last entry
|
|
|
|
New API functions:
|
|
- `SPIFFS_gc_quick` - call a nonintrusive gc
|
|
- `SPIFFS_gc` - call a full-scale intrusive gc
|
|
|
|
### 0.3.1
|
|
- Removed two return warnings, was too triggerhappy on release
|
|
|
|
### 0.3.0
|
|
- Added existing namecheck when creating files
|
|
- Lots of static analysis bugs #6
|
|
- Added rename func
|
|
- Fix SPIFFS_read length when reading beyond file size
|
|
- Added reading beyond file length testcase
|
|
- Made build a bit more configurable
|
|
- Changed name in spiffs from "errno" to "err_code" due to conflicts compiling in mingw
|
|
- Improved GC checks, fixed an append bug, more robust truncate for very special case
|
|
- GC checks preempts GC, truncate even less picky
|
|
- Struct alignment needed for some targets, define in spiffs config #10
|
|
- Spiffs filesystem magic, definable in config
|
|
|
|
New config defines:
|
|
- `SPIFFS_USE_MAGIC` - enable or disable magic check upon mount
|
|
- `SPIFFS_ALIGNED_OBJECT_INDEX_TABLES` - alignment for certain targets
|
|
|
|
New API functions:
|
|
- `SPIFFS_rename` - rename files
|
|
- `SPIFFS_clearerr` - clears last errno
|
|
- `SPIFFS_info` - returns info on used and total bytes in fs
|
|
- `SPIFFS_format` - formats the filesystem
|
|
- `SPIFFS_mounted` - checks if filesystem is mounted
|