summaryrefslogtreecommitdiff
path: root/DOC/src/html
diff options
context:
space:
mode:
Diffstat (limited to 'DOC/src/html')
-rw-r--r--DOC/src/html/download.html68
-rw-r--r--DOC/src/html/ex_LDR.html150
-rw-r--r--DOC/src/html/ex_ir_remote.html253
-rw-r--r--DOC/src/html/ex_motor_shield.html254
-rw-r--r--DOC/src/html/ex_rotary_encoder.html185
-rw-r--r--DOC/src/html/ex_sonar_ranger.html164
-rw-r--r--DOC/src/html/faq.html462
-rw-r--r--DOC/src/html/index.html659
-rw-r--r--DOC/src/html/misc.html33
-rw-r--r--DOC/src/html/pif.html30
-rw-r--r--DOC/src/html/piscope.html216
-rw-r--r--DOC/src/html/sif.html2004
12 files changed, 4478 insertions, 0 deletions
diff --git a/DOC/src/html/download.html b/DOC/src/html/download.html
new file mode 100644
index 0000000..740a3c8
--- /dev/null
+++ b/DOC/src/html/download.html
@@ -0,0 +1,68 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta name="generator" content="Bluefish 2.2.11" >
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
+<title>download</title>
+</head>
+<body>
+If the pigpio daemon is running it should be killed (sudo killall
+pigpiod) before make install and restarted afterwards (sudo
+pigpiod).<br>
+<br>
+<span style="font-weight: bold;">The initial part of the make, the
+compilation of pigpio.c, takes 100 seconds on early model
+Pis.&nbsp; Be patient.&nbsp; The overall install takes just over 3
+minutes.</span><br style="font-weight: bold;">
+<h3>Download and install latest version<br></h3>
+<code>
+wget https://github.com/joan2937/pigpio/archive/master.zip<br>
+unzip master.zip<br>
+cd pigpio-master<br>
+make<br>
+sudo make install<br>
+</code>
+<br>
+If the Python part of the install fails it may be because you need
+the setup tools.<br>
+<br>
+<code>sudo apt install python-setuptools
+python3-setuptools<br></code><br>
+<br>
+<h3>To check the library</h3>
+These tests make extensive use of GPIO 25 (pin 22).&nbsp; Make sure
+nothing, or only a LED, is connected to the GPIO before running the
+tests.&nbsp; Most tests are statistical in nature and so may on
+occasion fail.&nbsp; Repeated failures on the same test or many
+failures in a group of tests indicate a problem.<br>
+<code><br>
+sudo ./x_pigpio # check C I/F<br>
+<br>
+sudo pigpiod&nbsp;&nbsp;&nbsp; # start daemon<br>
+<br>
+./x_pigpiod_if2 # check C&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; I/F to
+daemon<br>
+./x_pigpio.py&nbsp;&nbsp; # check Python I/F to daemon<br>
+./x_pigs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # check
+pigs&nbsp;&nbsp; I/F to daemon<br>
+./x_pipe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # check
+pipe&nbsp;&nbsp; I/F to daemon<br>
+<br>
+<br></code>
+<h3>To compile, link, and run a C program</h3>
+<code>gcc -Wall -pthread -o foobar foobar.c -lpigpio -lrt<br>
+sudo ./foobar</code><code><br></code><br>
+<h3>To start the pigpio daemon<br></h3>
+<code>sudo pigpiod<br></code>
+<h3>To stop the pigpio daemon<br></h3>
+<code>sudo killall pigpiod<br></code><br>
+<h3>github</h3>
+<code>git clone https://github.com/joan2937/pigpio</code><br>
+<h3>Raspbian (raspberrypi.org image)</h3>
+<p>This may not be the most recent version.&nbsp; You can check the
+version with the command pigpiod -v.<br></p>
+<code>sudo apt-get update<br>
+sudo apt-get install pigpio python-pigpio python3-pigpio</code><br>
+<br>
+</body>
+</html>
diff --git a/DOC/src/html/ex_LDR.html b/DOC/src/html/ex_LDR.html
new file mode 100644
index 0000000..3c54c68
--- /dev/null
+++ b/DOC/src/html/ex_LDR.html
@@ -0,0 +1,150 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta name="generator" content="Bluefish 2.2.10" >
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
+<title>LDR example</title>
+</head>
+<body>
+<p>The following code shows a method of reading analogue sensors on
+the digital input only Pi.&nbsp; A Light Dependent Resistor (LDR)
+varies its resistance according to the incident light
+intensisty.</p>
+<h3>SETUP</h3>
+<img src="images/LDR-fritz.png" alt="fritzing diagram" style=
+"width: 200px; height: 300px;" align="left" hspace="10">The LDR
+used is a Cadmium Sulphide device with a 1MOhm dark resistance and
+2-4KOhm at 100 lux.&nbsp; The capacitor is a 104
+ceramic.<span itemprop="name"><br>
+<br>
+One end of the capacitor is connected to Pi ground.<br>
+<br>
+One end of the LDR is connected to Pi 3V3.<br>
+<br>
+The other ends of the capacitor and LDR are connected to a spare
+gpio.</span><br>
+<p>Here P1-1 is used for 3V3, P1-20 is used for ground, and gpio 18
+(P1-12) is used for the gpio.<br clear="all"></p>
+<p><img src="images/LDR-photo.jpg" style=
+"width: 500px; height: 667px;" alt="photo of set-up"></p>
+<h3>CODE</h3>
+<code>#include &lt;stdio.h&gt;<br>
+<br>
+#include &lt;pigpio.h&gt;<br>
+<br>
+/*
+-----------------------------------------------------------------------<br>
+
+<br>
+&nbsp;&nbsp; 3V3 ----- Light Dependent Resistor --+-- Capacitor
+----- Ground<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+|<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
++-- gpio<br>
+<br>
+<br>
+&nbsp; cc -o LDR LDR.c -lpigpio -lpthread -lrt<br>
+&nbsp; sudo ./LDR<br>
+<br>
+*/<br>
+<br>
+#define LDR 18<br>
+<br>
+/* forward declaration */<br>
+<br>
+void alert(int pin, int level, uint32_t tick);<br>
+<br>
+int main (int argc, char *argv[])<br>
+{<br>
+&nbsp;&nbsp; if (gpioInitialise()&lt;0) return 1;<br>
+<br>
+&nbsp;&nbsp; gpioSetAlertFunc(LDR, alert); /* call alert when LDR
+changes state */<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<br>
+&nbsp;&nbsp; while (1)<br>
+&nbsp;&nbsp; {<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gpioSetMode(LDR, PI_OUTPUT); /*
+drain capacitor */<br>
+<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gpioWrite(LDR, PI_OFF);<br>
+<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gpioDelay(200); /* 50 micros is
+enough, 200 is overkill */<br>
+<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gpioSetMode(LDR, PI_INPUT); /* start
+capacitor recharge */<br>
+<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gpioDelay(10000); /* nominal 100
+readings per second */<br>
+&nbsp;&nbsp; }<br>
+<br>
+&nbsp;&nbsp; gpioTerminate();<br>
+}<br>
+<br>
+void alert(int pin, int level, uint32_t tick)<br>
+{<br>
+&nbsp;&nbsp; static uint32_t inited = 0;<br>
+&nbsp;&nbsp; static uint32_t lastTick, firstTick;<br>
+<br>
+&nbsp;&nbsp; uint32_t diffTick;<br>
+<br>
+&nbsp;&nbsp; if (inited)<br>
+&nbsp;&nbsp; {<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; diffTick = tick - lastTick;<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lastTick = tick;<br>
+<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (level == 1) printf("%u %d\ ",
+tick-firstTick, diffTick);<br>
+&nbsp;&nbsp; }<br>
+&nbsp;&nbsp; else<br>
+&nbsp;&nbsp; {<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inited = 1;<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; firstTick = tick;<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lastTick = firstTick;<br>
+&nbsp;&nbsp; }<br>
+}<br></code>
+<h3>BUILD</h3>
+<code>cc -o LDR LDR.c -lpigpio -lrt -lpthread<br></code>
+<h3>RUN</h3>
+<code>sudo ./LDR &gt;LDR.dat &amp;</code><br>
+<br>
+While the program is running you can capture the waveform using the
+notification feature built in to pigpio.&nbsp; Issue the following
+commands on the Pi.<br>
+<br>
+<code>pigs no<br>
+pig2vcd&nbsp; &lt;/dev/pigpio0 &gt;LDR.vcd &amp;<br>
+pigs nb 0 0x40000 # set bit for gpio 18<br></code>
+<p>Change the light falling on the LDR for a few seconds (e.g.
+shine a torch on it or shade it with your hands).<br></p>
+<code>pigs nc 0</code><br>
+<p>The file LDR.vcd will contain the captured waveform, which can
+be viewed using GTKWave.</p>
+<p>Overview</p>
+<img src="images/LDR-wave-1.png" style=
+"width: 600px; height: 100px;" alt="LDR waveform 1"><br>
+<p>Reading circa every 10ms<br></p>
+<img src="images/LDR-wave-2.png" style=
+"width: 600px; height: 100px;" alt="LDR waveform 2"><br>
+<p>One reading, circa 400us<br></p>
+<img src="images/LDR-wave-3.png" style=
+"width: 600px; height: 100px;" alt="LDR waveform 3"><br>
+<p>The file LDR.dat will contain pairs of timestamps and recharge
+time (in us).&nbsp; The following&nbsp; script will convert the
+timestamps into seconds.<span style=
+"font-style: italic;"><br></span></p>
+<p><code>awk '{print $1/1000000, $2}' LDR.dat
+&gt;LDR-secs.dat</code></p>
+<p>Gnuplot is a useful tool to graph data.<br></p>
+plot [14:24] 'LDR-secs.dat' with lines title 'LDR'
+<p>Gnuplot readings 14-24 seconds<br></p>
+<p><img src="images/LDR-gnup-1.png" style=
+"width: 600px; height: 321px;" alt="gnuplot 1"></p>
+plot [18:21] 'LDR-secs.dat' with lines title 'LDR'<br>
+<br>
+Gnuplot readings 18-21 seconds
+<p><img src="images/LDR-gnup-2.png" style=
+"width: 600px; height: 321px;" alt="Gnuplot 2"></p>
+</body>
+</html>
diff --git a/DOC/src/html/ex_ir_remote.html b/DOC/src/html/ex_ir_remote.html
new file mode 100644
index 0000000..2400a11
--- /dev/null
+++ b/DOC/src/html/ex_ir_remote.html
@@ -0,0 +1,253 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta name="generator" content="Bluefish 2.2.10" >
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
+<title>IR remote example</title>
+</head>
+<body>
+<p>The following code shows one way to read an infrared remote
+control device (the sort used in TVs and stereo systems).</p>
+<h3>SETUP</h3>
+<img alt="fritzing diagram" style="width: 200px; height: 317px;"
+src="images/ir-fritz.png" align="left" hspace="10">The device used
+is a <span itemprop="name">SFH5110 (IR Receiver for remote control,
+carrier 38 kHz).<br>
+<br></span> Pin 1 (left from front) may be connected to any spare
+gpio.&nbsp; Here it's connected via a 4K7 current limiting
+resistor.&nbsp; This isn't really needed as the device has an
+internal 23K resistor in-line.&nbsp; It does no harm though.<br>
+<br>
+Pin 2 should be connected to a Pi ground pin.<br>
+<br>
+Pin 3 should be connected to a Pi 5V pin.<br>
+<p>Here pin 1 to gpio7 (P1-26) via a 4K7 resistor, pin 2 to ground
+(P1-14), and pin 3 to 5V (P1-2).<br clear="all"></p>
+<p><img src="images/ir-photo.jpg" style=
+"width: 500px; height: 500px;" alt="photo of set-up"></p>
+<h3>CODE</h3>
+<code>#include &lt;stdio.h&gt;<br>
+<br>
+#include &lt;pigpio.h&gt;<br>
+<br>
+#define IR_PIN 7<br>
+<br>
+#define OUTSIDE_CODE 0<br>
+#define INSIDE_CODE&nbsp; 1<br>
+<br>
+#define MIN_MESSAGE_GAP 3000<br>
+#define MAX_MESSAGE_END 3000<br>
+<br>
+#define MAX_TRANSITIONS 500<br>
+<br>
+/*<br>
+&nbsp;&nbsp; using the FNV-1a
+hash&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
+
+&nbsp;&nbsp; from
+http://isthe.com/chongo/tech/comp/fnv/#FNV-param<br>
+*/<br>
+<br>
+#define FNV_PRIME_32 16777619<br>
+#define FNV_BASIS_32 2166136261U<br>
+<br>
+static volatile uint32_t ir_hash = 0;<br>
+<br>
+typedef struct<br>
+{<br>
+&nbsp;&nbsp; int state;<br>
+&nbsp;&nbsp; int count;<br>
+&nbsp;&nbsp; int level;<br>
+&nbsp;&nbsp; uint16_t micros[MAX_TRANSITIONS];<br>
+} decode_t;<br>
+<br>
+/* forward declarations */<br>
+<br>
+void&nbsp;&nbsp;&nbsp;&nbsp; alert(int gpio, int level, uint32_t
+tick);<br>
+uint32_t getHash(decode_t * decode);<br>
+void&nbsp;&nbsp;&nbsp;&nbsp; updateState(decode_t * decode, int
+level, uint32_t micros);<br>
+<br>
+int main(int argc, char * argv[])<br>
+{<br>
+&nbsp;&nbsp; if (gpioInitialise()&lt;0)<br>
+&nbsp;&nbsp; {<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 1 ;<br>
+&nbsp;&nbsp; }<br>
+<br>
+&nbsp;&nbsp; /* IR pin as input */<br>
+<br>
+&nbsp;&nbsp; gpioSetMode(IR_PIN, PI_INPUT);<br>
+<br>
+&nbsp;&nbsp; /* 5ms max gap after last pulse */<br>
+<br>
+&nbsp;&nbsp; gpioSetWatchdog(IR_PIN, 5);<br>
+<br>
+&nbsp;&nbsp; /* monitor IR level changes */<br>
+<br>
+&nbsp;&nbsp; gpioSetAlertFunc(IR_PIN, alert);<br>
+<br>
+&nbsp;&nbsp; while (1)<br>
+&nbsp;&nbsp; {<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (ir_hash)<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* non-zero means
+new decode */<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("ir code is
+%u\ ", ir_hash);<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ir_hash = 0;<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
+<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gpioDelay(100000); /* check remote
+10 times per second */<br>
+&nbsp;&nbsp; }<br>
+<br>
+&nbsp;&nbsp; gpioTerminate();<br>
+}<br>
+<br>
+void alert(int gpio, int level, uint32_t tick)<br>
+{<br>
+&nbsp;&nbsp; static int inited = 0;<br>
+<br>
+&nbsp;&nbsp; static decode_t activeHigh, activeLow;<br>
+<br>
+&nbsp;&nbsp; static uint32_t lastTick;<br>
+<br>
+&nbsp;&nbsp; uint32_t diffTick;<br>
+<br>
+&nbsp;&nbsp; if (!inited)<br>
+&nbsp;&nbsp; {<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inited = 1;<br>
+<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; activeHigh.state = OUTSIDE_CODE;
+activeHigh.level = PI_LOW;<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; activeLow.state&nbsp; =
+OUTSIDE_CODE; activeLow.level&nbsp; = PI_HIGH;<br>
+<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lastTick = tick;<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br>
+&nbsp;&nbsp; }<br>
+<br>
+&nbsp;&nbsp; diffTick = tick - lastTick;<br>
+<br>
+&nbsp;&nbsp; if (level != PI_TIMEOUT) lastTick = tick;<br>
+<br>
+&nbsp;&nbsp; updateState(&amp;activeHigh, level, diffTick);<br>
+&nbsp;&nbsp; updateState(&amp;activeLow, level, diffTick);<br>
+}<br>
+<br>
+void updateState(decode_t * decode, int level, uint32_t micros)<br>
+{<br>
+&nbsp;&nbsp; /*<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; We are dealing with active high as
+well as active low<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; remotes.&nbsp; Abstract the common
+functionality.<br>
+&nbsp;&nbsp; */<br>
+<br>
+&nbsp;&nbsp; if (decode-&gt;state == OUTSIDE_CODE)<br>
+&nbsp;&nbsp; {<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (level == decode-&gt;level)<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (micros &gt;
+MIN_MESSAGE_GAP)<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+decode-&gt;state = INSIDE_CODE;<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+decode-&gt;count = 0;<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
+&nbsp;&nbsp; }<br>
+&nbsp;&nbsp; else<br>
+&nbsp;&nbsp; {<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (micros &gt; MAX_MESSAGE_END)<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* end of message
+*/<br>
+<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* ignore if last
+code not consumed */<br>
+<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!ir_hash)
+ir_hash = getHash(decode);<br>
+<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; decode-&gt;state =
+OUTSIDE_CODE;<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if
+(decode-&gt;count &lt; (MAX_TRANSITIONS-1))<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+if (level != PI_TIMEOUT)<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+decode-&gt;micros[decode-&gt;count++] = micros;<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
+&nbsp;&nbsp; }<br>
+}<br>
+<br>
+int compare(unsigned int oldval, unsigned int newval)<br>
+{<br>
+&nbsp;&nbsp; if&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (newval &lt; (oldval
+* 0.75)) {return 1;}<br>
+&nbsp;&nbsp; else if (oldval &lt; (newval * 0.75)) {return 2;}<br>
+&nbsp;&nbsp;
+else&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+{return 4;}<br>
+}<br>
+<br>
+uint32_t getHash(decode_t * decode)<br>
+{<br>
+&nbsp;&nbsp; /* use FNV-1a */<br>
+<br>
+&nbsp;&nbsp; uint32_t hash;<br>
+&nbsp;&nbsp; int i, value;<br>
+<br>
+&nbsp;&nbsp; if (decode-&gt;count &lt; 6) {return 0;}<br>
+<br>
+&nbsp;&nbsp; hash = FNV_BASIS_32;<br>
+<br>
+&nbsp;&nbsp; for (i=0; i&lt;(decode-&gt;count-2); i++)<br>
+&nbsp;&nbsp; {<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; value =
+compare(decode-&gt;micros[i], decode-&gt;micros[i+2]);<br>
+<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hash = hash ^ value;<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hash = (hash * FNV_PRIME_32);<br>
+&nbsp;&nbsp; }<br>
+<br>
+&nbsp;&nbsp; return hash;<br>
+}<br></code>
+<h3>BUILD</h3>
+<code>cc -o ir_remote ir_remote.c -lpigpio -lrt
+-lpthread<br></code>
+<h3>RUN</h3>
+<code>sudo ./ir_remote</code><br>
+<p>A hash code is formed from the level transitions detected during
+a remote key press.&nbsp; This is likely to be unique over multiple
+remotes and keys.</p>
+<p>While the program is running you can capture the waveform using
+the notification feature built in to pigpio.&nbsp; Issue the
+following commands on the Pi.</p>
+<code>pigs no<br>
+pig2vcd&nbsp; &lt;/dev/pigpio0 &gt;ir.vcd &amp;<br>
+pigs nb 0 0x80 # set bits for gpios 7 (0x80)<br></code>
+<p>Press a few different remotes and keys.&nbsp; Then enter<br></p>
+<code>pigs nc 0</code><br>
+<p>The file ir.vcd will contain the captured waveform, which can be
+viewed using GTKWave.</p>
+<p>Overview</p>
+<img src="images/ir-wave-1.png" style=
+"width: 600px; height: 100px;" alt="ir remote waveform 1"><br>
+<p>Remote A typical waveform</p>
+<img src="images/ir-wave-2.png" style=
+"width: 600px; height: 100px;" alt="ir remote waveform 2"><br>
+<p>Remote B typical waveform</p>
+<img style="width: 600px; height: 100px;" alt=
+"ir remote waveform 3" src="images/ir-wave-3.png">
+</body>
+</html>
diff --git a/DOC/src/html/ex_motor_shield.html b/DOC/src/html/ex_motor_shield.html
new file mode 100644
index 0000000..777ba9e
--- /dev/null
+++ b/DOC/src/html/ex_motor_shield.html
@@ -0,0 +1,254 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta name="generator" content="Bluefish 2.2.10" >
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
+<title>Arduino motor shield example</title>
+</head>
+<body>
+The following example demonstrates the use of an Arduino shield
+from the Rasperry Pi.<br>
+<br>
+The shield used is a clone of the Adafruit motor shield.&nbsp; See
+<a href="http://shieldlist.org/adafruit/motor">shieldlist.org</a>
+for details.<br>
+<br>
+For the demonstration DC motors 3 and 4 are being driven forwards
+and backwards with changing speeds (speeds are controlled via
+PWM).<br>
+<br>
+Seven connections are made between the Pi and the shield.&nbsp;
+Four to latch the motor states (latch, enable, data, clock); Two to
+control motor speed (PWM 3 and 4); and ground.<br>
+<br>
+The code used was ported from the Adafruit Arduino code and
+converted to use the pigpio library.&nbsp; Only the DC motor code
+was ported.<br>
+<br>
+A video of the shield in use is available at <a href=
+"http://youtu.be/Z_l3C246oVI">youtube.com</a><br>
+<code><br>
+#include &lt;stdio.h&gt;</code> <code><br>
+<br>
+#include &lt;pigpio.h&gt;<br>
+<br>
+/*<br>
+&nbsp;&nbsp; This code may be used to drive the Adafruit (or
+clones) Motor Shield.<br>
+<br>
+&nbsp;&nbsp; The code as written only supports DC motors.<br>
+<br>
+&nbsp;&nbsp; http://shieldlist.org/adafruit/motor<br>
+<br>
+&nbsp;&nbsp; The shield pinouts are<br>
+<br>
+&nbsp;&nbsp; D12 MOTORLATCH<br>
+&nbsp;&nbsp; D11 PMW motor 1<br>
+&nbsp;&nbsp; D10 Servo 1<br>
+&nbsp;&nbsp; D9&nbsp; Servo 2<br>
+&nbsp;&nbsp; D8&nbsp; MOTORDATA<br>
+<br>
+&nbsp;&nbsp; D7&nbsp; MOTORENABLE<br>
+&nbsp;&nbsp; D6&nbsp; PWM motor 4<br>
+&nbsp;&nbsp; D5&nbsp; PWM motor 3<br>
+&nbsp;&nbsp; D4&nbsp; MOTORCLK<br>
+&nbsp;&nbsp; D3&nbsp; PWM motor 2<br>
+<br>
+&nbsp;&nbsp; The motor states (forward, backward, brake, release)
+are encoded using the<br>
+&nbsp;&nbsp; MOTOR_ latch pins.&nbsp; This saves four gpios.<br>
+*/<br>
+<br>
+typedef unsigned char uint8_t;<br>
+<br>
+#define BIT(bit) (1 &lt;&lt; (bit))<br>
+<br>
+/* assign gpios to drive the shield pins */<br>
+<br>
+/*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+Shield&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Pi */<br>
+<br>
+#define MOTORLATCH&nbsp; 14<br>
+#define MOTORCLK&nbsp;&nbsp;&nbsp; 24<br>
+#define MOTORENABLE 25<br>
+#define MOTORDATA&nbsp;&nbsp; 15<br>
+<br>
+#define MOTOR_3_PWM&nbsp; 7<br>
+#define MOTOR_4_PWM&nbsp; 8<br>
+<br>
+/*<br>
+&nbsp;&nbsp; The only other connection needed between the Pi and
+the shield<br>
+&nbsp;&nbsp; is ground to ground. I used Pi P1-6 to shield gnd
+(next to D13).<br>
+*/<br>
+<br>
+/* assignment of motor states to latch */<br>
+<br>
+#define MOTOR1_A 2<br>
+#define MOTOR1_B 3<br>
+#define MOTOR2_A 1<br>
+#define MOTOR2_B 4<br>
+#define MOTOR4_A 0<br>
+#define MOTOR4_B 6<br>
+#define MOTOR3_A 5<br>
+#define MOTOR3_B 7<br>
+<br>
+#define FORWARD&nbsp; 1<br>
+#define BACKWARD 2<br>
+#define BRAKE&nbsp;&nbsp;&nbsp; 3<br>
+#define RELEASE&nbsp; 4<br>
+<br>
+static uint8_t latch_state;<br>
+<br>
+void latch_tx(void)<br>
+{<br>
+&nbsp;&nbsp; unsigned char i;<br>
+<br>
+&nbsp;&nbsp; gpioWrite(MOTORLATCH, PI_LOW);<br>
+<br>
+&nbsp;&nbsp; gpioWrite(MOTORDATA, PI_LOW);<br>
+<br>
+&nbsp;&nbsp; for (i=0; i&lt;8; i++)<br>
+&nbsp;&nbsp; {<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gpioDelay(10);&nbsp; // 10 micros
+delay<br>
+<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gpioWrite(MOTORCLK, PI_LOW);<br>
+<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (latch_state &amp; BIT(7-i))
+gpioWrite(MOTORDATA, PI_HIGH);<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+else&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+gpioWrite(MOTORDATA, PI_LOW);<br>
+<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gpioDelay(10);&nbsp; // 10 micros
+delay<br>
+<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gpioWrite(MOTORCLK, PI_HIGH);<br>
+&nbsp;&nbsp; }<br>
+<br>
+&nbsp;&nbsp; gpioWrite(MOTORLATCH, PI_HIGH);<br>
+}<br>
+<br>
+void init(void)<br>
+{<br>
+&nbsp;&nbsp; latch_state = 0;<br>
+<br>
+&nbsp;&nbsp; latch_tx();<br>
+<br>
+&nbsp;&nbsp; gpioWrite(MOTORENABLE, PI_LOW);<br>
+}<br>
+<br>
+void DCMotorInit(uint8_t num)<br>
+{<br>
+&nbsp;&nbsp; switch (num)<br>
+&nbsp;&nbsp; {<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 1: latch_state &amp;=
+~BIT(MOTOR1_A) &amp; ~BIT(MOTOR1_B); break;<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 2: latch_state &amp;=
+~BIT(MOTOR2_A) &amp; ~BIT(MOTOR2_B); break;<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 3: latch_state &amp;=
+~BIT(MOTOR3_A) &amp; ~BIT(MOTOR3_B); break;<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 4: latch_state &amp;=
+~BIT(MOTOR4_A) &amp; ~BIT(MOTOR4_B); break;<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; default: return;<br>
+&nbsp;&nbsp; }<br>
+<br>
+&nbsp;&nbsp; latch_tx();<br>
+<br>
+&nbsp;&nbsp; printf("Latch=%08X\ ", latch_state);<br>
+}<br>
+<br>
+void DCMotorRun(uint8_t motornum, uint8_t cmd)<br>
+{<br>
+&nbsp;&nbsp; uint8_t a, b;<br>
+<br>
+&nbsp;&nbsp; switch (motornum)<br>
+&nbsp;&nbsp; {<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 1: a = MOTOR1_A; b = MOTOR1_B;
+break;<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 2: a = MOTOR2_A; b = MOTOR2_B;
+break;<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 3: a = MOTOR3_A; b = MOTOR3_B;
+break;<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 4: a = MOTOR4_A; b = MOTOR4_B;
+break;<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; default: return;<br>
+&nbsp;&nbsp; }<br>
+&nbsp;<br>
+&nbsp;&nbsp; switch (cmd)<br>
+&nbsp;&nbsp; {<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case FORWARD:&nbsp; latch_state
+|=&nbsp; BIT(a); latch_state &amp;= ~BIT(b); break;<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case BACKWARD: latch_state &amp;=
+~BIT(a); latch_state |=&nbsp; BIT(b); break;<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case RELEASE:&nbsp; latch_state
+&amp;= ~BIT(a); latch_state &amp;= ~BIT(b); break;<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; default: return;<br>
+&nbsp;&nbsp; }<br>
+<br>
+&nbsp;&nbsp; latch_tx();<br>
+<br>
+&nbsp;&nbsp; printf("Latch=%08X\ ", latch_state);<br>
+}<br>
+<br>
+int main (int argc, char *argv[])<br>
+{<br>
+&nbsp;&nbsp; int i;<br>
+<br>
+&nbsp;&nbsp; if (gpioInitialise()&lt;0) return 1;<br>
+<br>
+&nbsp;&nbsp; gpioSetMode(MOTORLATCH,&nbsp; PI_OUTPUT);<br>
+&nbsp;&nbsp; gpioSetMode(MOTORENABLE, PI_OUTPUT);<br>
+&nbsp;&nbsp; gpioSetMode(MOTORDATA,&nbsp;&nbsp; PI_OUTPUT);<br>
+&nbsp;&nbsp; gpioSetMode(MOTORCLK,&nbsp;&nbsp;&nbsp;
+PI_OUTPUT);<br>
+<br>
+&nbsp;&nbsp; gpioSetMode(MOTOR_3_PWM, PI_OUTPUT);<br>
+&nbsp;&nbsp; gpioSetMode(MOTOR_4_PWM, PI_OUTPUT);<br>
+<br>
+&nbsp;&nbsp; gpioPWM(MOTOR_3_PWM, 0);<br>
+&nbsp;&nbsp; gpioPWM(MOTOR_4_PWM, 0);<br>
+<br>
+&nbsp;&nbsp; init();<br>
+<br>
+&nbsp;&nbsp; for (i=60; i&lt;160; i+=20)<br>
+&nbsp;&nbsp; {<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gpioPWM(MOTOR_3_PWM, i);<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gpioPWM(MOTOR_4_PWM, 220-i);<br>
+<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DCMotorRun(3, FORWARD);<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DCMotorRun(4, BACKWARD);<br>
+<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sleep(2);<br>
+<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DCMotorRun(3, RELEASE);<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DCMotorRun(4, RELEASE);<br>
+<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sleep(2);<br>
+<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gpioPWM(MOTOR_4_PWM, i);<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gpioPWM(MOTOR_3_PWM, 220-i);<br>
+<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DCMotorRun(3, BACKWARD);<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DCMotorRun(4, FORWARD);<br>
+<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sleep(2);<br>
+<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DCMotorRun(3, RELEASE);<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DCMotorRun(4, RELEASE);<br>
+<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sleep(2);<br>
+&nbsp;&nbsp; }<br>
+<br>
+&nbsp;&nbsp; gpioPWM(MOTOR_4_PWM, 0);<br>
+&nbsp;&nbsp; gpioPWM(MOTOR_3_PWM, 0);<br>
+<br>
+&nbsp;&nbsp; DCMotorRun(3, RELEASE);<br>
+&nbsp;&nbsp; DCMotorRun(4, RELEASE);<br>
+<br>
+&nbsp;&nbsp; gpioTerminate();<br>
+}<br></code>
+</body>
+</html>
diff --git a/DOC/src/html/ex_rotary_encoder.html b/DOC/src/html/ex_rotary_encoder.html
new file mode 100644
index 0000000..b95711e
--- /dev/null
+++ b/DOC/src/html/ex_rotary_encoder.html
@@ -0,0 +1,185 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta name="generator" content="Bluefish 2.2.10" >
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
+<title>Rotary encoder sample</title>
+</head>
+<body>
+<p>The following code shows one way to read an incremental
+mechanical rotary enoder (the sort used for volume control in audio
+systems).&nbsp; These rotary encoders have two switches A and B
+which return a quadrature output, i.e. they are 90 degrees out of
+phase.</p>
+<h3>SETUP</h3>
+<img alt="fritzing diagram" style="width: 200px; height: 300px;"
+src="images/re-fritz.png" align="left" hspace="10">The common
+(centre) terminal should be connected to a Pi ground.
+<p>The A and B terminals may be connected to any spare gpios.</p>
+<p>Here A to gpio18 (P1-12), common to ground (P1-20), B to gpio7
+(P1-26).<br clear="all"></p>
+<p><img src="images/re-photo.jpg" style=
+"width: 400px; height: 300px;" alt="photo of set-up"></p>
+<h3>CODE</h3>
+<code>#include &lt;stdio.h&gt;<br>
+<br>
+#include &lt;pigpio.h&gt;<br>
+<br>
+/*<br>
+&nbsp;&nbsp; Rotary encoder connections:<br>
+<br>
+&nbsp;&nbsp; Encoder A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - gpio
+18&nbsp;&nbsp; (pin P1-12)<br>
+&nbsp;&nbsp; Encoder B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - gpio
+7&nbsp;&nbsp;&nbsp; (pin P1-26)<br>
+&nbsp;&nbsp; Encoder Common - Pi ground (pin P1-20)<br>
+*/<br>
+<br>
+#define ENCODER_A 18<br>
+#define ENCODER_B&nbsp; 7<br>
+<br>
+static volatile int encoderPos;<br>
+<br>
+/* forward declaration */<br>
+<br>
+void encoderPulse(int gpio, int lev, uint32_t tick);<br>
+<br>
+int main(int argc, char * argv[])<br>
+{<br>
+&nbsp;&nbsp; int pos=0;<br>
+<br>
+&nbsp;&nbsp; if (gpioInitialise()&lt;0) return 1;<br>
+<br>
+&nbsp;&nbsp; gpioSetMode(ENCODER_A, PI_INPUT);<br>
+&nbsp;&nbsp; gpioSetMode(ENCODER_B, PI_INPUT);<br>
+<br>
+&nbsp;&nbsp; /* pull up is needed as encoder common is grounded
+*/<br>
+<br>
+&nbsp;&nbsp; gpioSetPullUpDown(ENCODER_A, PI_PUD_UP);<br>
+&nbsp;&nbsp; gpioSetPullUpDown(ENCODER_B, PI_PUD_UP);<br>
+<br>
+&nbsp;&nbsp; encoderPos = pos;<br>
+<br>
+&nbsp;&nbsp; /* monitor encoder level changes */<br>
+<br>
+&nbsp;&nbsp; gpioSetAlertFunc(ENCODER_A, encoderPulse);<br>
+&nbsp;&nbsp; gpioSetAlertFunc(ENCODER_B, encoderPulse);<br>
+<br>
+&nbsp;&nbsp; while (1)<br>
+&nbsp;&nbsp; {<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (pos != encoderPos)<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pos =
+encoderPos;<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("pos=%d\ ",
+pos);<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gpioDelay(20000); /* check pos 50
+times per second */<br>
+&nbsp;&nbsp; }<br>
+<br>
+&nbsp;&nbsp; gpioTerminate();<br>
+}<br>
+<br>
+void encoderPulse(int gpio, int level, uint32_t tick)<br>
+{<br>
+&nbsp;&nbsp; /*<br>
+<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
++---------+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
++---------+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br>
+&nbsp;&nbsp; A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br>
+&nbsp;&nbsp;
++---------+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
++---------+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +-----
+1<br>
+<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
++---------+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
++---------+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+0<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br>
+&nbsp;&nbsp; B&nbsp;&nbsp;
+|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br>
+&nbsp;&nbsp; ----+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
++---------+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
++---------+&nbsp; 1<br>
+<br>
+&nbsp;&nbsp; */<br>
+<br>
+&nbsp;&nbsp; static int levA=0, levB=0, lastGpio = -1;<br>
+<br>
+&nbsp;&nbsp; if (gpio == ENCODER_A) levA = level; else levB =
+level;<br>
+<br>
+&nbsp;&nbsp; if (gpio != lastGpio) /* debounce */<br>
+&nbsp;&nbsp; {<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lastGpio = gpio;<br>
+<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((gpio == ENCODER_A) &amp;&amp;
+(level == 0))<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!levB)
+++encoderPos;<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if ((gpio == ENCODER_B)
+&amp;&amp; (level == 1))<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (levA)
+--encoderPos;<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
+&nbsp;&nbsp; }<br>
+}<br></code>
+<h3>BUILD</h3>
+<code>cc -o rotary_encoder rotary_encoder.c -lpigpio -lrt
+-lpthread<br></code>
+<h3>RUN</h3>
+<code>sudo ./rotary_encoder</code><br>
+<p>While the program is running you can capture the waveform using
+the notification feature built in to pigpio.&nbsp; Issue the
+following commands on the Pi.</p>
+<code>pigs no<br>
+pig2vcd&nbsp; &lt;/dev/pigpio0 &gt;re.vcd &amp;<br>
+pigs nb 0 0x40080 # set bits for gpios 7 (0x80) and 18
+(0x40000)<br></code>
+<p>Twiddle the rotary encoder forwards and backwards for a few
+seconds.&nbsp; Then enter<br></p>
+<code>pigs nc 0</code><br>
+<p>The file re.vcd will contain the captured waveform, which can be
+viewed using GTKWave.</p>
+<br>
+Overview<br>
+<br>
+<img src="images/re-wave-1.png" style=
+"width: 600px; height: 100px;" alt=
+"rotary encoder waveform overview"><br>
+<br>
+Detail of switch bounce.&nbsp; Contact A bounces for circa 700 us
+before completing the level transition<br>
+<br>
+<img src="images/re-wave-2.png" style=
+"width: 600px; height: 100px;" alt=
+"rotary encoder waveform detail"><br>
+</body>
+</html>
diff --git a/DOC/src/html/ex_sonar_ranger.html b/DOC/src/html/ex_sonar_ranger.html
new file mode 100644
index 0000000..8edb9c2
--- /dev/null
+++ b/DOC/src/html/ex_sonar_ranger.html
@@ -0,0 +1,164 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta name="generator" content="Bluefish 2.2.10" >
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
+<title>Sonar ranger example</title>
+</head>
+<body>
+<p>The following code shows a method of reading a class of sonar
+rangers.&nbsp; These rangers requires a trigger pulse.&nbsp;
+Shortly after receiving a trigger they transmit a noise pulse and
+set the echo line high.&nbsp; When the echo is received the echo
+line is set low.<br></p>
+<h3>SETUP</h3>
+<img src="images/son-fritz.png" alt="fritzing diagram" style=
+"width: 200px; height: 600px;" align="left" hspace="10"><br>
+<br>
+<br>
+<br>
+<br>
+The ranger used is a SRF05 (check the pinouts, there are many
+variants).<br>
+<br>
+The fritzing diagram shows the back of the ranger, i.e. pin 1 is
+the rightmost.<br>
+<br>
+Pin 1 is 5V.<br>
+Pin 2 is the trigger line.<br>
+Pin 3 is the echo line.<br>
+Pin 4 is out (unused).<br>
+Pin 5 is ground.<br>
+<br clear="all">
+<p><img src="images/son-photo.jpg" style=
+"width: 500px; height: 376px;" alt="photo of set-up"></p>
+<h3>CODE</h3>
+<code>#include &lt;stdio.h&gt;<br>
+<br>
+#include &lt;pigpio.h&gt;<br>
+<br>
+/*<br>
+<br>
+P1&nbsp; Name&nbsp; gpio&nbsp;&nbsp;&nbsp; used for<br>
+<br>
+&nbsp;2&nbsp; 5V&nbsp;&nbsp;&nbsp; ---&nbsp;&nbsp;&nbsp;&nbsp;
+5V<br>
+&nbsp;6&nbsp; GND&nbsp;&nbsp; ---&nbsp;&nbsp;&nbsp;&nbsp;
+Ground<br>
+24&nbsp; CE0&nbsp;&nbsp; 8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+Sonar echo<br>
+26&nbsp; CE1&nbsp;&nbsp; 7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+Sonar trigger<br>
+<br>
+*/<br>
+<br>
+#define SONAR_TRIGGER 7<br>
+#define SONAR_ECHO&nbsp;&nbsp;&nbsp; 8<br>
+<br>
+/* forward prototypes */<br>
+<br>
+void sonarTrigger(void);<br>
+<br>
+void sonarEcho(int gpio, int level, uint32_t tick);<br>
+<br>
+int main(int argc, char *argv[])<br>
+{<br>
+&nbsp;&nbsp; if (gpioInitialise()&lt;0) return 1;<br>
+<br>
+&nbsp;&nbsp; gpioSetMode(SONAR_TRIGGER, PI_OUTPUT);<br>
+&nbsp;&nbsp; gpioWrite&nbsp; (SONAR_TRIGGER, PI_OFF);<br>
+<br>
+&nbsp;&nbsp; gpioSetMode(SONAR_ECHO,&nbsp;&nbsp;&nbsp;
+PI_INPUT);<br>
+<br>
+&nbsp;&nbsp; /* update sonar 20 times a second, timer #0 */<br>
+<br>
+&nbsp;&nbsp; gpioSetTimerFunc(0, 50, sonarTrigger); /* every 50ms
+*/<br>
+<br>
+&nbsp;&nbsp; /* monitor sonar echos */<br>
+<br>
+&nbsp;&nbsp; gpioSetAlertFunc(SONAR_ECHO, sonarEcho);<br>
+<br>
+&nbsp;&nbsp; while (1) sleep(1);<br>
+<br>
+&nbsp;&nbsp; gpioTerminate();<br>
+<br>
+&nbsp;&nbsp; return 0;<br>
+}<br>
+<br>
+void sonarTrigger(void)<br>
+{<br>
+&nbsp;&nbsp; /* trigger a sonar reading */<br>
+<br>
+&nbsp;&nbsp; gpioWrite(SONAR_TRIGGER, PI_ON);<br>
+<br>
+&nbsp;&nbsp; gpioDelay(10); /* 10us trigger pulse */<br>
+<br>
+&nbsp;&nbsp; gpioWrite(SONAR_TRIGGER, PI_OFF);<br>
+}<br>
+<br>
+void sonarEcho(int gpio, int level, uint32_t tick)<br>
+{<br>
+&nbsp;&nbsp; static uint32_t startTick, firstTick=0;<br>
+<br>
+&nbsp;&nbsp; int diffTick;<br>
+<br>
+&nbsp;&nbsp; if (!firstTick) firstTick = tick;<br>
+<br>
+&nbsp;&nbsp; if (level == PI_ON)<br>
+&nbsp;&nbsp; {<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; startTick = tick;<br>
+&nbsp;&nbsp; }<br>
+&nbsp;&nbsp; else if (level == PI_OFF)<br>
+&nbsp;&nbsp; {<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; diffTick = tick - startTick;<br>
+<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%u %u\ ", tick-firstTick,
+diffTick);<br>
+&nbsp;&nbsp; }<br>
+}<br></code>
+<h3>BUILD</h3>
+<code>cc -o sonar sonar.c -lpigpio -lrt -lpthread<br></code>
+<h3>RUN</h3>
+<code>sudo ./sonar &gt;sonar.dat &amp;</code><br>
+<br>
+While the program is running you can capture the waveform using the
+notification feature built in to pigpio.&nbsp; Issue the following
+commands on the Pi.<br>
+<br>
+<code>pigs no<br>
+pig2vcd&nbsp; &lt;/dev/pigpio0 &gt;sonar.vcd &amp;<br>
+pigs nb 0 0x180 # set bits for gpios 7 and 8<br></code>
+<p>Move an object in front of the sonar ranger for a few
+seconds.<br></p>
+<code>pigs nc 0</code><br>
+<p>The file sonar.vcd will contain the captured waveform, which can
+be viewed using GTKWave.</p>
+<p>Overview</p>
+<img src="images/son-wave-1.png" style=
+"width: 600px; height: 100px;" alt="LDR waveform 1"><br>
+<p>Reading circa every 10ms<br></p>
+<img src="images/son-wave-2.png" style=
+"width: 600px; height: 100px;" alt="Sonar waveform 2"><br>
+<p>One reading, circa 400us<br></p>
+<img src="images/son-wave-3.png" style=
+"width: 600px; height: 100px;" alt="Sonar waveform 3"><br>
+<p>another</p>
+<img style="width: 600px; height: 100px;" alt="Sonar waveform 4"
+src="images/son-wave-4.png"><br>
+<p>The file sonar.dat will contain pairs of timestamps and echo
+length (in us).&nbsp; The following&nbsp; script will convert the
+timestamps into seconds.<span style=
+"font-style: italic;"><br></span></p>
+<p><code>awk '{print $1/1000000, $2}' sonar.dat
+&gt;sonar-secs.dat</code></p>
+<p>Gnuplot is a useful tool to graph data.<br></p>
+plot 'sonar-secs.dat' title 'Sonar'<br>
+<p><img src="images/son-gnup-1.png" style=
+"width: 600px; height: 321px;" alt="gnuplot 1"><br>
+&nbsp;plot [10:25] 'sonar-secs.dat' title 'Sonar'<br></p>
+<p><img src="images/son-gnup-2.png" style=
+"width: 600px; height: 321px;" alt="gnuplot 1"></p>
+</body>
+</html>
diff --git a/DOC/src/html/faq.html b/DOC/src/html/faq.html
new file mode 100644
index 0000000..b8d6df5
--- /dev/null
+++ b/DOC/src/html/faq.html
@@ -0,0 +1,462 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta name="generator" content=
+"HTML Tidy for HTML5 for Linux version 5.6.0">
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
+<title>faq</title>
+</head>
+<body>
+<a href="#Are_my_GPIO_broken">Are my GPIO broken?</a><br>
+<br>
+<a href="#Audio_is_broken">Audio is broken</a><br>
+<br>
+<a href="#Cant_initialise_pigpio_library">Can´t initialise pigpio
+library</a><br>
+<br>
+<a href="#Cant_lock_varrunpigpio.pid">Can´t lock
+var/run/pigpio.pid</a><br>
+<br>
+<a href="#Hello_World">Hello World!</a><br>
+<br>
+<a href="#make_fails">Clock skew, make fails</a><br>
+<br>
+<a href="#Have_I_fried_my_GPIO">Have I fried my GPIO?</a><br>
+<br>
+<a href="#How_do_I_debounce_inputs">How do I debounce
+inputs?</a><br>
+<br>
+<a href="#How_fast_is_SPI">How fast is SPI?</a><br>
+<br>
+<a href="#Library_update_fails">Library update didn't work</a><br>
+<br>
+<a href="#make_fails">make fails with clock skew</a><br>
+<br>
+<a href="#Porting_pigpio">Porting pigpio to another CPU/SoC</a><br>
+<br>
+<a href="#Sound_isnt_working">Sound isn't working</a><br>
+<br>
+<a href="#Library_update_fails">Symbol not found</a><br>
+<br>
+<a href="#What_is_I2C">What is I2C?</a><br>
+<br>
+<a href="#What_is_Serial">What is Serial?</a><br>
+<br>
+<a href="#What_is_SPI">What is SPI?</a><br>
+<br>
+<a href="#Which_library">Which library should I use?</a><br>
+<br>
+<h3><a name="Are_my_GPIO_broken" id="Are_my_GPIO_broken"></a>Are my
+GPIO broken?</h3>
+<p>See <a href="#Have_I_fried_my_GPIO">Have I fried my
+GPIO?</a><br></p>
+<h3><a name="Audio_is_broken" id="Audio_is_broken"></a>Audio is
+broken</h3>
+<p>See <a href="#Sound_isnt_working">Sound isn't
+working</a><br></p>
+<h3><a name="Cant_lock_varrunpigpio.pid" id=
+"Cant_lock_varrunpigpio.pid"></a>Can´t lock
+/var/run/pigpio.pid</h3>
+<p>See <a href=
+"#Cant_initialise_pigpio_library">Can´t_initialise_pigpio_library</a><br>
+</p>
+<h3><a name="Cant_initialise_pigpio_library" id=
+"Cant_initialise_pigpio_library"></a>Can´t initialise pigpio
+library</h3>
+<p>This message means the pigpio daemon is already running.<br></p>
+<p>The default daemon is called pigpiod and may be removed as
+follows.<br></p>
+Check that it is running with the command
+<p><code>ps aux | grep pigpiod</code></p>
+<p>Kill the daemon with<br></p>
+<p><code>sudo killall pigpiod</code></p>
+<p>If your own program is acting as the daemon it may be removed as
+follows.</p>
+<p>Find its process id (<span style=
+"font-style: italic;">pid</span>).<br></p>
+<p><code>cat /var/run/pigpio.pid</code><br></p>
+<p>Kill the program with<br></p>
+<p><code>sudo kill -9 <span style=
+"font-style: italic;">pid</span></code><br></p>
+If the above doesn't work do the following and try starting the
+daemon again
+<p><code>sudo rm /var/run/pigpio.pid<br></code></p>
+<p>To start the daemon do</p>
+<p><code>sudo pigpiod</code></p>
+<h3><a name="Have_I_fried_my_GPIO" id=
+"Have_I_fried_my_GPIO"></a>Have I fried my GPIO?</h3>
+<p>If you think you have damaged one or more GPIO you can carry out
+a diagnostic test.</p>
+<p>The test is a command line script called <a rel="nofollow"
+class="external text" href=
+"http://abyz.me.uk/rpi/pigpio/code/gpiotest.zip">gpiotest</a></p>
+For the duration of the test nothing must be connected to the GPIO
+(no LEDs, wires, ribbon cables etc.).
+<p>The test checks that each GPIO may be read and written and that
+the internal resistor pull-ups and pull-downs are functional.</p>
+<p>A <a rel="nofollow" class="external text" href=
+"https://www.youtube.com/watch?v=sCJFLKWaxHo&amp;feature=youtu.be">video</a>
+showing what happens to the GPIO during a test.</p>
+<p>A test with all GPIO okay.</p>
+<pre>This program checks the Pi's (user) gpios.
+
+The program reads and writes all the gpios. Make sure NOTHING
+is connected to the gpios during this test.
+
+The program uses the pigpio daemon which must be running.
+
+To start the daemon use the command sudo pigpiod.
+
+Press the ENTER key to continue or ctrl-C to abort...
+
+Testing...
+Skipped non-user gpios: 0 1 28 29 30 31
+Tested user gpios: 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18<br> 19 20 21 22 23 24 25 26 27
+Failed user gpios: None
+</pre>
+<p>A test showing failed GPIO.</p>
+<pre>This program checks the Pi's (user) gpios.
+
+The program reads and writes all the gpios. Make sure NOTHING
+is connected to the gpios during this test.
+
+The program uses the pigpio daemon which must be running.
+
+To start the daemon use the command sudo pigpiod.
+
+Press the ENTER key to continue or ctrl-C to abort...
+
+Testing...
+Write 1 to gpio 17 failed.
+Pull up on gpio 17 failed.
+Write 1 to gpio 18 failed.
+Pull up on gpio 18 failed.
+Write 0 to gpio 23 failed.
+Pull down on gpio 23 failed.
+Write 0 to gpio 24 failed.
+Pull down on gpio 24 failed.
+Write 1 to gpio 27 failed.
+Pull up on gpio 27 failed.
+Skipped non-user gpios: 0 1 28 29 30 31
+Tested user gpios: 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18<br> 19 20 21 22 23 24 25 26 27
+Failed user gpios: 17 18 23 24 27
+</pre>
+<h3><a name="How_do_I_debounce_inputs" id=
+"How_do_I_debounce_inputs"></a>How do I debounce inputs?</h3>
+<p>Some devices like mechanical switches can generate multiple
+interrupts as they bounce between on and off.&nbsp; It is possible
+to debounce the inputs in hardware by the correct use of resistors
+and capacitors.<br></p>
+<p>In software use the glitch filter which ignores all events
+shorter than a set number of microseconds.&nbsp; C <a href=
+"cif.html#gpioGlitchFilter">gpioGlitchFilter</a>, Python <a href=
+"python.html#set_glitch_filter">set_glitch_filter</a>.<br></p>
+<h3><a name="How_fast_is_SPI" id="How_fast_is_SPI"></a>How fast is
+SPI?</h3>
+The SPI throughput in samples per second depends on a number of
+factors.<br>
+<br>
+<ul>
+<li>The SPI bit rate (transfer rate in bits per second)</li>
+</ul>
+<ul>
+<li>The number of bytes transferred per sample (a 12 bit ADC sample
+may require 3 bytes to transfer)</li>
+</ul>
+<ul>
+<li>The driver used</li>
+</ul>
+<p>Two of those factors are fixed, the variable is the driver
+used.</p>
+<p>The pigpio driver is considerably faster than the Linux SPI
+driver as is demonstrated by the following graphs.<br></p>
+<p>Each graph shows the SPI bit rate in bits per second along the
+horizontal axis.&nbsp; The samples per second achieved is shown on
+the vertical axis.&nbsp; Each graph contains plots assuming 1 to 5
+bytes per transfer.<br></p>
+<p>The source code used for the tests is <a href=
+"code/spi-driver-speed.c">spi-driver-speed.c</a> and <a href=
+"code/spi-pigpio-speed.c">spi-pigpio-speed.c</a><br></p>
+<p><img alt="spi-lnx-pibr1.png" src="images/spi-lnx-pibr1.png"></p>
+<hr>
+<p><img alt="spi-pig-pibr1.png" src="images/spi-pig-pibr1.png"></p>
+<hr>
+<p><img alt="spi-lnx-pi3b.png" src="images/spi-lnx-pi3b.png"></p>
+<hr>
+<p><img alt="spi-pig-pi3b.png" src="images/spi-pig-pi3b.png"></p>
+<h3><a name="Library_update_fails" id=
+"Library_update_fails"></a>Library update didn't work</h3>
+<p>pigpio places files in the following locations<br></p>
+<p>/usr/local/include (pigpio.h, pigpiod_if.h, pigpiod_if2.h)<br>
+/usr/local/lib (libpigpio.so, libpigpiod_if.so,
+libpigpiod_if2.so)<br>
+/usr/local/bin (pig2vcd, pigpiod, pigs)<br>
+/usr/local/man (man pages)<br></p>
+The raspberrypi.org image containing pigpio uses different
+locations.<br>
+<p>/usr/include (pigpio.h, pigpiod_if.h, pigpiod_if2.h)<br>
+/usr/lib (libpigpio.so, libpigpiod_if.so, libpigpiod_if2.so)<br>
+/usr/bin (pig2vcd, pigpiod, pigs)<br>
+/usr/man (man pages)<br></p>
+<p>Mostly this doesn't matter as the /usr/local directories will
+generally be earlier in the search path.&nbsp; The pigpio built
+includes, binaries, and manuals are normally found first.<br></p>
+<p>However the wrong libraries may be linked during the
+compilation.&nbsp; If this is the case remove the /usr/lib entries
+for libpigpio.so , libpigpiod_if.so, and libpigpiod_if2.so</p>
+<h3><a name="Hello_World" id="Hello_World"></a>Hello World!</h3>
+<p>The following examples show how to use the various components of
+the pigpio library.</p>
+<p>Each example shows how to read the level of a GPIO.</p>
+<h4>C</h4>
+read_cif.c
+<pre>
+#include &lt;stdio.h&gt;
+#include &lt;pigpio.h&gt;
+
+int main(int argc, char *argv[])
+{
+ int GPIO=4;
+ int level;
+
+ if (gpioInitialise() &lt; 0) return 1;
+
+ level = gpioRead(GPIO);
+
+ printf("GPIO %d is %d\n", GPIO, level);
+
+ gpioTerminate();
+}
+ </pre>
+<p>Build</p>
+<code>gcc -pthread -o read_cif read_cif.c -lpigpio</code>
+<p>Run</p>
+<code>sudo ./read_cif</code>
+<h4>C via pigpio daemon</h4>
+read_pdif.c
+<pre>
+#include &lt;stdio.h&gt;
+#include &lt;pigpiod_if2.h&gt;
+
+int main(int argc, char *argv[])
+{
+ int pi;
+ int GPIO=4;
+ int level;
+
+ pi = pigpio_start(0, 0); /* Connect to local Pi. */
+
+ if (pi &lt; 0)
+ {
+ printf("Can't connect to pigpio daemon\n");
+ return 1;
+ }
+
+ level = gpio_read(pi, GPIO);
+
+ printf("GPIO %d is %d\n", GPIO, level);
+
+ pigpio_stop(pi); /* Disconnect from local Pi. */
+
+ return 0;
+}
+</pre>
+<p>Build</p>
+<code>gcc -pthread -o read_pdif read_pdif.c -lpigpiod_if2</code>
+<p>Run</p>
+<code>./read_pdif</code>
+<h4>Python</h4>
+read_gpio.py
+<pre>
+#!/usr/bin/env python
+
+import pigpio
+
+GPIO=4
+
+pi = pigpio.pi()
+if not pi.connected:
+ exit()
+
+level = pi.read(GPIO)
+
+print("GPIO {} is {}".format(GPIO, level))
+
+pi.stop()
+ </pre>
+<p>Run</p>
+<code>python read_gpio.py</code>
+<h4>pigs</h4>
+<pre>
+pigs r 4
+ </pre>
+<h4>pipe I/F</h4>
+<pre>
+echo "r 4" &gt;/dev/pigpio
+cat /dev/pigout
+ </pre>
+<h3><a name="make_fails" id="make_fails"></a>make fails with clock
+skew</h3>
+<p>If make fails with one of the following messages it is probably
+because the Pi's clock is wrong.<br></p>
+<p><code>make: Warning: File 'xxx' has modification time x s in the
+future<br>
+make: warning: Clock skew detected. Your build may be
+incomplete.</code></p>
+<p>make uses the current time to work out which files need to be
+rebuilt (a file is rebuilt if it depends on other files which have
+a later time-stamp).<br></p>
+<p>The solution is to make sure the system clock is correct.&nbsp;
+If the Pi is networked this will not normally be a problem.<br></p>
+<p>To set the date and time use the date command as in the
+following example.</p>
+<p><code>sudo date -d "2017-03-01 18:47:00"</code></p>
+<h3><a name="Porting_pigpio" id="Porting_pigpio"></a>Porting pigpio
+to another CPU/SoC</h3>
+<h3><a name="Sound_isnt_working" id="Sound_isnt_working"></a>Sound
+isn't working</h3>
+<p>The Pi contains two pieces of hardware, a PWM peripheral and a
+PCM peripheral, to generate sound.&nbsp; The PWM peripheral is
+normally used and generates medium quality audio out of the
+headphone jack.&nbsp; The PCM peripheral may be used by add-ons
+such as HATs and generates high quality audio.<br></p>
+<p>pigpio uses at least one of these peripherals during normal
+operation (for timing DMA transfers).&nbsp; pigpio will use both
+peripherals if waves or the hardware PWM function is used.<br></p>
+<p>By default pigpio uses the PCM peripheral leaving the PWM
+peripheral free for medium quality audio.<br></p>
+<p>You can change the default with a configuration option.&nbsp;
+For C use <a href="cif.html#gpioCfgClock">gpioCfgClock</a>, for the
+<a href="pigpiod.html">pigpio daemon</a> use the -t option.</p>
+<h3><a name="What_is_I2C" id="What_is_I2C"></a>What is I2C?</h3>
+<p>I2C is a data link between the Pi (master) and one or more
+slaves.</p>
+<p>Data may be sent and received but the Pi initiates all
+transfers.<br></p>
+<p>I2C is a medium speed link.&nbsp; On the Pi the default speed is
+100 kbps, but 400 kbps also works.<br></p>
+<p>I2C is implemented as a bus with two lines called<br></p>
+<ul>
+<li>SDA - for data</li>
+<li>SCL - for a clock</li>
+</ul>
+On the Pi bus 1 is used which uses GPIO 2 (pin 3) for SDA and GPIO
+3 (pin 5) for SCL.<br>
+<br>
+Only one slave device may be communicated with at a time.&nbsp;
+Each message from the Pi includes the slave to be addressed and
+whether a read or write is to be performed.<br>
+<br>
+When the Pi (master) wishes to talk to a slave it begins by issuing
+a start sequence on the I2C bus. A start sequence is one of two
+special sequences defined for the I2C bus, the other being the stop
+sequence. The start sequence and stop sequence are special in that
+these are the only places where the SDA (data line) is allowed to
+change while the SCL (clock line) is high. When data is being
+transferred, SDA must remain stable and not change whilst SCL is
+high. The start and stop sequences mark the beginning and end of a
+transaction with the slave device.<br>
+<br>
+<img style="width: 600px;" alt="I2C start and stop sequences" src=
+"images/faq-i2c-ss.png"><br>
+<br>
+Data is transferred in 8-bit bytes. The bytes are placed on the SDA
+line starting with the most significant bit. The SCL line is then
+pulsed high, then low. For every byte transferred, the device
+receiving the data sends back an acknowledge bit, so there are
+actually 9 SCL clock pulses to transfer each 8-bit byte of data. If
+the receiving device sends back a low ACK bit, then it has received
+the data and is ready to accept another byte. If it sends back a
+high then it is indicating it cannot accept any further data and
+the master should terminate the transfer by sending a stop
+sequence.<br>
+<br>
+<p><img style="width: 600px;" alt="I2C waveform" src=
+"images/faq-i2c.jpg"><br></p>
+<h3><a name="What_is_Serial" id="What_is_Serial"></a>What is
+Serial?</h3>
+<p>Serial is a data link between the Pi and one other
+device.<br></p>
+<p>Data may be sent and received.&nbsp; Either the Pi or the device
+can initiate a transfer.<br></p>
+<p>Serial is a low to medium speed link.&nbsp; On the Pi speeds of
+50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800, 9600,
+19200, 38400, 57600, 115200, and 230400 bps may be used.<br></p>
+<p>Serial is implemented with one line for transmit called TXD and
+one line for receive called RXD.<br></p>
+<p>If only receive or transmit are required the other line need not
+be connected.<br></p>
+<p>The Pi uses GPIO 14 (pin 8) for TXD and GPIO 15 (pin 10) for
+RXD.<br></p>
+<p>Data is normally transmitted in 8-bit bytes with a start bit,
+eight data bits, no parity, and one stop bit.&nbsp; This is
+represented as 8N1.&nbsp; The number of transmitted bits per second
+(bps) is called the baud rate.&nbsp;&nbsp; The time for each bit,
+<span style="font-style: italic;">1 / baud rate</span> seconds, is
+referred to as the bit period.<br></p>
+<p>The lines are in the high state when no data is being
+transmitted.&nbsp; The start of a byte is signalled by the line
+going low for one bit period (the start bit).&nbsp; The data bits
+are then sent least significant bit firsts (low if the bit is 0,
+high if the bit is 1).&nbsp; The data bits are followed by the
+optional parity bit.&nbsp; Finally the line is set high for at
+least the number of stop bit periods.&nbsp; The line will stay high
+if there are no more bytes to be transmitted.<br></p>
+<p><img style="width: 600px;" alt="Serial waveform" src=
+"images/faq-serial.jpg"><br></p>
+<h3><a name="What_is_SPI" id="What_is_SPI"></a>What is SPI?</h3>
+<p>SPI is a data link between the Pi (master) and one or more
+slaves.</p>
+<p>Data may be sent and received but the Pi initiates all
+transfers.<br></p>
+<p>SPI is a medium to high speed link.&nbsp; On the Pi speeds of 32
+kbps to 8 Mbps may be used.<br></p>
+<p>SPI is implemented as a bus with three lines called<br></p>
+<ul>
+<li>MOSI - for data from the Pi to the slave</li>
+<li>MISO - for data from the slave to the Pi</li>
+<li>SCLK - for a clock</li>
+</ul>
+Only one slave device may be communicated with at a time.&nbsp; An
+additional line per slave called slave select is used to identify
+the slave to be addressed.
+<p>The Pi has two SPI buses<br></p>
+<ol>
+<li>the main SPI bus
+<ul>
+<li>MOSI GPIO 10 (pin 19)</li>
+<li>MISO GPIO 9 (pin 21)</li>
+<li>SCLK GPIO 11 (pin 23)</li>
+<li>Slave selects</li>
+<li style="list-style: none; display: inline">
+<ul>
+<li>CE0 GPIO 8 (pin 24)</li>
+<li>CE1 GPIO 7 (pin 26)</li>
+</ul>
+</li>
+</ul>
+</li>
+<li>the auxiliary SPI bus
+<ul>
+<li>MOSI GPIO 20 (pin 38)</li>
+<li>MISO GPIO 19 (pin 35)</li>
+<li>SCLK GPIO 21 (pin 40)</li>
+<li>Slave selects</li>
+<li style="list-style: none; display: inline">
+<ul>
+<li>CE0 GPIO 18 (pin 12)</li>
+<li>CE1 GPIO 17 (pin 11)</li>
+<li>CE2 GPIO 16 (pin 36)<br></li>
+</ul>
+</li>
+</ul>
+</li>
+</ol>
+<p><img style="width: 600px;" alt="SPI waveform" src=
+"images/faq-spi.jpg"><br></p>
+<p><br></p>
+<h3><a name="Which_library" id="Which_library"></a>Which library
+should I use?</h3>
+<p><br></p>
+</body>
+</html>
diff --git a/DOC/src/html/index.html b/DOC/src/html/index.html
new file mode 100644
index 0000000..0b8e33c
--- /dev/null
+++ b/DOC/src/html/index.html
@@ -0,0 +1,659 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+"http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+<meta name="generator" content="Bluefish 2.2.10" >
+<meta content="text/html; charset=utf-8" http-equiv="content-type">
+<title>pigpio</title>
+</head>
+<body>
+pigpio is a library for the Raspberry which allows control of the
+General Purpose Input Outputs (GPIO).&nbsp; pigpio works on all
+versions of the Pi.
+<p><a href="download.html">Download</a><br></p>
+<h3>Features<br></h3>
+<ul>
+<li>
+<p>hardware timed sampling and time-stamping of GPIO 0-31 every 5
+us<br></p>
+</li>
+<li>
+<p>hardware timed PWM on all of GPIO 0-31<br></p>
+</li>
+<li>
+<p>hardware timed servo pulses on all of GPIO 0-31</p>
+</li>
+<li>
+<p>callbacks on GPIO 0-31 level change (time accurate to a few
+us)</p>
+</li>
+<li>
+<p>notifications via pipe on GPIO 0-31 level change<br></p>
+</li>
+<li>
+<p>callbacks at timed intervals</p>
+</li>
+<li>
+<p>reading/writing all of the GPIO in a bank (0-31, 32-53) as a
+single operation</p>
+</li>
+<li>
+<p>GPIO reading, writing, modes, and internal pulls<br></p>
+</li>
+<li>
+<p>socket and pipe interfaces for the bulk of the functionality</p>
+</li>
+<li>
+<p>waveforms to generate GPIO level changes (time accurate to a few
+us)</p>
+</li>
+<li>
+<p>software serial links using any user GPIO</p>
+</li>
+<li>
+<p>rudimentary permission control through the socket and pipe
+interfaces<br></p>
+</li>
+<li>creating and running scripts on the pigpio daemon</li>
+</ul>
+<h3>General</h3>
+The pigpio <a href="cif.html">library</a> is written in the C
+programming language.<br>
+<br>
+The <a href="pigpiod.html">pigpio daemon</a> offers a <a href=
+"sif.html">socket</a> and <a href="pif.html">pipe</a> interface to
+the underlying C library.<br>
+<br>
+A <a href="pdif2.html">C library</a> and a <a href=
+"python.html">Python module</a> allow control of the GPIO via the
+pigpio daemon.<br>
+<br>
+There is third party support for a number of <a href=
+"index.html#Other_Languages">other languages</a>.&nbsp;
+<h3>piscope</h3>
+<p><a href="piscope.html">piscope</a> is a logic analyser (digital
+waveform viewer).<br></p>
+piscope is a GTK+3 application and uses pigpio to provide raw GPIO
+level data.&nbsp; piscope may be run on a Pi or on any machine
+capable of compiling a GTK+3 application.
+<h3><a name="GPIO" id="GPIO"></a>GPIO</h3>
+<p><span style="font-weight: bold;">ALL GPIO</span> are identified
+by their <span style="font-weight: bold;">Broadcom
+number</span>.&nbsp; See <a href=
+"http://elinux.org/RPi_Low-level_peripherals#General_Purpose_Input.2FOutput_.28GPIO.29">
+elinux.org</a><br></p>
+There are 54 GPIO in total, arranged in two banks.<br>
+<p>Bank 1 contains GPIO 0-31.&nbsp; Bank 2 contains GPIO
+32-53.<br></p>
+For all types of Pi it is safe to read all the GPIO. If you try to
+write a system GPIO or change its mode you can crash the Pi or
+corrupt the data on the SD card.<br>
+<br>
+There are several types of board, each with different expansion
+headers, giving physical access to different GPIO.&nbsp;
+<ul>
+<li><a href="#Type_1">Type 1</a> - Model B (original model)</li>
+<li><a href="#Type_2">Type 2</a> - Model A, B (revision 2)</li>
+<li><a href="#Type_3">Type 3</a> - Model A+, B+, Pi Zero, Pi2B,
+Pi3B</li>
+<li><a href="#CM">Compute Module</a> - Compute Module</li>
+</ul>
+<h4><a name="Type_1" id="Type_1"></a>Type 1 - Model B (original
+model)</h4>
+<ul>
+<li>26 pin header (P1).</li>
+</ul>
+<ul>
+<li>Hardware revision numbers of 2 and 3.</li>
+</ul>
+<ul>
+<li>User GPIO 0-1, 4, 7-11, 14-15, 17-18, 21-25.</li>
+</ul>
+<table summary="" style="width: 60%; text-align: left;"
+cellspacing="0" cellpadding="0" border="0">
+<tbody>
+<tr>
+<td style=
+"vertical-align: top; font-weight: bold; text-align: center;">
+<br></td>
+<td style=
+"vertical-align: top; font-weight: bold; text-align: center;">
+GPIO</td>
+<td style="font-weight: bold; text-align: center;">pin</td>
+<td style="font-weight: bold; text-align: center;">pin</td>
+<td style=
+"vertical-align: top; font-weight: bold; text-align: center;">
+GPIO</td>
+<td style="font-weight: bold; text-align: center;"><br></td>
+</tr>
+<tr>
+<td style="text-align: center;">3V3</td>
+<td style="text-align: center;">-</td>
+<td style="text-align: center;">1</td>
+<td style="text-align: center;">2</td>
+<td style="text-align: center;">-</td>
+<td style="text-align: center;">5V</td>
+</tr>
+<tr>
+<td style="text-align: center;">SDA</td>
+<td style="text-align: center;">0<br></td>
+<td style="text-align: center;">3</td>
+<td style="text-align: center;">4</td>
+<td style="text-align: center;">-</td>
+<td style="text-align: center;">5V</td>
+</tr>
+<tr>
+<td style="text-align: center;">SCL</td>
+<td style="text-align: center;">1<br></td>
+<td style="text-align: center;">5</td>
+<td style="text-align: center;">6</td>
+<td style="text-align: center;">-</td>
+<td style="text-align: center;">Ground</td>
+</tr>
+<tr>
+<td style="text-align: center;"><br></td>
+<td style="text-align: center;">4</td>
+<td style="text-align: center;">7</td>
+<td style="text-align: center;">8</td>
+<td style="text-align: center;">14</td>
+<td style="text-align: center;">TXD</td>
+</tr>
+<tr>
+<td style="text-align: center;">Ground</td>
+<td style="text-align: center;">-</td>
+<td style="text-align: center;">9</td>
+<td style="text-align: center;">10</td>
+<td style="text-align: center;">15</td>
+<td style="text-align: center;">RXD</td>
+</tr>
+<tr>
+<td style="text-align: center;">ce1</td>
+<td style="text-align: center;">17</td>
+<td style="text-align: center;">11</td>
+<td style="text-align: center;">12</td>
+<td style="text-align: center;">18</td>
+<td style="text-align: center;">ce0</td>
+</tr>
+<tr>
+<td style="text-align: center;"><br></td>
+<td style="text-align: center;">21</td>
+<td style="text-align: center;">13</td>
+<td style="text-align: center;">14</td>
+<td style="text-align: center;">-</td>
+<td style="text-align: center;">Ground</td>
+</tr>
+<tr>
+<td style="text-align: center;"><br></td>
+<td style="text-align: center;">22</td>
+<td style="text-align: center;">15</td>
+<td style="text-align: center;">16</td>
+<td style="text-align: center;">23</td>
+<td style="text-align: center;"><br></td>
+</tr>
+<tr>
+<td style="text-align: center;">3V3</td>
+<td style="text-align: center;">-<br></td>
+<td style="text-align: center;">17</td>
+<td style="text-align: center;">18</td>
+<td style="text-align: center;">24</td>
+<td style="text-align: center;"><br></td>
+</tr>
+<tr>
+<td style="text-align: center;">MOSI</td>
+<td style="text-align: center;">10</td>
+<td style="text-align: center;">19</td>
+<td style="text-align: center;">20</td>
+<td style="text-align: center;">-</td>
+<td style="text-align: center;">Ground</td>
+</tr>
+<tr>
+<td style="text-align: center;">MISO</td>
+<td style="text-align: center;">9</td>
+<td style="text-align: center;">21</td>
+<td style="text-align: center;">22</td>
+<td style="text-align: center;">25</td>
+<td style="text-align: center;"><br></td>
+</tr>
+<tr>
+<td style="text-align: center;">SCLK</td>
+<td style="text-align: center;">11</td>
+<td style="text-align: center;">23</td>
+<td style="text-align: center;">24</td>
+<td style="text-align: center;">8</td>
+<td style="text-align: center;">CE0</td>
+</tr>
+<tr>
+<td style="text-align: center;">Ground</td>
+<td style="text-align: center;">-</td>
+<td style="text-align: center;">25</td>
+<td style="text-align: center;">26</td>
+<td style="text-align: center;">7</td>
+<td style="text-align: center;">CE1</td>
+</tr>
+</tbody>
+</table>
+<br>
+<h4><a name="Type_2" id="Type_2"></a>Type 2 - Model A, B (revision
+2)</h4>
+26 pin header (P1) and an additional 8 pin header (P5).
+<ul>
+<li>Hardware revision numbers of 4, 5, 6 (B), 7, 8, 9 (A), and 13,
+14, 15 (B).</li>
+</ul>
+<ul>
+<li>User GPIO 2-4, 7-11, 14-15, 17-18, 22-25, 27-31.<br></li>
+</ul>
+<table summary="" style="width: 60%; text-align: left;"
+cellspacing="0" cellpadding="0" border="0">
+<tbody>
+<tr>
+<td style=
+"vertical-align: top; font-weight: bold; text-align: center;">
+<br></td>
+<td style=
+"vertical-align: top; font-weight: bold; text-align: center;">
+GPIO</td>
+<td style="font-weight: bold; text-align: center;">pin</td>
+<td style="font-weight: bold; text-align: center;">pin</td>
+<td style=
+"vertical-align: top; font-weight: bold; text-align: center;">
+GPIO</td>
+<td style="font-weight: bold; text-align: center;"><br></td>
+</tr>
+<tr>
+<td style="text-align: center;">3V3</td>
+<td style="text-align: center;">-</td>
+<td style="text-align: center;">1</td>
+<td style="text-align: center;">2</td>
+<td style="text-align: center;">-</td>
+<td style="text-align: center;">5V</td>
+</tr>
+<tr>
+<td style="text-align: center;">SDA</td>
+<td style="text-align: center;">2</td>
+<td style="text-align: center;">3</td>
+<td style="text-align: center;">4</td>
+<td style="text-align: center;">-</td>
+<td style="text-align: center;">5V</td>
+</tr>
+<tr>
+<td style="text-align: center;">SCL</td>
+<td style="text-align: center;">3</td>
+<td style="text-align: center;">5</td>
+<td style="text-align: center;">6</td>
+<td style="text-align: center;">-</td>
+<td style="text-align: center;">Ground</td>
+</tr>
+<tr>
+<td style="text-align: center;"><br></td>
+<td style="text-align: center;">4</td>
+<td style="text-align: center;">7</td>
+<td style="text-align: center;">8</td>
+<td style="text-align: center;">14</td>
+<td style="text-align: center;">TXD</td>
+</tr>
+<tr>
+<td style="text-align: center;">Ground</td>
+<td style="text-align: center;">-</td>
+<td style="text-align: center;">9</td>
+<td style="text-align: center;">10</td>
+<td style="text-align: center;">15</td>
+<td style="text-align: center;">RXD</td>
+</tr>
+<tr>
+<td style="text-align: center;">ce1</td>
+<td style="text-align: center;">17</td>
+<td style="text-align: center;">11</td>
+<td style="text-align: center;">12</td>
+<td style="text-align: center;">18</td>
+<td style="text-align: center;">ce0</td>
+</tr>
+<tr>
+<td style="text-align: center;"><br></td>
+<td style="text-align: center;">27</td>
+<td style="text-align: center;">13</td>
+<td style="text-align: center;">14</td>
+<td style="text-align: center;">-</td>
+<td style="text-align: center;">Ground</td>
+</tr>
+<tr>
+<td style="text-align: center;"><br></td>
+<td style="text-align: center;">22</td>
+<td style="text-align: center;">15</td>
+<td style="text-align: center;">16</td>
+<td style="text-align: center;">23</td>
+<td style="text-align: center;"><br></td>
+</tr>
+<tr>
+<td style="text-align: center;">3V3</td>
+<td style="text-align: center;">-<br></td>
+<td style="text-align: center;">17</td>
+<td style="text-align: center;">18</td>
+<td style="text-align: center;">24</td>
+<td style="text-align: center;"><br></td>
+</tr>
+<tr>
+<td style="text-align: center;">MOSI</td>
+<td style="text-align: center;">10</td>
+<td style="text-align: center;">19</td>
+<td style="text-align: center;">20</td>
+<td style="text-align: center;">-</td>
+<td style="text-align: center;">Ground</td>
+</tr>
+<tr>
+<td style="text-align: center;">MISO</td>
+<td style="text-align: center;">9</td>
+<td style="text-align: center;">21</td>
+<td style="text-align: center;">22</td>
+<td style="text-align: center;">25</td>
+<td style="text-align: center;"><br></td>
+</tr>
+<tr>
+<td style="text-align: center;">SCLK</td>
+<td style="text-align: center;">11</td>
+<td style="text-align: center;">23</td>
+<td style="text-align: center;">24</td>
+<td style="text-align: center;">8</td>
+<td style="text-align: center;">CE0</td>
+</tr>
+<tr>
+<td style="text-align: center;">Ground</td>
+<td style="text-align: center;">-</td>
+<td style="text-align: center;">25</td>
+<td style="text-align: center;">26</td>
+<td style="text-align: center;">7</td>
+<td style="text-align: center;">CE1</td>
+</tr>
+</tbody>
+</table>
+<br>
+<table summary="" style="width: 60%; text-align: left;"
+cellspacing="0" cellpadding="0" border="0">
+<tbody>
+<tr>
+<td style=
+"vertical-align: top; font-weight: bold; text-align: center;">
+<br></td>
+<td style=
+"vertical-align: top; font-weight: bold; text-align: center;">
+GPIO</td>
+<td style="font-weight: bold; text-align: center;">pin</td>
+<td style="font-weight: bold; text-align: center;">pin</td>
+<td style=
+"vertical-align: top; font-weight: bold; text-align: center;">
+GPIO</td>
+<td style="font-weight: bold; text-align: center;"><br></td>
+</tr>
+<tr>
+<td style="text-align: center;">5V<br></td>
+<td style="text-align: center;">-</td>
+<td style="text-align: center;">1</td>
+<td style="text-align: center;">2</td>
+<td style="text-align: center;">-</td>
+<td style="text-align: center;">3V3</td>
+</tr>
+<tr>
+<td style="text-align: center;">SDA<br></td>
+<td style="text-align: center;">28</td>
+<td style="text-align: center;">3</td>
+<td style="text-align: center;">4</td>
+<td style="text-align: center;">29</td>
+<td style="text-align: center;">SCL</td>
+</tr>
+<tr>
+<td style="text-align: center;"><br></td>
+<td style="text-align: center;">30</td>
+<td style="text-align: center;">5</td>
+<td style="text-align: center;">6</td>
+<td style="text-align: center;">31</td>
+<td style="text-align: center;"><br></td>
+</tr>
+<tr>
+<td style="text-align: center;">Ground<br></td>
+<td style="text-align: center;">-<br></td>
+<td style="text-align: center;">7</td>
+<td style="text-align: center;">8</td>
+<td style="text-align: center;">-<br></td>
+<td style="text-align: center;">Ground</td>
+</tr>
+</tbody>
+</table>
+<br>
+<h4><a name="Type_3" id="Type_3"></a>Type 3 - Model A+, B+, Pi
+Zero, Pi Zero W, Pi2B, Pi3B, Pi4B<br></h4>
+<ul>
+<li>40 pin expansion header (J8).</li>
+</ul>
+<ul>
+<li>Hardware revision numbers of 16 or greater.</li>
+</ul>
+<ul>
+<li>User GPIO 2-27 (0 and 1 are reserved).<br></li>
+</ul>
+<table summary="" style="width: 60%; text-align: left;"
+cellspacing="0" cellpadding="0" border="0">
+<tbody>
+<tr>
+<td style=
+"vertical-align: top; font-weight: bold; text-align: center;">
+<br></td>
+<td style=
+"vertical-align: top; font-weight: bold; text-align: center;">
+GPIO</td>
+<td style="font-weight: bold; text-align: center;">pin</td>
+<td style="font-weight: bold; text-align: center;">pin</td>
+<td style=
+"vertical-align: top; font-weight: bold; text-align: center;">
+GPIO</td>
+<td style="font-weight: bold; text-align: center;"><br></td>
+</tr>
+<tr>
+<td style="text-align: center;">3V3</td>
+<td style="text-align: center;">-</td>
+<td style="text-align: center;">1</td>
+<td style="text-align: center;">2</td>
+<td style="text-align: center;">-</td>
+<td style="text-align: center;">5V</td>
+</tr>
+<tr>
+<td style="text-align: center;">SDA</td>
+<td style="text-align: center;">2</td>
+<td style="text-align: center;">3</td>
+<td style="text-align: center;">4</td>
+<td style="text-align: center;">-</td>
+<td style="text-align: center;">5V</td>
+</tr>
+<tr>
+<td style="text-align: center;">SCL</td>
+<td style="text-align: center;">3</td>
+<td style="text-align: center;">5</td>
+<td style="text-align: center;">6</td>
+<td style="text-align: center;">-</td>
+<td style="text-align: center;">Ground</td>
+</tr>
+<tr>
+<td style="text-align: center;"><br></td>
+<td style="text-align: center;">4</td>
+<td style="text-align: center;">7</td>
+<td style="text-align: center;">8</td>
+<td style="text-align: center;">14</td>
+<td style="text-align: center;">TXD</td>
+</tr>
+<tr>
+<td style="text-align: center;">Ground</td>
+<td style="text-align: center;">-</td>
+<td style="text-align: center;">9</td>
+<td style="text-align: center;">10</td>
+<td style="text-align: center;">15</td>
+<td style="text-align: center;">RXD</td>
+</tr>
+<tr>
+<td style="text-align: center;">ce1</td>
+<td style="text-align: center;">17</td>
+<td style="text-align: center;">11</td>
+<td style="text-align: center;">12</td>
+<td style="text-align: center;">18</td>
+<td style="text-align: center;">ce0</td>
+</tr>
+<tr>
+<td style="text-align: center;"><br></td>
+<td style="text-align: center;">27</td>
+<td style="text-align: center;">13</td>
+<td style="text-align: center;">14</td>
+<td style="text-align: center;">-</td>
+<td style="text-align: center;">Ground</td>
+</tr>
+<tr>
+<td style="text-align: center;"><br></td>
+<td style="text-align: center;">22</td>
+<td style="text-align: center;">15</td>
+<td style="text-align: center;">16</td>
+<td style="text-align: center;">23</td>
+<td style="text-align: center;"><br></td>
+</tr>
+<tr>
+<td style="text-align: center;">3V3</td>
+<td style="text-align: center;">-<br></td>
+<td style="text-align: center;">17</td>
+<td style="text-align: center;">18</td>
+<td style="text-align: center;">24</td>
+<td style="text-align: center;"><br></td>
+</tr>
+<tr>
+<td style="text-align: center;">MOSI</td>
+<td style="text-align: center;">10</td>
+<td style="text-align: center;">19</td>
+<td style="text-align: center;">20</td>
+<td style="text-align: center;">-</td>
+<td style="text-align: center;">Ground</td>
+</tr>
+<tr>
+<td style="text-align: center;">MISO</td>
+<td style="text-align: center;">9</td>
+<td style="text-align: center;">21</td>
+<td style="text-align: center;">22</td>
+<td style="text-align: center;">25</td>
+<td style="text-align: center;"><br></td>
+</tr>
+<tr>
+<td style="text-align: center;">SCLK</td>
+<td style="text-align: center;">11</td>
+<td style="text-align: center;">23</td>
+<td style="text-align: center;">24</td>
+<td style="text-align: center;">8</td>
+<td style="text-align: center;">CE0</td>
+</tr>
+<tr>
+<td style="text-align: center;">Ground</td>
+<td style="text-align: center;">-</td>
+<td style="text-align: center;">25</td>
+<td style="text-align: center;">26</td>
+<td style="text-align: center;">7</td>
+<td style="text-align: center;">CE1</td>
+</tr>
+<tr>
+<td style="text-align: center;">ID_SD</td>
+<td style="text-align: center;">0</td>
+<td style="text-align: center;">27</td>
+<td style="text-align: center;">28</td>
+<td style="text-align: center;">1</td>
+<td style="text-align: center;">ID_SC</td>
+</tr>
+<tr>
+<td style="text-align: center;"><br></td>
+<td style="text-align: center;">5</td>
+<td style="text-align: center;">29</td>
+<td style="text-align: center;">30</td>
+<td style="text-align: center;">-</td>
+<td style="text-align: center;">Ground</td>
+</tr>
+<tr>
+<td style="text-align: center;"><br></td>
+<td style="text-align: center;">6</td>
+<td style="text-align: center;">31</td>
+<td style="text-align: center;">32</td>
+<td style="text-align: center;">12</td>
+<td style="text-align: center;"><br></td>
+</tr>
+<tr>
+<td style="text-align: center;"><br></td>
+<td style="text-align: center;">13</td>
+<td style="text-align: center;">33</td>
+<td style="text-align: center;">34</td>
+<td style="text-align: center;">-</td>
+<td style="text-align: center;">Ground</td>
+</tr>
+<tr>
+<td style="text-align: center;">miso</td>
+<td style="text-align: center;">19</td>
+<td style="text-align: center;">35</td>
+<td style="text-align: center;">36</td>
+<td style="text-align: center;">16</td>
+<td style="text-align: center;">ce2</td>
+</tr>
+<tr>
+<td style="text-align: center;"><br></td>
+<td style="text-align: center;">26</td>
+<td style="text-align: center;">37</td>
+<td style="text-align: center;">38</td>
+<td style="text-align: center;">20</td>
+<td style="text-align: center;">mosi</td>
+</tr>
+<tr>
+<td style="text-align: center;">Ground</td>
+<td style="text-align: center;">-</td>
+<td style="text-align: center;">39</td>
+<td style="text-align: center;">40</td>
+<td style="text-align: center;">21</td>
+<td style="text-align: center;">sclk</td>
+</tr>
+</tbody>
+</table>
+<br>
+<h4><a name="CM" id="CM"></a>Compute Module</h4>
+<p>All 54 GPIO may be physically accessed.&nbsp; Some are reserved
+for system use - refer to the Compute Module documentation.<br></p>
+<p>Only GPIO 0-31 are supported for hardware timed sampling, PWM,
+servo pulses, alert callbacks, waves, and software serial
+links.<br></p>
+<h3><a name="Other_Languages" id="Other_Languages"></a>Other
+Languages</h3>
+<p>There are several third party projects which provide wrappers
+for pigpio.<br></p>
+<p>Some are listed here:<br></p>
+<ul>
+<li><a href="https://github.com/skvamme/pigpio">Erlang</a>
+(skvamme)</li>
+<li><a href="https://github.com/mattjlewis/pigpioj">Java</a> JNI
+wrapper around the pigpio C library (mattlewis)</li>
+<li><a href="https://github.com/mattjlewis/diozero">Java</a> via
+diozero, a high level wrapper around pigpio, Pi4J, wiringPi etc
+(mattlewis)</li>
+<li><a href="https://github.com/nkolban/jpigpio">Java</a>
+(nkolban)</li>
+<li><a href=
+"https://github.com/unosquare/pigpio-dotnet">.NET/mono</a>
+(unosquare)</li>
+<li><a href="https://github.com/fivdi/pigpio">Node.js</a>
+A wrapper for the pigpio C library (fivdi)</li>
+<li><a href="https://github.com/guymcswain/pigpio-client">Node.js</a>
+A client for pigpio socket interface (guymcswain)</li>
+<li><a href="https://metacpan.org/pod/RPi::PIGPIO">Perl</a> (Gligan
+Calin Horea)</li>
+<li><a href=
+"https://github.com/nak1114/ruby-extension-pigpio">Ruby</a>
+(Nak)</li>
+<li><a href=
+"https://github.com/vasmalltalk/pigpio-vast">Smalltalk</a>(Instantiations)</li>
+<li><a href=
+"https://github.com/UBogun/Xojo-pigpio">Xojo</a>(UBogun)</li>
+<li><a href=
+"https://github.com/eugenedakin/pigpio-GPIO">Xojo</a>(Eugene Dakin)</li>
+</ul>
+<hr style="width: 100%; height: 2px;">
+<p><font size="-2">The PWM and servo pulses are timed using the DMA
+and PWM/PCM peripherals.&nbsp; This use was inspired by Richard
+Hirst's <a href="https://github.com/richardghirst/PiBits" target=
+"_blank">servoblaster</a> kernel module.</font></p>
+</body>
+</html>
diff --git a/DOC/src/html/misc.html b/DOC/src/html/misc.html
new file mode 100644
index 0000000..4c6f305
--- /dev/null
+++ b/DOC/src/html/misc.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta name="generator" content="Bluefish 2.2.10" >
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
+<title>Miscellaneous</title>
+</head>
+<body>
+There are two C libraries which provide a socket interface to the
+pigpio daemon.&nbsp; They provide an interface very similar to the
+pigpio Python module.<br>
+<ul>
+<li>The original <a href="./pdif.html">pigpiod_if</a> library is
+now deprecated and will no longer be updated.&nbsp; This library is
+limited to controlling one Pi at a time.</li>
+</ul>
+<ul>
+<li>The new <a href="./pdif2.html">pigpiod_if2</a> library which
+should be used for new code.&nbsp; This library allows multiple Pis
+to be controlled at one time.</li>
+</ul>
+Additional details of the pigpio <a href="./sif.html">socket</a>
+interface.<br>
+<br>
+Additional details of the pigpio <a href="./pif.html">pipe</a>
+interface.<br>
+<br>
+<a href="pig2vcd.html">pig2vcd</a> is a utility which converts
+pigpio notifications into the VCD (Value Change Dump) format.&nbsp;
+VCD can be read by many programs, in particular <a href=
+"http://gtkwave.sourceforge.net/">GTKWave</a>.
+</body>
+</html>
diff --git a/DOC/src/html/pif.html b/DOC/src/html/pif.html
new file mode 100644
index 0000000..bc924ff
--- /dev/null
+++ b/DOC/src/html/pif.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta name="generator" content="Bluefish 2.2.10" >
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
+<title>Pipe interface</title>
+</head>
+<body>
+pigpio provides a pipe interface to many of its functions.<br>
+<br>
+The pipe interface is available whenever pigpio is running, either
+because it has been started as a daemon, or it has been linked in
+to a running user program.&nbsp; The pipe interface can be disabled
+by the program which initialises the library.&nbsp; pigpiod offers
+the -f option to disable the pipe interface.&nbsp; User programs
+should call <a href=
+"http://abyz.me.uk/rpi/pigpio/cif.html#gpioCfgInterfaces">gpioCfgInterfaces</a>
+if they wish to disable the pipe interface.<br>
+<br>
+pigpio listens for commands on pipe /dev/pigpio.&nbsp; The commands
+consist of a command identifier with, depending on the command,
+zero, one, or two parameters.&nbsp; The result, if any, may be read
+from pipe /dev/pigout.&nbsp; If any errors are detected a message
+will be written to pipe /dev/pigerr.<br>
+<br>
+<br>
+The format of the commands is identical to those used by <a href=
+"pigs.html">pigs</a>.
+</body>
+</html>
diff --git a/DOC/src/html/piscope.html b/DOC/src/html/piscope.html
new file mode 100644
index 0000000..c381057
--- /dev/null
+++ b/DOC/src/html/piscope.html
@@ -0,0 +1,216 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+"http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+<meta name="generator" content=
+"HTML Tidy for HTML5 for Linux version 5.6.0">
+<meta content="text/html; charset=utf-8" http-equiv="content-type">
+<title>piscope</title>
+</head>
+<body>
+<h2>Introduction<br></h2>
+<a href="piscope.tar">piscope</a> is a logic analyser (digital
+waveform viewer) for the Raspberry.&nbsp; It shows the state (high
+or low) of selected GPIO in real-time.<br>
+<br>
+See <a href="http://youtu.be/2apqOiLHEzs">video</a>.<br>
+<br>
+piscope uses the services of the pigpio <a href=
+"download.html">library</a>.&nbsp; pigpio needs to be running on
+the Pi whose GPIO are to be monitored.<br>
+<br>
+The pigpio library may be started as a daemon (background process)
+by the following command.<br>
+<br>
+<code>sudo pigpiod<br></code><br>
+piscope may be invoked in several different ways<br>
+<br>
+<table summary="" style=
+"text-align: left; width: 90%; height: 246px;" cellspacing="2"
+cellpadding="2" border="1">
+<tbody>
+<tr>
+<td style="width: 15%;"><small>Pi<br></small></td>
+<td style="vertical-align: top; width: 55%;"><small><span style=
+"font-style: italic;">pi_host</span> ~ $ piscope
+&amp;<br></small></td>
+<td style="vertical-align: top; width: 30%;"><small>Pi captures
+data<br>
+Pi processes data<br>
+Pi displays data<br></small></td>
+</tr>
+<tr>
+<td style="vertical-align: top;"><small>Pi plus Linux PC<br>
+<br>
+(with the<br>
+display on a remote<br>
+&nbsp; Linux PC)<br></small></td>
+<td style="vertical-align: top;"><small><span style=
+"font-style: italic;">remote_host</span> ~ $ ssh -X <span style=
+"font-style: italic;">pi_host</span><br></small><small><span style=
+"font-style: italic;">pi_host</span> ~ $ piscope
+&amp;</small><small><br></small></td>
+<td style="vertical-align: top;"><small>Pi captures data<br>
+Pi processes data<br>
+Remote Linux PC displays data<br></small></td>
+</tr>
+<tr>
+<td style="vertical-align: top;"><small>Pi plus Windows PC<br>
+<br>
+(with the<br>
+display on a remote<br>
+&nbsp; Windows PC)</small></td>
+<td style="vertical-align: top;"><small>You need to install an SSH
+client (putty suggested) and a X11 server (xming suggested).<br>
+<br>
+Run Program Files -&gt; Xming -&gt; XLaunch and accept the
+defaults.<br>
+<br>
+Run putty and enter the Pi's host name or IP address.&nbsp; Click
+on SSH X11 and tick Enable X11 forwarding and then select
+Open.</small><br>
+<small><br></small> <small><span style=
+"font-style: italic;">pi_host</span> ~ $ piscope
+&amp;</small><br></td>
+<td style="vertical-align: top;"><small>Pi captures data<br>
+Pi processes data<br>
+Remote Windows PC displays data</small></td>
+</tr>
+<tr>
+<td style="vertical-align: top;"><small>Pi plus Linux PC<br>
+<br>
+(with the display and processing on a remote Linux
+PC)<br></small></td>
+<td style="vertical-align: top;"><small><span style=
+"font-style: italic;">remote_host</span> ~ $ export
+PIGPIO_ADDR=<span style="font-style: italic;">pi_host</span><br>
+<span style="font-style: italic;">remote_host</span> ~ $ piscope
+&amp;<br></small></td>
+<td style="vertical-align: top;"><small>Pi captures data<br>
+Remote processes data<br>
+Remote displays data<br></small></td>
+</tr>
+</tbody>
+</table>
+<br>
+piscope operates in one of three modes<br>
+<br>
+<table summary="" style="text-align: left; width: 90%;"
+cellspacing="2" cellpadding="2" border="1">
+<tbody>
+<tr>
+<td style="vertical-align: top;">Live<br></td>
+<td style="vertical-align: top;">The latest GPIO samples are
+displayed.<br>
+<br>
+The mode will automatically change to Pause if a sampling trigger
+is detected.<br>
+<br>
+There are four triggers.&nbsp; Each trigger is made up of a
+combination of GPIO states (one of don't care, low, high, edge,
+falling, or rising per GPIO).&nbsp; Triggers are always
+counted.&nbsp; In addition a trigger may be sample to, sample
+around, or sample from, a so called sampling trigger.<br></td>
+<td style="vertical-align: top;">New samples are added to the
+sample buffer.<br>
+<br>
+Once the sample buffer is full the <span style=
+"font-weight: bold;">oldest</span> samples are discarded.</td>
+</tr>
+<tr>
+<td style="vertical-align: top;">Play<br></td>
+<td style="vertical-align: top;">Recorded GPIO samples are
+displayed.<br>
+<br>
+The play speed may be varied between 64 times real-time to 1/32768
+of real-time.<br>
+<br>
+The page up key increases the play speed by a factor of 2.&nbsp;
+The page down key decreases the play speed by a factor of 2.&nbsp;
+The home key sets the play speed to 1X.<br></td>
+<td style="vertical-align: top;">New samples are added to the
+sample buffer.<br>
+<br>
+Once the sample buffer is full <span style=
+"font-weight: bold;">new</span> samples are discarded.</td>
+</tr>
+<tr>
+<td style="vertical-align: top;">Pause<br></td>
+<td style="vertical-align: top;">Recorded GPIO samples are
+displayed.<br>
+<br>
+The left and right cursor keys move the blue marker to the previous
+or next edge.&nbsp; By default all GPIO edges are considered.&nbsp;
+Clicking on a GPIO name will limit edge searches to the highlighted
+GPIO only.<br>
+<br>
+The left and right square bracket keys move the blue marker to the
+previous or next trigger.<br>
+<br>
+The time between the blue and gold markers is displayed.&nbsp; The
+gold marker is set to the blue marker by a press of the 'g'
+key.<br></td>
+<td style="vertical-align: top;">New samples are added to the
+sample buffer.<br>
+<br>
+Once the sample buffer is full <span style=
+"font-weight: bold;">new</span> samples are discarded.</td>
+</tr>
+</tbody>
+</table>
+<br>
+In all modes the down and up cursor keys zoom the time scale in and
+out.<br>
+<br>
+Samples can be saved with File Save All Samples or File Save
+Selected Samples.
+<p>To select samples enter pause mode. Press 1 to specify the start
+of the samples (green marker) and 2 to specify the end of the
+samples (red marker).</p>
+<p>The samples may be saved in the native piscope format or in VCD
+format.</p>
+<p>Data saved in VCD format may be viewed and further processed
+with GTKWave.</p>
+<p>Data saved in the native piscope format may be restored later
+with File Restore Saved Data.</p>
+<h2>Installation</h2>
+<p>To download and install piscope.</p>
+<h3>Pi (pre-built image)</h3>
+<code>wget abyz.me.uk/rpi/pigpio/piscope.tar<br>
+tar xvf piscope.tar<br>
+cd PISCOPE<br>
+make hf<br>
+make install</code><span style="font-weight: bold;"><br></span>
+<h3>Linux 64 bit X86/AMD (pre-built image)</h3>
+<code>wget abyz.me.uk/rpi/pigpio/piscope.tar<br>
+tar xvf piscope.tar<br>
+cd PISCOPE<br>
+make x86_64<br>
+make install<br></code>
+<h3>All machines (building from source)</h3>
+You only need to perform this step if you want to build the
+executable from the source files.&nbsp; This is not needed if you
+use a pre-built image.<br>
+<span style="font-weight: bold;"><br>
+WARNING</span>: Installing gtk+-3.0 uses a lot of SD card
+space.<br>
+<br>
+Most of the space used by gtk+-3.0 is taken up by unneeded *-dbg
+packages.<br>
+<br>
+With *-dbg packages an additional 3753MB SD space is required.<br>
+<br>
+If you edit the list of packages to be downloaded and remove the
+*-dbg packages only 134MB of additional SD space is needed (as at
+the time of writing).<br>
+<br>
+<code>#<br></code> <code># *** This may take a lot of time and use
+a lot of SD card space ***<br></code> <code>#<br>
+sudo apt-get install gtk+-3.0<br></code> <code>#<br></code>
+<code>wget abyz.me.uk/rpi/pigpio/piscope.tar<br>
+tar xvf piscope.tar<br>
+cd PISCOPE<br>
+make<br>
+make install<br></code><br>
+</body>
+</html>
diff --git a/DOC/src/html/sif.html b/DOC/src/html/sif.html
new file mode 100644
index 0000000..67b880b
--- /dev/null
+++ b/DOC/src/html/sif.html
@@ -0,0 +1,2004 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+"http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+<meta name="generator" content="Bluefish 2.2.10" >
+<meta content="text/html; charset=utf-8" http-equiv="content-type">
+<title>Socket interface</title>
+</head>
+<body>
+pigpio provides a socket interface to many of its functions.<br>
+<br>
+The socket interface is available whenever pigpio is running,
+either because it has been started as a daemon, or it has been
+linked in to a running user program.<br>
+<br>
+The socket interface can be disabled by the program which
+initialises the library.&nbsp; pigpiod offers the -k option to
+disable the socket interface.&nbsp; User programs should call
+<a href="cif.html#gpioCfgInterfaces">gpioCfgInterfaces</a> if they
+wish to disable the socket interface.<br>
+<br>
+pigpio listens for connections on port 8888 by default.&nbsp; This
+default may be overridden when pigpio starts by the <a href=
+"cif.html#gpioCfgSocketPort">gpioCfgSocketPort</a> function
+call.&nbsp; The pigpio daemon uses this function to provide an
+option to change the port number.<br>
+<br>
+The pigs utility is an example of using the socket interface from
+C.<span style="font-weight: bold;"><br></span>
+<h3><a name="Request" id="Request"></a>Request</h3>
+<p>pigpio expects messages of type <a href=
+"sif.html#cmdCmd_t">cmdCmd_t</a> immediately followed with an
+extension for a few commands.<br>
+<br>
+The caller should fill in cmd, p1, p2, p3/res, and any extension as
+needed.&nbsp; p3 will always be zero unless the command requires an
+extension in which case p3 will be the length in bytes of the
+extension.<br>
+<br>
+The <a href="sif.html#cmdCmd_t">cmdCmd_t</a> is echoed back with
+the result, if any, in p3/res, and an extension immediately
+afterwards for a few commands.<br></p>
+<table summary="" style="width: 80%;" cellspacing="2" cellpadding=
+"2" border="1">
+<tbody>
+<tr>
+<td style="font-weight: bold;">COMMAND</td>
+<td style="font-weight: bold;">cmd<br></td>
+<td style="font-weight: bold;">p1</td>
+<td style="font-weight: bold;">p2</td>
+<td style="font-weight: bold;">p3</td>
+<td style="font-weight: bold;">Extension<br></td>
+</tr>
+<tr>
+<td>MODES</td>
+<td>0</td>
+<td>gpio</td>
+<td>mode</td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>MODEG</td>
+<td>1</td>
+<td>gpio</td>
+<td>0</td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>PUD</td>
+<td>2</td>
+<td>gpio</td>
+<td>pud</td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>READ</td>
+<td>3</td>
+<td>gpio</td>
+<td>0</td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>WRITE</td>
+<td>4</td>
+<td>gpio</td>
+<td>level</td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>PWM</td>
+<td>5</td>
+<td>gpio</td>
+<td>dutycycle</td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>PRS</td>
+<td>6</td>
+<td>gpio</td>
+<td>range</td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>PFS</td>
+<td>7</td>
+<td>gpio</td>
+<td>frequency</td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>SERVO</td>
+<td>8</td>
+<td>gpio</td>
+<td>pulsewidth</td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>WDOG</td>
+<td>9</td>
+<td>gpio</td>
+<td>timeout</td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>BR1</td>
+<td>10</td>
+<td>0</td>
+<td>0</td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>BR2</td>
+<td>11</td>
+<td>0</td>
+<td>0</td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>BC1</td>
+<td>12</td>
+<td>bits</td>
+<td>0</td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>BC2</td>
+<td>13</td>
+<td>bits</td>
+<td>0</td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>BS1</td>
+<td>14</td>
+<td>bits</td>
+<td>0</td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>BS2</td>
+<td>15</td>
+<td>bits</td>
+<td>0</td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>TICK</td>
+<td>16</td>
+<td>0</td>
+<td>0</td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>HWVER</td>
+<td>17</td>
+<td>0</td>
+<td>0</td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>NO</td>
+<td>18</td>
+<td>0</td>
+<td>0</td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>NB</td>
+<td>19</td>
+<td>handle</td>
+<td>bits</td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>NP</td>
+<td>20</td>
+<td>handle</td>
+<td>0</td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>NC</td>
+<td>21</td>
+<td>handle</td>
+<td>0</td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>PRG</td>
+<td>22</td>
+<td>gpio</td>
+<td>0</td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>PFG</td>
+<td>23</td>
+<td>gpio</td>
+<td>0</td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>PRRG</td>
+<td>24</td>
+<td>gpio</td>
+<td>0</td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>HELP<br></td>
+<td>25</td>
+<td>N/A<br></td>
+<td>N/A<br></td>
+<td>N/A<br></td>
+<td>N/A<br></td>
+</tr>
+<tr>
+<td>PIGPV</td>
+<td>26</td>
+<td>0</td>
+<td>0</td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>WVCLR</td>
+<td>27</td>
+<td>0</td>
+<td>0</td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>WVAG</td>
+<td>28</td>
+<td>0</td>
+<td>0</td>
+<td>12*X</td>
+<td>gpioPulse_t pulse[X]</td>
+</tr>
+<tr>
+<td>WVAS</td>
+<td>29</td>
+<td>gpio</td>
+<td>baud</td>
+<td>12+X</td>
+<td>uint32_t databits<br>
+uint32_t stophalfbits<br>
+uint32_t offset<br>
+uint8_t data[X]</td>
+</tr>
+<tr>
+<td>N/A<br></td>
+<td>30</td>
+<td>0</td>
+<td>0</td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>N/A<br></td>
+<td>31</td>
+<td>0</td>
+<td>0</td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>WVBSY</td>
+<td>32</td>
+<td>0</td>
+<td>0</td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>WVHLT</td>
+<td>33</td>
+<td>0</td>
+<td>0</td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>WVSM</td>
+<td>34</td>
+<td>subcmd</td>
+<td>0</td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>WVSP</td>
+<td>35</td>
+<td>subcmd</td>
+<td>0</td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>WVSC</td>
+<td>36</td>
+<td>subcmd</td>
+<td>0</td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>TRIG</td>
+<td>37</td>
+<td>gpio</td>
+<td>pulselen</td>
+<td>4</td>
+<td>uint32_t level</td>
+</tr>
+<tr>
+<td>PROC</td>
+<td>38</td>
+<td>0</td>
+<td>0</td>
+<td>X</td>
+<td>uint8_t text[X]</td>
+</tr>
+<tr>
+<td>PROCD</td>
+<td>39</td>
+<td>script_id</td>
+<td>0</td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>PROCR</td>
+<td>40</td>
+<td>script_id</td>
+<td>0</td>
+<td>4*X<br></td>
+<td>uint32_t pars[X]<br></td>
+</tr>
+<tr>
+<td>PROCS</td>
+<td>41</td>
+<td>script_id</td>
+<td>0</td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>SLRO</td>
+<td>42</td>
+<td>gpio</td>
+<td>baud</td>
+<td>4</td>
+<td>uint32_t databits<br></td>
+</tr>
+<tr>
+<td>SLR</td>
+<td>43</td>
+<td>gpio</td>
+<td>count</td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>SLRC</td>
+<td>44</td>
+<td>gpio</td>
+<td>0</td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>PROCP</td>
+<td>45</td>
+<td>script_id</td>
+<td>0</td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>MICS</td>
+<td>46</td>
+<td>micros</td>
+<td>0</td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>MILS</td>
+<td>47</td>
+<td>millis</td>
+<td>0</td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>PARSE</td>
+<td>48</td>
+<td>N/A</td>
+<td>N/A<br></td>
+<td>N/A<br></td>
+<td>N/A</td>
+</tr>
+<tr>
+<td>WVCRE</td>
+<td>49</td>
+<td>0</td>
+<td>0</td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>WVDEL</td>
+<td>50</td>
+<td>wave_id</td>
+<td>0</td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>WVTX</td>
+<td>51</td>
+<td>wave_id</td>
+<td>0</td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>WVTXR</td>
+<td>52</td>
+<td>wave_id</td>
+<td>0</td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>WVNEW</td>
+<td>53</td>
+<td>0</td>
+<td>0</td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>I2CO</td>
+<td>54</td>
+<td>bus</td>
+<td>device</td>
+<td>4</td>
+<td>uint32_t flags</td>
+</tr>
+<tr>
+<td>I2CC</td>
+<td>55</td>
+<td>handle</td>
+<td>0</td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>I2CRD</td>
+<td>56</td>
+<td>handle</td>
+<td>count</td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>I2CWD</td>
+<td>57</td>
+<td>handle</td>
+<td>0</td>
+<td>X</td>
+<td>uint8_t data[X]</td>
+</tr>
+<tr>
+<td>I2CWQ</td>
+<td>58</td>
+<td>handle</td>
+<td>bit</td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>I2CRS</td>
+<td>59</td>
+<td>handle</td>
+<td>0</td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>I2CWS</td>
+<td>60</td>
+<td>handle</td>
+<td>byte</td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>I2CRB</td>
+<td>61</td>
+<td>handle</td>
+<td>register</td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>I2CWB</td>
+<td>62</td>
+<td>handle</td>
+<td>register</td>
+<td>4</td>
+<td>uint32_t byte</td>
+</tr>
+<tr>
+<td>I2CRW</td>
+<td>63</td>
+<td>handle</td>
+<td>register</td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>I2CWW</td>
+<td>64</td>
+<td>handle</td>
+<td>register</td>
+<td>4</td>
+<td>uint32_t word</td>
+</tr>
+<tr>
+<td>I2CRK</td>
+<td>65</td>
+<td>handle</td>
+<td>register<br></td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>I2CWK</td>
+<td>66</td>
+<td>handle</td>
+<td>register<br></td>
+<td>X</td>
+<td>uint8_t bvs[X]<br></td>
+</tr>
+<tr>
+<td>I2CRI</td>
+<td>67</td>
+<td>handle</td>
+<td>register<br></td>
+<td>4</td>
+<td>uint32_t num<br></td>
+</tr>
+<tr>
+<td>I2CWI</td>
+<td>68</td>
+<td>handle</td>
+<td>register<br></td>
+<td>X<br></td>
+<td>uint8_t bvs[X]<br></td>
+</tr>
+<tr>
+<td>I2CPC</td>
+<td>69</td>
+<td>handle</td>
+<td>register<br></td>
+<td>4</td>
+<td>uint32_t word<br></td>
+</tr>
+<tr>
+<td>I2CPK</td>
+<td>70</td>
+<td>handle</td>
+<td>register<br></td>
+<td>X<br></td>
+<td>uint8_t data[X]<br></td>
+</tr>
+<tr>
+<td>SPIO<br></td>
+<td>71</td>
+<td>channel</td>
+<td>baud</td>
+<td>4</td>
+<td>uint32_t flags</td>
+</tr>
+<tr>
+<td>SPIC</td>
+<td>72</td>
+<td>handle</td>
+<td>0</td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>SPIR</td>
+<td>73</td>
+<td>handle</td>
+<td>count</td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>SPIW</td>
+<td>74</td>
+<td>handle</td>
+<td>0</td>
+<td>X</td>
+<td>uint8_t data[X]</td>
+</tr>
+<tr>
+<td>SPIX</td>
+<td>75</td>
+<td>handle</td>
+<td>0</td>
+<td>X</td>
+<td>uint8_t data[X]</td>
+</tr>
+<tr>
+<td>SERO</td>
+<td>76</td>
+<td>baud</td>
+<td>flags</td>
+<td>X</td>
+<td>uint8_t device[X]</td>
+</tr>
+<tr>
+<td>SERC</td>
+<td>77</td>
+<td>handle</td>
+<td>0</td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>SERRB</td>
+<td>78</td>
+<td>handle</td>
+<td>0</td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>SERWB</td>
+<td>79</td>
+<td>handle</td>
+<td>byte</td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>SERR</td>
+<td>80</td>
+<td>handle</td>
+<td>count</td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>SERW</td>
+<td>81</td>
+<td>handle</td>
+<td>0</td>
+<td>X</td>
+<td>uint8_t data[X]</td>
+</tr>
+<tr>
+<td>SERDA</td>
+<td>82</td>
+<td>handle</td>
+<td>0</td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td style="vertical-align: top;">GDC<br></td>
+<td style="vertical-align: top;">83<br></td>
+<td style="vertical-align: top;">gpio<br></td>
+<td style="vertical-align: top;">0<br></td>
+<td style="vertical-align: top;">0<br></td>
+<td style="vertical-align: top;">-<br></td>
+</tr>
+<tr>
+<td style="vertical-align: top;">GPW<br></td>
+<td style="vertical-align: top;">84<br></td>
+<td style="vertical-align: top;">gpio<br></td>
+<td style="vertical-align: top;">0<br></td>
+<td style="vertical-align: top;">0<br></td>
+<td style="vertical-align: top;">-<br></td>
+</tr>
+<tr>
+<td style="vertical-align: top;">HC<br></td>
+<td style="vertical-align: top;">85<br></td>
+<td style="vertical-align: top;">gpio<br></td>
+<td style="vertical-align: top;">frequency<br></td>
+<td style="vertical-align: top;">0<br></td>
+<td style="vertical-align: top;">-<br></td>
+</tr>
+<tr>
+<td style="vertical-align: top;">HP<br></td>
+<td style="vertical-align: top;">86<br></td>
+<td style="vertical-align: top;">gpio<br></td>
+<td style="vertical-align: top;">frequency<br></td>
+<td style="vertical-align: top;">4<br></td>
+<td style="vertical-align: top;">uint32_t dutycycle<br></td>
+</tr>
+<tr>
+<td style="vertical-align: top;">CF1<br></td>
+<td style="vertical-align: top;">87<br></td>
+<td style="vertical-align: top;">arg1<br></td>
+<td style="vertical-align: top;">arg2<br></td>
+<td style="vertical-align: top;">X<br></td>
+<td style="vertical-align: top;">uint8_t argx[X]<br></td>
+</tr>
+<tr>
+<td style="vertical-align: top;">CF2<br></td>
+<td style="vertical-align: top;">88<br></td>
+<td style="vertical-align: top;">arg1<br></td>
+<td style="vertical-align: top;">retMax<br></td>
+<td style="vertical-align: top;">X<br></td>
+<td style="vertical-align: top;">uint8_t argx[X]<br></td>
+</tr>
+<tr>
+<td style="vertical-align: top;">BI2CC<br></td>
+<td style="vertical-align: top;">89<br></td>
+<td style="vertical-align: top;">sda<br></td>
+<td style="vertical-align: top;">0<br></td>
+<td style="vertical-align: top;">0<br></td>
+<td style="vertical-align: top;">-<br></td>
+</tr>
+<tr>
+<td style="vertical-align: top;">BI2CO<br></td>
+<td style="vertical-align: top;">90<br></td>
+<td style="vertical-align: top;">sda<br></td>
+<td style="vertical-align: top;">scl<br></td>
+<td style="vertical-align: top;">4<br></td>
+<td style="vertical-align: top;">uint32_t baud<br></td>
+</tr>
+<tr>
+<td style="vertical-align: top;">BI2CZ<br></td>
+<td style="vertical-align: top;">91<br></td>
+<td style="vertical-align: top;">sda<br></td>
+<td style="vertical-align: top;">0<br></td>
+<td style="vertical-align: top;">X<br></td>
+<td style="vertical-align: top;">uint8_t data[X]<br></td>
+</tr>
+<tr>
+<td style="vertical-align: top;">I2CZ<br></td>
+<td style="vertical-align: top;">92<br></td>
+<td style="vertical-align: top;">handle<br></td>
+<td style="vertical-align: top;">0<br></td>
+<td style="vertical-align: top;">X<br></td>
+<td style="vertical-align: top;">uint8_t data[X]<br></td>
+</tr>
+<tr>
+<td style="vertical-align: top;">WVCHA<br></td>
+<td style="vertical-align: top;">93<br></td>
+<td style="vertical-align: top;">0<br></td>
+<td style="vertical-align: top;">0<br></td>
+<td style="vertical-align: top;">X<br></td>
+<td style="vertical-align: top;">uint8_t data[X]<br></td>
+</tr>
+<tr>
+<td style="vertical-align: top;">SLRI<br></td>
+<td style="vertical-align: top;">94<br></td>
+<td style="vertical-align: top;">gpio<br></td>
+<td style="vertical-align: top;">invert<br></td>
+<td style="vertical-align: top;">0<br></td>
+<td style="vertical-align: top;">-<br></td>
+</tr>
+<tr>
+<td style="vertical-align: top;">CGI<br></td>
+<td style="vertical-align: top;">95<br></td>
+<td style="vertical-align: top;">0<br></td>
+<td style="vertical-align: top;">0<br></td>
+<td style="vertical-align: top;">0<br></td>
+<td style="vertical-align: top;">-<br></td>
+</tr>
+<tr>
+<td style="vertical-align: top;">CSI<br></td>
+<td style="vertical-align: top;">96<br></td>
+<td style="vertical-align: top;">config<br></td>
+<td style="vertical-align: top;">0<br></td>
+<td style="vertical-align: top;">0<br></td>
+<td style="vertical-align: top;">-<br></td>
+</tr>
+<tr>
+<td style="vertical-align: top;">FG<br></td>
+<td style="vertical-align: top;">97<br></td>
+<td style="vertical-align: top;">gpio<br></td>
+<td style="vertical-align: top;">steady<br></td>
+<td style="vertical-align: top;">0<br></td>
+<td style="vertical-align: top;">-<br></td>
+</tr>
+<tr>
+<td style="vertical-align: top;">FN<br></td>
+<td style="vertical-align: top;">98<br></td>
+<td style="vertical-align: top;">gpio<br></td>
+<td style="vertical-align: top;">steady<br></td>
+<td style="vertical-align: top;">4<br></td>
+<td style="vertical-align: top;">uint32_t active<br></td>
+</tr>
+<tr>
+<td>NOIB</td>
+<td>99</td>
+<td>0</td>
+<td>0</td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td style="vertical-align: top;">WVTXM<br></td>
+<td style="vertical-align: top;">100<br></td>
+<td style="vertical-align: top;">wave_id<br></td>
+<td style="vertical-align: top;">mode<br></td>
+<td style="vertical-align: top;">0<br></td>
+<td style="vertical-align: top;">-<br></td>
+</tr>
+<tr>
+<td style="vertical-align: top;">WVTAT<br></td>
+<td style="vertical-align: top;">101<br></td>
+<td style="vertical-align: top;">0<br></td>
+<td style="vertical-align: top;">0<br></td>
+<td style="vertical-align: top;">0<br></td>
+<td style="vertical-align: top;">-<br></td>
+</tr>
+<tr>
+<td style="vertical-align: top;">PADS<br></td>
+<td style="vertical-align: top;">102<br></td>
+<td style="vertical-align: top;">pad<br></td>
+<td style="vertical-align: top;">strength<br></td>
+<td style="vertical-align: top;">0<br></td>
+<td style="vertical-align: top;">-<br></td>
+</tr>
+<tr>
+<td style="vertical-align: top;">PADG<br></td>
+<td style="vertical-align: top;">103<br></td>
+<td style="vertical-align: top;">pad<br></td>
+<td style="vertical-align: top;">0<br></td>
+<td style="vertical-align: top;">0<br></td>
+<td style="vertical-align: top;">-<br></td>
+</tr>
+<tr>
+<td style="vertical-align: top;">FO<br></td>
+<td style="vertical-align: top;">104<br></td>
+<td style="vertical-align: top;">mode<br></td>
+<td style="vertical-align: top;">0<br></td>
+<td style="vertical-align: top;">X<br></td>
+<td style="vertical-align: top;">uint8_t file[X]<br></td>
+</tr>
+<tr>
+<td style="vertical-align: top;">FC<br></td>
+<td style="vertical-align: top;">105<br></td>
+<td style="vertical-align: top;">handle<br></td>
+<td style="vertical-align: top;">0<br></td>
+<td style="vertical-align: top;">0<br></td>
+<td style="vertical-align: top;">-<br></td>
+</tr>
+<tr>
+<td style="vertical-align: top;">FR<br></td>
+<td style="vertical-align: top;">106<br></td>
+<td style="vertical-align: top;">handle<br></td>
+<td style="vertical-align: top;">count<br></td>
+<td style="vertical-align: top;">0<br></td>
+<td style="vertical-align: top;">-<br></td>
+</tr>
+<tr>
+<td style="vertical-align: top;">FW<br></td>
+<td style="vertical-align: top;">107<br></td>
+<td style="vertical-align: top;">handle<br></td>
+<td style="vertical-align: top;">0<br></td>
+<td style="vertical-align: top;">X<br></td>
+<td style="vertical-align: top;">uint8_t data[X]<br></td>
+</tr>
+<tr>
+<td style="vertical-align: top;">FS<br></td>
+<td style="vertical-align: top;">108<br></td>
+<td style="vertical-align: top;">handle<br></td>
+<td style="vertical-align: top;">offset<br></td>
+<td style="vertical-align: top;">4<br></td>
+<td style="vertical-align: top;">uint32_t from<br></td>
+</tr>
+<tr>
+<td style="vertical-align: top;">FL<br></td>
+<td style="vertical-align: top;">109<br></td>
+<td style="vertical-align: top;">count<br></td>
+<td style="vertical-align: top;">0<br></td>
+<td style="vertical-align: top;">X<br></td>
+<td style="vertical-align: top;">uint8_t pattern[X]<br></td>
+</tr>
+<tr>
+<td style="vertical-align: top;">SHELL<br></td>
+<td style="vertical-align: top;">110<br></td>
+<td style="vertical-align: top;">len(name)<br></td>
+<td style="vertical-align: top;">0<br></td>
+<td style="vertical-align: top;">len(name)+<br>
+1+<br>
+len(string)<br></td>
+<td style="vertical-align: top;">uint8_t name[len(name)]<br>
+uint8_t null (0)<br>
+uint8_t string[len(string)]<br></td>
+</tr>
+<tr>
+<td style="vertical-align: top;">BSPIC<br></td>
+<td style="vertical-align: top;">111<br></td>
+<td style="vertical-align: top;">CS<br></td>
+<td style="vertical-align: top;">0<br></td>
+<td style="vertical-align: top;">0<br></td>
+<td style="vertical-align: top;">-<br></td>
+</tr>
+<tr>
+<td style="vertical-align: top;">BSPIO<br></td>
+<td style="vertical-align: top;">112<br></td>
+<td style="vertical-align: top;">CS<br></td>
+<td style="vertical-align: top;">0<br></td>
+<td style="vertical-align: top;">20<br></td>
+<td style="vertical-align: top;">uint32_t MISO<br>
+uint32_t MOSI<br>
+uint32_t SCLK<br>
+uint32_t baud<br>
+uint32_t spi_flags<br></td>
+</tr>
+<tr>
+<td style="vertical-align: top;">BSPIX<br></td>
+<td style="vertical-align: top;">113<br></td>
+<td style="vertical-align: top;">CS<br></td>
+<td style="vertical-align: top;">0<br></td>
+<td style="vertical-align: top;">X<br></td>
+<td style="vertical-align: top;">uint8_t data[X]<br></td>
+</tr>
+<tr>
+<td style="vertical-align: top;">BSCX<br></td>
+<td style="vertical-align: top;">114<br></td>
+<td style="vertical-align: top;">control<br></td>
+<td style="vertical-align: top;">0<br></td>
+<td style="vertical-align: top;">X<br></td>
+<td style="vertical-align: top;">uint8_t data[X]<br></td>
+</tr>
+<tr>
+<td style="vertical-align: top;">EVM<br></td>
+<td style="vertical-align: top;">115<br></td>
+<td style="vertical-align: top;">handle<br></td>
+<td style="vertical-align: top;">bits<br></td>
+<td style="vertical-align: top;">0<br></td>
+<td style="vertical-align: top;">-<br></td>
+</tr>
+<tr>
+<td style="vertical-align: top;">EVT<br></td>
+<td style="vertical-align: top;">116<br></td>
+<td style="vertical-align: top;">event<br></td>
+<td style="vertical-align: top;">0<br></td>
+<td style="vertical-align: top;">0<br></td>
+<td style="vertical-align: top;">-<br></td>
+</tr>
+<tr>
+<td valign="top">PROCU<br></td>
+<td valign="top">117<br></td>
+<td valign="top">script_id<br></td>
+<td valign="top">0<br></td>
+<td valign="top">4*X<br></td>
+<td valign="top">uint32_t pars[X]<br></td>
+</tr>
+</tbody>
+</table>
+<h3><a name="Response" id="Response"></a>Response</h3>
+<p>The response has cmd/p1/p2 as in the request.&nbsp; p3/res holds
+the return value.&nbsp; If the command returns additional values
+they will be in the immediately following extension.<br></p>
+Normally res should be treated as a 32 bit signed value and will be
+greater than or equal to zero.&nbsp; Upon failure res will be less
+than 0 and contains an error code.<br>
+<p>There are a few commands where the returned value should be
+treated as a 32 bit unsigned value.&nbsp; These commands can not
+fail.&nbsp; They are indicated with a * after the command
+name.<br></p>
+<p>Commands with an extension have the size of the extension in
+bytes returned in res (or &lt;0 on error as above).</p>
+<table summary="" style="width: 80%;" cellspacing="2" cellpadding=
+"2" border="1">
+<tbody>
+<tr>
+<td style="font-weight: bold;">COMMAND</td>
+<td style="font-weight: bold;">cmd<br></td>
+<td style="vertical-align: top; font-weight: bold;">p1<br></td>
+<td style="vertical-align: top; font-weight: bold;">p2<br></td>
+<td style="font-weight: bold;">res<br></td>
+<td style="font-weight: bold;">Extension<br></td>
+</tr>
+<tr>
+<td>MODES</td>
+<td>0</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>MODEG</td>
+<td>1</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>mode<br></td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>PUD</td>
+<td>2</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>READ</td>
+<td>3</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>level<br></td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>WRITE</td>
+<td>4</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>PWM</td>
+<td>5</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>PRS</td>
+<td>6</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>PFS</td>
+<td>7</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>SERVO</td>
+<td>8</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>WDOG</td>
+<td>9</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>BR1 *</td>
+<td>10</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>bits<br></td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>BR2 *</td>
+<td>11</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>bits<br></td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>BC1</td>
+<td>12</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>BC2</td>
+<td>13</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>BS1</td>
+<td>14</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>BS2</td>
+<td>15</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>TICK *<br></td>
+<td>16</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>tick<br></td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>HWVER *<br></td>
+<td>17</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>version<br></td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>NO</td>
+<td>18</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>handle<br></td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>NB</td>
+<td>19</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>NP</td>
+<td>20</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>NC</td>
+<td>21</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>PRG</td>
+<td>22</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>range<br></td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>PFG</td>
+<td>23</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>frequency<br></td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>PRRG</td>
+<td>24</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>real range<br></td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>HELP</td>
+<td>25</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>N/A<br></td>
+<td>N/A<br></td>
+</tr>
+<tr>
+<td>PIGPV *<br></td>
+<td>26</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>version<br></td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>WVCLR</td>
+<td>27</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>WVAG</td>
+<td>28</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>wave pulses<br></td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>WVAS</td>
+<td>29</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>wave pulses<br></td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>N/A<br></td>
+<td>30</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>-<br></td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>N/A<br></td>
+<td>31</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>-<br></td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>WVBSY</td>
+<td>32</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>busy (1) or not busy (0)<br></td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>WVHLT</td>
+<td>33</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>WVSM</td>
+<td>34</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>wave micros<br>
+wave micros - high<br>
+wave micros - max<br></td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>WVSP</td>
+<td>35</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>wave pulses<br>
+wave pulses - high<br>
+wave pulses - max<br></td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>WVSC</td>
+<td>36</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>wave DMA CBs<br>
+wave DMA CBs - high<br>
+wave DMA CBs - max<br></td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>TRIG</td>
+<td>37</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>0<br></td>
+<td>-</td>
+</tr>
+<tr>
+<td>PROC</td>
+<td>38</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>script id<br></td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>PROCD</td>
+<td>39</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>PROCR</td>
+<td>40</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>script status<br></td>
+<td>-</td>
+</tr>
+<tr>
+<td>PROCS</td>
+<td>41</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>SLRO</td>
+<td>42</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>0<br></td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>SLR</td>
+<td>43</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>X<br></td>
+<td>uint8_t data[X]<br></td>
+</tr>
+<tr>
+<td>SLRC</td>
+<td>44</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>PROCP</td>
+<td>45</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>44</td>
+<td>uint32_t script_status<br>
+uint32_t pars[10]<br></td>
+</tr>
+<tr>
+<td>MICS</td>
+<td>46</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>MILS</td>
+<td>47</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>PARSE</td>
+<td>48</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>N/A<br></td>
+<td>-</td>
+</tr>
+<tr>
+<td>WVCRE</td>
+<td>49</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>wave id<br></td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>WVDEL</td>
+<td>50</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>WVTX</td>
+<td>51</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>wave DMA CBs<br></td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>WVTXR</td>
+<td>52</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>wave DMA CBs<br></td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>WVNEW</td>
+<td>53</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>I2CO</td>
+<td>54</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>handle</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>I2CC</td>
+<td>55</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>I2CRD</td>
+<td>56</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>X<br></td>
+<td>uint8_t data[X]<br></td>
+</tr>
+<tr>
+<td>I2CWD</td>
+<td>57</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>0<br></td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>I2CWQ</td>
+<td>58</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>I2CRS</td>
+<td>59</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>byte value<br></td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>I2CWS</td>
+<td>60</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>I2CRB</td>
+<td>61</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>byte value<br></td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>I2CWB</td>
+<td>62</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>0<br></td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>I2CRW</td>
+<td>63</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>word value<br></td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>I2CWW</td>
+<td>64</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>0<br></td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>I2CRK</td>
+<td>65</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>I2CWK</td>
+<td>66</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>0<br></td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>I2CRI</td>
+<td>67</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>X<br></td>
+<td>uint8_t data[X]<br></td>
+</tr>
+<tr>
+<td>I2CWI</td>
+<td>68</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>0<br></td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>I2CPC</td>
+<td>69</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>word value<br></td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>I2CPK</td>
+<td>70</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>X<br></td>
+<td>uint8_t data[X]<br></td>
+</tr>
+<tr>
+<td>SPIO<br></td>
+<td>71</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>handle<br></td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>SPIC</td>
+<td>72</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>SPIR</td>
+<td>73</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>X<br></td>
+<td>uint8_t data[X]<br></td>
+</tr>
+<tr>
+<td>SPIW</td>
+<td>74</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>0<br></td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>SPIX</td>
+<td>75</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>X</td>
+<td>uint8_t data[X]</td>
+</tr>
+<tr>
+<td>SERO</td>
+<td>76</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>handle<br></td>
+<td>-</td>
+</tr>
+<tr>
+<td>SERC</td>
+<td>77</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>SERRB</td>
+<td>78</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>byte value<br></td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>SERWB</td>
+<td>79</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>SERR</td>
+<td>80</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>X<br></td>
+<td>uint8_t data[X]<br></td>
+</tr>
+<tr>
+<td>SERW</td>
+<td>81</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>0<br></td>
+<td>-<br></td>
+</tr>
+<tr>
+<td>SERDA</td>
+<td>82</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>data ready count<br></td>
+<td>-<br></td>
+</tr>
+<tr>
+<td style="vertical-align: top;">GDC<br></td>
+<td style="vertical-align: top;">83<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">dutycycle<br></td>
+<td style="vertical-align: top;">-<br></td>
+</tr>
+<tr>
+<td style="vertical-align: top;">GPW<br></td>
+<td style="vertical-align: top;">84<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">pulsewidth<br></td>
+<td style="vertical-align: top;">-<br></td>
+</tr>
+<tr>
+<td style="vertical-align: top;">HC<br></td>
+<td style="vertical-align: top;">85<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">0<br></td>
+<td style="vertical-align: top;">-<br></td>
+</tr>
+<tr>
+<td style="vertical-align: top;">HP<br></td>
+<td style="vertical-align: top;">86<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">0<br></td>
+<td style="vertical-align: top;">-<br></td>
+</tr>
+<tr>
+<td style="vertical-align: top;">CF1<br></td>
+<td style="vertical-align: top;">87<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">value<br></td>
+<td style="vertical-align: top;">-<br></td>
+</tr>
+<tr>
+<td style="vertical-align: top;">CF2<br></td>
+<td style="vertical-align: top;">88<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">X<br></td>
+<td style="vertical-align: top;">uint8_t retBuf[X]<br></td>
+</tr>
+<tr>
+<td style="vertical-align: top;">BI2CC<br></td>
+<td style="vertical-align: top;">89<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">0<br></td>
+<td style="vertical-align: top;">-<br></td>
+</tr>
+<tr>
+<td style="vertical-align: top;">BI2CO<br></td>
+<td style="vertical-align: top;">90<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">handle<br></td>
+<td style="vertical-align: top;">-<br></td>
+</tr>
+<tr>
+<td style="vertical-align: top;">BI2CZ<br></td>
+<td style="vertical-align: top;">91<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">X<br></td>
+<td style="vertical-align: top;">uint8_t data[X]<br></td>
+</tr>
+<tr>
+<td style="vertical-align: top;">I2CZ<br></td>
+<td style="vertical-align: top;">92<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">X<br></td>
+<td style="vertical-align: top;">uint8_t data[X]<br></td>
+</tr>
+<tr>
+<td style="vertical-align: top;">WVCHA<br></td>
+<td style="vertical-align: top;">93<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">0<br></td>
+<td style="vertical-align: top;">-<br></td>
+</tr>
+<tr>
+<td style="vertical-align: top;">SLRI<br></td>
+<td style="vertical-align: top;">94<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">0<br></td>
+<td style="vertical-align: top;">-<br></td>
+</tr>
+<tr>
+<td style="vertical-align: top;">CGI<br></td>
+<td style="vertical-align: top;">95<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">config<br></td>
+<td style="vertical-align: top;">-<br></td>
+</tr>
+<tr>
+<td style="vertical-align: top;">CSI<br></td>
+<td style="vertical-align: top;">96<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">0<br></td>
+<td style="vertical-align: top;">-<br></td>
+</tr>
+<tr>
+<td style="vertical-align: top;">FG<br></td>
+<td style="vertical-align: top;">97<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">0<br></td>
+<td style="vertical-align: top;">-<br></td>
+</tr>
+<tr>
+<td style="vertical-align: top;">FN<br></td>
+<td style="vertical-align: top;">98<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">0<br></td>
+<td style="vertical-align: top;">-<br></td>
+</tr>
+<tr>
+<td>NOIB</td>
+<td>99</td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td>0</td>
+<td>-<br></td>
+</tr>
+<tr>
+<td style="vertical-align: top;">WVTXM<br></td>
+<td style="vertical-align: top;">100<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">wave DMA CBs<br></td>
+<td style="vertical-align: top;">-<br></td>
+</tr>
+<tr>
+<td style="vertical-align: top;">WVTAT<br></td>
+<td style="vertical-align: top;">101<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">wave id<br></td>
+<td style="vertical-align: top;">-<br></td>
+</tr>
+<tr>
+<td style="vertical-align: top;">PADS<br></td>
+<td style="vertical-align: top;">102<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">0<br></td>
+<td style="vertical-align: top;">-<br></td>
+</tr>
+<tr>
+<td style="vertical-align: top;">PADG<br></td>
+<td style="vertical-align: top;">103<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">strength<br></td>
+<td style="vertical-align: top;">-<br></td>
+</tr>
+<tr>
+<td style="vertical-align: top;">FO<br></td>
+<td style="vertical-align: top;">104<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">handle<br></td>
+<td style="vertical-align: top;">-<br></td>
+</tr>
+<tr>
+<td style="vertical-align: top;">FC<br></td>
+<td style="vertical-align: top;">105<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">0<br></td>
+<td style="vertical-align: top;">-<br></td>
+</tr>
+<tr>
+<td style="vertical-align: top;">FR<br></td>
+<td style="vertical-align: top;">106<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">X<br></td>
+<td style="vertical-align: top;">uint8_t data[X]<br></td>
+</tr>
+<tr>
+<td style="vertical-align: top;">FW<br></td>
+<td style="vertical-align: top;">107<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">0<br></td>
+<td style="vertical-align: top;">-<br></td>
+</tr>
+<tr>
+<td style="vertical-align: top;">FS<br></td>
+<td style="vertical-align: top;">108<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">position<br></td>
+<td style="vertical-align: top;">-<br></td>
+</tr>
+<tr>
+<td style="vertical-align: top;">FL<br></td>
+<td style="vertical-align: top;">109<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">X<br></td>
+<td style="vertical-align: top;">uint8_t filenames[X]<br></td>
+</tr>
+<tr>
+<td style="vertical-align: top;">SHELL<br></td>
+<td style="vertical-align: top;">110<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">exit status<br></td>
+<td style="vertical-align: top;">-<br></td>
+</tr>
+<tr>
+<td style="vertical-align: top;">BSPIC<br></td>
+<td style="vertical-align: top;">111<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">0<br></td>
+<td style="vertical-align: top;">-<br></td>
+</tr>
+<tr>
+<td style="vertical-align: top;">BSPIO<br></td>
+<td style="vertical-align: top;">112<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">0<br></td>
+<td style="vertical-align: top;">-<br></td>
+</tr>
+<tr>
+<td style="vertical-align: top;">BSPIX<br></td>
+<td style="vertical-align: top;">113<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">X<br></td>
+<td style="vertical-align: top;">uint8_t data[X]</td>
+</tr>
+<tr>
+<td style="vertical-align: top;">BSCX<br></td>
+<td style="vertical-align: top;">114<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">X+4<br></td>
+<td style="vertical-align: top;">uint32_t status<br>
+uint8_t data[X]</td>
+</tr>
+<tr>
+<td style="vertical-align: top;">EVM<br></td>
+<td style="vertical-align: top;">115<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">0<br></td>
+<td style="vertical-align: top;">-<br></td>
+</tr>
+<tr>
+<td style="vertical-align: top;">EVT<br></td>
+<td style="vertical-align: top;">116<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">-<br></td>
+<td style="vertical-align: top;">0<br></td>
+<td style="vertical-align: top;">-<br></td>
+</tr>
+<tr>
+<td valign="top">PROCU<br></td>
+<td valign="top">117<br></td>
+<td valign="top">-<br></td>
+<td valign="top">-<br></td>
+<td valign="top">0<br></td>
+<td valign="top">-<br></td>
+</tr>
+</tbody>
+</table>
+<code><br></code>
+<h3><a name="cmdCmd_t" id="cmdCmd_t"></a>cmdCmd_t</h3>
+<code>typedef struct<br>
+{<br>
+&nbsp;&nbsp; uint32_t cmd;<br>
+&nbsp;&nbsp; uint32_t p1;<br>
+&nbsp;&nbsp; uint32_t p2;<br>
+&nbsp;&nbsp; union<br>
+&nbsp;&nbsp; {<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uint32_t p3;<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uint32_t ext_len;<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uint32_t res;<br>
+&nbsp;&nbsp; };<br>
+} cmdCmd_t;<br></code><br>
+</body>
+</html>