-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
--- /dev/null
+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
--- /dev/null
+.\"
+.\" 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
--- /dev/null
+/*
+ * 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);
+}
--- /dev/null
+/*
+ * 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;
+}
--- /dev/null
+/*
+ * 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;
+}
--- /dev/null
+/*
+ * 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);
--- /dev/null
+/*
+ * 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);
+}
--- /dev/null
+/*
+ * 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;
+}
--- /dev/null
+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
--- /dev/null
+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
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
])