+<!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">
+<meta name="generator" content="Asciidoctor 2.0.10">
+<meta name="author" content="Keith Packard">
+<title>AltOS</title>
+<link rel="stylesheet" href="./am.css">
+</head>
+<body class="book">
+<div id="header">
+<h1>AltOS</h1>
+<div class="details">
+<span id="author" class="author">Keith Packard</span><br>
+<span id="email" class="email"><a href="mailto:keithp@keithp.com">keithp@keithp.com</a></span><br>
+<span id="revdate">29 Sep 2020</span>
+</div>
+<div id="toc" class="toc">
+<div id="toctitle">Table of Contents</div>
+<ul class="sectlevel1">
+<li><a href="#_license">License</a></li>
+<li><a href="#_overview">1. Overview</a></li>
+<li><a href="#_altos_porting_layer">2. AltOS Porting Layer</a>
+<ul class="sectlevel2">
+<li><a href="#_low_level_cpu_operations">2.1. Low-level CPU operations</a></li>
+<li><a href="#_gpio_operations">2.2. GPIO operations</a></li>
+<li><a href="#_8051_memory_spaces">2.3. 8051 memory spaces</a></li>
+<li><a href="#_function_calls_on_the_8051">2.4. Function calls on the 8051</a></li>
+</ul>
+</li>
+<li><a href="#_task_functions">3. Task functions</a>
+<ul class="sectlevel2">
+<li><a href="#_ao_add_task">3.1. ao_add_task</a></li>
+<li><a href="#_ao_exit">3.2. ao_exit</a></li>
+<li><a href="#_ao_sleep">3.3. ao_sleep</a></li>
+<li><a href="#_ao_wakeup">3.4. ao_wakeup</a></li>
+<li><a href="#_ao_alarm">3.5. ao_alarm</a></li>
+<li><a href="#_ao_start_scheduler">3.6. ao_start_scheduler</a></li>
+<li><a href="#_ao_clock_init">3.7. ao_clock_init</a></li>
+</ul>
+</li>
+<li><a href="#_timer_functions">4. Timer Functions</a>
+<ul class="sectlevel2">
+<li><a href="#_ao_time">4.1. ao_time</a></li>
+<li><a href="#_ao_delay">4.2. ao_delay</a></li>
+<li><a href="#_ao_timer_set_adc_interval">4.3. ao_timer_set_adc_interval</a></li>
+<li><a href="#_ao_timer_init">4.4. ao_timer_init</a></li>
+</ul>
+</li>
+<li><a href="#_altos_mutexes">5. AltOS Mutexes</a>
+<ul class="sectlevel2">
+<li><a href="#_ao_mutex_get">5.1. ao_mutex_get</a></li>
+<li><a href="#_ao_mutex_put">5.2. ao_mutex_put</a></li>
+</ul>
+</li>
+<li><a href="#_dma_engine">6. DMA engine</a>
+<ul class="sectlevel2">
+<li><a href="#_cc1111_dma_engine">6.1. CC1111 DMA Engine</a></li>
+<li><a href="#_stm32l_dma_engine">6.2. STM32L DMA Engine</a></li>
+</ul>
+</li>
+<li><a href="#_stdio_interface">7. Stdio interface</a>
+<ul class="sectlevel2">
+<li><a href="#_putchar">7.1. putchar</a></li>
+<li><a href="#_getchar">7.2. getchar</a></li>
+<li><a href="#_flush">7.3. flush</a></li>
+<li><a href="#_ao_add_stdio">7.4. ao_add_stdio</a></li>
+</ul>
+</li>
+<li><a href="#_command_line_interface">8. Command line interface</a>
+<ul class="sectlevel2">
+<li><a href="#_ao_cmd_register">8.1. ao_cmd_register</a></li>
+<li><a href="#_ao_cmd_lex">8.2. ao_cmd_lex</a></li>
+<li><a href="#_ao_cmd_put16">8.3. ao_cmd_put16</a></li>
+<li><a href="#_ao_cmd_put8">8.4. ao_cmd_put8</a></li>
+<li><a href="#_ao_cmd_white">8.5. ao_cmd_white</a></li>
+<li><a href="#_ao_cmd_hex">8.6. ao_cmd_hex</a></li>
+<li><a href="#_ao_cmd_decimal">8.7. ao_cmd_decimal</a></li>
+<li><a href="#_ao_match_word">8.8. ao_match_word</a></li>
+<li><a href="#_ao_cmd_init">8.9. ao_cmd_init</a></li>
+</ul>
+</li>
+<li><a href="#_usb_target_device">9. USB target device</a>
+<ul class="sectlevel2">
+<li><a href="#_ao_usb_flush">9.1. ao_usb_flush</a></li>
+<li><a href="#_ao_usb_putchar">9.2. ao_usb_putchar</a></li>
+<li><a href="#_ao_usb_pollchar">9.3. ao_usb_pollchar</a></li>
+<li><a href="#_ao_usb_getchar">9.4. ao_usb_getchar</a></li>
+<li><a href="#_ao_usb_disable">9.5. ao_usb_disable</a></li>
+<li><a href="#_ao_usb_enable">9.6. ao_usb_enable</a></li>
+<li><a href="#_ao_usb_init">9.7. ao_usb_init</a></li>
+</ul>
+</li>
+<li><a href="#_serial_peripherals">10. Serial peripherals</a>
+<ul class="sectlevel2">
+<li><a href="#_ao_serial_getchar">10.1. ao_serial_getchar</a></li>
+<li><a href="#_ao_serial_putchar">10.2. ao_serial_putchar</a></li>
+<li><a href="#_ao_serial_drain">10.3. ao_serial_drain</a></li>
+<li><a href="#_ao_serial_set_speed">10.4. ao_serial_set_speed</a></li>
+<li><a href="#_ao_serial_init">10.5. ao_serial_init</a></li>
+</ul>
+</li>
+<li><a href="#_cc1111cc1120cc1200_radio_peripheral">11. CC1111/CC1120/CC1200 Radio peripheral</a>
+<ul class="sectlevel2">
+<li><a href="#_radio_introduction">11.1. Radio Introduction</a></li>
+<li><a href="#_ao_radio_set_telemetry">11.2. ao_radio_set_telemetry</a></li>
+<li><a href="#_ao_radio_set_packet">11.3. ao_radio_set_packet</a></li>
+<li><a href="#_ao_radio_set_rdf">11.4. ao_radio_set_rdf</a></li>
+<li><a href="#_ao_radio_idle">11.5. ao_radio_idle</a></li>
+<li><a href="#_ao_radio_get">11.6. ao_radio_get</a></li>
+<li><a href="#_ao_radio_put">11.7. ao_radio_put</a></li>
+<li><a href="#_ao_radio_abort">11.8. ao_radio_abort</a></li>
+<li><a href="#_radio_telemetry">11.9. Radio Telemetry</a></li>
+<li><a href="#_radio_direction_finding">11.10. Radio Direction Finding</a></li>
+<li><a href="#_radio_packet_mode">11.11. Radio Packet Mode</a></li>
+</ul>
+</li>
+</ul>
+</div>
+</div>
+<div id="content">
+<div id="preamble">
+<div class="sectionbody">
+<div id="logo" class="imageblock">
+<div class="content">
+<a class="image" href="https://altusmetrum.org"><img src="altusmetrum-oneline.svg" alt="Altus Metrum"></a>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_license">License</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>Copyright © 2018 Bdale Garbee and Keith Packard</p>
+</div>
+<div class="paragraph">
+<p>This document is released under the terms of the <a href="http://creativecommons.org/licenses/by-sa/3.0/">Creative Commons ShareAlike 3.0 License</a></p>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_overview">1. Overview</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>AltOS is a operating system built for a variety of