blob: e69f10943951c9600c5e016f1ff8cd925d6f6c3d [file] [log] [blame]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>flash &mdash; Apache Mynewt latest documentation</title>
<link rel="shortcut icon" href="../../../_static/mynewt-logo-only-newt32x32.png"/>
<link rel="stylesheet" href="../../../_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="../../../_static/css/sphinx_theme.css" type="text/css" />
<link rel="stylesheet" href="../../../_static/css/bootstrap-3.0.3.min.css" type="text/css" />
<link rel="stylesheet" href="../../../_static/css/v2.css" type="text/css" />
<link rel="stylesheet" href="../../../_static/css/custom.css" type="text/css" />
<link rel="stylesheet" href="../../../_static/css/restructuredtext.css" type="text/css" />
<link rel="stylesheet" href="../../../_static/css/overrides.css" type="text/css" />
<link rel="index" title="Index"
href="../../../genindex.html"/>
<link rel="search" title="Search" href="../../../search.html"/>
<link rel="top" title="Apache Mynewt latest documentation" href="../../../index.html"/>
<link rel="up" title="Drivers" href="driver.html"/>
<link rel="next" title="mmc" href="mmc.html"/>
<link rel="prev" title="Drivers" href="driver.html"/>
<script src="../../../_static/js/modernizr.min.js"></script>
<script>
(function(i, s, o, g, r, a, m) {
i["GoogleAnalyticsObject"] = r;
(i[r] =
i[r] ||
function() {
(i[r].q = i[r].q || []).push(arguments);
}),
(i[r].l = 1 * new Date());
(a = s.createElement(o)), (m = s.getElementsByTagName(o)[0]);
a.async = 1;
a.src = g;
m.parentNode.insertBefore(a, m);
})(window, document, "script", "//www.google-analytics.com/analytics.js", "ga");
ga("create", "UA-72162311-1", "auto");
ga("send", "pageview");
</script>
</head>
<body class="not-front page-documentation" role="document" >
<div id="wrapper">
<div class="container">
<div id="banner" class="row v2-main-banner">
<a class="logo-cell" href="/">
<img class="logo" src="../../../_static/img/logo.png">
</a>
<div class="tagline-cell">
<h4 class="tagline">An OS to build, deploy and securely manage billions of devices</h4>
</div>
<div class="news-cell">
<div class="well">
<h4>Latest News:</h4> <a href="/download">Apache Mynewt 1.12.0, Apache NimBLE 1.7.0 </a> released April 4, 2024)
</div>
</div>
</div>
</div>
<header>
<nav id="navbar" class="navbar navbar-inverse" role="navigation">
<div class="container">
<!-- Collapsed navigation -->
<div class="navbar-header">
<!-- Expander button -->
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
</div>
<!-- Expanded navigation -->
<div class="navbar-collapse collapse">
<!-- Main navigation -->
<ul class="nav navbar-nav navbar-right">
<li>
<a href="/"><i class="fa fa-home" style="font-size: larger;"></i></a>
</li>
<li class="important">
<a href="/quick-start/">Quick Start</a>
</li>
<li>
<a href="/about/">About</a>
</li>
<li>
<a href="/talks/">Talks</a>
</li>
<li class="active">
<a href="/documentation/">Documentation</a>
</li>
<li>
<a href="/download/">Download</a>
</li>
<li>
<a href="/community/">Community</a>
</li>
<li>
<a href="/events/">Events</a>
</li>
</ul>
<!-- Search, Navigation and Repo links -->
<ul class="nav navbar-nav navbar-right">
</ul>
</div>
</div>
</nav>
</header>
<!-- STARTS MAIN CONTENT -->
<div id="main-content">
<div id="breadcrumb">
<div class="container">
<a href="/documentation/">Docs</a> /
<a href="../../os_user_guide.html">OS User Guide</a> /
<a href="driver.html">Drivers</a> /
flash
<div class="sourcelink">
<a href="https://github.com/apache/mynewt-core/edit/master/docs/os/modules/drivers/flash.rst" class="icon icon-github"
rel="nofollow"> Edit on GitHub</a>
</div>
</div>
</div>
<!-- STARTS CONTAINER -->
<div class="container">
<!-- STARTS .content -->
<div id="content" class="row">
<!-- STARTS .container-sidebar -->
<div class="container-sidebar col-xs-12 col-sm-3">
<div id="docSidebar" class="sticky-container">
<div role="search" class="sphinx-search">
<form id="rtd-search-form" class="wy-form" action="../../../search.html" method="get">
<input type="text" name="q" placeholder="Search documentation" class="search-documentation" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
<!-- Note: only works when deployed -->
<select class="form-control" onchange="if (this.value) window.location.href=this.value">
<option value="/latest" selected>
Version: latest
</option>
<option value="/v1_12_0" >
Version: 1.12.0
</option>
<option value="/v1_11_0" >
Version: 1.11.0
</option>
<option value="/v1_10_0" >
Version: 1.10.0
</option>
<option value="/v1_9_0" selected="selected" >
Version: 1.9.0
</option>
<option value="/v1_8_0" >
Version: 1.8.0
</option>
<option value="/v1_7_0" >
Version: 1.7.0
</option>
<option value="/v1_6_0" >
Version: 1.6.0
</option>
<option value="/v1_5_0" >
Version: 1.5.0
</option>
<option value="/v1_4_0" >
Version: 1.4.0
</option>
<option value="/v1_3_0/os/introduction" >
Version: 1.3.0
</option>
<option value="/v1_2_0/os/introduction" >
Version: 1.2.0
</option>
<option value="/v1_1_0/os/introduction" >
Version: 1.1.0
</option>
<option value="/v1_0_0/os/introduction" >
Version: 1.0.0
</option>
<option value="/v0_9_0/os/introduction" >
Version: 0.9.0
</option>
</select>
<div class="region region-sidebar">
<div class="docs-menu">
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="../../../index.html">Introduction</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../get_started/index.html">Setup &amp; Get Started</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../concepts.html">Concepts</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../tutorials/tutorials.html">Tutorials</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../external_links.html">Third-party Resources</a></li>
<li class="toctree-l1 current"><a class="reference internal" href="../../os_user_guide.html">OS User Guide</a><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="../../core_os/mynewt_os.html">Kernel</a></li>
<li class="toctree-l2"><a class="reference internal" href="../system_modules.html">System</a></li>
<li class="toctree-l2"><a class="reference internal" href="../hal/hal.html">Hardware Abstraction</a></li>
<li class="toctree-l2"><a class="reference internal" href="../bootloader/bootloader.html">Secure Bootloader</a></li>
<li class="toctree-l2"><a class="reference internal" href="../split/split.html">Split Images</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../core_os/porting/port_os.html">Porting Guide</a></li>
<li class="toctree-l2"><a class="reference internal" href="../baselibc.html">Baselibc</a></li>
<li class="toctree-l2 current"><a class="reference internal" href="driver.html">Drivers</a><ul class="current">
<li class="toctree-l3 current"><a class="current reference internal" href="#">flash</a></li>
<li class="toctree-l3"><a class="reference internal" href="mmc.html">mmc</a></li>
<li class="toctree-l3"><a class="reference internal" href="chg_ctrl/chg_ctrl.html">Charge Control</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../devmgmt/newtmgr.html">Device Management with Newt Manager</a></li>
<li class="toctree-l2"><a class="reference internal" href="../mcumgr/mcumgr.html">Device Management with MCUmgr</a></li>
<li class="toctree-l2"><a class="reference internal" href="../imgmgr/imgmgr.html">Image Manager</a></li>
<li class="toctree-l2"><a class="reference internal" href="../sysinitconfig/sysinitconfig.html">Compile-Time Configuration</a></li>
<li class="toctree-l2"><a class="reference internal" href="../sysinitdown/sysinitdown.html">System Initialization and Shutdown</a></li>
<li class="toctree-l2"><a class="reference internal" href="../extcmd/extcmd.html">Build-Time Hooks</a></li>
<li class="toctree-l2"><a class="reference internal" href="../fs/fs.html">File System</a></li>
<li class="toctree-l2"><a class="reference internal" href="../fcb/fcb.html">Flash Circular Buffer</a></li>
<li class="toctree-l2"><a class="reference internal" href="../sensor_framework/sensor_framework.html">Sensor Framework</a></li>
<li class="toctree-l2"><a class="reference internal" href="../testutil/testutil.html">Test Utilities</a></li>
<li class="toctree-l2"><a class="reference internal" href="../json/json.html">JSON</a></li>
<li class="toctree-l2"><a class="reference internal" href="../mfg/mfg.html">Manufacturing support</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../bsp/index.html">Board support</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../../../network/index.html">BLE User Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../newt/index.html">Newt Tool Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../newtmgr/index.html">Newt Manager Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../mynewt_faq/index.html">Mynewt FAQ</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../misc/index.html">Appendix</a></li>
</ul>
</div>
</div>
</div>
<!-- ENDS STICKY CONTAINER -->
</div>
<!-- ENDS .container-sidebar -->
<div class="col-xs-12 col-sm-9">
<div class="alert alert-warning">
<p>
Version 1.9.0 is not the most recent version of the
Apache Mynewt documentation. Click <a href="/latest">here</a> to
read the latest version.
</p>
</div>
<div class="">
<div class="rst-content">
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<div class="section" id="flash">
<h1>flash<a class="headerlink" href="#flash" title="Permalink to this headline">¶</a></h1>
<p>The flash driver subsystem is a work in progress which aims at
supporting common external SPI/I2C flash/eeprom memory chips. This is
equivalent to what Linux calls <code class="docutils literal notranslate"><span class="pre">MTD</span></code> for
<code class="docutils literal notranslate"><span class="pre">Memory</span> <span class="pre">Technology</span> <span class="pre">Devices</span></code>.</p>
<p>At the moment the only <code class="docutils literal notranslate"><span class="pre">flash</span></code> device that is already supported is the
AT45DBxxx SPI flash family with the <code class="docutils literal notranslate"><span class="pre">at45db</span></code> driver.</p>
<p>The flash driver aims for full compatibility with the <code class="docutils literal notranslate"><span class="pre">hal_flash</span></code> API,
which means initialization and usage can be performed by any <code class="docutils literal notranslate"><span class="pre">fs</span></code> that
supports the <code class="docutils literal notranslate"><span class="pre">hal_flash</span></code> interface.</p>
<div class="section" id="initialization">
<h2>Initialization<a class="headerlink" href="#initialization" title="Permalink to this headline">¶</a></h2>
<p>To be compatible with the standard <code class="docutils literal notranslate"><span class="pre">hal_flash</span></code> interface, the
<code class="docutils literal notranslate"><span class="pre">at45db</span></code> driver embeds a <code class="docutils literal notranslate"><span class="pre">struct</span> <span class="pre">hal_flash</span></code> to its own
<code class="docutils literal notranslate"><span class="pre">struct</span> <span class="pre">at45db_dev</span></code>. The whole <code class="docutils literal notranslate"><span class="pre">at45db_dev</span></code> struct is shown below.</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="k">struct</span><span class="w"> </span><span class="nc">at45db_dev</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">hal_flash</span><span class="w"> </span><span class="n">hal</span><span class="p">;</span>
<span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">hal_spi_settings</span><span class="w"> </span><span class="o">*</span><span class="n">settings</span><span class="p">;</span>
<span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">spi_num</span><span class="p">;</span>
<span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="o">*</span><span class="n">spi_cfg</span><span class="p">;</span><span class="w"> </span><span class="cm">/** Low-level MCU SPI config */</span>
<span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">ss_pin</span><span class="p">;</span>
<span class="w"> </span><span class="kt">uint32_t</span><span class="w"> </span><span class="n">baudrate</span><span class="p">;</span>
<span class="w"> </span><span class="kt">uint16_t</span><span class="w"> </span><span class="n">page_size</span><span class="p">;</span><span class="w"> </span><span class="cm">/** Page size to be used, valid: 512 and 528 */</span>
<span class="w"> </span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">disable_auto_erase</span><span class="p">;</span><span class="w"> </span><span class="cm">/** Reads and writes auto-erase by default */</span>
<span class="p">};</span>
</pre></div>
</div>
<p>To ease with initialization a helper function <code class="docutils literal notranslate"><span class="pre">at45db_default_config</span></code>
was added. It returns an already initialized <code class="docutils literal notranslate"><span class="pre">struct</span> <span class="pre">at45db_dev</span></code>
leaving the user with just having to provide the SPI related config.</p>
<p>To initialize the device, pass the <code class="docutils literal notranslate"><span class="pre">at45db_dev</span></code> struct to
<code class="docutils literal notranslate"><span class="pre">at45db_init</span></code>.</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="kt">int</span><span class="w"> </span><span class="nf">at45db_init</span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">hal_flash</span><span class="w"> </span><span class="o">*</span><span class="n">dev</span><span class="p">);</span>
</pre></div>
</div>
<p>For low-level access to the device the following functions are provided:</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="kt">int</span><span class="w"> </span><span class="nf">at45db_read</span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">hal_flash</span><span class="w"> </span><span class="o">*</span><span class="n">dev</span><span class="p">,</span><span class="w"> </span><span class="kt">uint32_t</span><span class="w"> </span><span class="n">addr</span><span class="p">,</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="o">*</span><span class="n">buf</span><span class="p">,</span>
<span class="w"> </span><span class="kt">uint32_t</span><span class="w"> </span><span class="n">len</span><span class="p">);</span>
<span class="kt">int</span><span class="w"> </span><span class="nf">at45db_write</span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">hal_flash</span><span class="w"> </span><span class="o">*</span><span class="n">dev</span><span class="p">,</span><span class="w"> </span><span class="kt">uint32_t</span><span class="w"> </span><span class="n">addr</span><span class="p">,</span><span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="o">*</span><span class="n">buf</span><span class="p">,</span>
<span class="w"> </span><span class="kt">uint32_t</span><span class="w"> </span><span class="n">len</span><span class="p">);</span>
<span class="kt">int</span><span class="w"> </span><span class="nf">at45db_erase_sector</span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">hal_flash</span><span class="w"> </span><span class="o">*</span><span class="n">dev</span><span class="p">,</span><span class="w"> </span><span class="kt">uint32_t</span><span class="w"> </span><span class="n">sector_address</span><span class="p">);</span>
<span class="kt">int</span><span class="w"> </span><span class="nf">at45db_sector_info</span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">hal_flash</span><span class="w"> </span><span class="o">*</span><span class="n">dev</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">idx</span><span class="p">,</span><span class="w"> </span><span class="kt">uint32_t</span><span class="w"> </span><span class="o">*</span><span class="n">address</span><span class="p">,</span>
<span class="w"> </span><span class="kt">uint32_t</span><span class="w"> </span><span class="o">*</span><span class="n">sz</span><span class="p">);</span>
</pre></div>
</div>
<p>Also, <code class="docutils literal notranslate"><span class="pre">nffs</span></code> is able to run on the device due to the fact that
standard <code class="docutils literal notranslate"><span class="pre">hal_flash</span></code> interface compatibility is provided. Due to
current limitations of <code class="docutils literal notranslate"><span class="pre">nffs</span></code>, it can only run on <code class="docutils literal notranslate"><span class="pre">at45db</span></code> if the
internal flash of the MCU is not being used.</p>
</div>
<div class="section" id="dependencies">
<h2>Dependencies<a class="headerlink" href="#dependencies" title="Permalink to this headline">¶</a></h2>
<p>To include the <code class="docutils literal notranslate"><span class="pre">at45db</span></code> driver on a project, just include it as a
dependency in your pkg.yml:</p>
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>pkg.deps:
- &quot;@apache-mynewt-core/hw/drivers/flash/at45db&quot;
</pre></div>
</div>
</div>
<div class="section" id="header-file">
<h2>Header file<a class="headerlink" href="#header-file" title="Permalink to this headline">¶</a></h2>
<p>The <code class="docutils literal notranslate"><span class="pre">at45db</span></code> SPI flash follows the standard <code class="docutils literal notranslate"><span class="pre">hal_flash</span></code> interface
but requires that a special struct</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;at45db/at45db.h&gt;</span>
</pre></div>
</div>
</div>
<div class="section" id="example">
<h2>Example<a class="headerlink" href="#example" title="Permalink to this headline">¶</a></h2>
<p>This following examples assume that the <code class="docutils literal notranslate"><span class="pre">at45db</span></code> is being used on a
STM32F4 MCU.</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="k">static</span><span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">SPI_SS_PIN</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MCU_GPIO_PORTA</span><span class="p">(</span><span class="mi">4</span><span class="p">);</span>
<span class="k">static</span><span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">SPI_SCK_PIN</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MCU_GPIO_PORTA</span><span class="p">(</span><span class="mi">5</span><span class="p">);</span>
<span class="k">static</span><span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">SPI_MISO_PIN</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MCU_GPIO_PORTA</span><span class="p">(</span><span class="mi">6</span><span class="p">);</span>
<span class="k">static</span><span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">SPI_MOSI_PIN</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MCU_GPIO_PORTA</span><span class="p">(</span><span class="mi">7</span><span class="p">);</span>
<span class="k">struct</span><span class="w"> </span><span class="nc">stm32f4_hal_spi_cfg</span><span class="w"> </span><span class="n">spi_cfg</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="p">.</span><span class="n">ss_pin</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">SPI_SS_PIN</span><span class="p">,</span>
<span class="w"> </span><span class="p">.</span><span class="n">sck_pin</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">SPI_SCK_PIN</span><span class="p">,</span>
<span class="w"> </span><span class="p">.</span><span class="n">miso_pin</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">SPI_MISO_PIN</span><span class="p">,</span>
<span class="w"> </span><span class="p">.</span><span class="n">mosi_pin</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">SPI_MOSI_PIN</span><span class="p">,</span>
<span class="w"> </span><span class="p">.</span><span class="n">irq_prio</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">2</span>
<span class="p">};</span>
<span class="k">struct</span><span class="w"> </span><span class="nc">at45db_dev</span><span class="w"> </span><span class="o">*</span><span class="n">my_at45db_dev</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">NULL</span><span class="p">;</span>
<span class="n">my_at45db_dev</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">at45db_default_config</span><span class="p">();</span>
<span class="n">my_at45db_dev</span><span class="o">-&gt;</span><span class="n">spi_num</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="n">my_at45db_dev</span><span class="o">-&gt;</span><span class="n">spi_cfg</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">&amp;</span><span class="n">spi_cfg</span><span class="p">;</span>
<span class="n">my_at45db_dev</span><span class="o">-&gt;</span><span class="n">ss_pin</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">spi_cfg</span><span class="p">.</span><span class="n">ss_pin</span><span class="p">;</span>
<span class="n">rc</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">at45db_init</span><span class="p">((</span><span class="k">struct</span><span class="w"> </span><span class="nc">hal_flash</span><span class="w"> </span><span class="o">*</span><span class="p">)</span><span class="w"> </span><span class="n">my_at45db_dev</span><span class="p">);</span>
<span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">rc</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="cm">/* XXX: error handling */</span>
<span class="p">}</span>
</pre></div>
</div>
<p>The enable <code class="docutils literal notranslate"><span class="pre">nffs</span></code> to run on the <code class="docutils literal notranslate"><span class="pre">at45db</span></code>, the <code class="docutils literal notranslate"><span class="pre">flash_id</span></code> 0 needs
to map to provide a mapping from 0 to this struct.</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="k">const</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">hal_flash</span><span class="w"> </span><span class="o">*</span>
<span class="n">hal_bsp_flash_dev</span><span class="p">(</span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">id</span><span class="p">)</span>
<span class="p">{</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">id</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="mi">0</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="nb">NULL</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="o">&amp;</span><span class="n">my_at45db_dev</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>
</div>
</div>
</div>
</div>
</div>
<div class="rst-footer-buttons row" role="navigation" aria-label="footer navigation">
<a href="mmc.html" class="btn btn-neutral float-right" title="mmc" accesskey="n">Next: mmc <span class="fa fa-arrow-circle-right"></span></a>
<a href="driver.html" class="btn btn-neutral" title="Drivers" accesskey="p"><span class="fa fa-arrow-circle-left"></span> Previous: Drivers</a>
</div>
</div>
</div>
</div>
<!-- ENDS CONTENT SECTION -->
</div>
<!-- ENDS .content -->
</div>
</div>
<footer>
<div class="container">
<div class="row">
<div class="col-xs-12">
<p class="copyright">Apache Mynewt is available under Apache License, version 2.0.</p>
</div>
<div class="col-xs-12">
<div class="logos">
<img src="../../../_static/img/asf_logo_wide_small.png" alt="Apache" title="Apache">
<small class="footnote">
Apache Mynewt, Mynewt, Apache, the Apache feather logo, and the Apache Mynewt project logo are either
registered trademarks or trademarks of the Apache Software Foundation in the United States and other countries.
</small>
<a href="">
<img src="../../../_static/img/add_to_slack.png" alt="Slack Icon" title="Join our Slack Community" />
</a>
</div>
</div>
</div>
</div>
</footer>
</div>
<!-- ENDS #wrapper -->
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT:'../../../',
VERSION:'latest',
COLLAPSE_INDEX:false,
FILE_SUFFIX:'.html',
HAS_SOURCE: true,
SOURCELINK_SUFFIX: '.txt',
LINK_SUFFIX: '.html'
};
</script>
<script type="text/javascript" src="../../../_static/jquery.js"></script>
<script type="text/javascript" src="../../../_static/underscore.js"></script>
<script type="text/javascript" src="../../../_static/doctools.js"></script>
<script type="text/javascript" src="../../../_static/js/bootstrap-3.0.3.min.js"></script>
<script type="text/javascript" src="../../../_static/js/affix.js"></script>
<script type="text/javascript" src="../../../_static/js/main.js"></script>
</body>
</html>