blob: 1664c02f8d97b07580a98bdbe0052cc72f0f5f41 [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>Drivers &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="OS User Guide" href="../../os_user_guide.html"/>
<link rel="next" title="flash" href="flash.html"/>
<link rel="prev" title="Baselibc" href="../baselibc.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.11.0, Apache NimBLE 1.6.0 </a> released September 7, 2023)
</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> /
Drivers
<div class="sourcelink">
<a href="https://github.com/apache/mynewt-core/edit/master/docs/os/modules/drivers/driver.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_11_0" selected="selected" >
Version: 1.11.0
</option>
<option value="/v1_10_0" >
Version: 1.10.0
</option>
<option value="/v1_9_0" >
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="current reference internal" href="#">Drivers</a><ul>
<li class="toctree-l3"><a class="reference internal" href="flash.html">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.11.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="drivers">
<h1>Drivers<a class="headerlink" href="#drivers" title="Permalink to this headline"></a></h1>
<div class="toctree-wrapper compound">
</div>
<div class="section" id="description">
<h2>Description<a class="headerlink" href="#description" title="Permalink to this headline"></a></h2>
<p>Device drivers in the Mynewt context includes libraries that interface
with devices external to the CPU. These devices are connected to the CPU
via standard peripherals such as SPI, GPIO, I2C etc. Device drivers
leverage the base HAL services in Mynewt to provide friendly
abstractions to application developers.</p>
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="go">+———————————————————————————+</span>
<span class="go">| app |</span>
<span class="go">+———————————————————————————+</span>
<span class="go">| (n)drivers |</span>
<span class="go">+———————————————————————————+</span>
<span class="go">| HAL | BSP |</span>
<span class="go">+—————————————+—————————————+</span>
</pre></div>
</div>
<ul class="simple">
<li><p>The Board Support Package (BSP) abstracts board specific
configurations e.g. CPU frequency, input voltage, LED pins, on-chip
flash map etc.</p></li>
<li><p>The Hardware Abstraction Layer (HAL) abstracts architecture-specific
functionality. It initializes and enables components within a master
processor. It is designed to be portable across all the various MCUs
supported in Mynewt (e.g. Nordic’s nRF51, Nordic’s nRF52, NXP’s
MK64F12 etc.). It includes code that initializes and manages access
to components of the board such as board buses (I2C, PCI, PCMCIA,
etc.), off-chip memory (controllers, level 2+ cache, Flash, etc.),
and off-chip I/O (Ethernet, RS-232, display, mouse, etc.)</p></li>
<li><p>The driver sits atop the BSP and HAL. It abstracts the common modes
of operation for each peripheral device connected via the standard
interfaces to the processor. There may be multiple driver
implementations of differing complexities for a particular peripheral
device. For example, for an Analog to Digital Converter (ADC)
peripheral you might have a simple driver that does blocking ADC
reads and uses the HAL only. You might have a more complex driver
that can deal with both internal and external ADCs, and has chip
specific support for doing things like DMA’ing ADC reads into a
buffer and posting an event to a task every ’n’ samples. The drivers
are the ones that register with the kernel’s power management APIs,
and manage turning on and off peripherals and external chipsets, etc.
The Mynewt core repository comes with a base set of drivers to help
the user get started.</p></li>
</ul>
</div>
<div class="section" id="general-design-principles">
<h2>General design principles<a class="headerlink" href="#general-design-principles" title="Permalink to this headline"></a></h2>
<ul class="simple">
<li><p>Device drivers should have a consistent structure and unified
interface whenever possible. For example, we have a top-level
package, “adc”, which contains the interface for all ADC drivers, and
then we have the individual implementation of the driver itself. The
following source files point to this:</p>
<ul>
<li><p>high-level ADC API: <code class="docutils literal notranslate"><span class="pre">hw/drivers/adc/include/adc/adc.h</span></code></p></li>
<li><p>implementation of ADC for STM32F4:
<code class="docutils literal notranslate"><span class="pre">hw/drivers/adc/adc_stm32f4/src/adc_stm32f4.c</span></code> (As of the
1.0.0-beta release, ADC for nRF51 and nRF52 are available at an
external
<a class="reference external" href="https://github.com/runtimeco/mynewt_nordic/tree/master/hw/drivers/adc">repo</a>.
They are expected to be pulled into the core repo on Apache Mynewt
after the license terms are clarified.). The only exported call in
this example is
<code class="docutils literal notranslate"><span class="pre">int</span> <span class="pre">stm32f4_adc_dev_init(struct</span> <span class="pre">os_dev</span> <span class="pre">*,</span> <span class="pre">void</span> <span class="pre">*)</span></code> which is
passed as a function pointer to <code class="docutils literal notranslate"><span class="pre">os_dev_create()</span></code> in
<code class="docutils literal notranslate"><span class="pre">hal_bsp.c</span></code>, when the adc device is created.</p></li>
</ul>
</li>
<li><p>Device drivers should be easy to use. In Mynewt, creating a device
initializes it as well, making it readily available for the user to
open, use (e.g. read, configure etc.) and close. Creating a device is
simple using
<code class="docutils literal notranslate"><span class="pre">os_dev_create(struct</span> <span class="pre">os_dev</span> <span class="pre">*dev,</span> <span class="pre">char</span> <span class="pre">*name,</span> <span class="pre">uint8_t</span> <span class="pre">stage,</span> <span class="pre">uint8_t</span> <span class="pre">priority,</span> <span class="pre">os_dev_init_func_t</span> <span class="pre">od_init,</span> <span class="pre">void</span> <span class="pre">*arg)</span></code>.
The <code class="docutils literal notranslate"><span class="pre">od_init</span></code> function is defined within the appropriate driver
directory e.g. <code class="docutils literal notranslate"><span class="pre">stm32f4_adc_dev_init</span></code> in
<code class="docutils literal notranslate"><span class="pre">hw/drivers/adc/adc_stm32f4/src/adc_stm32f4.c</span></code> for the ADC device
initialization function.</p></li>
<li><p>The implementation should allow for builds optimized for minimal
memory usage. Additional functionality can be enabled by writing a
more complex driver (usually based on the simple implementation
included by default in the core repository) and optionally compiling
the relevant packages in. Typically, only a basic driver that
addresses a device’s core functionality (covering ~90% of use cases)
is included in the Mynewt core repository, thus keeping the footprint
small.</p></li>
<li><p>The implementation should allow a user to be able to instantiate
multiple devices of a certain kind. In the Mynewt environment the
user can, for example, maintain separate contexts for multiple ADCs
over different peripheral connections such as SPI, I2C etc. It is
also possible for a user to use a single peripheral interface (e.g.
SPI) to drive multiple devices (e.g. ADC), and in that case the
device driver has to handle the proper synchronization of the various
tasks.</p></li>
<li><p>Device drivers should be MCU independent. In Mynewt, device creation
and operation functions are independent of the underlying MCU.</p></li>
<li><p>Device drivers should be able to offer high-level interfaces for
generic operations common to a particular device group. An example of
such a class or group of devices is a group for sensors with generic
operations such as channel discovery, configure, and read values. The
organization of the driver directory is work in progress - so we
encourage you to hop on the dev&#64; mailing list and offer your
insights!</p></li>
<li><p>Device drivers should be searchable. The plan is to have the newt
tool offer a <code class="docutils literal notranslate"><span class="pre">newt</span> <span class="pre">pkg</span> <span class="pre">search</span></code> capability. This is work in
progress. You are welcome to join the conversation on the dev&#64;
mailing list!</p></li>
</ul>
</div>
<div class="section" id="example">
<h2>Example<a class="headerlink" href="#example" title="Permalink to this headline"></a></h2>
<p>The Mynewt core repo includes an example of a driver using the HAL to
provide extra functionality - the UART driver. It uses HAL GPIO and UART
to provide multiple serial ports on the NRF52 (but allowed on other
platforms too.)</p>
<p>The gist of the driver design is that there is an API for the driver
(for use by applications), and then sub-packages to that driver that
implement that driver API using the HAL and BSP APIs.</p>
</div>
<div class="section" id="implemented-drivers">
<h2>Implemented drivers<a class="headerlink" href="#implemented-drivers" title="Permalink to this headline"></a></h2>
<p>Drivers live under <code class="docutils literal notranslate"><span class="pre">hw/drivers</span></code>. The current list of supported drivers
includes:</p>
<table class="docutils align-default">
<colgroup>
<col style="width: 61%" />
<col style="width: 39%" />
</colgroup>
<thead>
<tr class="row-odd"><th class="head"><p>Driver</p></th>
<th class="head"><p>Description</p></th>
</tr>
</thead>
<tbody>
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">adc</span></code></p></td>
<td><p>TODO: ADC driver.</p></td>
</tr>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">flash</span></code></p></td>
<td><p>SPI/I2C flash drivers.</p></td>
</tr>
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">lwip</span></code></p></td>
<td><p>TODO: LWIP.</p></td>
</tr>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">mmc</span></code></p></td>
<td><p>MMC/SD card driver.</p></td>
</tr>
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">sensors</span></code></p></td>
<td><p>TODO: sensors.</p></td>
</tr>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">uart</span></code></p></td>
<td><p>TODO: UART driver.</p></td>
</tr>
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">chg_ctrl</span></code></p></td>
<td><p>Charge control drivers.</p></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
<div class="rst-footer-buttons row" role="navigation" aria-label="footer navigation">
<a href="flash.html" class="btn btn-neutral float-right" title="flash" accesskey="n">Next: flash <span class="fa fa-arrow-circle-right"></span></a>
<a href="../baselibc.html" class="btn btn-neutral" title="Baselibc" accesskey="p"><span class="fa fa-arrow-circle-left"></span> Previous: Baselibc</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>