From: gitknilch Date: Tue, 29 Mar 2011 12:35:10 +0000 (+0200) Subject: move fixcrc to patcheeprom, add patching of node id (pretty ugly) X-Git-Url: https://git.zerfleddert.de/cgi-bin/gitweb.cgi/fnordlicht-mini/commitdiff_plain/2acfa12f0d3f47810bdfda83b6eef12a63e71703?ds=inline move fixcrc to patcheeprom, add patching of node id (pretty ugly) --- diff --git a/firmware/tools/.gitignore b/firmware/tools/.gitignore index 188dff2..7d6ddd9 100644 --- a/firmware/tools/.gitignore +++ b/firmware/tools/.gitignore @@ -1 +1 @@ -fixcrc +patcheeprom diff --git a/firmware/tools/Makefile b/firmware/tools/Makefile index fd23463..a2a632f 100644 --- a/firmware/tools/Makefile +++ b/firmware/tools/Makefile @@ -1,2 +1,4 @@ -all: fixcrc +CFLAGS ?= -Wall -O3 + +all: patcheeprom diff --git a/firmware/tools/fixcrc.c b/firmware/tools/fixcrc.c deleted file mode 100644 index 3d7fefb..0000000 --- a/firmware/tools/fixcrc.c +++ /dev/null @@ -1,47 +0,0 @@ -#include -#include - -/* EEPROM data size, not including checksum */ -#define EEP_DATA_SIZE 494 -/* FIXME: actually we should either find a way to include the declaration of - struct storage_t here or at least make this a command line parameter */ - -/* code from http://www.nongnu.org/avr-libc/user-manual/group__util__crc.html */ -uint16_t crc16_update(uint16_t crc, uint8_t a) -{ - int i; - - crc ^= a; - for (i = 0; i < 8; ++i) - { - if (crc & 1) - crc = (crc >> 1) ^ 0xA001; - else - crc = (crc >> 1); - } - - return crc; -} - -int main(int argc, char ** argv) -{ - int i, c; - uint16_t checksum = 0; - for (i = 0; i < EEP_DATA_SIZE; i++) { - - if ((c = getchar()) == EOF) { - return 1; - } - - checksum = crc16_update(checksum, c); - - if (putchar(c) == EOF) { - return 2; - } - } - putchar(checksum & 0xff); - putchar(checksum >> 8); - - return 0; -} - diff --git a/firmware/tools/patcheeprom.c b/firmware/tools/patcheeprom.c new file mode 100644 index 0000000..98e5eff --- /dev/null +++ b/firmware/tools/patcheeprom.c @@ -0,0 +1,69 @@ +#include +#include +#include + +/* EEPROM data size, not including checksum */ +#define EEP_DATA_SIZE 494 +/* FIXME: actually we should either find a way to include the declaration of + struct storage_t here or at least make this a command line parameter */ + +/* code from http://www.nongnu.org/avr-libc/user-manual/group__util__crc.html */ +uint16_t crc16_update(uint16_t crc, uint8_t a) +{ + int i; + + crc ^= a; + for (i = 0; i < 8; ++i) + { + if (crc & 1) + crc = (crc >> 1) ^ 0xA001; + else + crc = (crc >> 1); + } + + return crc; +} + +/* oh, this is soooo ugly... :-( */ +int main(int argc, char ** argv) +{ + int i, c, id; + uint16_t checksum = 0; + + if ((argc < 2) || ((id = atoi(argv[1])) > 15) || (id <= 0)) + { + fputs("usage: patcheeprom id < eeprom-template > eeprom-binary\n\n", stderr); + return 127; + } + /* print out magic byte and add it to checksum */ + putchar(0x23); + checksum = crc16_update(checksum, 0x23); + + /* print out id and add it to checksum */ + putchar(id); + checksum = crc16_update(checksum, id); + + /* ignore first two bytes of input */ + getchar(); + getchar(); + + /* now copy template and adapt checksum */ + for (i = 2; i < EEP_DATA_SIZE; i++) { + + if ((c = getchar()) == EOF) { + return 1; + } + + checksum = crc16_update(checksum, c); + + if (putchar(c) == EOF) { + return 2; + } + } + /* print out checksum, and we're done */ + putchar(checksum & 0xff); + putchar(checksum >> 8); + + return 0; +} +