zephyr/samples/subsys/shell/fs
..
boards
src
CMakeLists.txt
README.rst
mpu.conf
prj.conf
prj_flash_load.conf
sample.yaml

README.rst

.. zephyr:code-sample:: shell-fs
   :name: File system shell
   :relevant-api: file_system_api

   Access a LittleFS file system partition in flash using the file system shell.

Overview
********

This example provides shell access to a LittleFS file system partition in flash.

Requirements
************

A board with LittleFS file system support and UART console

Building
********

native_sim
==========

You can build this sample for :ref:`native_sim <native_sim>` with:

.. zephyr-app-commands::
   :zephyr-app: samples/subsys/shell/fs
   :board: native_sim
   :goals: build
   :compact:

Which by default will use the flash simulator. The flash simulator will use a file,
:file:`flash.bin`, in the current directory to keep the flash content.
You have several options to control this. You can check them with:

.. code-block:: console

  zephyr/zephyr.exe -help

Check the :ref:`native_sim UART documentation <native_ptty_uart>` for information on how to connect
to the UART.

With FUSE access in the host filesystem
---------------------------------------

If you enable the :ref:`host FUSE filsystem access <native_fuse_flash>`
you will also have the flash filesystem mounted and accessible from your Linux host filesystem.

Before starting a build, make sure that the i386 pkgconfig directory is in your
search path and that a 32-bit version of libfuse is installed. For more
background information on this requirement check
:ref:`the native_sim documentation <native_fuse_flash>`.

.. code-block:: console

  export PKG_CONFIG_PATH=/usr/lib/i386-linux-gnu/pkgconfig

.. zephyr-app-commands::
   :zephyr-app: samples/subsys/shell/fs
   :board: native_sim
   :gen-args: -DCONFIG_FUSE_FS_ACCESS=y
   :goals: build
   :compact:

Reel Board
==========

.. zephyr-app-commands::
   :zephyr-app: samples/subsys/shell/fs
   :board: reel_board
   :goals: build
   :compact:

Particle Xenon
==============

This target is customized to support the same SPI NOR partition table as
the :zephyr:code-sample:`littlefs` sample.

.. zephyr-app-commands::
   :zephyr-app: samples/subsys/shell/fs
   :board: particle_xenon
   :goals: build
   :compact:

Flash load
==========

If you want to use the 'flash load' command then build the sample with the
'prj_flash_load.conf' configuration file. It has defined a larger RX buffer.
If the buffer is too small then some data may be lost during transfer of large
files.

Running
*******

Once the board has booted, you will be presented with a shell prompt.
All file system related commands are available as sub-commands of fs.

Begin by mounting the LittleFS file system.

.. code-block:: console

  fs mount littlefs /lfs

Loading filesystem from host PC to flash memory
===============================================

Use command:

.. code-block:: console

  flash load <address> <size>

It allows loading the data via UART, directly into flash memory at a given
address. Data must be aligned to a value dependent on the target flash memory,
otherwise it will cause an error and nothing will be loaded.

From the host side file system must be loaded with 'dd' tool with 'bs=64'
(if the file is loaded in chunks greater than 64B the data is lost and isn't
received by the Zephyr shell).

Example in Zephyr console:

.. code-block:: console

  flash load 0x7a000 0x5000

Example in the host PC:

.. code-block:: console

  dd if=filesystem of=/dev/ttyACM0 bs=64

During the transfer there are printed messages indicating how many chunks are
already written. After the successful transfer the 'Read all' message is
printed.

Files System Shell Commands
===========================

Mount
-----

Mount a file system partition to a given mount point

.. code-block:: console

  fs mount (littlefs|fat) <path>

Ls
--

List all files and directories in a given path

.. code-block:: console

  fs ls [path]

Cd
--

Change current working directory to given path

.. code-block:: console

  fs cd [path]

Pwd
---

List current working directory

.. code-block:: console

  fs pwd

Write
-----

Write hexadecimal numbers to a given file.
Optionally a offset in the file can be given.

.. code-block:: console

  fs write <path> [-o <offset>] <hex number> ...

Read
----

Read file and dump in hex and ASCII format

.. code-block:: console

  fs read <path>

Trunc
-----

Truncate a given file

.. code-block:: console

  fs trunc <path>

Mkdir
-----

Create a directory

.. code-block:: console

  fs mkdir <path>

Rm
--

Remove a file or directory

.. code-block:: console

  fs rm <path>

Flash Host Access
=================

For the :ref:`native sim board <native_sim>` the flash partitions can be accessed from the host
Linux system.

By default the flash partitions are accessible through the directory *flash*
relative to the directory where the build is started.