diff options
| author | Keith Packard <keithp@keithp.com> | 2012-11-30 17:36:40 -0800 | 
|---|---|---|
| committer | Keith Packard <keithp@keithp.com> | 2012-11-30 17:36:40 -0800 | 
| commit | dd8b2eadab12965d232640449b1d1c9f2484238c (patch) | |
| tree | 3b9f476eabc78f0ffa7aaed9e44762ef75bff68b | |
| parent | 860d0526737295c695f8e6a790d72b49eb4a686d (diff) | |
ao-tools: Add ao-sky-flash to update GPS firmware
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>
| -rw-r--r-- | ao-tools/Makefile.am | 2 | ||||
| -rw-r--r-- | ao-tools/ao-sky-flash/Makefile.am | 18 | ||||
| -rw-r--r-- | ao-tools/ao-sky-flash/STI_01.04.42-01.10.23_4x_9600_Bin_20100901.bin | bin | 0 -> 318000 bytes | |||
| -rw-r--r-- | ao-tools/ao-sky-flash/STI_01.06.10-01.07.23_balloon_CRC_7082_9600_20120913.bin | bin | 0 -> 303344 bytes | |||
| -rw-r--r-- | ao-tools/ao-sky-flash/ao-sky-flash.1 | 85 | ||||
| -rw-r--r-- | ao-tools/ao-sky-flash/sky_bin.c | 75 | ||||
| -rw-r--r-- | ao-tools/ao-sky-flash/sky_debug.c | 111 | ||||
| -rw-r--r-- | ao-tools/ao-sky-flash/sky_flash.c | 259 | ||||
| -rw-r--r-- | ao-tools/ao-sky-flash/sky_flash.h | 67 | ||||
| -rw-r--r-- | ao-tools/ao-sky-flash/sky_serial.c | 259 | ||||
| -rw-r--r-- | ao-tools/ao-sky-flash/sky_srec.c | 60 | ||||
| -rw-r--r-- | ao-tools/ao-sky-flash/srec_115200.bin | 346 | ||||
| -rw-r--r-- | ao-tools/ao-sky-flash/srec_9600.bin | 346 | ||||
| -rw-r--r-- | configure.ac | 1 | 
14 files changed, 1628 insertions, 1 deletions
| diff --git a/ao-tools/Makefile.am b/ao-tools/Makefile.am index 257fdaec..871b8205 100644 --- a/ao-tools/Makefile.am +++ b/ao-tools/Makefile.am @@ -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 index 00000000..f6c5089a --- /dev/null +++ b/ao-tools/ao-sky-flash/Makefile.am @@ -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.binBinary files differ new file mode 100644 index 00000000..c698add2 --- /dev/null +++ b/ao-tools/ao-sky-flash/STI_01.04.42-01.10.23_4x_9600_Bin_20100901.bin 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.binBinary files differ new file mode 100644 index 00000000..9e256897 --- /dev/null +++ b/ao-tools/ao-sky-flash/STI_01.06.10-01.07.23_balloon_CRC_7082_9600_20120913.bin 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 index 00000000..d61c9c9d --- /dev/null +++ b/ao-tools/ao-sky-flash/ao-sky-flash.1 @@ -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 index 00000000..e693c892 --- /dev/null +++ b/ao-tools/ao-sky-flash/sky_bin.c @@ -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 index 00000000..32571f0e --- /dev/null +++ b/ao-tools/ao-sky-flash/sky_debug.c @@ -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 index 00000000..55cb2cb6 --- /dev/null +++ b/ao-tools/ao-sky-flash/sky_flash.c @@ -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 index 00000000..77f4c742 --- /dev/null +++ b/ao-tools/ao-sky-flash/sky_flash.h @@ -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 index 00000000..4aeb1458 --- /dev/null +++ b/ao-tools/ao-sky-flash/sky_serial.c @@ -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 index 00000000..6d00f58c --- /dev/null +++ b/ao-tools/ao-sky-flash/sky_srec.c @@ -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 index 00000000..8ea8e7cd --- /dev/null +++ b/ao-tools/ao-sky-flash/srec_115200.bin @@ -0,0 +1,346 @@ +S0130000666C6173683131353230302E73726563DA
 +S31550000000033FFFF7821063209DE380011920000013
 +S31550000010D2030000173FFFF79612E3E4AC07BFF890
 +S31550000020D225800BD005800B133FFFC0900A0009E4
 +S3155000003090122977D0230000E00320901B0800136C
 +S31550000040C0232090D20320149E136018D225800B13
 +S31550000050D005800B1300180090120009900A3FF04B
 +S31550000060D0232014D20300001100003FD225800B6C
 +S31550000070D405800B901223FF940A800813043E0087
 +S3155000008094128009D4230000D003C0009A13601C38
 +S31550000090D025800BD205800B11004000902A4008D5
 +S315500000A0D023C000D403400011000040D425800B5B
 +S315500000B0D205800BA00C204092124008A13C20068D
 +S315500000C011140005E02A2180D2234000B8102000E8
 +S315500000D0400004C890102005130004004000017031
 +S315500000E090102001213FFFF84000036F90058010CB
 +S315500000F0A014200A92058010B6102000B4102000DB
 +S31550000100A6102000AE10200096102000D00A400005
 +S3155000011080A2202002800006920260019602E00131
 +S3155000012080A2E06324BFFFFBD00A40009810200055
 +S3155000013080A3000B1680000F113FFFF89012200A83
 +S31550000140940580089810000B912CE0029002001341
 +S31550000150D20A8000912A200190020009A6023FD0BF
 +S3155000016098833FFF12BFFFF99402A0019810000B2D
 +S315500001709205800C113FFFF894024008961020001B
 +S315500001809002800BD20A201680A2602002800007BF
 +S3155000019080A2E0009602E00180A2E06304BFFFFA6D
 +S315500001A09002800B80A2E0000480000F113FFFF800
 +S315500001B09205800C9012201698024008900DE0FF90
 +S315500001C0932A2002D40B000092024008932A600121
 +S315500001D094028009AE02BFD09682FFFF12BFFFF88D
 +S315500001E098032001133FFFF794126384921263869B
 +S315500001F090078009400001A89207800A80A220003B
 +S3155000020002800122153FFFF79012A386D21780086D
 +S3155000021080A2601C0280010E9012A384113FFFF74A
 +S31550000220961223849012238692102037D237800854
 +S31550000230941020B5D437800B900F2001213FFFF743
 +S31550000240AB2A201392142386110001E1D41780099A
 +S3155000025090122154A2142384A4054008D617801165
 +S3155000026090100012400002289210202080A22000F8
 +S31550000270028000CA11140005B0100010B21000110F
 +S31550000280A0102000113FFFEA80A420000280000445
 +S315500002909212225511000015921221AA912A60102D
 +S315500002A0A8162386A3322010D617801990048010E2
 +S315500002B0D417801492102002400001DA98100011D1
 +S315500002C080A22000028000B511140005D0148010C1
 +S315500002D080A44008128000B0A004200280A420030D
 +S315500002E004BFFFEA113FFFEA213FFFF79214238430
 +S315500002F0D617800990100012D417801440000202BD
 +S3155000030092102020170001DF9012E3F8D20200006D
 +S31550000310941423E4D225800AA01423E0C02580102B
 +S31550000320D005800A80A23FFF228000BB9012E3FCDA
 +S31550000330113FFFF7A2122384A0122386110001C198
 +S31550000340D417801090122154D61780119210202065
 +S31550000350400001ED90054008110001E9D4178010C6
 +S3155000036090122154D617801192102020400001E699
 +S3155000037090054008110001F1D417801090122154B5
 +S31550000380D617801192102020400001DF90054008BA
 +S31550000390133FFFF8D00D800980A220421280000B37
 +S315500003A0A410001392058009D00A600180A220494A
 +S315500003B03280000721140005D00A600280A2204E28
 +S315500003C022800008D417801021140005400002F640
 +S315500003D09014202890142028400002F39E03FCF02D
 +S315500003E090102000D6178011400001C792100013BC
 +S315500003F080A2200022800069111400051114000506
 +S31550000400400002E990122030400000BE010000007A
 +S3155000041011000007A81223FFB010001480A4801406
 +S31550000420148000031300000892100012113FFFF8C9
 +S315500004304000036F90058008A2922000028000734E
 +S31550000440A010200080A40011B40680111A8000214B
 +S31550000450A4248011333FFFF71100003FAA1223FF57
 +S31550000460BA1663849810001092102000A00420023F
 +S31550000470173FFFF89005800CD40A000B932A6008AA
 +S315500004809803200180A3001006BFFFFB9212400A7A
 +S31550000490912A60109932201080A300150280000A1C
 +S315500004A090166386D417800892102002D617801DA6
 +S315500004B04000015C9010001B80A220000280003793
 +S315500004C01114000580A400110ABFFFE7B606E0022A
 +S315500004D0900E801880A0000892603FFF80A0001206
 +S315500004E090603FFF809240080280000680A68013ED
 +S315500004F011140005400002AC9012203080A68013E3
 +S3155000050012BFFFC880A480149410200080A28013CC
 +S315500005101680000996102000D21280009132600891
 +S315500005209002C0089402A00280A2801306BFFFFB6F
 +S3155000053096020009920AE0FF900DE0FF80A2400863
 +S31550000540028000041114000510BFFFA49012203839
 +S31550000550153FFFF79012A3E0D205800880A26001F4
 +S31550000560128000109212A3849012A386D41780088A
 +S3155000057098102A01D6178009110001DF901223FC2A
 +S31550000580400001289210200280A22000128000060E
 +S31550000590211400051114000510BFFF909012202061
 +S315500005A02114000540000280901420404000027E35
 +S315500005B090142040901020F013080013D0302000E3
 +S315500005C092126020D012400015200000900A3FFE83
 +S315500005D0D03240009612A04C90102010D022C0006D
 +S315500005E0D802C0009412A0B813080004D822800084
 +S315500005F092126014D0024000900A3FFED022400072
 +S3155000060010800000010000001114000510BFFF7398
 +S3155000061090122048D20200001102807FD225800A13
 +S31550000620901223FFD0258010D205800AD005801065
 +S3155000063080A2400832BFFF40113FFFF790102001C3
 +S31550000640D025801010BFFF3C113FFFF7D61780080A
 +S31550000650921AE0B980A0000994603FFF901AE0DA40
 +S3155000066080A0000892603FFF8092800902BFFEED95
 +S31550000670113FFFF780A2E0DA22BFFEF0B81020014A
 +S3155000068010BFFEEF900F20012114000540000246D6
 +S315500006909014205030BFFFFE01000000941020F04F
 +S315500006A019080013D430200098132020170800048E
 +S315500006B0D41300008212E01417200000940ABFFEE3
 +S315500006C09A12E0B8D4330000900A20FF9612E04CFC
 +S315500006D0D222C00080A22001128000070100000033
 +S315500006E0D202C000D2234000D0004000900A3FFE04
 +S315500006F0D02040000100000081C3E0080100000046
 +S315500007001308000492126014D00240009012200187
 +S31550000710D02240000100000081C3E0080100000023
 +S315500007209C03BF90D233A066D213A06696100008E1
 +S31550000730920A6080D012000080A0000994402000E8
 +S31550000740900A208080A000089240200080A2400A93
 +S315500007500280000D01000000D012C000808A2020C7
 +S315500007601280000901000000D012C000900A2080BB
 +S3155000077080A000089240200080A2400A12BFFFF7D6
 +S3155000078001000000D012C000900A208080A000080E
 +S3155000079090402000901A000A901A20010100000093
 +S315500007A081C3E0089C23BF909DE3BF90B20E60FFCB
 +S315500007B0A0100018C027BFF480A660BA14800006A7
 +S315500007C080A660DA80A660B916800006153FFFEA5B
 +S315500007D080A660B512800027B0102000153FFFEAB2
 +S315500007E096102AAA9412A2AA13000015D432C00059
 +S315500007F09212615598102554113FFFE0D2330000F4
 +S3155000080090122080D032C000D432C000D2330000C3
 +S315500008101100000C2300003F90122030130000C33B
 +S31550000820D0340000A412613FB21463FF921463FFE8
 +S315500008307FFFFFBC90100010B0100008D007BFF427
 +S3155000084090022001D027BFF4D214000080A64009A0
 +S315500008500280000880A620011280000601000000D8
 +S31550000860D007BFF480A2001208BFFFF2921463FFB4
 +S31550000870D007BFF4130000C39212613F80A2400814
 +S3155000088094403FFFB00E000A0100000081C7E00807
 +S3155000089081E80000153FFFEA98102AAA9412A2AAEE
 +S315500008A0D4330000170000159612E155153FFFE4AA
 +S315500008B0D63025549412A090D4330000D61022007E
 +S315500008C09A100008960AE0FFD6320000901030F0D9
 +S315500008D0D0330000D613400098100009901AE03724
 +S315500008E080A0000894603FFF901AE01C80A000088A
 +S315500008F092603FFF8092800912800007821020008C
 +S3155000090080A2E0C20280000480A2E0201280004251
 +S3155000091090102000113FFFEA94102AAA901222AAA2
 +S31550000920D03280001300001592126155113FFFE43A
 +S31550000930D230255490122090D0328000D21022020C
 +S31550000940901030F0920A60FFD2330000D03280000F
 +S31550000950D013400080A220370280002A80A2202097
 +S31550000960D41300000280001D912AA0109002BF47A8
 +S31550000970912A201091322010952AA01080A2200290
 +S315500009809532A01092602000901AA0B580A0000861
 +S31550000990920A600190603FFF809240083280000BBF
 +S315500009A08210200180A2A0B90280000A80A2A0BABB
 +S315500009B00280000880A2A0EF0280000680A2A0DA82
 +S315500009C02280000282102001108000139010000136
 +S315500009D010BFFFFE821020019132201080A220EE1F
 +S315500009E012BFFFE49002BF479010201CD033400046
 +S315500009F0921020B9D233000010BFFFDD941020B9F9
 +S31550000A00D413000080A2A03402BFFFF880A2202099
 +S31550000A1030BFFFD50100000081C3E008010000008F
 +S31550000A209DE3BF88B72EE010C037BFF4B736E0104D
 +S31550000A30A0100018C027BFEC80A6E0BA14800006AC
 +S31550000A4080A6E0DA80A6E0B916800006113FFFEADC
 +S31550000A5080A6E0B512800023B0102000113FFFEAB7
 +S31550000A6094102AAA901222AAD032800013000015A0
 +S31550000A7092126155113FFFE8D2302554901220A0B2
 +S31550000A80D0328000F837BFF2D017BFF2130000C340
 +S31550000A90D0340000B612613FD217BFF27FFFFF215C
 +S31550000AA090100010B0100008D007BFEC9002200143
 +S31550000AB0D027BFECD2140000D017BFF280A2000995
 +S31550000AC00280000880A62001128000060100000066
 +S31550000AD0D007BFEC80A2001B08BFFFF0010000004A
 +S31550000AE0D007BFEC130000C39212613F80A24008AA
 +S31550000AF094403FFFB00E000A0100000081C7E00895
 +S31550000B0081E800009DE3BF9811140005D4022150DE
 +S31550000B10A210200080A4400AA410001B9A102000A6
 +S31550000B20A0102000A610200116800012961020005A
 +S31550000B30912EA010B5322010932EE0109810000A76
 +S31550000B40111400059332601094122060D002A00C4C
 +S31550000B5080A2001A22800048D002A0109602E0011E
 +S31550000B6080A2C00C06BFFFFA9402A05011140005D3
 +S31550000B70D202215080A2C009028000449010200168
 +S31550000B8080A6200008800016912AE0029002000BF1
 +S31550000B9013140005B4126060992A20049E10200197
 +S31550000BA0912C200290020010912A200290030008F6
 +S31550000BB09002001AD4022004A2046001D202200836
 +S31550000BC080A4400A932BC0099A034009A0643FFFB2
 +S31550000BD080A6000D18BFFFF4912C200280A660005D
 +S31550000BE00480001F932AE0029202400BB60CA0FF2D
 +S31550000BF011140005A4122060B52A60049210001B3F
 +S31550000C007FFFFEEA90100018932C200292024010AB
 +S31550000C10932A6002920680099402401280A2200014
 +S31550000C2002800013A2046001D202A0089010200195
 +S31550000C30912A000980A64008B00600080680000ADE
 +S31550000C40B2264008D002A00480A44008A0643FFF0A
 +S31550000C5080A6600014BFFFEB9210001B1080000BA3
 +S31550000C6090100013108000099010200110BFFFFC57
 +S31550000C70A610200080A2000932BFFFBA9602E001FA
 +S31550000C8010BFFFBC1114000581C7E00891E80008A9
 +S31550000C9013140005D40A61801708000013000013CE
 +S31550000CA09212630C952AA00294028009D202C00ABD
 +S31550000CB0941000089132601F80A22001028000002B
 +S31550000CC09132601D808A20012280000490102001FC
 +S31550000CD0C022800030800002D022800081C3E0080C
 +S31550000CE09010000911140005D20A21801508000041
 +S31550000CF0110000139012230C932A600292024008AE
 +S31550000D00D20280099132601F80A220010280000029
 +S31550000D100100000081C3E008901000099DE3BF90D8
 +S31550000D2011140005E00A2180B00E20FF11140005B1
 +S31550000D3090122154B12E2002E2020018A12C20025A
 +S31550000D40110000139012230CA00400087FFFFFD15E
 +S31550000D509007BFF4D207BFF411060000932A601E15
 +S31550000D60921240112308000092124008D2244010DB
 +S31550000D707FFFFFC89007BFF4D207BFF411070000EA
 +S31550000D80932A601E92124008D22440107FFFFFC162
 +S31550000D909007BFF4D207BFF411030000932A601ED8
 +S31550000DA092124008D22440107FFFFFBA9007BFF43A
 +S31550000DB0D207BFF41104000090122003932A601E3C
 +S31550000DC092124008D22440107FFFFFB29007BFF422
 +S31550000DD0D207BFF411050000932A601E92124008F4
 +S31550000DE0D22440107FFFFFC0010000000100000028
 +S31550000DF081C7E00881E800009DE3BF90111400050B
 +S31550000E00E00A218025080000110000139012230CDF
 +S31550000E10A12C2002A00400087FFFFF9E9007BFF47C
 +S31550000E20D207BFF411050000932A601E92124008A3
 +S31550000E30D22480107FFFFF979007BFF4A2100008BE
 +S31550000E40D007BFF427040000912A201E90120013E9
 +S31550000E50D02480107FFFFF8F9007BFF4D207BFF4D6
 +S31550000E6011040004932A601E92124008D224801066
 +S31550000E707FFFFF889007BFF4D007BFF4A20C60FF36
 +S31550000E80912A201E9012001190120013D024801027
 +S31550000E907FFFFF95010000000100000081C7E008B8
 +S31550000EA081E800009DE3BF9011140005D20A21800D
 +S31550000EB02708000011000013932A60029012230C99
 +S31550000EC09202400893326002AC100009AB2A6002CD
 +S31550000ED0AE1000097FFFFF6F9007BFF4D007BFF435
 +S31550000EE023030000912A201E90120011D024C01511
 +S31550000EF07FFFFF7D0100000091322016A08A200F4F
 +S31550000F0032800011A2102000A4100011A32DA002BF
 +S31550000F107FFFFF609007BFF4D207BFF4932A601E8D
 +S31550000F2092124012D224C0117FFFFF6F01000000C1
 +S31550000F3091322016A08A200F02BFFFF60100000052
 +S31550000F40A210200080A440101ABFFFE3A52DE00296
 +S31550000F50290100007FFFFF4F9007BFF4D007BFF471
 +S31550000F60A2046001912A201E90120014D024C012AF
 +S31550000F707FFFFF5D01000000D02E0000808A20FF19
 +S31550000F8002800006B006200180A440100ABFFFF27E
 +S31550000F900100000030BFFFD00100000081C7E0080B
 +S31550000FA081E800009DE3BF9011140005D20A21800C
 +S31550000FB025080000D40E000011000013932A600289
 +S31550000FC09012230C80A2A000028000849202400856
 +S31550000FD0AD2A60109135A012A72A2002AA10000847
 +S31550000FE0A81000137FFFFF2B9007BFF4D007BFF464
 +S31550000FF021030000912A201E90120010D024801345
 +S315500010007FFFFF3901000000900A200680A22006CB
 +S315500010100280001001000000A2100010A12D6002F5
 +S315500010207FFFFF1C9007BFF4D207BFF4932A601EC0
 +S3155000103092124011D22480107FFFFF2B0100000036
 +S31550001040900A200680A2200612BFFFF6010000007B
 +S315500010507FFFFF109007BFF4D007BFF4D20E0000F9
 +S31550001060912A201E90120009D02480147FFFFF1E63
 +S31550001070B0062001D00E000080A2200012BFFFDA79
 +S31550001080010000009135A010D404800880A2A00071
 +S315500010900680004C010000009132A01D808A20017C
 +S315500010A00280004690102001C027BFF4D007BFF43D
 +S315500010B013030000912A201E901200099335A010A8
 +S315500010C0D0248009D404800980A2A0000680003470
 +S315500010D0900AA00680A22006028000169135A01222
 +S315500010E09A1000089E102001972A2002190300002A
 +S315500010F09132A01D808A2001128000039210200098
 +S315500011009210000F912A601E9012000CD024800B72
 +S31550001110D404800B80A2A0000680001A900AA00674
 +S3155000112080A2200612BFFFF49132A01DD227BFF431
 +S315500011309132A01D808A200102800010901020015B
 +S31550001140C027BFF4D007BFF49335A010912A201EB4
 +S31550001150D0248009D404800980A2A00016800021E2
 +S3155000116090100009D404800880A2A00006BFFFFE9C
 +S31550001170010000003080001B10BFFFF3D027BFF4E2
 +S31550001180912B6002D404800880A2A00006BFFFFE07
 +S315500011900100000010BFFFE3900AA006901000095E
 +S315500011A0D404800880A2A00006BFFFFE0100000004
 +S315500011B010BFFFC9900AA00610BFFFBDD027BFF4CD
 +S315500011C0D404800880A2A00006BFFFFE01000000E4
 +S315500011D010BFFFB39132A01D10BFFFABAD2A6010F8
 +S315500011E00100000081C7E00881E800009DE3BF9838
 +S315500011F035140005F60EA180921000183500001324
 +S31550001200B416A30CB72EE002B606C01A992EE010FB
 +S31550001210B53320129B2EA002A210001AA610001958
 +S315500012203B080000961020009410000DA410001AE0
 +S31550001230F807400D80A7200006800064B137201DB6
 +S31550001240B00E200180A00018B0603FFFB12E201EC6
 +S3155000125033030000B0160019F027400AF807400A79
 +S3155000126080A7200006800052B1372016B48E200F7A
 +S315500012701280001A82102000B3332012310003D09E
 +S31550001280901000199E162240B32E600237030000BC
 +S3155000129080A0400F8200600118800053B0102000DB
 +S315500012A0B137201DB00E200180A00018B0603FFF5E
 +S315500012B0B12E201EB016001BF0274019F807401912
 +S315500012C080A7200006800033B1372016B48E200F39
 +S315500012D002BFFFF180A0400F8210200080A0401A6C
 +S315500012E01ABFFFD4B1332012B72E20029010001827
 +S315500012F09E10001BA0100018F807401B80A7200066
 +S315500013000680001DB137201DB00E200180A00018A8
 +S31550001310B0603FFFB12E201E33010000B0160019F9
 +S31550001320F027400FF807400F80A720000680000CDA
 +S31550001330B12C20029602E001F82A400080A2C01388
 +S3155000134002800029B010000B8200600180A0401A74
 +S315500013500ABFFFEA9202600130BFFFB6F807401895
 +S3155000136080A7200006BFFFFE0100000010BFFFF35C
 +S315500013709602E001B12A2002F807401880A7200003
 +S3155000138006BFFFFE0100000010BFFFE0B137201D71
 +S31550001390B12A2002F807401880A7200006BFFFFE9A
 +S315500013A00100000010BFFFCAB1372016B12CA002B1
 +S315500013B0F807401880A7200006BFFFFE0100000076
 +S315500013C010BFFFABB1372016B12C6002F80740189A
 +S315500013D080A7200006BFFFFE0100000010BFFF9946
 +S315500013E0B137201D0100000081C7E00881E80000E8
 +S315500013F09DE3BF987FFFFE81B00E20FF7FFFFE4822
 +S3155000140081E800000100000000000000000000001C
 +S315500014100000000000000000000000000000000076
 +S315500014204572726F723400004572726F72330000EB
 +S315500014304F4B0000000000004572726F7232000080
 +S31550001440454E4400000000004572726F7235000030
 +S315500014504572726F723100000000000000000000FB
 +S3155000146000000000000000010000000E00000037E0
 +S31550001470000000B500004000000000030000000D11
 +S3155000148000000037000000B5000080000000000496
 +S315500014900000000F00000037000000B500010000FA
 +S315500014A00000000B0000001000000037000000B5DF
 +S315500014B00000000000000007000000100000001CA3
 +S315500014C0000000B900007000000000080000000F86
 +S315500014D00000001C000000B9000078000000000A5F
 +S315500014E00000000D0000001C000000B900007C0048
 +S315500014F00000000B0000000E0000001C000000B9A8
 +S31550001500000000000000000F000000100000001C4A
 +S31550001510000000DA00007000000000100000000F0C
 +S315500015200000001C000000DA0000700000000012ED
 +S315500015300000000D0000001C000000DA00007000E2
 +S31550001540000000130000000E0000001C000000DA2E
 +S3155000155000000003000001AA000000D50000006A48
 +S3155000156000000035000000230000001100000008B4
 +S3115000157000000000000000000000000019
 +S70550000000AA
 diff --git a/ao-tools/ao-sky-flash/srec_9600.bin b/ao-tools/ao-sky-flash/srec_9600.bin new file mode 100644 index 00000000..9a29ab1b --- /dev/null +++ b/ao-tools/ao-sky-flash/srec_9600.bin @@ -0,0 +1,346 @@ +S0190000666C6173685F3139646F74355F393630302E737265638A
 +S31550000000033FFFF7821063209DE380011920000013
 +S31550000010D2030000173FFFF79612E3E4AC07BFF890
 +S31550000020D225800BD005800B133FFFC0900A0009E4
 +S3155000003090122977D0230000E00320901B0800136C
 +S31550000040C0232090D20320149E136018D225800B13
 +S31550000050D005800B1300180090120009900A3FF04B
 +S31550000060D0232014D20300001100003FD225800B6C
 +S31550000070D405800B901223FF940A800813043E0087
 +S3155000008094128009D4230000D003C0009A13601C38
 +S31550000090D025800BD205800B11004000902A4008D5
 +S315500000A0D023C000D403400011000040D425800B5B
 +S315500000B0D205800BA00C204092124008A13C20068D
 +S315500000C011140005E02A2180D2234000B8102000E8
 +S315500000D0400004C890102001130004004000017035
 +S315500000E090102001213FFFF84000036F90058010CB
 +S315500000F0A014200A92058010B6102000B4102000DB
 +S31550000100A6102000AE10200096102000D00A400005
 +S3155000011080A2202002800006920260019602E00131
 +S3155000012080A2E06324BFFFFBD00A40009810200055
 +S3155000013080A3000B1680000F113FFFF89012200A83
 +S31550000140940580089810000B912CE0029002001341
 +S31550000150D20A8000912A200190020009A6023FD0BF
 +S3155000016098833FFF12BFFFF99402A0019810000B2D
 +S315500001709205800C113FFFF894024008961020001B
 +S315500001809002800BD20A201680A2602002800007BF
 +S3155000019080A2E0009602E00180A2E06304BFFFFA6D
 +S315500001A09002800B80A2E0000480000F113FFFF800
 +S315500001B09205800C9012201698024008900DE0FF90
 +S315500001C0932A2002D40B000092024008932A600121
 +S315500001D094028009AE02BFD09682FFFF12BFFFF88D
 +S315500001E098032001133FFFF794126384921263869B
 +S315500001F090078009400001A89207800A80A220003B
 +S3155000020002800122153FFFF79012A386D21780086D
 +S3155000021080A2601C0280010E9012A384113FFFF74A
 +S31550000220961223849012238692102037D237800854
 +S31550000230941020B5D437800B900F2001213FFFF743
 +S31550000240AB2A201392142386110001E1D41780099A
 +S3155000025090122154A2142384A4054008D617801165
 +S3155000026090100012400002289210202080A22000F8
 +S31550000270028000CA11140005B0100010B21000110F
 +S31550000280A0102000113FFFEA80A420000280000445
 +S315500002909212225511000015921221AA912A60102D
 +S315500002A0A8162386A3322010D617801990048010E2
 +S315500002B0D417801492102002400001DA98100011D1
 +S315500002C080A22000028000B511140005D0148010C1
 +S315500002D080A44008128000B0A004200280A420030D
 +S315500002E004BFFFEA113FFFEA213FFFF79214238430
 +S315500002F0D617800990100012D417801440000202BD
 +S3155000030092102020170001DF9012E3F8D20200006D
 +S31550000310941423E4D225800AA01423E0C02580102B
 +S31550000320D005800A80A23FFF228000BB9012E3FCDA
 +S31550000330113FFFF7A2122384A0122386110001C198
 +S31550000340D417801090122154D61780119210202065
 +S31550000350400001ED90054008110001E9D4178010C6
 +S3155000036090122154D617801192102020400001E699
 +S3155000037090054008110001F1D417801090122154B5
 +S31550000380D617801192102020400001DF90054008BA
 +S31550000390133FFFF8D00D800980A220421280000B37
 +S315500003A0A410001392058009D00A600180A220494A
 +S315500003B03280000721140005D00A600280A2204E28
 +S315500003C022800008D417801021140005400002F640
 +S315500003D09014202890142028400002F39E03FCF02D
 +S315500003E090102000D6178011400001C792100013BC
 +S315500003F080A2200022800069111400051114000506
 +S31550000400400002E990122030400000BE010000007A
 +S3155000041011000007A81223FFB010001480A4801406
 +S31550000420148000031300000892100012113FFFF8C9
 +S315500004304000036F90058008A2922000028000734E
 +S31550000440A010200080A40011B40680111A8000214B
 +S31550000450A4248011333FFFF71100003FAA1223FF57
 +S31550000460BA1663849810001092102000A00420023F
 +S31550000470173FFFF89005800CD40A000B932A6008AA
 +S315500004809803200180A3001006BFFFFB9212400A7A
 +S31550000490912A60109932201080A300150280000A1C
 +S315500004A090166386D417800892102002D617801DA6
 +S315500004B04000015C9010001B80A220000280003793
 +S315500004C01114000580A400110ABFFFE7B606E0022A
 +S315500004D0900E801880A0000892603FFF80A0001206
 +S315500004E090603FFF809240080280000680A68013ED
 +S315500004F011140005400002AC9012203080A68013E3
 +S3155000050012BFFFC880A480149410200080A28013CC
 +S315500005101680000996102000D21280009132600891
 +S315500005209002C0089402A00280A2801306BFFFFB6F
 +S3155000053096020009920AE0FF900DE0FF80A2400863
 +S31550000540028000041114000510BFFFA49012203839
 +S31550000550153FFFF79012A3E0D205800880A26001F4
 +S31550000560128000109212A3849012A386D41780088A
 +S3155000057098102A01D6178009110001DF901223FC2A
 +S31550000580400001289210200280A22000128000060E
 +S31550000590211400051114000510BFFF909012202061
 +S315500005A02114000540000280901420404000027E35
 +S315500005B090142040901020F013080013D0302000E3
 +S315500005C092126020D012400015200000900A3FFE83
 +S315500005D0D03240009612A04C90102010D022C0006D
 +S315500005E0D802C0009412A0B813080004D822800084
 +S315500005F092126014D0024000900A3FFED022400072
 +S3155000060010800000010000001114000510BFFF7398
 +S3155000061090122048D20200001102807FD225800A13
 +S31550000620901223FFD0258010D205800AD005801065
 +S3155000063080A2400832BFFF40113FFFF790102001C3
 +S31550000640D025801010BFFF3C113FFFF7D61780080A
 +S31550000650921AE0B980A0000994603FFF901AE0DA40
 +S3155000066080A0000892603FFF8092800902BFFEED95
 +S31550000670113FFFF780A2E0DA22BFFEF0B81020014A
 +S3155000068010BFFEEF900F20012114000540000246D6
 +S315500006909014205030BFFFFE01000000941020F04F
 +S315500006A019080013D430200098132020170800048E
 +S315500006B0D41300008212E01417200000940ABFFEE3
 +S315500006C09A12E0B8D4330000900A20FF9612E04CFC
 +S315500006D0D222C00080A22001128000070100000033
 +S315500006E0D202C000D2234000D0004000900A3FFE04
 +S315500006F0D02040000100000081C3E0080100000046
 +S315500007001308000492126014D00240009012200187
 +S31550000710D02240000100000081C3E0080100000023
 +S315500007209C03BF90D233A066D213A06696100008E1
 +S31550000730920A6080D012000080A0000994402000E8
 +S31550000740900A208080A000089240200080A2400A93
 +S315500007500280000D01000000D012C000808A2020C7
 +S315500007601280000901000000D012C000900A2080BB
 +S3155000077080A000089240200080A2400A12BFFFF7D6
 +S3155000078001000000D012C000900A208080A000080E
 +S3155000079090402000901A000A901A20010100000093
 +S315500007A081C3E0089C23BF909DE3BF90B20E60FFCB
 +S315500007B0A0100018C027BFF480A660BA14800006A7
 +S315500007C080A660DA80A660B916800006153FFFEA5B
 +S315500007D080A660B512800027B0102000153FFFEAB2
 +S315500007E096102AAA9412A2AA13000015D432C00059
 +S315500007F09212615598102554113FFFE0D2330000F4
 +S3155000080090122080D032C000D432C000D2330000C3
 +S315500008101100000C2300003F90122030130000C33B
 +S31550000820D0340000A412613FB21463FF921463FFE8
 +S315500008307FFFFFBC90100010B0100008D007BFF427
 +S3155000084090022001D027BFF4D214000080A64009A0
 +S315500008500280000880A620011280000601000000D8
 +S31550000860D007BFF480A2001208BFFFF2921463FFB4
 +S31550000870D007BFF4130000C39212613F80A2400814
 +S3155000088094403FFFB00E000A0100000081C7E00807
 +S3155000089081E80000153FFFEA98102AAA9412A2AAEE
 +S315500008A0D4330000170000159612E155153FFFE4AA
 +S315500008B0D63025549412A090D4330000D61022007E
 +S315500008C09A100008960AE0FFD6320000901030F0D9
 +S315500008D0D0330000D613400098100009901AE03724
 +S315500008E080A0000894603FFF901AE01C80A000088A
 +S315500008F092603FFF8092800912800007821020008C
 +S3155000090080A2E0C20280000480A2E0201280004251
 +S3155000091090102000113FFFEA94102AAA901222AAA2
 +S31550000920D03280001300001592126155113FFFE43A
 +S31550000930D230255490122090D0328000D21022020C
 +S31550000940901030F0920A60FFD2330000D03280000F
 +S31550000950D013400080A220370280002A80A2202097
 +S31550000960D41300000280001D912AA0109002BF47A8
 +S31550000970912A201091322010952AA01080A2200290
 +S315500009809532A01092602000901AA0B580A0000861
 +S31550000990920A600190603FFF809240083280000BBF
 +S315500009A08210200180A2A0B90280000A80A2A0BABB
 +S315500009B00280000880A2A0EF0280000680A2A0DA82
 +S315500009C02280000282102001108000139010000136
 +S315500009D010BFFFFE821020019132201080A220EE1F
 +S315500009E012BFFFE49002BF479010201CD033400046
 +S315500009F0921020B9D233000010BFFFDD941020B9F9
 +S31550000A00D413000080A2A03402BFFFF880A2202099
 +S31550000A1030BFFFD50100000081C3E008010000008F
 +S31550000A209DE3BF88B72EE010C037BFF4B736E0104D
 +S31550000A30A0100018C027BFEC80A6E0BA14800006AC
 +S31550000A4080A6E0DA80A6E0B916800006113FFFEADC
 +S31550000A5080A6E0B512800023B0102000113FFFEAB7
 +S31550000A6094102AAA901222AAD032800013000015A0
 +S31550000A7092126155113FFFE8D2302554901220A0B2
 +S31550000A80D0328000F837BFF2D017BFF2130000C340
 +S31550000A90D0340000B612613FD217BFF27FFFFF215C
 +S31550000AA090100010B0100008D007BFEC9002200143
 +S31550000AB0D027BFECD2140000D017BFF280A2000995
 +S31550000AC00280000880A62001128000060100000066
 +S31550000AD0D007BFEC80A2001B08BFFFF0010000004A
 +S31550000AE0D007BFEC130000C39212613F80A24008AA
 +S31550000AF094403FFFB00E000A0100000081C7E00895
 +S31550000B0081E800009DE3BF9811140005D4022150DE
 +S31550000B10A210200080A4400AA410001B9A102000A6
 +S31550000B20A0102000A610200116800012961020005A
 +S31550000B30912EA010B5322010932EE0109810000A76
 +S31550000B40111400059332601094122060D002A00C4C
 +S31550000B5080A2001A22800048D002A0109602E0011E
 +S31550000B6080A2C00C06BFFFFA9402A05011140005D3
 +S31550000B70D202215080A2C009028000449010200168
 +S31550000B8080A6200008800016912AE0029002000BF1
 +S31550000B9013140005B4126060992A20049E10200197
 +S31550000BA0912C200290020010912A200290030008F6
 +S31550000BB09002001AD4022004A2046001D202200836
 +S31550000BC080A4400A932BC0099A034009A0643FFFB2
 +S31550000BD080A6000D18BFFFF4912C200280A660005D
 +S31550000BE00480001F932AE0029202400BB60CA0FF2D
 +S31550000BF011140005A4122060B52A60049210001B3F
 +S31550000C007FFFFEEA90100018932C200292024010AB
 +S31550000C10932A6002920680099402401280A2200014
 +S31550000C2002800013A2046001D202A0089010200195
 +S31550000C30912A000980A64008B00600080680000ADE
 +S31550000C40B2264008D002A00480A44008A0643FFF0A
 +S31550000C5080A6600014BFFFEB9210001B1080000BA3
 +S31550000C6090100013108000099010200110BFFFFC57
 +S31550000C70A610200080A2000932BFFFBA9602E001FA
 +S31550000C8010BFFFBC1114000581C7E00891E80008A9
 +S31550000C9013140005D40A61801708000013000013CE
 +S31550000CA09212630C952AA00294028009D202C00ABD
 +S31550000CB0941000089132601F80A22001028000002B
 +S31550000CC09132601D808A20012280000490102001FC
 +S31550000CD0C022800030800002D022800081C3E0080C
 +S31550000CE09010000911140005D20A21801508000041
 +S31550000CF0110000139012230C932A600292024008AE
 +S31550000D00D20280099132601F80A220010280000029
 +S31550000D100100000081C3E008901000099DE3BF90D8
 +S31550000D2011140005E00A2180B00E20FF11140005B1
 +S31550000D3090122154B12E2002E2020018A12C20025A
 +S31550000D40110000139012230CA00400087FFFFFD15E
 +S31550000D509007BFF4D207BFF411060000932A601E15
 +S31550000D60921240112308000092124008D2244010DB
 +S31550000D707FFFFFC89007BFF4D207BFF411070000EA
 +S31550000D80932A601E92124008D22440107FFFFFC162
 +S31550000D909007BFF4D207BFF411030000932A601ED8
 +S31550000DA092124008D22440107FFFFFBA9007BFF43A
 +S31550000DB0D207BFF41104000090122003932A601E3C
 +S31550000DC092124008D22440107FFFFFB29007BFF422
 +S31550000DD0D207BFF411050000932A601E92124008F4
 +S31550000DE0D22440107FFFFFC0010000000100000028
 +S31550000DF081C7E00881E800009DE3BF90111400050B
 +S31550000E00E00A218025080000110000139012230CDF
 +S31550000E10A12C2002A00400087FFFFF9E9007BFF47C
 +S31550000E20D207BFF411050000932A601E92124008A3
 +S31550000E30D22480107FFFFF979007BFF4A2100008BE
 +S31550000E40D007BFF427040000912A201E90120013E9
 +S31550000E50D02480107FFFFF8F9007BFF4D207BFF4D6
 +S31550000E6011040004932A601E92124008D224801066
 +S31550000E707FFFFF889007BFF4D007BFF4A20C60FF36
 +S31550000E80912A201E9012001190120013D024801027
 +S31550000E907FFFFF95010000000100000081C7E008B8
 +S31550000EA081E800009DE3BF9011140005D20A21800D
 +S31550000EB02708000011000013932A60029012230C99
 +S31550000EC09202400893326002AC100009AB2A6002CD
 +S31550000ED0AE1000097FFFFF6F9007BFF4D007BFF435
 +S31550000EE023030000912A201E90120011D024C01511
 +S31550000EF07FFFFF7D0100000091322016A08A200F4F
 +S31550000F0032800011A2102000A4100011A32DA002BF
 +S31550000F107FFFFF609007BFF4D207BFF4932A601E8D
 +S31550000F2092124012D224C0117FFFFF6F01000000C1
 +S31550000F3091322016A08A200F02BFFFF60100000052
 +S31550000F40A210200080A440101ABFFFE3A52DE00296
 +S31550000F50290100007FFFFF4F9007BFF4D007BFF471
 +S31550000F60A2046001912A201E90120014D024C012AF
 +S31550000F707FFFFF5D01000000D02E0000808A20FF19
 +S31550000F8002800006B006200180A440100ABFFFF27E
 +S31550000F900100000030BFFFD00100000081C7E0080B
 +S31550000FA081E800009DE3BF9011140005D20A21800C
 +S31550000FB025080000D40E000011000013932A600289
 +S31550000FC09012230C80A2A000028000849202400856
 +S31550000FD0AD2A60109135A012A72A2002AA10000847
 +S31550000FE0A81000137FFFFF2B9007BFF4D007BFF464
 +S31550000FF021030000912A201E90120010D024801345
 +S315500010007FFFFF3901000000900A200680A22006CB
 +S315500010100280001001000000A2100010A12D6002F5
 +S315500010207FFFFF1C9007BFF4D207BFF4932A601EC0
 +S3155000103092124011D22480107FFFFF2B0100000036
 +S31550001040900A200680A2200612BFFFF6010000007B
 +S315500010507FFFFF109007BFF4D007BFF4D20E0000F9
 +S31550001060912A201E90120009D02480147FFFFF1E63
 +S31550001070B0062001D00E000080A2200012BFFFDA79
 +S31550001080010000009135A010D404800880A2A00071
 +S315500010900680004C010000009132A01D808A20017C
 +S315500010A00280004690102001C027BFF4D007BFF43D
 +S315500010B013030000912A201E901200099335A010A8
 +S315500010C0D0248009D404800980A2A0000680003470
 +S315500010D0900AA00680A22006028000169135A01222
 +S315500010E09A1000089E102001972A2002190300002A
 +S315500010F09132A01D808A2001128000039210200098
 +S315500011009210000F912A601E9012000CD024800B72
 +S31550001110D404800B80A2A0000680001A900AA00674
 +S3155000112080A2200612BFFFF49132A01DD227BFF431
 +S315500011309132A01D808A200102800010901020015B
 +S31550001140C027BFF4D007BFF49335A010912A201EB4
 +S31550001150D0248009D404800980A2A00016800021E2
 +S3155000116090100009D404800880A2A00006BFFFFE9C
 +S31550001170010000003080001B10BFFFF3D027BFF4E2
 +S31550001180912B6002D404800880A2A00006BFFFFE07
 +S315500011900100000010BFFFE3900AA006901000095E
 +S315500011A0D404800880A2A00006BFFFFE0100000004
 +S315500011B010BFFFC9900AA00610BFFFBDD027BFF4CD
 +S315500011C0D404800880A2A00006BFFFFE01000000E4
 +S315500011D010BFFFB39132A01D10BFFFABAD2A6010F8
 +S315500011E00100000081C7E00881E800009DE3BF9838
 +S315500011F035140005F60EA180921000183500001324
 +S31550001200B416A30CB72EE002B606C01A992EE010FB
 +S31550001210B53320129B2EA002A210001AA610001958
 +S315500012203B080000961020009410000DA410001AE0
 +S31550001230F807400D80A7200006800064B137201DB6
 +S31550001240B00E200180A00018B0603FFFB12E201EC6
 +S3155000125033030000B0160019F027400AF807400A79
 +S3155000126080A7200006800052B1372016B48E200F7A
 +S315500012701280001A82102000B3332012310003D09E
 +S31550001280901000199E162240B32E600237030000BC
 +S3155000129080A0400F8200600118800053B0102000DB
 +S315500012A0B137201DB00E200180A00018B0603FFF5E
 +S315500012B0B12E201EB016001BF0274019F807401912
 +S315500012C080A7200006800033B1372016B48E200F39
 +S315500012D002BFFFF180A0400F8210200080A0401A6C
 +S315500012E01ABFFFD4B1332012B72E20029010001827
 +S315500012F09E10001BA0100018F807401B80A7200066
 +S315500013000680001DB137201DB00E200180A00018A8
 +S31550001310B0603FFFB12E201E33010000B0160019F9
 +S31550001320F027400FF807400F80A720000680000CDA
 +S31550001330B12C20029602E001F82A400080A2C01388
 +S3155000134002800029B010000B8200600180A0401A74
 +S315500013500ABFFFEA9202600130BFFFB6F807401895
 +S3155000136080A7200006BFFFFE0100000010BFFFF35C
 +S315500013709602E001B12A2002F807401880A7200003
 +S3155000138006BFFFFE0100000010BFFFE0B137201D71
 +S31550001390B12A2002F807401880A7200006BFFFFE9A
 +S315500013A00100000010BFFFCAB1372016B12CA002B1
 +S315500013B0F807401880A7200006BFFFFE0100000076
 +S315500013C010BFFFABB1372016B12C6002F80740189A
 +S315500013D080A7200006BFFFFE0100000010BFFF9946
 +S315500013E0B137201D0100000081C7E00881E80000E8
 +S315500013F09DE3BF987FFFFE81B00E20FF7FFFFE4822
 +S3155000140081E800000100000000000000000000001C
 +S315500014100000000000000000000000000000000076
 +S315500014204572726F723400004572726F72330000EB
 +S315500014304F4B0000000000004572726F7232000080
 +S31550001440454E4400000000004572726F7235000030
 +S315500014504572726F723100000000000000000000FB
 +S3155000146000000000000000010000000E00000037E0
 +S31550001470000000B500004000000000030000000D11
 +S3155000148000000037000000B5000080000000000496
 +S315500014900000000F00000037000000B500010000FA
 +S315500014A00000000B0000001000000037000000B5DF
 +S315500014B00000000000000007000000100000001CA3
 +S315500014C0000000B900007000000000080000000F86
 +S315500014D00000001C000000B9000078000000000A5F
 +S315500014E00000000D0000001C000000B900007C0048
 +S315500014F00000000B0000000E0000001C000000B9A8
 +S31550001500000000000000000F000000100000001C4A
 +S31550001510000000DA00007000000000100000000F0C
 +S315500015200000001C000000DA0000700000000012ED
 +S315500015300000000D0000001C000000DA00007000E2
 +S31550001540000000130000000E0000001C000000DA2E
 +S3155000155000000003000001FB000000FD0000007EBB
 +S315500015600000003F0000002A000000150000000A9D
 +S3115000157000000000000000000000000019
 +S70550000000AA
 diff --git a/configure.ac b/configure.ac index bee9480d..0fcd97e2 100644 --- a/configure.ac +++ b/configure.ac @@ -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-sky-flash/Makefile  ao-utils/Makefile  src/Version  ]) | 
