blob: b07ae206bd8fafc41e820f3cec47a833fcb28d80 [file] [log] [blame]
<!--
Documentation/_templates/layout.html
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership. The
ASF licenses this file to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance with the
License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
License for the specific language governing permissions and limitations
under the License.
-->
<!DOCTYPE html>
<html class="writer-html5" lang="en" >
<head>
<meta charset="utf-8" /><meta name="generator" content="Docutils 0.18.1: http://docutils.sourceforge.net/" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Auto-Mounter &mdash; NuttX latest documentation</title>
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
<link rel="stylesheet" href="../_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="../_static/copybutton.css" type="text/css" />
<link rel="stylesheet" href="../_static/tabs.css" type="text/css" />
<link rel="stylesheet" href="../_static/custom.css" type="text/css" />
<link rel="shortcut icon" href="../_static/favicon.ico"/>
<!--[if lt IE 9]>
<script src="../_static/js/html5shiv.min.js"></script>
<![endif]-->
<script src="../_static/jquery.js"></script>
<script src="../_static/_sphinx_javascript_frameworks_compat.js"></script>
<script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js"></script>
<script src="../_static/doctools.js"></script>
<script src="../_static/sphinx_highlight.js"></script>
<script src="../_static/clipboard.min.js"></script>
<script src="../_static/copybutton.js"></script>
<script src="../_static/js/theme.js"></script>
<link rel="index" title="Index" href="../genindex.html" />
<link rel="search" title="Search" href="../search.html" />
<link rel="next" title="STM32 Null Pointer Detection" href="stm32nullpointer.html" />
<link rel="prev" title="Testing TCP/IP Network Stacks" href="testingtcpip.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="../index.html" class="icon icon-home"> NuttX
</a>
<!-- this version selector is quite ugly, should be probably replaced by something
more modern -->
<div class="version-selector">
<select onchange="javascript:location.href = this.value;">
<option value="../../latest" selected="selected">latest</option>
<option value="../../10.0.0" >10.0.0</option>
<option value="../../10.0.1" >10.0.1</option>
<option value="../../10.1.0" >10.1.0</option>
<option value="../../10.2.0" >10.2.0</option>
<option value="../../10.3.0" >10.3.0</option>
<option value="../../11.0.0" >11.0.0</option>
<option value="../../12.0.0" >12.0.0</option>
<option value="../../12.1.0" >12.1.0</option>
<option value="../../12.2.0" >12.2.0</option>
<option value="../../12.2.1" >12.2.1</option>
<option value="../../12.3.0" >12.3.0</option>
<option value="../../12.4.0" >12.4.0</option>
<option value="../../12.5.0" >12.5.0</option>
<option value="../../12.5.1" >12.5.1</option>
</select>
</div>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" aria-label="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu">
<p class="caption" role="heading"><span class="caption-text">Table of Contents</span></p>
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="../index.html">Home</a></li>
<li class="toctree-l1"><a class="reference internal" href="../introduction/index.html">Introduction</a></li>
<li class="toctree-l1"><a class="reference internal" href="../quickstart/index.html">Getting Started</a></li>
<li class="toctree-l1"><a class="reference internal" href="../contributing/index.html">Contributing</a></li>
<li class="toctree-l1"><a class="reference internal" href="../introduction/inviolables.html">The Inviolable Principles of NuttX</a></li>
<li class="toctree-l1"><a class="reference internal" href="../platforms/index.html">Supported Platforms</a></li>
<li class="toctree-l1"><a class="reference internal" href="../components/index.html">OS Components</a></li>
<li class="toctree-l1"><a class="reference internal" href="../applications/index.html">Applications</a></li>
<li class="toctree-l1"><a class="reference internal" href="../implementation/index.html">Implementation Details</a></li>
<li class="toctree-l1"><a class="reference internal" href="../reference/index.html">API Reference</a></li>
<li class="toctree-l1"><a class="reference internal" href="../faq/index.html">FAQ</a></li>
<li class="toctree-l1 current"><a class="reference internal" href="index.html">Guides</a><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="nfs.html">NFS Client How-To</a></li>
<li class="toctree-l2"><a class="reference internal" href="usbtrace.html">USB Device Trace</a></li>
<li class="toctree-l2"><a class="reference internal" href="simulator.html">Simulator</a></li>
<li class="toctree-l2"><a class="reference internal" href="qemugdb.html">How to debug NuttX using QEMU and GDB</a></li>
<li class="toctree-l2"><a class="reference internal" href="rndis.html">How to use RNDIS</a></li>
<li class="toctree-l2"><a class="reference internal" href="drivers.html">Drivers</a></li>
<li class="toctree-l2"><a class="reference internal" href="tasktrace.html">Task Trace</a></li>
<li class="toctree-l2"><a class="reference internal" href="cpp_cmake.html">C++ Example using CMake</a></li>
<li class="toctree-l2"><a class="reference internal" href="pysimcoder.html">pysimCoder integration with NuttX</a></li>
<li class="toctree-l2"><a class="reference internal" href="customboards.html">Custom Boards How-To</a></li>
<li class="toctree-l2"><a class="reference internal" href="customapps.html">Custom Apps How-to</a></li>
<li class="toctree-l2"><a class="reference internal" href="citests.html">Running CI Test Locally</a></li>
<li class="toctree-l2"><a class="reference internal" href="zerolatencyinterrupts.html">High Performance, Zero Latency Interrupts</a></li>
<li class="toctree-l2"><a class="reference internal" href="nestedinterrupts.html">Nested Interrupts</a></li>
<li class="toctree-l2"><a class="reference internal" href="cortexmhardfaults.html">Analyzing Cortex-M Hardfaults</a></li>
<li class="toctree-l2"><a class="reference internal" href="coredump.html">Core Dump</a></li>
<li class="toctree-l2"><a class="reference internal" href="minidumpserver.html">minidumpserver</a></li>
<li class="toctree-l2"><a class="reference internal" href="gdbwithpython.html">GDB with Python</a></li>
<li class="toctree-l2"><a class="reference internal" href="ofloader.html">Open Flash Loader</a></li>
<li class="toctree-l2"><a class="reference internal" href="testingtcpip.html">Testing TCP/IP Network Stacks</a></li>
<li class="toctree-l2 current"><a class="current reference internal" href="#">Auto-Mounter</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#general-description">General Description</a></li>
<li class="toctree-l3"><a class="reference internal" href="#board-specific-support">Board-Specific Support</a></li>
<li class="toctree-l3"><a class="reference internal" href="#example-implementation">Example Implementation</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="stm32nullpointer.html">STM32 Null Pointer Detection</a></li>
<li class="toctree-l2"><a class="reference internal" href="stm32ccm.html">STM32 CCM Allocator</a></li>
<li class="toctree-l2"><a class="reference internal" href="stackrecord.html">Run time stack statistics</a></li>
<li class="toctree-l2"><a class="reference internal" href="etcromfs.html">etc romfs</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../glossary.html">Glossary</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="Mobile navigation menu" >
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../index.html">NuttX</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="Page navigation">
<ul class="wy-breadcrumbs">
<li><a href="../index.html" class="icon icon-home" aria-label="Home"></a></li>
<li class="breadcrumb-item"><a href="index.html">Guides</a></li>
<li class="breadcrumb-item active">Auto-Mounter</li>
<li class="wy-breadcrumbs-aside">
<a href="../_sources/guides/automounter.rst.txt" rel="nofollow"> View page source</a>
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<section id="auto-mounter">
<h1>Auto-Mounter<a class="headerlink" href="#auto-mounter" title="Permalink to this heading"></a></h1>
<section id="general-description">
<h2>General Description<a class="headerlink" href="#general-description" title="Permalink to this heading"></a></h2>
<p>NuttX implements an auto-mounter than can make working with SD cards or other
removable media easier. With the auto-mounter, the file system will be
automatically mounted when media is inserted and automatically unmounted when
the media is removed.</p>
<p>The auto is enable by selecting in the NuttX configuration:</p>
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>CONFIG_FS_AUTOMOUNTER=y
</pre></div>
</div>
<p>WARNING: SD cards should never be removed without first unmounting them. This
is to avoid data and possible corruption of the file system. Certainly this is
the case if you are writing to the SD card at the time of the removal. If you
use the SD card for read-only access, however, then I cannot think of any
reason why removing the card without mounting would be harmful.</p>
<p>For applications that write to the removable media, the automatic unmount is
still beneficial (as opposed to leaving a broken mount in place) although
should not be relied upon for a proper solution.</p>
</section>
<section id="board-specific-support">
<h2>Board-Specific Support<a class="headerlink" href="#board-specific-support" title="Permalink to this heading"></a></h2>
<p>Like many components of NuttX, the auto-mounter has a upper-half/lower-half
architecture:</p>
<ul class="simple">
<li><p><strong>Upper half</strong> The upper half is the file <code class="docutils literal notranslate"><span class="pre">fs/fs_automount.c</span></code>. This upper
half performs the basic automount activities. It responds to media
insertion and removal events by mounting and unmounting the file system on
the media. This includes logic to handle unmount retries: The unmount cannot
be performed while applications have open files on the media. In this case,
the auto-mounter will periodically retry the unmount until all of the
applications close there references to files on the non-existent media.</p></li>
<li><p><strong>Lower Half</strong> The lower half is defined by a standard interface. That
interface definition is in the header file <code class="docutils literal notranslate"><span class="pre">include/nuttx/fs/automount.h</span></code>.
The lower half interface provides: (1) mount information including file
system type, block driver path, and mount point path, (2) mount and unmount
retry delays, and (3) and callbacks to attach to and management the media
insertion / removal interrupts.</p></li>
</ul>
</section>
<section id="example-implementation">
<h2>Example Implementation<a class="headerlink" href="#example-implementation" title="Permalink to this heading"></a></h2>
<p>There is an example implementation of this lower half interface at
<code class="docutils literal notranslate"><span class="pre">boards/arm/sama5/sama5d4-ek/src/sam_automount.c</span></code>. The <code class="docutils literal notranslate"><span class="pre">boards/arm/sama5/sama5d4-ek/Kconfig</span></code>
as the board-specific configuration for the auto-mounter. You can see
the configuration settings in the <code class="docutils literal notranslate"><span class="pre">boards/arm/sama5/sama5d4-ek/configs/nsh/defconfig</span></code>
and <code class="docutils literal notranslate"><span class="pre">boards/arm/sama5/sama5d4-ek/configs/nxwm/defconfig</span></code> configuration files:</p>
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>CONFIG_SAMA5D4EK_HSMCI0_AUTOMOUNT=y
CONFIG_SAMA5D4EK_HSMCI0_AUTOMOUNT_FSTYPE=&quot;vfat&quot;
CONFIG_SAMA5D4EK_HSMCI0_AUTOMOUNT_BLKDEV=&quot;/dev/mmcsd0&quot;
CONFIG_SAMA5D4EK_HSMCI0_AUTOMOUNT_MOUNTPOINT=&quot;/mnt/sdcard&quot;
CONFIG_SAMA5D4EK_HSMCI0_AUTOMOUNT_DDELAY=1000
CONFIG_SAMA5D4EK_HSMCI0_AUTOMOUNT_UDELAY=2000
</pre></div>
</div>
<p>These setting determine the values in the lower half interface. The interrupt is
provided by a PIO pin defined in <code class="docutils literal notranslate"><span class="pre">boards/arm/sama5/sama5d4-ek/src/sama5e4-ek.h</span></code> and
the implementation of the interface and callbacks is in
<code class="docutils literal notranslate"><span class="pre">boards/arm/sama5/sama5d4-ek/src/sam_automount.c</span></code>.</p>
</section>
</section>
</div>
</div>
<footer><div class="rst-footer-buttons" role="navigation" aria-label="Footer">
<a href="testingtcpip.html" class="btn btn-neutral float-left" title="Testing TCP/IP Network Stacks" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
<a href="stm32nullpointer.html" class="btn btn-neutral float-right" title="STM32 Null Pointer Detection" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
</div>
<hr/>
<div role="contentinfo">
<p>&#169; Copyright 2023, The Apache Software Foundation.</p>
</div>
</footer>
</div>
</div>
</section>
</div>
<script>
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>