introduce first updater-functionalities using the do_spm
[pub/USBaspLoader.git] / updater / firmware_gen.c
diff --git a/updater/firmware_gen.c b/updater/firmware_gen.c
new file mode 100644 (file)
index 0000000..4707dd4
--- /dev/null
@@ -0,0 +1,63 @@
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <stdint.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+
+#define myfirmware_rawfilename "./usbasploader.raw"
+#define myout                  stdout
+
+int main(int argc, char** argv) {
+  int fd;
+  uint16_t b;
+  uint64_t c;
+  struct stat fwstat;
+
+  fprintf(myout, "\n");
+  fprintf(myout, "#ifndef FIRMWARE_H_5f27a7e9840141b1aa57eef07c1d939f\n");
+  fprintf(myout, "#define FIRMWARE_H_5f27a7e9840141b1aa57eef07c1d939f 1\n");
+  fprintf(myout, "\n");
+  fprintf(myout, "#include <stdint.h>\n");
+  fprintf(myout, "#include <avr/io.h>\n");
+  fprintf(myout, "#include \"../firmware/spminterface.h\"\n");
+  fprintf(myout, "\n");
+  fprintf(myout, "//firmware generator generated\n");
+  
+  fd=open(myfirmware_rawfilename, O_RDONLY);
+  if (fd > 2) {
+    fstat(fd, &fwstat);
+    fprintf(myout, "#define    SIZEOF_new_firmware                                             %llu\n",(long long unsigned int)fwstat.st_size);
+    fprintf(myout, "const uint16_t firmware[SIZEOF_new_firmware>>1] PROGMEM    =       {");
+    fprintf(myout, "\n");
+
+    c=0;
+    while (read(fd, &b, 2) == 2) {
+      c+=2;
+      fprintf(myout,"0x%04x, ", (unsigned int)b);
+      if ((c % 20) == 0) fprintf(myout,"\n");
+    }
+    if ((c % 20) != 0) fprintf(myout,"\n");
+    fprintf(myout, "};\n");
+    fprintf(myout, "const uint8_t *new_firmware        =       (void*)&firmware;\n");
+    fprintf(myout, "\n");
+
+    close(fd);
+  } else {
+    fprintf(stderr, "error opening %s\n", myfirmware_rawfilename);
+    
+    fprintf(myout, "#define    SIZEOF_new_firmware                                             0\n");
+    fprintf(myout, "const uint16_t firmware[SIZEOF_new_firmware>>1] PROGMEM    =       {};\n");
+    fprintf(myout, "const uint8_t *new_firmware        =       (void*)&firmware;\n");
+    fprintf(myout, "\n");
+  }
+  
+  fprintf(myout, "#endif\n");
+  fprintf(myout, "\n");
+  return 0;
+}