blob: e54082969ff3310b543a0b2d9b1617c9618199a9 [file] [log] [blame]
Other File Systems
==================
Libraries use Mynewt's file system abstraction layer (``fs/fs``) for all
file operations. Because clients use an abstraction layer, the
underlying file system can be swapped out without affecting client code.
This page documents the procedure for plugging a custom file system into
the Mynewt file system abstraction layer.
1. Specify ``fs/fs`` as a dependency of your file system package.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The file system package must register itself with the ``fs/fs`` package,
so it must specify ``fs/fs`` as a dependency. As an example, part of the
Newtron Flash File System (nffs) ``pkg.yml`` is reproduced below. Notice
the first item in the ``pkg.deps`` list.
.. code-block:: console
pkg.name: fs/nffs
pkg.deps:
- "@apache-mynewt-core/fs/fs"
- "@apache-mynewt-core/hw/hal"
- "@apache-mynewt-core/libs/os"
- "@apache-mynewt-core/libs/testutil"
- "@apache-mynewt-core/sys/log"
2. Register your package's API with the ``fs/fs`` interface.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The ``fs/fs`` package calls into the underlying file system via a
collection of function pointers. To plug your file system into the
``fs/fs`` API, you must assign these function pointers to the
corresponding routines in your file system package.
For example, ``nffs`` registers itself with ``fs/fs`` as follows (from
``fs/nffs/src/nffs.c``):
.. code:: c
static const struct fs_ops nffs_ops = {
.f_open = nffs_open,
.f_close = nffs_close,
.f_read = nffs_read,
.f_write = nffs_write,
.f_seek = nffs_seek,
.f_getpos = nffs_getpos,
.f_filelen = nffs_file_len,
.f_unlink = nffs_unlink,
.f_rename = nffs_rename,
.f_mkdir = nffs_mkdir,
.f_opendir = nffs_opendir,
.f_readdir = nffs_readdir,
.f_closedir = nffs_closedir,
.f_dirent_name = nffs_dirent_name,
.f_dirent_is_dir = nffs_dirent_is_dir,
.f_name = "nffs"
};
int
nffs_init(void)
{
/* [...] */
fs_register(&nffs_ops);
}
Header Files
~~~~~~~~~~~~
To gain access to ``fs/fs``'s registration interface, include the
following header:
.. code:: c
#include "fs/fs_if.h"