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"