change the build-process of the updater (do some linker magic)
[pub/USBaspLoader.git] / updater / firmware_gen.c
1
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <string.h>
5
6 #include <stdint.h>
7
8 #include <sys/types.h>
9 #include <sys/stat.h>
10 #include <fcntl.h>
11
12
13 #define myfirmware_rawfilename "./usbasploader.raw"
14 #define myout stdout
15
16 int main(int argc, char** argv) {
17 int fd;
18 uint16_t b;
19 uint64_t c;
20 struct stat fwstat;
21
22 fprintf(myout, "\n");
23 fprintf(myout, "#ifndef FIRMWARE_H_5f27a7e9840141b1aa57eef07c1d939f\n");
24 fprintf(myout, "#define FIRMWARE_H_5f27a7e9840141b1aa57eef07c1d939f 1\n");
25 fprintf(myout, "\n");
26 fprintf(myout, "#include <stdint.h>\n");
27 fprintf(myout, "#include <avr/io.h>\n");
28 fprintf(myout, "#include <avr/pgmspace.h>\n");
29 fprintf(myout, "#include \"../firmware/spminterface.h\"\n");
30 fprintf(myout, "\n");
31 fprintf(myout, "//firmware generator generated\n");
32
33 fd=open(myfirmware_rawfilename, O_RDONLY);
34 if (fd > 2) {
35 fstat(fd, &fwstat);
36 fprintf(myout, "#define SIZEOF_new_firmware %llu\n",(long long unsigned int)fwstat.st_size);
37 fprintf(myout, "const uint16_t firmware[SIZEOF_new_firmware>>1] PROGMEM = {");
38 fprintf(myout, "\n");
39
40 c=0;
41 while (read(fd, &b, 2) == 2) {
42 c+=2;
43 fprintf(myout,"0x%04x, ", (unsigned int)b);
44 if ((c % 20) == 0) fprintf(myout,"\n");
45 }
46 if ((c % 20) != 0) fprintf(myout,"\n");
47 fprintf(myout, "};\n");
48 fprintf(myout, "const uint8_t *new_firmware = (void*)&firmware;\n");
49 fprintf(myout, "\n");
50
51 close(fd);
52 } else {
53 fprintf(stderr, "error opening %s\n", myfirmware_rawfilename);
54
55 fprintf(myout, "#define SIZEOF_new_firmware 0\n");
56 fprintf(myout, "const uint16_t firmware[SIZEOF_new_firmware>>1] PROGMEM = {};\n");
57 fprintf(myout, "const uint8_t *new_firmware = (void*)&firmware;\n");
58 fprintf(myout, "\n");
59 }
60
61 fprintf(myout, "#endif\n");
62 fprintf(myout, "\n");
63 return 0;
64 }