blob: 22cac5baf49e15a5dcd66e9638702cb9dcdaf636 [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>Charge control 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="Drivers" href="../driver.html"/>
<link rel="next" title="SGM4056 Charger" href="sgm4056.html"/>
<link rel="prev" title="mmc" href="../mmc.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> /
Charge control drivers
<div class="sourcelink">
<a href="https://github.com/apache/mynewt-core/edit/master/docs/os/modules/drivers/chg_ctrl/chg_ctrl.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" >
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"><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 current"><a class="current reference internal" href="#">Charge Control</a><ul>
<li class="toctree-l4"><a class="reference internal" href="sgm4056.html">SGM4056</a></li>
</ul>
</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="">
<div class="rst-content">
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<div class="section" id="charge-control-drivers">
<h1>Charge control drivers<a class="headerlink" href="#charge-control-drivers" title="Permalink to this headline">ΒΆ</a></h1>
<div class="toctree-wrapper compound">
</div>
<p>The charge control drivers provides support for various battery chargers. They
provide a abstract <code class="docutils literal notranslate"><span class="pre">hw/charge-control</span></code> Battery Charge Controller IC Interface.
The available drivers are for:</p>
<ul class="simple">
<li><p>ADP5061</p></li>
<li><p>BQ24040</p></li>
<li><p>DA1469x</p></li>
<li><p><a class="reference internal" href="sgm4056.html"><span class="doc">SGM4056 Charger</span></a></p></li>
</ul>
<div class="section" id="initialization">
<h2>Initialization<a class="headerlink" href="#initialization" title="Permalink to this headline">ΒΆ</a></h2>
<p>Most of the drivers need some driver-specific initialization. This is normally
done in the BSP by making a call to <code class="docutils literal notranslate"><span class="pre">os_dev_create</span></code> with a reference to the
driver init function and a driver-specific configuration.</p>
<p>For the SGM4056 this will look this:</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="cp">#include</span><span class="w"> </span><span class="cpf">&quot;sgm4056/sgm4056.h&quot;</span>
<span class="p">...</span>
<span class="k">static</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">sgm4056_dev_config</span><span class="w"> </span><span class="n">os_bsp_charger_config</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">power_presence_pin</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">CHARGER_POWER_PRESENCE_PIN</span><span class="p">,</span>
<span class="w"> </span><span class="p">.</span><span class="n">charge_indicator_pin</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">CHARGER_CHARGE_PIN</span><span class="p">,</span>
<span class="p">};</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">os_dev_create</span><span class="p">(</span><span class="o">&amp;</span><span class="n">os_bsp_charger</span><span class="p">.</span><span class="n">dev</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;charger&quot;</span><span class="p">,</span>
<span class="w"> </span><span class="n">OS_DEV_INIT_KERNEL</span><span class="p">,</span><span class="w"> </span><span class="n">OS_DEV_INIT_PRIO_DEFAULT</span><span class="p">,</span>
<span class="w"> </span><span class="n">sgm4056_dev_init</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">os_bsp_charger_config</span><span class="p">);</span>
</pre></div>
</div>
</div>
<div class="section" id="usage">
<h2>Usage<a class="headerlink" href="#usage" title="Permalink to this headline">ΒΆ</a></h2>
<p>After initialization the general charge control interface can be used to obtain
the data from the charger. First you need to obtain a reference to the charger.</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="cp">#include</span><span class="w"> </span><span class="cpf">&quot;charge-control/charge_control.h&quot;</span>
<span class="p">...</span>
<span class="k">struct</span><span class="w"> </span><span class="nc">charge_control</span><span class="w"> </span><span class="o">*</span><span class="n">charger</span><span class="p">;</span>
<span class="n">charger</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">charge_control_mgr_find_next_bytype</span><span class="p">(</span><span class="n">CHARGE_CONTROL_TYPE_STATUS</span><span class="p">,</span><span class="w"> </span><span class="nb">NULL</span><span class="p">);</span>
<span class="n">assert</span><span class="p">(</span><span class="n">charger</span><span class="p">);</span>
</pre></div>
</div>
<p>This will find any charger that has the abbility to report <code class="docutils literal notranslate"><span class="pre">STATUS</span></code>. Then you
can obtain the status of the charger using <code class="docutils literal notranslate"><span class="pre">charge_control_read</span></code>. This function
will retreive the charger status and call a callback function. Lets first define
that callback function:</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="k">static</span><span class="w"> </span><span class="kt">int</span>
<span class="nf">charger_data_callback</span><span class="p">(</span><span class="k">struct</span><span class="w"> </span><span class="nc">charge_control</span><span class="w"> </span><span class="o">*</span><span class="n">chg_ctrl</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">arg</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">data</span><span class="p">,</span><span class="w"> </span><span class="n">charge_control_type_t</span><span class="w"> </span><span class="n">type</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">type</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">CHARGE_CONTROL_TYPE_STATUS</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">charge_control_status_t</span><span class="w"> </span><span class="n">charger_status</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">*</span><span class="p">(</span><span class="n">charge_control_status_t</span><span class="o">*</span><span class="p">)(</span><span class="n">data</span><span class="p">);</span>
<span class="w"> </span><span class="n">console_printf</span><span class="p">(</span><span class="s">&quot;Charger state is %i&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">charger_status</span><span class="p">);</span>
<span class="w"> </span><span class="n">console_flush</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="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>
</div>
<p>The important arguments are the data pointer and the type of data. This function
prints the status to the console as an integer. You need to
extend it for your use-case. Now we can call the <code class="docutils literal notranslate"><span class="pre">charge_control_read</span></code> function:</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="n">rc</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">charge_control_read</span><span class="p">(</span><span class="n">charger</span><span class="p">,</span><span class="w"> </span><span class="n">CHARGE_CONTROL_TYPE_STATUS</span><span class="p">,</span>
<span class="w"> </span><span class="n">charger_data_callback</span><span class="p">,</span><span class="w"> </span><span class="nb">NULL</span><span class="p">,</span><span class="w"> </span><span class="n">OS_TIMEOUT_NEVER</span><span class="p">);</span>
<span class="n">assert</span><span class="p">(</span><span class="n">rc</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">0</span><span class="p">);</span>
</pre></div>
</div>
<p>This causes the charge control code to obtain the status and call the callback.</p>
<p>Alternatively you can register a listener that will be called periodically and
on change. For this you need to define a <code class="docutils literal notranslate"><span class="pre">charge_control_listener</span></code> and
register it with charge control:</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="k">struct</span><span class="w"> </span><span class="nc">charge_control_listener</span><span class="w"> </span><span class="n">charger_listener</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">ccl_type</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">CHARGE_CONTROL_TYPE_STATUS</span><span class="p">,</span>
<span class="w"> </span><span class="p">.</span><span class="n">ccl_func</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">charger_data_callback</span><span class="p">,</span>
<span class="p">};</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">charge_control_set_poll_rate_ms</span><span class="p">(</span><span class="s">&quot;charger&quot;</span><span class="p">,</span><span class="w"> </span><span class="mi">10000</span><span class="p">);</span>
<span class="n">assert</span><span class="p">(</span><span class="n">rc</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">rc</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">charge_control_register_listener</span><span class="p">(</span><span class="n">charger</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">charger_listener</span><span class="p">);</span>
<span class="n">assert</span><span class="p">(</span><span class="n">rc</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">0</span><span class="p">);</span>
</pre></div>
</div>
<p>This sets the interval to 10 seconds and registers our callback as listener.
This means that the callback will be called every 10 seconds and on interrupt
of the charger.</p>
</div>
<div class="section" id="dependencies">
<h2>Dependencies<a class="headerlink" href="#dependencies" title="Permalink to this headline">ΒΆ</a></h2>
<p>To include a charge control driver on a project, just include it as a
dependency in your pkg.yml. This should be done in the BSP. For example:</p>
<div class="highlight-yaml notranslate"><div class="highlight"><pre><span></span><span class="nt">pkg.deps</span><span class="p">:</span>
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="s">&quot;@apache-mynewt-core/hw/drivers/chg_ctrl/sgm4056&quot;</span>
</pre></div>
</div>
</div>
</div>
</div>
</div>
<div class="rst-footer-buttons row" role="navigation" aria-label="footer navigation">
<a href="sgm4056.html" class="btn btn-neutral float-right" title="SGM4056 Charger" accesskey="n">Next: SGM4056 Charger <span class="fa fa-arrow-circle-right"></span></a>
<a href="../mmc.html" class="btn btn-neutral" title="mmc" accesskey="p"><span class="fa fa-arrow-circle-left"></span> Previous: mmc</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>