ao-tools: Add ao-sky-flash to update GPS firmware
authorKeith Packard <keithp@keithp.com>
Sat, 1 Dec 2012 01:36:40 +0000 (17:36 -0800)
committerKeith Packard <keithp@keithp.com>
Sat, 1 Dec 2012 01:36:40 +0000 (17:36 -0800)
This uses a new feature of AltOS to directly connect the GPS chip to
the USB link to reprogram the former.

Signed-off-by: Keith Packard <keithp@keithp.com>
14 files changed:
ao-tools/Makefile.am
ao-tools/ao-sky-flash/Makefile.am [new file with mode: 0644]
ao-tools/ao-sky-flash/STI_01.04.42-01.10.23_4x_9600_Bin_20100901.bin [new file with mode: 0644]
ao-tools/ao-sky-flash/STI_01.06.10-01.07.23_balloon_CRC_7082_9600_20120913.bin [new file with mode: 0644]
ao-tools/ao-sky-flash/ao-sky-flash.1 [new file with mode: 0644]
ao-tools/ao-sky-flash/sky_bin.c [new file with mode: 0644]
ao-tools/ao-sky-flash/sky_debug.c [new file with mode: 0644]
ao-tools/ao-sky-flash/sky_flash.c [new file with mode: 0644]
ao-tools/ao-sky-flash/sky_flash.h [new file with mode: 0644]
ao-tools/ao-sky-flash/sky_serial.c [new file with mode: 0644]
ao-tools/ao-sky-flash/sky_srec.c [new file with mode: 0644]
ao-tools/ao-sky-flash/srec_115200.bin [new file with mode: 0644]
ao-tools/ao-sky-flash/srec_9600.bin [new file with mode: 0644]
configure.ac

index 257fdaece07f7d4a060c1125cdd305700a8faaba..871b8205705757aa1b86f1045474316435bfc993 100644 (file)
@@ -1 +1 @@
-SUBDIRS=lib ao-rawload ao-dbg ao-bitbang ao-eeprom ao-list ao-load ao-telem ao-stmload ao-send-telem
+SUBDIRS=lib ao-rawload ao-dbg ao-bitbang ao-eeprom ao-list ao-load ao-telem ao-stmload ao-send-telem ao-sky-flash
diff --git a/ao-tools/ao-sky-flash/Makefile.am b/ao-tools/ao-sky-flash/Makefile.am
new file mode 100644 (file)
index 0000000..f6c5089
--- /dev/null
@@ -0,0 +1,18 @@
+bin_PROGRAMS=ao-sky-flash
+
+AM_CFLAGS=-I$(top_srcdir)/ao-tools/lib $(LIBUSB_CFLAGS)
+AO_SKY_FLASH_LIBS=$(top_builddir)/ao-tools/lib/libao-tools.a
+
+ao_sky_flash_DEPENDENCIES = $(AO_SKY_FLASH_LIBS)
+
+ao_sky_flash_LDADD=$(AO_SKY_FLASH_LIBS) $(LIBUSB_LIBS)
+
+ao_sky_flash_SOURCES = \
+       sky_bin.c \
+       sky_debug.c \
+       sky_flash.c \
+       sky_flash.h \
+       sky_serial.c \
+       sky_srec.c
+
+man_MANS = ao-sky-flash.1
diff --git a/ao-tools/ao-sky-flash/STI_01.04.42-01.10.23_4x_9600_Bin_20100901.bin b/ao-tools/ao-sky-flash/STI_01.04.42-01.10.23_4x_9600_Bin_20100901.bin
new file mode 100644 (file)
index 0000000..c698add
Binary files /dev/null and b/ao-tools/ao-sky-flash/STI_01.04.42-01.10.23_4x_9600_Bin_20100901.bin differ
diff --git a/ao-tools/ao-sky-flash/STI_01.06.10-01.07.23_balloon_CRC_7082_9600_20120913.bin b/ao-tools/ao-sky-flash/STI_01.06.10-01.07.23_balloon_CRC_7082_9600_20120913.bin
new file mode 100644 (file)
index 0000000..9e25689
Binary files /dev/null and b/ao-tools/ao-sky-flash/STI_01.06.10-01.07.23_balloon_CRC_7082_9600_20120913.bin differ
diff --git a/ao-tools/ao-sky-flash/ao-sky-flash.1 b/ao-tools/ao-sky-flash/ao-sky-flash.1
new file mode 100644 (file)
index 0000000..d61c9c9
--- /dev/null
@@ -0,0 +1,85 @@
+.\"
+.\" Copyright © 2009 Keith Packard <keithp@keithp.com>
+.\"
+.\" This program is free software; you can redistribute it and/or modify
+.\" it under the terms of the GNU General Public License as published by
+.\" the Free Software Foundation; either version 2 of the License, or
+.\" (at your option) any later version.
+.\"
+.\" This program is distributed in the hope that it will be useful, but
+.\" WITHOUT ANY WARRANTY; without even the implied warranty of
+.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+.\" General Public License for more details.
+.\"
+.\" You should have received a copy of the GNU General Public License along
+.\" with this program; if not, write to the Free Software Foundation, Inc.,
+.\" 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+.\"
+.\"
+.TH AO-SKY-FLASH 1 "ao-sky-flash" ""
+.SH NAME
+ao-sky-flash \- flash GPS firmware program to a SkyTraq GPS chip
+.SH SYNOPSIS
+.B "ao-sky-flash"
+[\-T \fItty-device\fP]
+[\--tty \fItty-device\fP]
+[\-D \fIaltos-device\fP]
+[\--device \fIaltos-device\fP]
+[\--loader \fIboot-loader\fP]
+[\--firmware \fIgps-firmware\fP]
+[\--query]
+[\--quiet]
+[\--raw]
+.SH DESCRIPTION
+.I ao-sky-flash
+loads the specified GPS firmware file into the target GPS chip flash
+memory using the specified boot loader.
+.SH OPTIONS
+.TP
+\-T tty-device | --tty tty-device
+This selects which tty device the debugger uses to communicate with
+the target device.
+.TP
+\-D AltOS-device | --device AltOS-device
+Search for a connected device. This requires an argument of one of the
+following forms:
+.IP
+TeleMetrum:2
+.br
+TeleMetrum
+.br
+2
+.IP
+Leaving out the product name will cause the tool to select a suitable
+product, leaving out the serial number will cause the tool to match
+one of the available devices.
+.TP
+\--loader boot-loader
+This specifies the desired boot loader to use for reflashing the
+device. You should use srec_115200.bin unless you have a good reason
+not to. This should be in S record format.
+.TP
+\--firmware gps-firmware
+This specifies the new GPS firmware image to load onto the target GPS
+chip. No checking is done on this device at all; flash garbage and the
+GPS chip will probably fail to boot.
+.TP
+\--query
+Instead of loading new firmware, query the current version of firmware
+running on the target device.
+.TP
+\--quiet
+Normally, ao-spy-flash is quite chatty. This shuts it up, except for
+error messages.
+.TP
+\--raw
+The expected target for reflashing is an Altus Metrum product with the
+GPS chip connected to the CPU on that board and not directly to the
+USB serial port. This option says that the target GPS chip is directly
+connected, which changes how things are initialized a bit.
+.SH USAGE
+.I ao-sky-flash
+loads the specified bootloader into device RAM and then uses that to
+load new firmware to flash.
+.SH AUTHOR
+Keith Packard
diff --git a/ao-tools/ao-sky-flash/sky_bin.c b/ao-tools/ao-sky-flash/sky_bin.c
new file mode 100644 (file)
index 0000000..e693c89
--- /dev/null
@@ -0,0 +1,75 @@
+/*
+ * Copyright © 2012 Keith Packard <keithp@keithp.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+#include "sky_flash.h"
+#include <stdio.h>
+#include <string.h>
+
+#define FLASHBYTES     8192
+
+int
+skytraq_send_bin(int fd, const char *filename)
+{
+       FILE            *file;
+       char            buf[FLASHBYTES];
+       int             count;
+       unsigned char   cksum;
+       int             c;
+       long            size;
+       long            pos;
+       char            message[1024];
+       int             ret;
+       
+       file = fopen(filename, "r");
+       if (!file) {
+               perror(filename);
+               return -1;
+       }
+
+       printf ("computing checksum...\n"); fflush(stdout);
+       /* Compute checksum, figure out how long the file */
+       cksum = 0;
+       while ((c = getc(file)) != EOF)
+               cksum += (unsigned char) c;
+       size = ftell(file);
+       rewind(file);
+       printf ("checksum: %d\n", cksum); fflush(stdout);
+
+       sprintf(message, "BINSIZE = %d Checksum = %d Loopnumber = %d ", size, cksum, 1);
+
+       ret = skytraq_cmd_wait(fd, message, strlen(message) + 1, "OK", 20000);
+       if (ret < 0)
+               printf ("waitstatus failed %d\n", ret);
+
+       pos = 0;
+       for (;;) {
+               count = fread(buf, 1, sizeof (buf), file);
+               if (count < 0) {
+                       perror("fread");
+                       fclose(file);
+                       return -1;
+               }
+               if (count == 0)
+                       break;
+               printf ("write %ld of %ld ", pos + count, size); fflush(stdout);
+               pos += count;
+               ret = skytraq_cmd_wait(fd, buf, count, "OK", 20000);
+               if (ret < 0)
+                       return ret;
+       }
+       return skytraq_waitstatus(fd, "END", 30000);
+}
diff --git a/ao-tools/ao-sky-flash/sky_debug.c b/ao-tools/ao-sky-flash/sky_debug.c
new file mode 100644 (file)
index 0000000..32571f0
--- /dev/null
@@ -0,0 +1,111 @@
+/*
+ * Copyright © 2012 Keith Packard <keithp@keithp.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+#include <stdint.h>
+#include <unistd.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/time.h>
+#include "sky_flash.h"
+
+static int     dbg_input;
+static int     dbg_newline = 1;
+
+int
+skytraq_millis(void)
+{
+       struct timeval  tv;
+       gettimeofday(&tv, NULL);
+       return tv.tv_sec * 1000 + tv.tv_usec / 1000;
+}
+
+static void
+skytraq_dbg_time(void)
+{
+       int     delta = skytraq_millis() - skytraq_open_time;
+
+       if (!skytraq_verbose)
+               return;
+       printf ("%4d.%03d ", delta / 1000, delta % 1000);
+}
+
+void
+skytraq_dbg_newline(void)
+{
+       if (!skytraq_verbose)
+               return;
+       if (!dbg_newline) {
+               putchar('\n');
+               dbg_newline = 1;
+       }
+}
+
+static void
+skytraq_dbg_set(int input)
+{
+       if (!skytraq_verbose)
+               return;
+       if (input != dbg_input) {
+               skytraq_dbg_newline();
+               if (input)
+                       putchar('\t');
+               dbg_input = input;
+       }
+}
+
+void
+skytraq_dbg_char(int input, char c)
+{
+       if (!skytraq_verbose)
+               return;
+       skytraq_dbg_set(input);
+       if (dbg_newline)
+               skytraq_dbg_time();
+       if (c < ' '  || c > '~')
+               printf ("\\%02x", (unsigned char) c);
+       else
+               putchar(c);
+       dbg_newline = 0;
+       if (c == '\n')
+               dbg_input = 2;
+       fflush(stdout);
+}
+
+void
+skytraq_dbg_buf(int input, const char *buf, int len)
+{
+       if (!skytraq_verbose)
+               return;
+       while (len--)
+               skytraq_dbg_char(input, *buf++);
+}
+
+void
+skytraq_dbg_printf(int input, const char *fmt, ...)
+{
+       va_list ap;
+
+       if (!skytraq_verbose)
+               return;
+       skytraq_dbg_set(input);
+       if (dbg_newline)
+               skytraq_dbg_time();
+       va_start (ap, fmt);
+       vprintf(fmt, ap);
+       va_end(ap);
+       dbg_newline = 0;
+}
diff --git a/ao-tools/ao-sky-flash/sky_flash.c b/ao-tools/ao-sky-flash/sky_flash.c
new file mode 100644 (file)
index 0000000..55cb2cb
--- /dev/null
@@ -0,0 +1,259 @@
+/*
+ * Copyright © 2012 Keith Packard <keithp@keithp.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+#include "sky_flash.h"
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <stdarg.h>
+#include <getopt.h>
+#include "cc.h"
+
+static const struct option options[] = {
+       { .name = "tty", .has_arg = 1, .val = 'T' },
+       { .name = "device", .has_arg = 1, .val = 'D' },
+       { .name = "loader", .has_arg = 1, .val = 'l' },
+       { .name = "firmware", .has_arg = 1, .val = 'f' },
+       { .name = "query", .has_arg = 0, .val = 'q' },
+       { .name = "raw", .has_arg = 0, .val = 'r' },
+       { .name = "quiet", .has_arg = 0, .val = 'Q' },
+       { 0, 0, 0, 0},
+};
+
+static uint8_t query_version[] = {
+       0xa0, 0xa1, 0x00, 0x02, 0x02, 0x01, 0x03, 0x0d, 0x0a
+};
+
+static void
+usage(char *program)
+{
+       fprintf(stderr,
+               "usage: %s [--tty <tty-name>]\n"
+               "          [--device <device-name>]\n"
+               "          [--loader <srec bootloader file>]\n"
+               "          [--firmware <binary firmware file>]\n"
+               "          [--query]\n"
+               "          [--quiet]\n"
+               "          [--raw]\n", program);
+       exit(1);
+}
+
+int
+skytraq_expect(int fd, uint8_t want, int timeout) {
+       int     c;
+
+       c = skytraq_waitchar(fd, timeout);
+       if (c < 0)
+               return -1;
+       if (c == want)
+               return 1;
+       return 0;
+}
+
+int
+skytraq_wait_reply(int fd, uint8_t reply, uint8_t *buf, uint8_t reply_len) {
+
+       for(;;) {
+               uint8_t a, b;
+               uint8_t cksum_computed, cksum_read;
+               int     len;
+               switch (skytraq_expect(fd, 0xa0, 10000)) {
+               case -1:
+                       return -1;
+               case 0:
+                       continue;
+               case 1:
+                       break;
+               }
+               switch (skytraq_expect(fd, 0xa1, 1000)) {
+               case -1:
+                       return -1;
+               case 0:
+                       continue;
+               }
+               a = skytraq_waitchar(fd, 1000);
+               b = skytraq_waitchar(fd, 1000);
+               switch (skytraq_expect(fd, reply, 1000)) {
+               case -1:
+                       return -1;
+               case 0:
+                       continue;
+               }
+               len = (a << 16) | b;
+               if (len != reply_len)
+                       continue;
+               *buf++ = reply;
+               len--;
+               cksum_computed = reply;
+               while (len--) {
+                       a = skytraq_waitchar(fd, 1000);
+                       if (a < 0)
+                               return a;
+                       cksum_computed ^= a;
+                       *buf++ = a;
+               }
+               switch (skytraq_expect(fd, cksum_computed, 1000)) {
+               case -1:
+                       return -1;
+               case 0:
+                       continue;
+               }
+               switch (skytraq_expect(fd, 0x0d, 1000)) {
+               case -1:
+                       return -1;
+               case 0:
+                       continue;
+               }
+               switch (skytraq_expect(fd, 0x0a, 1000)) {
+               case -1:
+                       return -1;
+               case 0:
+                       continue;
+               }
+               break;
+       }
+       return 0;
+}
+
+int
+main(int argc, char **argv)
+{
+       int     fd;
+       char    buf[512];
+       int     ret;
+       FILE    *input;
+       long    size;
+       unsigned char   cksum;
+       int     c;
+       char    message[1024];
+       char    *tty = NULL;
+       char    *device = NULL;
+       char    *loader = "srec_115200.bin";
+       char    *file = NULL;
+       int     query = 0;
+       int     raw = 0;
+
+       while ((c = getopt_long(argc, argv, "T:D:l:f:qQr", options, NULL)) != -1) {
+               switch (c) {
+               case 'T':
+                       tty = optarg;
+                       break;
+               case 'D':
+                       device = optarg;
+                       break;
+               case 'l':
+                       loader = optarg;
+                       break;
+               case 'f':
+                       file = optarg;
+                       break;
+               case 'q':
+                       query = 1;
+                       break;
+               case 'Q':
+                       skytraq_verbose = 0;
+                       break;
+               case 'r':
+                       raw = 1;
+                       break;
+               default:
+                       usage(argv[0]);
+                       break;
+               }
+       }
+
+       if (!tty)
+               tty = cc_usbdevs_find_by_arg(device, "TeleMetrum");
+       if (!tty)
+               tty = getenv("ALTOS_TTY");
+       if (!tty)
+               tty="/dev/ttyACM0";
+       fd = skytraq_open(tty);
+       if (fd < 0)
+               exit(1);
+
+       if (raw) {
+               /* Set the baud rate to 115200 */
+               skytraq_setcomm(fd, 115200);
+               sleep(1);
+               skytraq_setspeed(fd, 115200);
+       } else {
+               /* Connect TM to the device */
+               skytraq_write(fd, "U\n", 2);
+       }
+
+       /* Wait for the device to stabilize after baud rate changes */
+       for (c = 0; c < 6; c++) {
+               skytraq_flush(fd);
+               sleep(1);
+       }
+
+       if (query) {
+               uint8_t query_reply[14];
+
+               uint8_t         software_type;
+               uint32_t        kernel_version;
+               uint32_t        odm_version;
+               uint32_t        revision;
+
+               skytraq_write(fd, query_version, 9);
+               if (skytraq_wait_reply(fd, 0x80, query_reply, sizeof (query_reply)) != 0) {
+                       fprintf(stderr, "query reply failed\n");
+                       exit(1);
+               }
+
+#define i8(o)  query_reply[(o)-1]
+#define i32(o) ((i8(o) << 24) | (i8(o+1) << 16) | (i8(o+2) << 8) | (i8(o+3)))
+               software_type = i8(2);
+               kernel_version = i32(3);
+               odm_version = i32(7);
+               revision = i32(11);
+               skytraq_dbg_printf(0, "\n");
+               printf ("Software Type %d. Kernel Version %d.%d.%d. ODM Version %d.%d.%d. Revision %d.%d.%d.\n",
+                       software_type,
+                       kernel_version >> 16 & 0xff,
+                       kernel_version >> 8 & 0xff,
+                       kernel_version >> 0 & 0xff,
+                       odm_version >> 16 & 0xff,
+                       odm_version >> 8 & 0xff,
+                       odm_version >> 0 & 0xff,
+                       revision >> 16 & 0xff,
+                       revision >> 8 & 0xff,
+                       revision >> 0 & 0xff);
+               exit(0);
+       }
+
+       if (!file)
+               usage(argv[0]);
+
+       ret = skytraq_send_srec(fd, "srec_115200.bin");
+       skytraq_dbg_printf (0, "srec ret %d\n", ret);
+       if (ret < 0)
+               exit(1);
+
+       sleep(2);
+
+//     ret = skytraq_send_bin(fd, "STI_01.04.42-01.10.23_4x_9600_Bin_20100901.bin");
+       ret = skytraq_send_bin(fd, "STI_01.06.10-01.07.23_balloon_CRC_7082_9600_20120913.bin");
+
+       printf ("bin ret %d\n", ret);
+       if (ret < 0)
+               exit(1);
+
+       return 0;
+}
diff --git a/ao-tools/ao-sky-flash/sky_flash.h b/ao-tools/ao-sky-flash/sky_flash.h
new file mode 100644 (file)
index 0000000..77f4c74
--- /dev/null
@@ -0,0 +1,67 @@
+/*
+ * Copyright © 2012 Keith Packard <keithp@keithp.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+/* sky_serial.c */
+
+extern int     skytraq_open_time;
+extern int     skytraq_verbose;
+
+int
+skytraq_open(const char *path);
+
+int
+skytraq_setspeed(int fd, int baud);
+
+int
+skytraq_setcomm(int fd, int baudrate);
+
+int
+skytraq_write(int fd, const char *data, int len);
+
+int
+skytraq_waitchar(int fd, int timeout);
+
+int
+skytraq_waitstatus(int fd, const char *status, int timeout);
+
+void
+skytraq_flush(int fd);
+
+int
+skytraq_cmd_wait(int fd, const char *message, int len, const char *status, int timeout);
+
+int
+skytraq_cmd_nowait(int fd, const char *message, int len);
+
+/* sky_debug.c */
+
+void
+skytraq_dbg_printf(int input, const char *fmt, ...);
+
+void
+skytraq_dbg_buf(int input, const char *buf, int len);
+
+void
+skytraq_dbg_char(int input, char c);
+
+/* sky_srec.c */
+int
+skytraq_send_srec(int fd, const char *file);
+
+/* sky_bin.c */
+int
+skytraq_send_bin(int fd, const char *filename);
diff --git a/ao-tools/ao-sky-flash/sky_serial.c b/ao-tools/ao-sky-flash/sky_serial.c
new file mode 100644 (file)
index 0000000..4aeb145
--- /dev/null
@@ -0,0 +1,259 @@
+/*
+ * Copyright © 2012 Keith Packard <keithp@keithp.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+#define _BSD_SOURCE
+#include <termios.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <poll.h>
+#include "sky_flash.h"
+#include <stdio.h>
+#include <sys/time.h>
+#include <stdint.h>
+#include <unistd.h>
+#include <stdarg.h>
+
+int    skytraq_verbose = 1;
+
+int
+skytraq_setspeed(int fd, int baud)
+{
+       int     b;
+       int     ret;
+       struct termios  term;
+
+       switch (baud) {
+       case 9600:
+               b = B9600;
+               break;
+       case 38400:
+               b = B38400;
+               break;
+       case 115200:
+               b = B115200;
+               break;
+       default:
+               fprintf (stderr, "Invalid baudrate %d\n", baud);
+               return -1;
+       }
+       ret = tcgetattr(fd, &term);
+       cfmakeraw(&term);
+#ifdef USE_POLL
+       term.c_cc[VMIN] = 1;
+       term.c_cc[VTIME] = 0;
+#else
+       term.c_cc[VMIN] = 0;
+       term.c_cc[VTIME] = 1;
+#endif
+
+       cfsetspeed(&term, b);
+
+       ret = tcsetattr(fd, TCSAFLUSH, &term);
+       return ret;
+}
+
+int    skytraq_open_time;
+
+int
+skytraq_open(const char *path)
+{
+       int             fd;
+       int             ret;
+
+       fd = open(path, O_RDWR | O_NOCTTY);
+       if (fd < 0) {
+               perror (path);
+               return -1;
+       }
+
+       ret = skytraq_setspeed(fd, 9600);
+       if (ret < 0) {
+               close (fd);
+               return -1;
+       }
+       skytraq_open_time = skytraq_millis();
+       return fd;
+}
+
+
+#define BAUD           57600
+#define BPS            (BAUD/10 * 9/10)
+#define US_PER_CHAR    (1000000 / BPS)
+
+int
+skytraq_write(int fd, const char *data, int len)
+{
+       const char *d = data;
+       int             r;
+       int             us;
+
+       while (len) {
+               int     this_time = len;
+               if (this_time > 128)
+                       this_time = 128;
+               if (this_time < 70) {
+                       skytraq_dbg_printf (0, "%4d: ", this_time);
+                       skytraq_dbg_buf(0, data, this_time);
+               } else {
+                       skytraq_dbg_printf (0, "%d bytes (%d remain)", this_time, len);
+               }
+               fflush(stdout);
+               r = write(fd, data, this_time);
+               if (r <= 0)
+                       return r;
+               us = r * US_PER_CHAR;
+               usleep(r * US_PER_CHAR);
+               data += r;
+               len -= r;
+       }
+       skytraq_dbg_newline();
+       return 1;
+}
+
+int
+skytraq_setcomm(int fd, int baudrate)
+{
+       uint8_t msg[11];
+       int     i;
+       uint8_t cksum;
+
+       int target_baudrate;
+       switch(baudrate)
+       {
+       case 4800:
+               target_baudrate=0;
+               break;
+       case 9600:
+               target_baudrate=1;
+               break;
+       case 19200:
+               target_baudrate=2;
+               break;
+       case 38400:
+               target_baudrate=3;
+               break;
+       case 57600:
+               target_baudrate=4;
+               break;
+       case 115200:
+               target_baudrate=5;
+               break;
+       case 230400:
+               target_baudrate=6;
+               break;
+       }
+       msg[0] = 0xa0;  /* header */
+       msg[1] = 0xa1;
+       msg[2] = 0x00;  /* length */
+       msg[3] = 0x04;
+       msg[4] = 0x05;  /* configure serial port */
+       msg[5] = 0x00;  /* COM 1 */
+       msg[6] = target_baudrate;
+       msg[7] = 0x00;  /* update to SRAM only */
+
+       cksum = 0;
+       for (i = 4; i < 8; i++)
+               cksum ^= msg[i];
+       msg[8] = cksum;
+       msg[9] = 0x0d;
+       msg[10] = 0x0a;
+       return skytraq_write(fd, msg, 11);
+}
+
+int
+skytraq_waitchar(int fd, int timeout)
+{
+       struct pollfd   fds[1];
+       int             ret;
+       unsigned char   c;
+
+       for (;;) {
+               fds[0].fd = fd;
+               fds[0].events = POLLIN;
+               ret = poll(fds, 1, timeout);
+               if (ret >= 1) {
+                       if (fds[0].revents & POLLIN) {
+                               ret = read(fd, &c, 1);
+                               if (ret == 1) {
+                                       skytraq_dbg_char(1, c);
+                                       return c;
+                               }
+                       }
+               } else if (ret == 0)
+                       return -2;
+               else {
+                       perror("poll");
+                       return -1;
+               }
+       }
+}
+
+int
+skytraq_waitstatus(int fd, const char *status, int timeout)
+{
+       const char      *s;
+       int             c;
+
+       for (;;) {
+               c = skytraq_waitchar(fd, timeout);
+               if (c < 0) {
+                       skytraq_dbg_newline();
+                       return c;
+               }
+               if ((char) c == *status) {
+                       s = status + 1;
+                       for (;;) {
+                               c = skytraq_waitchar(fd, timeout);
+                               if (c < 0) {
+                                       skytraq_dbg_newline();
+                                       return c;
+                               }
+                               if ((char) c != *s)
+                                       break;
+                               if (!*s) {
+                                       skytraq_dbg_newline();
+                                       return 0;
+                               }
+                               s++;
+                       }
+               }
+       }
+}
+
+void
+skytraq_flush(int fd)
+{
+       while (skytraq_waitchar(fd, 1) >= 0)
+               ;
+}
+
+int
+skytraq_cmd_wait(int fd, const char *message, int len, const char *status, int timeout)
+{
+       skytraq_flush(fd);
+       skytraq_write(fd, message, len);
+       return skytraq_waitstatus(fd, status, timeout);
+}
+
+int
+skytraq_cmd_nowait(int fd, const char *message, int len)
+{
+       skytraq_flush(fd);
+       return skytraq_write(fd, message, len);
+}
diff --git a/ao-tools/ao-sky-flash/sky_srec.c b/ao-tools/ao-sky-flash/sky_srec.c
new file mode 100644 (file)
index 0000000..6d00f58
--- /dev/null
@@ -0,0 +1,60 @@
+/*
+ * Copyright © 2012 Keith Packard <keithp@keithp.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+#include "sky_flash.h"
+#include <stdio.h>
+#include <string.h>
+
+static const char loader_start[] = "$LOADER DOWNLOAD";
+
+int
+skytraq_send_srec(int fd, const char *filename)
+{
+       FILE    *file;
+       int     ret;
+       char    line[1024];
+
+       file = fopen(filename, "r");
+       if (!file) {
+               perror(filename);
+               return -1;
+       }
+
+       ret = skytraq_cmd_wait(fd, loader_start, strlen(loader_start) + 1, "OK", 1000);
+       if (ret)
+               return ret;
+
+       for (;;) {
+               char    *s;
+               int     len;
+
+               s = fgets(line, sizeof(line), file);
+               if (!s)
+                       break;
+               len = strlen(s);
+               if (len < 3)            /* Terminated with \r\n */
+                       break;
+               s[len-2] = '\n';        /* Smash \r */
+               s[len-1] = '\0';        /* Smash \n */
+               skytraq_cmd_nowait(fd, s, len);
+       }
+       fclose(file);
+
+       ret = skytraq_waitstatus(fd, "END", 10000);
+       skytraq_dbg_newline();
+       return ret;
+}
diff --git a/ao-tools/ao-sky-flash/srec_115200.bin b/ao-tools/ao-sky-flash/srec_115200.bin
new file mode 100644 (file)
index 0000000..8ea8e7c
--- /dev/null
@@ -0,0 +1,346 @@
+S0130000666C6173683131353230302E73726563DA\r
+S31550000000033FFFF7821063209DE380011920000013\r
+S31550000010D2030000173FFFF79612E3E4AC07BFF890\r
+S31550000020D225800BD005800B133FFFC0900A0009E4\r
+S3155000003090122977D0230000E00320901B0800136C\r
+S31550000040C0232090D20320149E136018D225800B13\r
+S31550000050D005800B1300180090120009900A3FF04B\r
+S31550000060D0232014D20300001100003FD225800B6C\r
+S31550000070D405800B901223FF940A800813043E0087\r
+S3155000008094128009D4230000D003C0009A13601C38\r
+S31550000090D025800BD205800B11004000902A4008D5\r
+S315500000A0D023C000D403400011000040D425800B5B\r
+S315500000B0D205800BA00C204092124008A13C20068D\r
+S315500000C011140005E02A2180D2234000B8102000E8\r
+S315500000D0400004C890102005130004004000017031\r
+S315500000E090102001213FFFF84000036F90058010CB\r
+S315500000F0A014200A92058010B6102000B4102000DB\r
+S31550000100A6102000AE10200096102000D00A400005\r
+S3155000011080A2202002800006920260019602E00131\r
+S3155000012080A2E06324BFFFFBD00A40009810200055\r
+S3155000013080A3000B1680000F113FFFF89012200A83\r
+S31550000140940580089810000B912CE0029002001341\r
+S31550000150D20A8000912A200190020009A6023FD0BF\r
+S3155000016098833FFF12BFFFF99402A0019810000B2D\r
+S315500001709205800C113FFFF894024008961020001B\r
+S315500001809002800BD20A201680A2602002800007BF\r
+S3155000019080A2E0009602E00180A2E06304BFFFFA6D\r
+S315500001A09002800B80A2E0000480000F113FFFF800\r
+S315500001B09205800C9012201698024008900DE0FF90\r
+S315500001C0932A2002D40B000092024008932A600121\r
+S315500001D094028009AE02BFD09682FFFF12BFFFF88D\r
+S315500001E098032001133FFFF794126384921263869B\r
+S315500001F090078009400001A89207800A80A220003B\r
+S3155000020002800122153FFFF79012A386D21780086D\r
+S3155000021080A2601C0280010E9012A384113FFFF74A\r
+S31550000220961223849012238692102037D237800854\r
+S31550000230941020B5D437800B900F2001213FFFF743\r
+S31550000240AB2A201392142386110001E1D41780099A\r
+S3155000025090122154A2142384A4054008D617801165\r
+S3155000026090100012400002289210202080A22000F8\r
+S31550000270028000CA11140005B0100010B21000110F\r
+S31550000280A0102000113FFFEA80A420000280000445\r
+S315500002909212225511000015921221AA912A60102D\r
+S315500002A0A8162386A3322010D617801990048010E2\r
+S315500002B0D417801492102002400001DA98100011D1\r
+S315500002C080A22000028000B511140005D0148010C1\r
+S315500002D080A44008128000B0A004200280A420030D\r
+S315500002E004BFFFEA113FFFEA213FFFF79214238430\r
+S315500002F0D617800990100012D417801440000202BD\r
+S3155000030092102020170001DF9012E3F8D20200006D\r
+S31550000310941423E4D225800AA01423E0C02580102B\r
+S31550000320D005800A80A23FFF228000BB9012E3FCDA\r
+S31550000330113FFFF7A2122384A0122386110001C198\r
+S31550000340D417801090122154D61780119210202065\r
+S31550000350400001ED90054008110001E9D4178010C6\r
+S3155000036090122154D617801192102020400001E699\r
+S3155000037090054008110001F1D417801090122154B5\r
+S31550000380D617801192102020400001DF90054008BA\r
+S31550000390133FFFF8D00D800980A220421280000B37\r
+S315500003A0A410001392058009D00A600180A220494A\r
+S315500003B03280000721140005D00A600280A2204E28\r
+S315500003C022800008D417801021140005400002F640\r
+S315500003D09014202890142028400002F39E03FCF02D\r
+S315500003E090102000D6178011400001C792100013BC\r
+S315500003F080A2200022800069111400051114000506\r
+S31550000400400002E990122030400000BE010000007A\r
+S3155000041011000007A81223FFB010001480A4801406\r
+S31550000420148000031300000892100012113FFFF8C9\r
+S315500004304000036F90058008A2922000028000734E\r
+S31550000440A010200080A40011B40680111A8000214B\r
+S31550000450A4248011333FFFF71100003FAA1223FF57\r
+S31550000460BA1663849810001092102000A00420023F\r
+S31550000470173FFFF89005800CD40A000B932A6008AA\r
+S315500004809803200180A3001006BFFFFB9212400A7A\r
+S31550000490912A60109932201080A300150280000A1C\r
+S315500004A090166386D417800892102002D617801DA6\r
+S315500004B04000015C9010001B80A220000280003793\r
+S315500004C01114000580A400110ABFFFE7B606E0022A\r
+S315500004D0900E801880A0000892603FFF80A0001206\r
+S315500004E090603FFF809240080280000680A68013ED\r
+S315500004F011140005400002AC9012203080A68013E3\r
+S3155000050012BFFFC880A480149410200080A28013CC\r
+S315500005101680000996102000D21280009132600891\r
+S315500005209002C0089402A00280A2801306BFFFFB6F\r
+S3155000053096020009920AE0FF900DE0FF80A2400863\r
+S31550000540028000041114000510BFFFA49012203839\r
+S31550000550153FFFF79012A3E0D205800880A26001F4\r
+S31550000560128000109212A3849012A386D41780088A\r
+S3155000057098102A01D6178009110001DF901223FC2A\r
+S31550000580400001289210200280A22000128000060E\r
+S31550000590211400051114000510BFFF909012202061\r
+S315500005A02114000540000280901420404000027E35\r
+S315500005B090142040901020F013080013D0302000E3\r
+S315500005C092126020D012400015200000900A3FFE83\r
+S315500005D0D03240009612A04C90102010D022C0006D\r
+S315500005E0D802C0009412A0B813080004D822800084\r
+S315500005F092126014D0024000900A3FFED022400072\r
+S3155000060010800000010000001114000510BFFF7398\r
+S3155000061090122048D20200001102807FD225800A13\r
+S31550000620901223FFD0258010D205800AD005801065\r
+S3155000063080A2400832BFFF40113FFFF790102001C3\r
+S31550000640D025801010BFFF3C113FFFF7D61780080A\r
+S31550000650921AE0B980A0000994603FFF901AE0DA40\r
+S3155000066080A0000892603FFF8092800902BFFEED95\r
+S31550000670113FFFF780A2E0DA22BFFEF0B81020014A\r
+S3155000068010BFFEEF900F20012114000540000246D6\r
+S315500006909014205030BFFFFE01000000941020F04F\r
+S315500006A019080013D430200098132020170800048E\r
+S315500006B0D41300008212E01417200000940ABFFEE3\r
+S315500006C09A12E0B8D4330000900A20FF9612E04CFC\r
+S315500006D0D222C00080A22001128000070100000033\r
+S315500006E0D202C000D2234000D0004000900A3FFE04\r
+S315500006F0D02040000100000081C3E0080100000046\r
+S315500007001308000492126014D00240009012200187\r
+S31550000710D02240000100000081C3E0080100000023\r
+S315500007209C03BF90D233A066D213A06696100008E1\r
+S31550000730920A6080D012000080A0000994402000E8\r
+S31550000740900A208080A000089240200080A2400A93\r
+S315500007500280000D01000000D012C000808A2020C7\r
+S315500007601280000901000000D012C000900A2080BB\r
+S3155000077080A000089240200080A2400A12BFFFF7D6\r
+S3155000078001000000D012C000900A208080A000080E\r
+S3155000079090402000901A000A901A20010100000093\r
+S315500007A081C3E0089C23BF909DE3BF90B20E60FFCB\r
+S315500007B0A0100018C027BFF480A660BA14800006A7\r
+S315500007C080A660DA80A660B916800006153FFFEA5B\r
+S315500007D080A660B512800027B0102000153FFFEAB2\r
+S315500007E096102AAA9412A2AA13000015D432C00059\r
+S315500007F09212615598102554113FFFE0D2330000F4\r
+S3155000080090122080D032C000D432C000D2330000C3\r
+S315500008101100000C2300003F90122030130000C33B\r
+S31550000820D0340000A412613FB21463FF921463FFE8\r
+S315500008307FFFFFBC90100010B0100008D007BFF427\r
+S3155000084090022001D027BFF4D214000080A64009A0\r
+S315500008500280000880A620011280000601000000D8\r
+S31550000860D007BFF480A2001208BFFFF2921463FFB4\r
+S31550000870D007BFF4130000C39212613F80A2400814\r
+S3155000088094403FFFB00E000A0100000081C7E00807\r
+S3155000089081E80000153FFFEA98102AAA9412A2AAEE\r
+S315500008A0D4330000170000159612E155153FFFE4AA\r
+S315500008B0D63025549412A090D4330000D61022007E\r
+S315500008C09A100008960AE0FFD6320000901030F0D9\r
+S315500008D0D0330000D613400098100009901AE03724\r
+S315500008E080A0000894603FFF901AE01C80A000088A\r
+S315500008F092603FFF8092800912800007821020008C\r
+S3155000090080A2E0C20280000480A2E0201280004251\r
+S3155000091090102000113FFFEA94102AAA901222AAA2\r
+S31550000920D03280001300001592126155113FFFE43A\r
+S31550000930D230255490122090D0328000D21022020C\r
+S31550000940901030F0920A60FFD2330000D03280000F\r
+S31550000950D013400080A220370280002A80A2202097\r
+S31550000960D41300000280001D912AA0109002BF47A8\r
+S31550000970912A201091322010952AA01080A2200290\r
+S315500009809532A01092602000901AA0B580A0000861\r
+S31550000990920A600190603FFF809240083280000BBF\r
+S315500009A08210200180A2A0B90280000A80A2A0BABB\r
+S315500009B00280000880A2A0EF0280000680A2A0DA82\r
+S315500009C02280000282102001108000139010000136\r
+S315500009D010BFFFFE821020019132201080A220EE1F\r
+S315500009E012BFFFE49002BF479010201CD033400046\r
+S315500009F0921020B9D233000010BFFFDD941020B9F9\r
+S31550000A00D413000080A2A03402BFFFF880A2202099\r
+S31550000A1030BFFFD50100000081C3E008010000008F\r
+S31550000A209DE3BF88B72EE010C037BFF4B736E0104D\r
+S31550000A30A0100018C027BFEC80A6E0BA14800006AC\r
+S31550000A4080A6E0DA80A6E0B916800006113FFFEADC\r
+S31550000A5080A6E0B512800023B0102000113FFFEAB7\r
+S31550000A6094102AAA901222AAD032800013000015A0\r
+S31550000A7092126155113FFFE8D2302554901220A0B2\r
+S31550000A80D0328000F837BFF2D017BFF2130000C340\r
+S31550000A90D0340000B612613FD217BFF27FFFFF215C\r
+S31550000AA090100010B0100008D007BFEC9002200143\r
+S31550000AB0D027BFECD2140000D017BFF280A2000995\r
+S31550000AC00280000880A62001128000060100000066\r
+S31550000AD0D007BFEC80A2001B08BFFFF0010000004A\r
+S31550000AE0D007BFEC130000C39212613F80A24008AA\r
+S31550000AF094403FFFB00E000A0100000081C7E00895\r
+S31550000B0081E800009DE3BF9811140005D4022150DE\r
+S31550000B10A210200080A4400AA410001B9A102000A6\r
+S31550000B20A0102000A610200116800012961020005A\r
+S31550000B30912EA010B5322010932EE0109810000A76\r
+S31550000B40111400059332601094122060D002A00C4C\r
+S31550000B5080A2001A22800048D002A0109602E0011E\r
+S31550000B6080A2C00C06BFFFFA9402A05011140005D3\r
+S31550000B70D202215080A2C009028000449010200168\r
+S31550000B8080A6200008800016912AE0029002000BF1\r
+S31550000B9013140005B4126060992A20049E10200197\r
+S31550000BA0912C200290020010912A200290030008F6\r
+S31550000BB09002001AD4022004A2046001D202200836\r
+S31550000BC080A4400A932BC0099A034009A0643FFFB2\r
+S31550000BD080A6000D18BFFFF4912C200280A660005D\r
+S31550000BE00480001F932AE0029202400BB60CA0FF2D\r
+S31550000BF011140005A4122060B52A60049210001B3F\r
+S31550000C007FFFFEEA90100018932C200292024010AB\r
+S31550000C10932A6002920680099402401280A2200014\r
+S31550000C2002800013A2046001D202A0089010200195\r
+S31550000C30912A000980A64008B00600080680000ADE\r
+S31550000C40B2264008D002A00480A44008A0643FFF0A\r
+S31550000C5080A6600014BFFFEB9210001B1080000BA3\r
+S31550000C6090100013108000099010200110BFFFFC57\r
+S31550000C70A610200080A2000932BFFFBA9602E001FA\r
+S31550000C8010BFFFBC1114000581C7E00891E80008A9\r
+S31550000C9013140005D40A61801708000013000013CE\r
+S31550000CA09212630C952AA00294028009D202C00ABD\r
+S31550000CB0941000089132601F80A22001028000002B\r
+S31550000CC09132601D808A20012280000490102001FC\r
+S31550000CD0C022800030800002D022800081C3E0080C\r
+S31550000CE09010000911140005D20A21801508000041\r
+S31550000CF0110000139012230C932A600292024008AE\r
+S31550000D00D20280099132601F80A220010280000029\r
+S31550000D100100000081C3E008901000099DE3BF90D8\r
+S31550000D2011140005E00A2180B00E20FF11140005B1\r
+S31550000D3090122154B12E2002E2020018A12C20025A\r
+S31550000D40110000139012230CA00400087FFFFFD15E\r
+S31550000D509007BFF4D207BFF411060000932A601E15\r
+S31550000D60921240112308000092124008D2244010DB\r
+S31550000D707FFFFFC89007BFF4D207BFF411070000EA\r
+S31550000D80932A601E92124008D22440107FFFFFC162\r
+S31550000D909007BFF4D207BFF411030000932A601ED8\r
+S31550000DA092124008D22440107FFFFFBA9007BFF43A\r
+S31550000DB0D207BFF41104000090122003932A601E3C\r
+S31550000DC092124008D22440107FFFFFB29007BFF422\r
+S31550000DD0D207BFF411050000932A601E92124008F4\r
+S31550000DE0D22440107FFFFFC0010000000100000028\r
+S31550000DF081C7E00881E800009DE3BF90111400050B\r
+S31550000E00E00A218025080000110000139012230CDF\r
+S31550000E10A12C2002A00400087FFFFF9E9007BFF47C\r
+S31550000E20D207BFF411050000932A601E92124008A3\r
+S31550000E30D22480107FFFFF979007BFF4A2100008BE\r
+S31550000E40D007BFF427040000912A201E90120013E9\r
+S31550000E50D02480107FFFFF8F9007BFF4D207BFF4D6\r
+S31550000E6011040004932A601E92124008D224801066\r
+S31550000E707FFFFF889007BFF4D007BFF4A20C60FF36\r
+S31550000E80912A201E9012001190120013D024801027\r
+S31550000E907FFFFF95010000000100000081C7E008B8\r
+S31550000EA081E800009DE3BF9011140005D20A21800D\r
+S31550000EB02708000011000013932A60029012230C99\r
+S31550000EC09202400893326002AC100009AB2A6002CD\r
+S31550000ED0AE1000097FFFFF6F9007BFF4D007BFF435\r
+S31550000EE023030000912A201E90120011D024C01511\r
+S31550000EF07FFFFF7D0100000091322016A08A200F4F\r
+S31550000F0032800011A2102000A4100011A32DA002BF\r
+S31550000F107FFFFF609007BFF4D207BFF4932A601E8D\r
+S31550000F2092124012D224C0117FFFFF6F01000000C1\r
+S31550000F3091322016A08A200F02BFFFF60100000052\r
+S31550000F40A210200080A440101ABFFFE3A52DE00296\r
+S31550000F50290100007FFFFF4F9007BFF4D007BFF471\r
+S31550000F60A2046001912A201E90120014D024C012AF\r
+S31550000F707FFFFF5D01000000D02E0000808A20FF19\r
+S31550000F8002800006B006200180A440100ABFFFF27E\r
+S31550000F900100000030BFFFD00100000081C7E0080B\r
+S31550000FA081E800009DE3BF9011140005D20A21800C\r
+S31550000FB025080000D40E000011000013932A600289\r
+S31550000FC09012230C80A2A000028000849202400856\r
+S31550000FD0AD2A60109135A012A72A2002AA10000847\r
+S31550000FE0A81000137FFFFF2B9007BFF4D007BFF464\r
+S31550000FF021030000912A201E90120010D024801345\r
+S315500010007FFFFF3901000000900A200680A22006CB\r
+S315500010100280001001000000A2100010A12D6002F5\r
+S315500010207FFFFF1C9007BFF4D207BFF4932A601EC0\r
+S3155000103092124011D22480107FFFFF2B0100000036\r
+S31550001040900A200680A2200612BFFFF6010000007B\r
+S315500010507FFFFF109007BFF4D007BFF4D20E0000F9\r
+S31550001060912A201E90120009D02480147FFFFF1E63\r
+S31550001070B0062001D00E000080A2200012BFFFDA79\r
+S31550001080010000009135A010D404800880A2A00071\r
+S315500010900680004C010000009132A01D808A20017C\r
+S315500010A00280004690102001C027BFF4D007BFF43D\r
+S315500010B013030000912A201E901200099335A010A8\r
+S315500010C0D0248009D404800980A2A0000680003470\r
+S315500010D0900AA00680A22006028000169135A01222\r
+S315500010E09A1000089E102001972A2002190300002A\r
+S315500010F09132A01D808A2001128000039210200098\r
+S315500011009210000F912A601E9012000CD024800B72\r
+S31550001110D404800B80A2A0000680001A900AA00674\r
+S3155000112080A2200612BFFFF49132A01DD227BFF431\r
+S315500011309132A01D808A200102800010901020015B\r
+S31550001140C027BFF4D007BFF49335A010912A201EB4\r
+S31550001150D0248009D404800980A2A00016800021E2\r
+S3155000116090100009D404800880A2A00006BFFFFE9C\r
+S31550001170010000003080001B10BFFFF3D027BFF4E2\r
+S31550001180912B6002D404800880A2A00006BFFFFE07\r
+S315500011900100000010BFFFE3900AA006901000095E\r
+S315500011A0D404800880A2A00006BFFFFE0100000004\r
+S315500011B010BFFFC9900AA00610BFFFBDD027BFF4CD\r
+S315500011C0D404800880A2A00006BFFFFE01000000E4\r
+S315500011D010BFFFB39132A01D10BFFFABAD2A6010F8\r
+S315500011E00100000081C7E00881E800009DE3BF9838\r
+S315500011F035140005F60EA180921000183500001324\r
+S31550001200B416A30CB72EE002B606C01A992EE010FB\r
+S31550001210B53320129B2EA002A210001AA610001958\r
+S315500012203B080000961020009410000DA410001AE0\r
+S31550001230F807400D80A7200006800064B137201DB6\r
+S31550001240B00E200180A00018B0603FFFB12E201EC6\r
+S3155000125033030000B0160019F027400AF807400A79\r
+S3155000126080A7200006800052B1372016B48E200F7A\r
+S315500012701280001A82102000B3332012310003D09E\r
+S31550001280901000199E162240B32E600237030000BC\r
+S3155000129080A0400F8200600118800053B0102000DB\r
+S315500012A0B137201DB00E200180A00018B0603FFF5E\r
+S315500012B0B12E201EB016001BF0274019F807401912\r
+S315500012C080A7200006800033B1372016B48E200F39\r
+S315500012D002BFFFF180A0400F8210200080A0401A6C\r
+S315500012E01ABFFFD4B1332012B72E20029010001827\r
+S315500012F09E10001BA0100018F807401B80A7200066\r
+S315500013000680001DB137201DB00E200180A00018A8\r
+S31550001310B0603FFFB12E201E33010000B0160019F9\r
+S31550001320F027400FF807400F80A720000680000CDA\r
+S31550001330B12C20029602E001F82A400080A2C01388\r
+S3155000134002800029B010000B8200600180A0401A74\r
+S315500013500ABFFFEA9202600130BFFFB6F807401895\r
+S3155000136080A7200006BFFFFE0100000010BFFFF35C\r
+S315500013709602E001B12A2002F807401880A7200003\r
+S3155000138006BFFFFE0100000010BFFFE0B137201D71\r
+S31550001390B12A2002F807401880A7200006BFFFFE9A\r
+S315500013A00100000010BFFFCAB1372016B12CA002B1\r
+S315500013B0F807401880A7200006BFFFFE0100000076\r
+S315500013C010BFFFABB1372016B12C6002F80740189A\r
+S315500013D080A7200006BFFFFE0100000010BFFF9946\r
+S315500013E0B137201D0100000081C7E00881E80000E8\r
+S315500013F09DE3BF987FFFFE81B00E20FF7FFFFE4822\r
+S3155000140081E800000100000000000000000000001C\r
+S315500014100000000000000000000000000000000076\r
+S315500014204572726F723400004572726F72330000EB\r
+S315500014304F4B0000000000004572726F7232000080\r
+S31550001440454E4400000000004572726F7235000030\r
+S315500014504572726F723100000000000000000000FB\r
+S3155000146000000000000000010000000E00000037E0\r
+S31550001470000000B500004000000000030000000D11\r
+S3155000148000000037000000B5000080000000000496\r
+S315500014900000000F00000037000000B500010000FA\r
+S315500014A00000000B0000001000000037000000B5DF\r
+S315500014B00000000000000007000000100000001CA3\r
+S315500014C0000000B900007000000000080000000F86\r
+S315500014D00000001C000000B9000078000000000A5F\r
+S315500014E00000000D0000001C000000B900007C0048\r
+S315500014F00000000B0000000E0000001C000000B9A8\r
+S31550001500000000000000000F000000100000001C4A\r
+S31550001510000000DA00007000000000100000000F0C\r
+S315500015200000001C000000DA0000700000000012ED\r
+S315500015300000000D0000001C000000DA00007000E2\r
+S31550001540000000130000000E0000001C000000DA2E\r
+S3155000155000000003000001AA000000D50000006A48\r
+S3155000156000000035000000230000001100000008B4\r
+S3115000157000000000000000000000000019\r
+S70550000000AA\r
diff --git a/ao-tools/ao-sky-flash/srec_9600.bin b/ao-tools/ao-sky-flash/srec_9600.bin
new file mode 100644 (file)
index 0000000..9a29ab1
--- /dev/null
@@ -0,0 +1,346 @@
+S0190000666C6173685F3139646F74355F393630302E737265638A\r
+S31550000000033FFFF7821063209DE380011920000013\r
+S31550000010D2030000173FFFF79612E3E4AC07BFF890\r
+S31550000020D225800BD005800B133FFFC0900A0009E4\r
+S3155000003090122977D0230000E00320901B0800136C\r
+S31550000040C0232090D20320149E136018D225800B13\r
+S31550000050D005800B1300180090120009900A3FF04B\r
+S31550000060D0232014D20300001100003FD225800B6C\r
+S31550000070D405800B901223FF940A800813043E0087\r
+S3155000008094128009D4230000D003C0009A13601C38\r
+S31550000090D025800BD205800B11004000902A4008D5\r
+S315500000A0D023C000D403400011000040D425800B5B\r
+S315500000B0D205800BA00C204092124008A13C20068D\r
+S315500000C011140005E02A2180D2234000B8102000E8\r
+S315500000D0400004C890102001130004004000017035\r
+S315500000E090102001213FFFF84000036F90058010CB\r
+S315500000F0A014200A92058010B6102000B4102000DB\r
+S31550000100A6102000AE10200096102000D00A400005\r
+S3155000011080A2202002800006920260019602E00131\r
+S3155000012080A2E06324BFFFFBD00A40009810200055\r
+S3155000013080A3000B1680000F113FFFF89012200A83\r
+S31550000140940580089810000B912CE0029002001341\r
+S31550000150D20A8000912A200190020009A6023FD0BF\r
+S3155000016098833FFF12BFFFF99402A0019810000B2D\r
+S315500001709205800C113FFFF894024008961020001B\r
+S315500001809002800BD20A201680A2602002800007BF\r
+S3155000019080A2E0009602E00180A2E06304BFFFFA6D\r
+S315500001A09002800B80A2E0000480000F113FFFF800\r
+S315500001B09205800C9012201698024008900DE0FF90\r
+S315500001C0932A2002D40B000092024008932A600121\r
+S315500001D094028009AE02BFD09682FFFF12BFFFF88D\r
+S315500001E098032001133FFFF794126384921263869B\r
+S315500001F090078009400001A89207800A80A220003B\r
+S3155000020002800122153FFFF79012A386D21780086D\r
+S3155000021080A2601C0280010E9012A384113FFFF74A\r
+S31550000220961223849012238692102037D237800854\r
+S31550000230941020B5D437800B900F2001213FFFF743\r
+S31550000240AB2A201392142386110001E1D41780099A\r
+S3155000025090122154A2142384A4054008D617801165\r
+S3155000026090100012400002289210202080A22000F8\r
+S31550000270028000CA11140005B0100010B21000110F\r
+S31550000280A0102000113FFFEA80A420000280000445\r
+S315500002909212225511000015921221AA912A60102D\r
+S315500002A0A8162386A3322010D617801990048010E2\r
+S315500002B0D417801492102002400001DA98100011D1\r
+S315500002C080A22000028000B511140005D0148010C1\r
+S315500002D080A44008128000B0A004200280A420030D\r
+S315500002E004BFFFEA113FFFEA213FFFF79214238430\r
+S315500002F0D617800990100012D417801440000202BD\r
+S3155000030092102020170001DF9012E3F8D20200006D\r
+S31550000310941423E4D225800AA01423E0C02580102B\r
+S31550000320D005800A80A23FFF228000BB9012E3FCDA\r
+S31550000330113FFFF7A2122384A0122386110001C198\r
+S31550000340D417801090122154D61780119210202065\r
+S31550000350400001ED90054008110001E9D4178010C6\r
+S3155000036090122154D617801192102020400001E699\r
+S3155000037090054008110001F1D417801090122154B5\r
+S31550000380D617801192102020400001DF90054008BA\r
+S31550000390133FFFF8D00D800980A220421280000B37\r
+S315500003A0A410001392058009D00A600180A220494A\r
+S315500003B03280000721140005D00A600280A2204E28\r
+S315500003C022800008D417801021140005400002F640\r
+S315500003D09014202890142028400002F39E03FCF02D\r
+S315500003E090102000D6178011400001C792100013BC\r
+S315500003F080A2200022800069111400051114000506\r
+S31550000400400002E990122030400000BE010000007A\r
+S3155000041011000007A81223FFB010001480A4801406\r
+S31550000420148000031300000892100012113FFFF8C9\r
+S315500004304000036F90058008A2922000028000734E\r
+S31550000440A010200080A40011B40680111A8000214B\r
+S31550000450A4248011333FFFF71100003FAA1223FF57\r
+S31550000460BA1663849810001092102000A00420023F\r
+S31550000470173FFFF89005800CD40A000B932A6008AA\r
+S315500004809803200180A3001006BFFFFB9212400A7A\r
+S31550000490912A60109932201080A300150280000A1C\r
+S315500004A090166386D417800892102002D617801DA6\r
+S315500004B04000015C9010001B80A220000280003793\r
+S315500004C01114000580A400110ABFFFE7B606E0022A\r
+S315500004D0900E801880A0000892603FFF80A0001206\r
+S315500004E090603FFF809240080280000680A68013ED\r
+S315500004F011140005400002AC9012203080A68013E3\r
+S3155000050012BFFFC880A480149410200080A28013CC\r
+S315500005101680000996102000D21280009132600891\r
+S315500005209002C0089402A00280A2801306BFFFFB6F\r
+S3155000053096020009920AE0FF900DE0FF80A2400863\r
+S31550000540028000041114000510BFFFA49012203839\r
+S31550000550153FFFF79012A3E0D205800880A26001F4\r
+S31550000560128000109212A3849012A386D41780088A\r
+S3155000057098102A01D6178009110001DF901223FC2A\r
+S31550000580400001289210200280A22000128000060E\r
+S31550000590211400051114000510BFFF909012202061\r
+S315500005A02114000540000280901420404000027E35\r
+S315500005B090142040901020F013080013D0302000E3\r
+S315500005C092126020D012400015200000900A3FFE83\r
+S315500005D0D03240009612A04C90102010D022C0006D\r
+S315500005E0D802C0009412A0B813080004D822800084\r
+S315500005F092126014D0024000900A3FFED022400072\r
+S3155000060010800000010000001114000510BFFF7398\r
+S3155000061090122048D20200001102807FD225800A13\r
+S31550000620901223FFD0258010D205800AD005801065\r
+S3155000063080A2400832BFFF40113FFFF790102001C3\r
+S31550000640D025801010BFFF3C113FFFF7D61780080A\r
+S31550000650921AE0B980A0000994603FFF901AE0DA40\r
+S3155000066080A0000892603FFF8092800902BFFEED95\r
+S31550000670113FFFF780A2E0DA22BFFEF0B81020014A\r
+S3155000068010BFFEEF900F20012114000540000246D6\r
+S315500006909014205030BFFFFE01000000941020F04F\r
+S315500006A019080013D430200098132020170800048E\r
+S315500006B0D41300008212E01417200000940ABFFEE3\r
+S315500006C09A12E0B8D4330000900A20FF9612E04CFC\r
+S315500006D0D222C00080A22001128000070100000033\r
+S315500006E0D202C000D2234000D0004000900A3FFE04\r
+S315500006F0D02040000100000081C3E0080100000046\r
+S315500007001308000492126014D00240009012200187\r
+S31550000710D02240000100000081C3E0080100000023\r
+S315500007209C03BF90D233A066D213A06696100008E1\r
+S31550000730920A6080D012000080A0000994402000E8\r
+S31550000740900A208080A000089240200080A2400A93\r
+S315500007500280000D01000000D012C000808A2020C7\r
+S315500007601280000901000000D012C000900A2080BB\r
+S3155000077080A000089240200080A2400A12BFFFF7D6\r
+S3155000078001000000D012C000900A208080A000080E\r
+S3155000079090402000901A000A901A20010100000093\r
+S315500007A081C3E0089C23BF909DE3BF90B20E60FFCB\r
+S315500007B0A0100018C027BFF480A660BA14800006A7\r
+S315500007C080A660DA80A660B916800006153FFFEA5B\r
+S315500007D080A660B512800027B0102000153FFFEAB2\r
+S315500007E096102AAA9412A2AA13000015D432C00059\r
+S315500007F09212615598102554113FFFE0D2330000F4\r
+S3155000080090122080D032C000D432C000D2330000C3\r
+S315500008101100000C2300003F90122030130000C33B\r
+S31550000820D0340000A412613FB21463FF921463FFE8\r
+S315500008307FFFFFBC90100010B0100008D007BFF427\r
+S3155000084090022001D027BFF4D214000080A64009A0\r
+S315500008500280000880A620011280000601000000D8\r
+S31550000860D007BFF480A2001208BFFFF2921463FFB4\r
+S31550000870D007BFF4130000C39212613F80A2400814\r
+S3155000088094403FFFB00E000A0100000081C7E00807\r
+S3155000089081E80000153FFFEA98102AAA9412A2AAEE\r
+S315500008A0D4330000170000159612E155153FFFE4AA\r
+S315500008B0D63025549412A090D4330000D61022007E\r
+S315500008C09A100008960AE0FFD6320000901030F0D9\r
+S315500008D0D0330000D613400098100009901AE03724\r
+S315500008E080A0000894603FFF901AE01C80A000088A\r
+S315500008F092603FFF8092800912800007821020008C\r
+S3155000090080A2E0C20280000480A2E0201280004251\r
+S3155000091090102000113FFFEA94102AAA901222AAA2\r
+S31550000920D03280001300001592126155113FFFE43A\r
+S31550000930D230255490122090D0328000D21022020C\r
+S31550000940901030F0920A60FFD2330000D03280000F\r
+S31550000950D013400080A220370280002A80A2202097\r
+S31550000960D41300000280001D912AA0109002BF47A8\r
+S31550000970912A201091322010952AA01080A2200290\r
+S315500009809532A01092602000901AA0B580A0000861\r
+S31550000990920A600190603FFF809240083280000BBF\r
+S315500009A08210200180A2A0B90280000A80A2A0BABB\r
+S315500009B00280000880A2A0EF0280000680A2A0DA82\r
+S315500009C02280000282102001108000139010000136\r
+S315500009D010BFFFFE821020019132201080A220EE1F\r
+S315500009E012BFFFE49002BF479010201CD033400046\r
+S315500009F0921020B9D233000010BFFFDD941020B9F9\r
+S31550000A00D413000080A2A03402BFFFF880A2202099\r
+S31550000A1030BFFFD50100000081C3E008010000008F\r
+S31550000A209DE3BF88B72EE010C037BFF4B736E0104D\r
+S31550000A30A0100018C027BFEC80A6E0BA14800006AC\r
+S31550000A4080A6E0DA80A6E0B916800006113FFFEADC\r
+S31550000A5080A6E0B512800023B0102000113FFFEAB7\r
+S31550000A6094102AAA901222AAD032800013000015A0\r
+S31550000A7092126155113FFFE8D2302554901220A0B2\r
+S31550000A80D0328000F837BFF2D017BFF2130000C340\r
+S31550000A90D0340000B612613FD217BFF27FFFFF215C\r
+S31550000AA090100010B0100008D007BFEC9002200143\r
+S31550000AB0D027BFECD2140000D017BFF280A2000995\r
+S31550000AC00280000880A62001128000060100000066\r
+S31550000AD0D007BFEC80A2001B08BFFFF0010000004A\r
+S31550000AE0D007BFEC130000C39212613F80A24008AA\r
+S31550000AF094403FFFB00E000A0100000081C7E00895\r
+S31550000B0081E800009DE3BF9811140005D4022150DE\r
+S31550000B10A210200080A4400AA410001B9A102000A6\r
+S31550000B20A0102000A610200116800012961020005A\r
+S31550000B30912EA010B5322010932EE0109810000A76\r
+S31550000B40111400059332601094122060D002A00C4C\r
+S31550000B5080A2001A22800048D002A0109602E0011E\r
+S31550000B6080A2C00C06BFFFFA9402A05011140005D3\r
+S31550000B70D202215080A2C009028000449010200168\r
+S31550000B8080A6200008800016912AE0029002000BF1\r
+S31550000B9013140005B4126060992A20049E10200197\r
+S31550000BA0912C200290020010912A200290030008F6\r
+S31550000BB09002001AD4022004A2046001D202200836\r
+S31550000BC080A4400A932BC0099A034009A0643FFFB2\r
+S31550000BD080A6000D18BFFFF4912C200280A660005D\r
+S31550000BE00480001F932AE0029202400BB60CA0FF2D\r
+S31550000BF011140005A4122060B52A60049210001B3F\r
+S31550000C007FFFFEEA90100018932C200292024010AB\r
+S31550000C10932A6002920680099402401280A2200014\r
+S31550000C2002800013A2046001D202A0089010200195\r
+S31550000C30912A000980A64008B00600080680000ADE\r
+S31550000C40B2264008D002A00480A44008A0643FFF0A\r
+S31550000C5080A6600014BFFFEB9210001B1080000BA3\r
+S31550000C6090100013108000099010200110BFFFFC57\r
+S31550000C70A610200080A2000932BFFFBA9602E001FA\r
+S31550000C8010BFFFBC1114000581C7E00891E80008A9\r
+S31550000C9013140005D40A61801708000013000013CE\r
+S31550000CA09212630C952AA00294028009D202C00ABD\r
+S31550000CB0941000089132601F80A22001028000002B\r
+S31550000CC09132601D808A20012280000490102001FC\r
+S31550000CD0C022800030800002D022800081C3E0080C\r
+S31550000CE09010000911140005D20A21801508000041\r
+S31550000CF0110000139012230C932A600292024008AE\r
+S31550000D00D20280099132601F80A220010280000029\r
+S31550000D100100000081C3E008901000099DE3BF90D8\r
+S31550000D2011140005E00A2180B00E20FF11140005B1\r
+S31550000D3090122154B12E2002E2020018A12C20025A\r
+S31550000D40110000139012230CA00400087FFFFFD15E\r
+S31550000D509007BFF4D207BFF411060000932A601E15\r
+S31550000D60921240112308000092124008D2244010DB\r
+S31550000D707FFFFFC89007BFF4D207BFF411070000EA\r
+S31550000D80932A601E92124008D22440107FFFFFC162\r
+S31550000D909007BFF4D207BFF411030000932A601ED8\r
+S31550000DA092124008D22440107FFFFFBA9007BFF43A\r
+S31550000DB0D207BFF41104000090122003932A601E3C\r
+S31550000DC092124008D22440107FFFFFB29007BFF422\r
+S31550000DD0D207BFF411050000932A601E92124008F4\r
+S31550000DE0D22440107FFFFFC0010000000100000028\r
+S31550000DF081C7E00881E800009DE3BF90111400050B\r
+S31550000E00E00A218025080000110000139012230CDF\r
+S31550000E10A12C2002A00400087FFFFF9E9007BFF47C\r
+S31550000E20D207BFF411050000932A601E92124008A3\r
+S31550000E30D22480107FFFFF979007BFF4A2100008BE\r
+S31550000E40D007BFF427040000912A201E90120013E9\r
+S31550000E50D02480107FFFFF8F9007BFF4D207BFF4D6\r
+S31550000E6011040004932A601E92124008D224801066\r
+S31550000E707FFFFF889007BFF4D007BFF4A20C60FF36\r
+S31550000E80912A201E9012001190120013D024801027\r
+S31550000E907FFFFF95010000000100000081C7E008B8\r
+S31550000EA081E800009DE3BF9011140005D20A21800D\r
+S31550000EB02708000011000013932A60029012230C99\r
+S31550000EC09202400893326002AC100009AB2A6002CD\r
+S31550000ED0AE1000097FFFFF6F9007BFF4D007BFF435\r
+S31550000EE023030000912A201E90120011D024C01511\r
+S31550000EF07FFFFF7D0100000091322016A08A200F4F\r
+S31550000F0032800011A2102000A4100011A32DA002BF\r
+S31550000F107FFFFF609007BFF4D207BFF4932A601E8D\r
+S31550000F2092124012D224C0117FFFFF6F01000000C1\r
+S31550000F3091322016A08A200F02BFFFF60100000052\r
+S31550000F40A210200080A440101ABFFFE3A52DE00296\r
+S31550000F50290100007FFFFF4F9007BFF4D007BFF471\r
+S31550000F60A2046001912A201E90120014D024C012AF\r
+S31550000F707FFFFF5D01000000D02E0000808A20FF19\r
+S31550000F8002800006B006200180A440100ABFFFF27E\r
+S31550000F900100000030BFFFD00100000081C7E0080B\r
+S31550000FA081E800009DE3BF9011140005D20A21800C\r
+S31550000FB025080000D40E000011000013932A600289\r
+S31550000FC09012230C80A2A000028000849202400856\r
+S31550000FD0AD2A60109135A012A72A2002AA10000847\r
+S31550000FE0A81000137FFFFF2B9007BFF4D007BFF464\r
+S31550000FF021030000912A201E90120010D024801345\r
+S315500010007FFFFF3901000000900A200680A22006CB\r
+S315500010100280001001000000A2100010A12D6002F5\r
+S315500010207FFFFF1C9007BFF4D207BFF4932A601EC0\r
+S3155000103092124011D22480107FFFFF2B0100000036\r
+S31550001040900A200680A2200612BFFFF6010000007B\r
+S315500010507FFFFF109007BFF4D007BFF4D20E0000F9\r
+S31550001060912A201E90120009D02480147FFFFF1E63\r
+S31550001070B0062001D00E000080A2200012BFFFDA79\r
+S31550001080010000009135A010D404800880A2A00071\r
+S315500010900680004C010000009132A01D808A20017C\r
+S315500010A00280004690102001C027BFF4D007BFF43D\r
+S315500010B013030000912A201E901200099335A010A8\r
+S315500010C0D0248009D404800980A2A0000680003470\r
+S315500010D0900AA00680A22006028000169135A01222\r
+S315500010E09A1000089E102001972A2002190300002A\r
+S315500010F09132A01D808A2001128000039210200098\r
+S315500011009210000F912A601E9012000CD024800B72\r
+S31550001110D404800B80A2A0000680001A900AA00674\r
+S3155000112080A2200612BFFFF49132A01DD227BFF431\r
+S315500011309132A01D808A200102800010901020015B\r
+S31550001140C027BFF4D007BFF49335A010912A201EB4\r
+S31550001150D0248009D404800980A2A00016800021E2\r
+S3155000116090100009D404800880A2A00006BFFFFE9C\r
+S31550001170010000003080001B10BFFFF3D027BFF4E2\r
+S31550001180912B6002D404800880A2A00006BFFFFE07\r
+S315500011900100000010BFFFE3900AA006901000095E\r
+S315500011A0D404800880A2A00006BFFFFE0100000004\r
+S315500011B010BFFFC9900AA00610BFFFBDD027BFF4CD\r
+S315500011C0D404800880A2A00006BFFFFE01000000E4\r
+S315500011D010BFFFB39132A01D10BFFFABAD2A6010F8\r
+S315500011E00100000081C7E00881E800009DE3BF9838\r
+S315500011F035140005F60EA180921000183500001324\r
+S31550001200B416A30CB72EE002B606C01A992EE010FB\r
+S31550001210B53320129B2EA002A210001AA610001958\r
+S315500012203B080000961020009410000DA410001AE0\r
+S31550001230F807400D80A7200006800064B137201DB6\r
+S31550001240B00E200180A00018B0603FFFB12E201EC6\r
+S3155000125033030000B0160019F027400AF807400A79\r
+S3155000126080A7200006800052B1372016B48E200F7A\r
+S315500012701280001A82102000B3332012310003D09E\r
+S31550001280901000199E162240B32E600237030000BC\r
+S3155000129080A0400F8200600118800053B0102000DB\r
+S315500012A0B137201DB00E200180A00018B0603FFF5E\r
+S315500012B0B12E201EB016001BF0274019F807401912\r
+S315500012C080A7200006800033B1372016B48E200F39\r
+S315500012D002BFFFF180A0400F8210200080A0401A6C\r
+S315500012E01ABFFFD4B1332012B72E20029010001827\r
+S315500012F09E10001BA0100018F807401B80A7200066\r
+S315500013000680001DB137201DB00E200180A00018A8\r
+S31550001310B0603FFFB12E201E33010000B0160019F9\r
+S31550001320F027400FF807400F80A720000680000CDA\r
+S31550001330B12C20029602E001F82A400080A2C01388\r
+S3155000134002800029B010000B8200600180A0401A74\r
+S315500013500ABFFFEA9202600130BFFFB6F807401895\r
+S3155000136080A7200006BFFFFE0100000010BFFFF35C\r
+S315500013709602E001B12A2002F807401880A7200003\r
+S3155000138006BFFFFE0100000010BFFFE0B137201D71\r
+S31550001390B12A2002F807401880A7200006BFFFFE9A\r
+S315500013A00100000010BFFFCAB1372016B12CA002B1\r
+S315500013B0F807401880A7200006BFFFFE0100000076\r
+S315500013C010BFFFABB1372016B12C6002F80740189A\r
+S315500013D080A7200006BFFFFE0100000010BFFF9946\r
+S315500013E0B137201D0100000081C7E00881E80000E8\r
+S315500013F09DE3BF987FFFFE81B00E20FF7FFFFE4822\r
+S3155000140081E800000100000000000000000000001C\r
+S315500014100000000000000000000000000000000076\r
+S315500014204572726F723400004572726F72330000EB\r
+S315500014304F4B0000000000004572726F7232000080\r
+S31550001440454E4400000000004572726F7235000030\r
+S315500014504572726F723100000000000000000000FB\r
+S3155000146000000000000000010000000E00000037E0\r
+S31550001470000000B500004000000000030000000D11\r
+S3155000148000000037000000B5000080000000000496\r
+S315500014900000000F00000037000000B500010000FA\r
+S315500014A00000000B0000001000000037000000B5DF\r
+S315500014B00000000000000007000000100000001CA3\r
+S315500014C0000000B900007000000000080000000F86\r
+S315500014D00000001C000000B9000078000000000A5F\r
+S315500014E00000000D0000001C000000B900007C0048\r
+S315500014F00000000B0000000E0000001C000000B9A8\r
+S31550001500000000000000000F000000100000001C4A\r
+S31550001510000000DA00007000000000100000000F0C\r
+S315500015200000001C000000DA0000700000000012ED\r
+S315500015300000000D0000001C000000DA00007000E2\r
+S31550001540000000130000000E0000001C000000DA2E\r
+S3155000155000000003000001FB000000FD0000007EBB\r
+S315500015600000003F0000002A000000150000000A9D\r
+S3115000157000000000000000000000000019\r
+S70550000000AA\r
index bee9480d798c35e21c6aa7f3f217d2d60bad324b..0fcd97e27bac6349850b06cc8b8d7e7a509eef1e 100644 (file)
@@ -163,6 +163,7 @@ ao-tools/ao-load/Makefile
 ao-tools/ao-telem/Makefile
 ao-tools/ao-stmload/Makefile
 ao-tools/ao-send-telem/Makefile
 ao-tools/ao-telem/Makefile
 ao-tools/ao-stmload/Makefile
 ao-tools/ao-send-telem/Makefile
+ao-tools/ao-sky-flash/Makefile
 ao-utils/Makefile
 src/Version
 ])
 ao-utils/Makefile
 src/Version
 ])