blob: ffcd3f5dfda98551255bc560c92d9117c545d5d9 [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">
<!-- This is broken by doc revisioning.
-->
<link rel="shortcut icon" href="../../../img/favicon.ico">
<title>Blinky on Arduino Zero - Apache Mynewt</title>
<link href="../../../css/bootstrap-3.0.3.min.css" rel="stylesheet">
<link rel="stylesheet" href="../../../css/highlight.css">
<link href="../../../css/base.css" rel="stylesheet">
<link href="../../../css/custom.css" rel="stylesheet">
<link href="../../../css/v2.css" rel="stylesheet">
<link href="https://fonts.googleapis.com/css?family=Lato" rel="stylesheet">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.min.css">
<!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
<script src="https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js"></script>
<![endif]-->
<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="Blinky on Arduino Zero">
<div class="container">
<div class="row v2-main-banner">
<a class="logo-cell" href="/">
<img class="logo" src="/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>
<nav id="navbar" class="navbar navbar-inverse affix-top" data-spy="affix" data-offset-top="150" 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
class=""
>
<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
class=""
>
<a href="/about/">About</a>
</li>
<li
class=""
>
<a href="/talks/">Talks</a>
</li>
<li
class="active"
>
<a href="/documentation/">Documentation</a>
</li>
<li
class=""
>
<a href="/download/">Download</a>
</li>
<li
class=""
>
<a href="/community/">Community</a>
</li>
<li
class=""
>
<a href="/events/">Events</a>
</li>
</ul>
</div>
</div>
</nav>
<div class="container">
<div class="row">
<div class="col-md-3 v2-sidebar sidebar-container"><div id="docSidebar" class="hidden-print" role="complementary">
<div class="top">
<div role="search">
<form id="rtd-search-form" class="wy-form" action="../../../search.html" method="get">
<div class="form-group">
<input type="text" name="q" class="form-control" placeholder="Search documentation" />
</div>
</form>
</div>
</div>
<ul class="toc-nav">
<li class="doc-version"><select class="form-control" onchange="if (this.value) window.location.href=this.value">
<option value="/latest">
Version: master
</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" selected="selected" >
Version: 0.9.0
</option>
</select></li>
<li ><a href="../../introduction/">Mynewt Documentation</a>
<ul>
<li ><a href="../../get_started/get_started/">Basic Setup</a>
</li>
<li >
<a href="../../get_started/vocabulary/">Concepts</a>
</li>
<li ><a href="../tutorials/">Tutorials</a>
<ul>
<li><a href="
./
">Project Blinky</a>
<ul>
<li class="active">
<a href="./">Blinky on Arduino Zero</a>
</li>
<li >
<a href="../blinky_primo/">Blinky on Arduino Primo</a>
</li>
<li >
<a href="../olimex/">Blinky on Olimex</a>
</li>
<li ><a href="../STM32F303/">Blinky on STM32F303</a>
</li>
<li >
<a href="../nRF52/">Blinky on nRF52</a>
</li>
<li >
<a href="../blinky_sram_olimex/">Run Blinky from SRAM, no bootloader</a>
</li>
</ul>
</li>
<li ><a href="../repo/add_repos/">Work with repositories</a>
</li>
<li >
<a href="../unit_test/">Write a Test Suite for a Package</a>
</li>
<li >
<a href="../air_quality_sensor/">Air-quality Sensor project</a>
</li>
<li >
<a href="../event_queue/">Add task to manage multiple events</a>
</li>
<li >
<a href="../project-slinky/">Enable remote comms on sim device</a>
</li>
<li >
<a href="../project-target-slinky/">Enable remote comms on STM32 board</a>
</li>
<li >
<a href="../bletiny_project/">BLE app to check stats via console</a>
</li>
<li ><a href="../bleprph/bleprph-intro/">BLE peripheral project</a>
</li>
<li >
<a href="../ibeacon/">BLE iBeacon</a>
</li>
<li >
<a href="../blehci_project/">BLE HCI interface</a>
</li>
</ul>
</li>
<li ><a href="../../os_user_guide/">OS User Guide</a>
</li>
<li><a href="
../../../network/ble/ble_intro/
">BLE User Guide</a>
</li>
<li ><a href="../../../newt/newt_intro/">Newt Tool Guide</a>
</li>
<li ><a href="../../../newtmgr/overview/">Newt Manager Guide</a>
</li>
<li >
<a href="../../../known_issues/">Known Issues</a>
</li>
</ul>
</li>
<li><a href="
../../../faq/how_to_edit_docs/
">Appendix</a>
</li>
</ul>
</div></div>
<div class="col-md-9" role="main">
<div class="doc-header">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="/documentation/">Docs</a></li>
<li>&raquo; Project Blinky</li>
<li>&raquo; <a href="os/tutorials/tutorials/">Tutorials</a></li>
<li>&raquo; <a href="os/introduction/">Mynewt Documentation</a></li>
<li>&raquo; Blinky on Arduino Zero</li>
</ul>
</div>
</div>
<div class="alert alert-warning">
<p>
Version 0.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>
<h2 id="blinky-your-hello-world-on-arduino-zero">Blinky, your "Hello World!", on Arduino Zero</h2>
<p>Learn how to use packages from a default application repository of Mynewt to build your first <em>Hello World</em> application (Blinky) on a target board. Once built using the <em>newt</em> tool, this application will blink the LED lights on the target board.</p>
<p>This tutorial describes how to run Mynewt OS on Arduino Zero. Follow these simple steps and your board will be blinking in no time!</p>
<h3 id="prerequisites">Prerequisites</h3>
<p>Before tackling this tutorial, it's best to read about Mynewt in the <a href="../get_started/introduction">Introduction</a> section of this documentation.</p>
<h3 id="equipment">Equipment</h3>
<p>You will need the following equipment</p>
<ul>
<li>An Arduino Zero board. NOTE: There are many flavors of Arduino. Ensure that
you have an Arduino Zero. See below for the versions of Arduino Zero that are
compatible with this tutorial</li>
<li>A computer that can connect to the Arduino Zero over USB</li>
<li>A USB cable (Type A to micro B) that can connect the computer to the Arduino</li>
<li>The Mynewt Release</li>
</ul>
<p>This tutorial has been tested on the following three Arduino Zero boards - Zero, M0 Pro, and Zero-Pro.</p>
<p><img src="https://www.arduino.cc/en/uploads/Main/Zero_Usb_Ports.jpg" alt="Drawing" style="width: 390px;"/>
<img src="http://www.arduino.org/images/products/Arduino-M0Pro-flat.jpg" alt="Drawing" style="width: 310px;"/>
<img src="http://www.arduino.org//images/products/ArduinoZeroPro-flat-org.jpg" alt="Drawing" style="width: 310px;"/></p>
<p>Mynewt has not been tested on Arduino M0 which has no internal debugger support.</p>
<h3 id="install-mynewt-and-newt">Install Mynewt and Newt</h3>
<ul>
<li>If you have not already done so, install Newt as shown in the <a href="../../../newt/install/newt_mac/">Newt install tutorial</a></li>
<li>If you have not already done so, create a project as shown in the Quick Start guide on how to <a href="../../get_started/project_create/">Create Your First Project</a>. Skip the testing and building the project steps in that tutorial since you will be defining a target for your Arduino board in this tutorial.</li>
</ul>
<p><br></p>
<h3 id="fetch-external-packages">Fetch External Packages</h3>
<p>Mynewt uses source code provided directly from the chip manufacturer for
low level operations. Sometimes this code is licensed only for the specific manufacturer of the chipset and cannot live in the Apache Mynewt repository. That happens to be the case for the Arduino Zero board which uses Atmel SAMD21. Runtime's github repository hosts such external third-party packages and the Newt tool can fetch them.</p>
<p>To fetch the package with MCU support for Atmel SAMD21 for Arduino Zero from the Runtime git repository, you need to add
the repository to the <code>project.yml</code> file in your base project directory.</p>
<p>Here is an example <code>project.yml</code> file with the Arduino Zero repository
added. The sections with <code>mynewt_arduino_zero</code> that need to be added to
your project file are highlighted.</p>
<div class="codehilite" style="background: #ffffff"><pre style="line-height: 125%;"><span></span><code>$ more project.yml
project.name: &quot;my_project&quot;
project.repositories:
- apache-mynewt-core
<span style="background-color: #ffffcc"> - mynewt_arduino_zero
</span>
repository.apache-mynewt-core:
type: github
vers: 0-latest
user: apache
repo: incubator-mynewt-core
<span style="background-color: #ffffcc">repository.mynewt_arduino_zero:
</span><span style="background-color: #ffffcc"> type: github
</span><span style="background-color: #ffffcc"> vers: 0-latest
</span><span style="background-color: #ffffcc"> user: runtimeinc
</span><span style="background-color: #ffffcc"> repo: mynewt_arduino_zero
</span>$
</code></pre></div>
<p><br></p>
<p>Once you've edited your <code>project.yml</code> file, the next step is to install the
project dependencies, this can be done with the <code>newt install</code> command
(to see more output, provide the <code>-v</code> verbose option.): </p>
<div class="codehilite" style="background: #ffffff"><pre style="line-height: 125%;"><span></span><code>$ newt install
apache-mynewt-core
mynewt_arduino_zero
$
</code></pre></div>
<p><br></p>
<p><strong>NOTE:</strong> If there has been a new release of a repo used in your project since you last installed it, the <code>0-latest</code> version for the repo in the <code>project.yml</code> file will refer to the new release and will not match the installed files. In that case you will get an error message saying so and you will need to run <code>newt upgrade</code> to overwrite the existing files with the latest codebase.</p>
<p><br></p>
<h3 id="create-your-bootloader-target">Create your bootloader target</h3>
<p>Next, you need to tell Newt what to build. For the Arduino Zero, we are going to
generate both a bootloader, and an image target.</p>
<p>To generate the bootloader target, you need to specify the following options. The output of the commands (indicating success) have been suppressed for easier readability. </p>
<div class="codehilite" style="background: #ffffff"><pre style="line-height: 125%;"><span></span><code>$ newt target create arduino_boot
$ newt target set arduino_boot bsp=@mynewt_arduino_zero/hw/bsp/arduino_zero
$ newt target set arduino_boot app=@apache-mynewt-core/apps/boot
$ newt target set arduino_boot build_profile=optimized
</code></pre></div>
<p><br></p>
<p>If you have an Arduino Zero Pro or M0 Pro, you have to set the following next:</p>
<div class="codehilite" style="background: #ffffff"><pre style="line-height: 125%;"><span></span><code>$ newt target set arduino_boot features=arduino_zero_pro
</code></pre></div>
<p>If you have an Arduino Zero, you have to set the following instead:</p>
<div class="codehilite" style="background: #ffffff"><pre style="line-height: 125%;"><span></span><code>$ newt target set arduino_boot features=arduino_zero
</code></pre></div>
<p><br></p>
<p>These commands do a few things: </p>
<ul>
<li>Create a target named <code>arduino_boot</code>, in order to build the Arduino Zero Bootloader.</li>
<li>Set the application for the <code>arduino_boot</code> target to the default Apache Mynewt
bootloader (<code>@apache-mynewt-core/apps/boot</code>)</li>
<li>Set the board support package for the target to
<code>@mynewt_arduino_zero/hw/bsp/arduino_zero</code>. This is a reference to the downloaded
Arduino Zero support from Github.</li>
<li>Use the "optimized" build profile for the <code>arduino_boot</code> target. This
instructs Newt to generate smaller and more efficient code for this target.
This setting is necessary due to the bootloader's strict size constraints.</li>
<li>Tells the Board Support Package to enable support for the Arduino Zero Pro or the Arduino Zero. Set it to <code>arduino_zero</code> or <code>arduino_zero_pro</code> depending on the board you have.</li>
</ul>
<p><br></p>
<h3 id="build-your-bootloader">Build your bootloader</h3>
<p>Once you've configured the bootloader target, the next step is to build the bootloader for your Arduino. You can do this by using the <code>newt build</code> command:</p>
<div class="codehilite" style="background: #ffffff"><pre style="line-height: 125%;"><span></span><code>$ newt build arduino_boot
Compiling asprintf.c
Compiling atoi.c
Compiling atol.c
Compiling atoll.c
Compiling bsearch.c
Compiling bzero.c
Compiling calloc.c
Compiling fgets.c
Compiling inline.c
&lt;snip&gt;
App successfully built: myproject/bin/arduino_boot/apps/boot/boot.elf
</code></pre></div>
<p>If this command finishes successfully, you have successfully built the Arduino
bootloader, and the next step is to build your application for the Arduino
board.</p>
<p><br></p>
<h3 id="build-your-blinky-app">Build your blinky app</h3>
<p>To create and download your application, you create another target, this one pointing to the application you want to download to the Arduino board. In this tutorial, we will use the default application that comes with your project, <code>apps/blinky</code>:</p>
<p><strong>Note</strong>: Remember to set features to <code>arduino_zero</code> if your board is Arduino Zero and not a Pro!</p>
<div class="codehilite" style="background: #ffffff"><pre style="line-height: 125%;"><span></span><code>$ newt target create arduino_blinky
Target targets/arduino_blinky successfully created
$ newt target set arduino_blinky app=apps/blinky
Target targets/arduino_blinky successfully set target.app to apps/blinky
$ newt target set arduino_blinky bsp=@mynewt_arduino_zero/hw/bsp/arduino_zero
Target targets/arduino_blinky successfully set target.bsp to @mynewt_arduino_zero/hw/bsp/arduino_zero
$ newt target set arduino_blinky build_profile=debug
Target targets/arduino_blinky successfully set target.build_profile to debug
<span style="background-color: #ffffcc">$ newt target set arduino_blinky features=arduino_zero_pro
</span>Target targets/arduino_blinky successfully set pkg.features to arduino_zero_pro
$
</code></pre></div>
<p><br></p>
<p>You can now build the target, with <code>newt build</code>: </p>
<div class="codehilite" style="background: #ffffff"><pre style="line-height: 125%;"><span></span><code>$ newt build arduino_blinky
Compiling main.c
Archiving blinky.a
Compiling cons_fmt.c
Compiling cons_tty.c
Archiving full.a
Compiling case.c
Compiling suite.c
Compiling testutil.c
Archiving testutil.a
&lt;snip&gt;
App successfully built: myproject/bin/arduino_blinky/apps/blinky/blinky.elf
</code></pre></div>
<p><font color="#FF0000"> Congratulations! </font> You have successfully built your application. Now it's time to load both the bootloader and application onto the target.</p>
<p><br></p>
<h3 id="connect-the-target">Connect the Target</h3>
<p>Connect your computer to the Arduino Zero (from now on we'll call this the
target) with the Micro-USB cable through the Programming Port as shown below.
Mynewt will download and debug the target through this port. You should see a
little green LED come on. That means the board has power.</p>
<p>No external debugger is required. The Arduino Zero comes with an internal
debugger that can be accessed by Mynewt.</p>
<p>A image below shows the Arduino Zero Programming Port.</p>
<p><img src="https://www.arduino.cc/en/uploads/Main/Zero_Usb_Ports.jpg" alt="Drawing" style="width: 400px;"/>
<img src="http://www.arduino.org//images/products/ArduinoZeroPro-flat-org.jpg" alt="Drawing" style="width: 330px;"/></p>
<p><br></p>
<h3 id="download-the-bootloader">Download the Bootloader</h3>
<p>Execute the command to download the bootloader. </p>
<div class="codehilite" style="background: #ffffff"><pre style="line-height: 125%;"><span></span><code> <span style="color: #000000">$</span> <span style="color: #000000">newt</span> <span style="color: #000000">load</span> <span style="color: #000000">arduino_boot</span>
</code></pre></div>
<p>If the newt tool finishes without error, that means the bootloader has been
successfully loaded onto the target.</p>
<p><br></p>
<p><font color="#FF0000"> Reminder if you are using Docker: </font> When working with actual hardware, remember that each board has an ID. If you swap boards and do not refresh the USB Device Filter on the VirtualBox UI, the ID might be stale and the Docker instance may not be able to see the board correctly. For example, you may see an error message like <code>Error: unable to find CMSIS-DAP device</code> when you try to load or run an image on the board. In that case, you need to click on the USB link in VirtualBox UI, remove the existing USB Device Filter (e.g. "Atmel Corp. EDBG CMSIS-DAP[0101]") by clicking on the "Removes selected USB filter" button, and add a new filter by clicking on the "Adds new USB filter" button.</p>
<p><br></p>
<h3 id="run-the-image">Run the Image</h3>
<p>Now that the bootloader is downloaded to the target, the next step is to load
your image onto the Arduino Zero. The easiest way to do this, is to use the
<code>newt run</code> command. <code>newt run</code> will automatically rebuild your program
(if necessary), create an image, and load it onto the target device.</p>
<p>Here, we will load our <code>arduino_blinky</code> target onto the device, and we
should see it run:</p>
<div class="codehilite" style="background: #ffffff"><pre style="line-height: 125%;"><span></span><code>$ newt run arduino_blinky 0.0.0
Debugging myproject/bin/arduino_blinky/apps/blinky/blinky.elf
Open On-Chip Debugger 0.9.0 (2015-09-23-21:46)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html
Info : only one transport option; autoselect &#39;swd&#39;
adapter speed: 500 kHz
adapter_nsrst_delay: 100
cortex_m reset_config sysresetreq
Info : CMSIS-DAP: SWD Supported
Info : CMSIS-DAP: JTAG Supported
Info : CMSIS-DAP: Interface Initialised (SWD)
Info : CMSIS-DAP: FW Version = 01.1F.0118
Info : SWCLK/TCK = 1 SWDIO/TMS = 1 TDI = 1 TDO = 1 nTRST = 0 nRESET = 1
Info : CMSIS-DAP: Interface ready
Info : clock speed 500 kHz
Info : SWD IDCODE 0x0bc11477
Info : at91samd21g18.cpu: hardware has 4 breakpoints, 2 watchpoints
GNU gdb (GNU Tools for ARM Embedded Processors) 7.8.0.20150604-cvs
Copyright (C) 2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later &lt;http://gnu.org/licenses/gpl.html&gt;
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type &quot;show copying&quot;
and &quot;show warranty&quot; for details.
This GDB was configured as &quot;--host=x86_64-apple-darwin10 --target=arm-none-eabi&quot;.
Type &quot;show configuration&quot; for configuration details.
For bug reporting instructions, please see:
&lt;http://www.gnu.org/software/gdb/bugs/&gt;.
Find the GDB manual and other documentation resources online at:
&lt;http://www.gnu.org/software/gdb/documentation/&gt;.
For help, type &quot;help&quot;.
Type &quot;apropos word&quot; to search for commands related to &quot;word&quot;...
Reading symbols from myproject/bin/arduino_blinky/apps/blinky/blinky.elf...done.
target state: halted
target halted due to debug-request, current mode: Thread
xPSR: 0x21000000 pc: 0x0000030e msp: 0x20008000
Info : accepting &#39;gdb&#39; connection on tcp/3333
Info : SAMD MCU: SAMD21G18A (256KB Flash, 32KB RAM)
0x0000030e in ?? ()
(gdb) r
The &quot;remote&quot; target does not support &quot;run&quot;. Try &quot;help target&quot; or &quot;continue&quot;.
(gdb) c
Continuing.
</code></pre></div>
<p><br></p>
<p><strong>NOTE:</strong> The 0.0.0 specified after the target name to <code>newt run</code> is the version
of the image to load. If you are not providing remote upgrade, and are just
developing locally, you can provide 0.0.0 for every image version.</p>
<p>If you want the image to run without the debugger connected, simply quit the
debugger and restart the board. The image you programmed will come and run on the Arduino on next boot! </p>
<p><br></p>
<h3 id="watch-the-led-blink">Watch the LED blink</h3>
<p>Congratulations! You have created a Mynewt operating system running on the
Arduino Zero. The LED right next to the power LED should be blinking. It is toggled by one task running on the Mynewt OS. </p>
<p>We have more fun tutorials for you to get your hands dirty. Be bold and try other Blinky-like <a href="../nRF52/">tutorials</a> or try enabling additional functionality such as <a href="../project-target-slinky/">remote comms</a> on the current board.</p>
<p>If you see anything missing or want to send us feedback, please do so by signing up for appropriate mailing lists on our <a href="../../../community/">Community Page</a>.</p>
<p>Keep on hacking and blinking!</p>
<div class="row">
<ul class="nav nav-pills" style="margin-bottom: 10px">
<li>
</li>
<li class="pull-right">
</li>
</ul>
</div>
<footer class="row">
<div class="col-xs-12">
<p class="copyright">Apache Mynewt (incubating) is available under Apache License, version 2.0.</p>
</div>
<div class="col-xs-12">
<div class="logos">
<a href="https://www.apache.org/">
<img src="/img/asf_logo_wide_small.png" alt="Apache" title="Apache">
</a>
<p>
Copyright © 2015-2021 The Apache Software Foundation.<br>
<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>
</p>
<a href="">
<img src="https://www.countit.com/images/add_to_slack.png" alt="Slack Icon" title="Join our Slack Community" />
</a>
</div>
</div>
<a href="https://www.apache.org/licenses/">
<button class="button-footer-asf">
License
</button>
</a>
<a href="https://www.apache.org/foundation/sponsorship.html">
<button class="button-footer-asf">
Sponsorship
</button>
</a>
<a href="https://www.apache.org/foundation/thanks.html">
<button class="button-footer-asf">
Thanks
</button>
</a>
<a href="https://www.apache.org/security/">
<button class="button-footer-asf">
Security
</button>
</a>
<a href="https://apache.org/events/current-event">
<button class="button-footer-asf">
ASF Events
</button>
</a>
</footer>
</div>
</div>
</div>
<script src="../../../js/jquery-1.10.2.min.js"></script>
<script src="../../../js/bootstrap-3.0.3.min.js"></script>
<script src="../../../js/highlight.pack.js"></script>
<script src="../../../js/base.js"></script>
<script src="../../../js/custom.js"></script>
<script src="search/main.js"></script>
</body>
</html>