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.
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
):
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:
#include "fs/fs_if.h"