blob: 88780763847dbbcc83d7b0638fb3ef3f0fb93030 [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>APIs Exported by Board-Specific Logic to NuttX &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="Naming and Header File Conventions" href="conventions.html" />
<link rel="prev" title="APIs Exported by Architecture-Specific Logic to NuttX" href="arch.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 current"><a class="reference internal" href="../index.html">API Reference</a><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="../user/index.html">Userspace API</a></li>
<li class="toctree-l2 current"><a class="reference internal" href="index.html">Architecture APIs</a><ul class="current">
<li class="toctree-l3"><a class="reference internal" href="addrenv.html">Address Environments</a></li>
<li class="toctree-l3"><a class="reference internal" href="app_vs_os.html">Application OS vs. Internal OS Interfaces</a></li>
<li class="toctree-l3"><a class="reference internal" href="arch.html">APIs Exported by Architecture-Specific Logic to NuttX</a></li>
<li class="toctree-l3 current"><a class="current reference internal" href="#">APIs Exported by Board-Specific Logic to NuttX</a></li>
<li class="toctree-l3"><a class="reference internal" href="conventions.html">Naming and Header File Conventions</a></li>
<li class="toctree-l3"><a class="reference internal" href="iob.html">I/O Buffer Management</a></li>
<li class="toctree-l3"><a class="reference internal" href="led.html">LED Support</a></li>
<li class="toctree-l3"><a class="reference internal" href="mutex.html">Mutual Exclusion lock</a></li>
<li class="toctree-l3"><a class="reference internal" href="nat.html">Network Address Translation (NAT)</a></li>
<li class="toctree-l3"><a class="reference internal" href="newreno.html">Congestion Control NewReno</a></li>
<li class="toctree-l3"><a class="reference internal" href="notifier.html">Notifier Chain</a></li>
<li class="toctree-l3"><a class="reference internal" href="nuttx.html">APIs Exported by NuttX to Architecture-Specific Logic</a></li>
<li class="toctree-l3"><a class="reference internal" href="paging.html">On-Demand Paging</a></li>
<li class="toctree-l3"><a class="reference internal" href="shm.html">Shared Memory</a></li>
<li class="toctree-l3"><a class="reference internal" href="smp.html">Symmetric Multiprocessing (SMP) Application</a></li>
<li class="toctree-l3"><a class="reference internal" href="time_clock.html">System Time and Clock</a></li>
<li class="toctree-l3"><a class="reference internal" href="wqueue.html">Work Queues</a></li>
<li class="toctree-l3"><a class="reference internal" href="netdev.html">Network Devices</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../../faq/index.html">FAQ</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../guides/index.html">Guides</a></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">API Reference</a></li>
<li class="breadcrumb-item"><a href="index.html">Architecture APIs</a></li>
<li class="breadcrumb-item active">APIs Exported by Board-Specific Logic to NuttX</li>
<li class="wy-breadcrumbs-aside">
<a href="../../_sources/reference/os/board.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="apis-exported-by-board-specific-logic-to-nuttx">
<h1>APIs Exported by Board-Specific Logic to NuttX<a class="headerlink" href="#apis-exported-by-board-specific-logic-to-nuttx" title="Permalink to this heading"></a></h1>
<p>Exported board-specific interfaces are prototyped in the header
file <code class="docutils literal notranslate"><span class="pre">include/nuttx/board.h</span></code>. There are many interfaces exported
from board- to architecture-specific logic. But there are only a
few exported from board-specific logic to common NuttX logic.
Those few of those related to initialization will be discussed in
this paragraph. There are others, like those used by
<code class="docutils literal notranslate"><span class="pre">`boardctl()</span></code> &lt;#boardctl&gt;`__ that will be discussed in other
paragraphs.</p>
<p>All of the board-specific interfaces used by the NuttX OS logic
are for controlled board initialization. There are three points in
time where you can insert custom, board-specific initialization
logic:</p>
<p>First, <code class="docutils literal notranslate"><span class="pre">&lt;arch&gt;_board_initialize()</span></code>: This function is <em>not</em>
called from the common OS logic, but rather from the
architecture-specific power on reset logic. This is used only for
initialization of very low-level things like configuration of GPIO
pins, power settings, DRAM initialization, etc. The OS has not
been initialized at this point, so you cannot allocate memory or
initialize device drivers.</p>
<p>The other two board initialization <em>hooks</em> are called from the OS
start-up logic and are described in the following paragraphs:</p>
<dl class="c function">
<dt class="sig sig-object c" id="c.board_early_initialize">
<span class="kt"><span class="pre">void</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">board_early_initialize</span></span></span><span class="sig-paren">(</span><span class="kt"><span class="pre">void</span></span><span class="sig-paren">)</span><a class="headerlink" href="#c.board_early_initialize" title="Permalink to this definition"></a><br /></dt>
<dd><p>The next level of initialization is performed by a call to
<code class="docutils literal notranslate"><span class="pre">up_initialize()</span></code> (in
<code class="docutils literal notranslate"><span class="pre">arch/&lt;arch&gt;/src/common/up_initialize.c</span></code>). The OS has been
initialized at this point and it is okay to initialize drivers in
this phase. <code class="docutils literal notranslate"><span class="pre">up_initialize()</span></code> is <em>not</em> a board-specific
interface, but rather an architecture-specific, board-independent
interface.</p>
<p>But at this same point in time, the OS will also call a
board-specific initialization function named
<code class="docutils literal notranslate"><span class="pre">board_early_initialize()</span></code> if
<code class="docutils literal notranslate"><span class="pre">CONFIG_BOARD_EARLY_INITIALIZE=y</span></code> is selected in the
configuration. The context in which <code class="docutils literal notranslate"><span class="pre">board_early_initialize()</span></code>
executes is suitable for early initialization of most, simple
device drivers and is a logical, board-specific extension of
up_initialize().</p>
<p><code class="docutils literal notranslate"><span class="pre">board_early_initialize()</span></code> runs on the startup, initialization
thread. Some initialization operations cannot be performed on the
start-up, initialization thread. That is because the
initialization thread cannot wait for event. Waiting may be
required, for example, to mount a file system or or initialize a
device such as an SD card. For this reason, such driver initialize
must be deferred to <code class="docutils literal notranslate"><span class="pre">board_late_initialize()</span></code>.</p>
</dd></dl>
<dl class="c function">
<dt class="sig sig-object c" id="c.board_late_initialize">
<span class="kt"><span class="pre">void</span></span><span class="w"> </span><span class="sig-name descname"><span class="n"><span class="pre">board_late_initialize</span></span></span><span class="sig-paren">(</span><span class="kt"><span class="pre">void</span></span><span class="sig-paren">)</span><a class="headerlink" href="#c.board_late_initialize" title="Permalink to this definition"></a><br /></dt>
<dd><p>And, finally, just before the user application code starts. If
<code class="docutils literal notranslate"><span class="pre">CONFIG_BOARD_LATE_INITIALIZE=y</span></code> is selected in the
configuration, then an final, additional initialization call will
be performed in the boot-up sequence to a function called
<code class="docutils literal notranslate"><span class="pre">board_late_initialize()</span></code>. <code class="docutils literal notranslate"><span class="pre">board_late_initialize()</span></code> will be
called well after <code class="docutils literal notranslate"><span class="pre">up_initialize()</span></code> and
<code class="docutils literal notranslate"><span class="pre">board_early_initialize()</span></code> are called.
<code class="docutils literal notranslate"><span class="pre">board_late_initialize()</span></code> will be called just before the main
application task is started. This additional initialization phase
may be used, for example, to initialize more complex,
board-specific device drivers.</p>
<p>Waiting for events, use of I2C, SPI, etc are permissible in the
context of board_late_initialize(). That is because
<code class="docutils literal notranslate"><span class="pre">board_late_initialize()</span></code> will run on a temporary, internal
kernel thread.</p>
</dd></dl>
</section>
</div>
</div>
<footer><div class="rst-footer-buttons" role="navigation" aria-label="Footer">
<a href="arch.html" class="btn btn-neutral float-left" title="APIs Exported by Architecture-Specific Logic to NuttX" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
<a href="conventions.html" class="btn btn-neutral float-right" title="Naming and Header File Conventions" 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>