ao-tools: Add ao-sky-flash to update GPS firmware
[fw/altos] / ao-tools / ao-sky-flash / sky_bin.c
diff --git a/ao-tools/ao-sky-flash/sky_bin.c b/ao-tools/ao-sky-flash/sky_bin.c
new file mode 100644 (file)
index 0000000..e693c89
--- /dev/null
@@ -0,0 +1,75 @@
+/*
+ * Copyright © 2012 Keith Packard <keithp@keithp.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+#include "sky_flash.h"
+#include <stdio.h>
+#include <string.h>
+
+#define FLASHBYTES     8192
+
+int
+skytraq_send_bin(int fd, const char *filename)
+{
+       FILE            *file;
+       char            buf[FLASHBYTES];
+       int             count;
+       unsigned char   cksum;
+       int             c;
+       long            size;
+       long            pos;
+       char            message[1024];
+       int             ret;
+       
+       file = fopen(filename, "r");
+       if (!file) {
+               perror(filename);
+               return -1;
+       }
+
+       printf ("computing checksum...\n"); fflush(stdout);
+       /* Compute checksum, figure out how long the file */
+       cksum = 0;
+       while ((c = getc(file)) != EOF)
+               cksum += (unsigned char) c;
+       size = ftell(file);
+       rewind(file);
+       printf ("checksum: %d\n", cksum); fflush(stdout);
+
+       sprintf(message, "BINSIZE = %d Checksum = %d Loopnumber = %d ", size, cksum, 1);
+
+       ret = skytraq_cmd_wait(fd, message, strlen(message) + 1, "OK", 20000);
+       if (ret < 0)
+               printf ("waitstatus failed %d\n", ret);
+
+       pos = 0;
+       for (;;) {
+               count = fread(buf, 1, sizeof (buf), file);
+               if (count < 0) {
+                       perror("fread");
+                       fclose(file);
+                       return -1;
+               }
+               if (count == 0)
+                       break;
+               printf ("write %ld of %ld ", pos + count, size); fflush(stdout);
+               pos += count;
+               ret = skytraq_cmd_wait(fd, buf, count, "OK", 20000);
+               if (ret < 0)
+                       return ret;
+       }
+       return skytraq_waitstatus(fd, "END", 30000);
+}