blob: b54dd5e42e38518a51577f467fafbbc73aceacbb [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>Hardware Abstraction Layer &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="Timer" href="hal_timer/hal_timer.html"/>
<link rel="prev" title="Shell" href="../shell/shell.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> /
Hardware Abstraction Layer
<div class="sourcelink">
<a href="https://github.com/apache/mynewt-core/edit/master/docs/os/modules/hal/hal.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" >
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 current"><a class="current reference internal" href="#">Hardware Abstraction</a><ul>
<li class="toctree-l3"><a class="reference internal" href="hal_timer/hal_timer.html">Timer</a></li>
<li class="toctree-l3"><a class="reference internal" href="hal_gpio/hal_gpio.html">GPIO</a></li>
<li class="toctree-l3"><a class="reference internal" href="hal_uart/hal_uart.html">UART</a></li>
<li class="toctree-l3"><a class="reference internal" href="hal_spi/hal_spi.html">SPI</a></li>
<li class="toctree-l3"><a class="reference internal" href="hal_i2c/hal_i2c.html">I2C</a></li>
<li class="toctree-l3"><a class="reference internal" href="hal_flash/hal_flash.html">Flash</a></li>
<li class="toctree-l3"><a class="reference internal" href="hal_system/hal_sys.html">System</a></li>
<li class="toctree-l3"><a class="reference internal" href="hal_watchdog/hal_watchdog.html">Watchdog</a></li>
<li class="toctree-l3"><a class="reference internal" href="hal_bsp/hal_bsp.html">BSP</a></li>
<li class="toctree-l3"><a class="reference internal" href="hal_os_tick/hal_os_tick.html">OS Tick</a></li>
<li class="toctree-l3"><a class="reference internal" href="hal_creation.html">Creating New HAL Interfaces</a></li>
<li class="toctree-l3"><a class="reference internal" href="hal_in_libraries.html">Using HAL in Your Libraries</a></li>
</ul>
</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"><a class="reference internal" href="../drivers/driver.html">Drivers</a></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="">
<div class="rst-content">
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<div class="section" id="hardware-abstraction-layer">
<h1>Hardware Abstraction Layer<a class="headerlink" href="#hardware-abstraction-layer" 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>The Hardware Abstraction Layer (HAL) in Mynewt is a low-level, base
peripheral abstraction. HAL provides a core set of services that is
implemented for each MCU supported by Mynewt. Device drivers are
typically the software libraries that initialize the hardware and manage
access to the hardware by higher layers of software. In the Mynewt OS,
the layers can be depicted in the following manner.</p>
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>+———————————————————————————+
| app |
+———————————————————————————+
| (n)drivers |
+———————————————————————————+
| HAL | BSP |
+—————————————+—————————————+
</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. 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.</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>The HAL API should be simple. It should be as easy to implement for
hardware as possible. A simple HAL API makes it easy to bring up new
MCUs quickly.</p></li>
<li><p>The HAL API should portable across all the various MCUs supported in
Mynewt (e.g. Nordic’s nRF51, Nordic’s nRF52, NXP’s MK64F12 etc.).</p></li>
</ul>
</div>
<div class="section" id="example">
<h2>Example<a class="headerlink" href="#example" title="Permalink to this headline"></a></h2>
<p>A Mynewt contributor might write a light-switch driver that provides the
functionality of an intelligent light switch. This might involve using a
timer, a General Purpose Output (GPO) to set the light to the on or off
state, and flash memory to log the times the lights were turned on or
off. The contributor would like this package to work with as many
different hardware platforms as possible, but can’t possibly test across
the complete set of hardware supported by Mynewt.</p>
<p><strong>Solution</strong>: The contributor uses the HAL APIs to control the
peripherals. The Mynewt team ensures that the underlying HAL devices all
work equivalently through the HAL APIs. The contributors library is
independent of the specifics of the hardware.</p>
</div>
<div class="section" id="dependency">
<h2>Dependency<a class="headerlink" href="#dependency" title="Permalink to this headline"></a></h2>
<p>To include the HAL within your project, simply add it to your package
dependencies as follows:</p>
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="go">pkg.deps:</span>
<span class="go"> . . .</span>
<span class="go"> hw/hal</span>
</pre></div>
</div>
</div>
<div class="section" id="platform-support">
<h2>Platform Support<a class="headerlink" href="#platform-support" title="Permalink to this headline"></a></h2>
<p>Not all platforms (MCU and BSP) support all HAL devices. Consult your
MCU or BSP documentation to find out if you have hardware support for
the peripherals you are interested in using. Once you verify support,
then consult the MCU implementation and see if the specific HAL
interface (xxxx) you are using is in the
<code class="docutils literal notranslate"><span class="pre">mcu/&lt;mcu-name&gt;/src/hal_xxxx.c</span></code> implementation. Finally, you can build
your project and ensure that there are no unresolved hal_xxxx
externals.</p>
</div>
</div>
</div>
</div>
<div class="rst-footer-buttons row" role="navigation" aria-label="footer navigation">
<a href="hal_timer/hal_timer.html" class="btn btn-neutral float-right" title="Timer" accesskey="n">Next: Timer <span class="fa fa-arrow-circle-right"></span></a>
<a href="../shell/shell.html" class="btn btn-neutral" title="Shell" accesskey="p"><span class="fa fa-arrow-circle-left"></span> Previous: Shell</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>