diff options
author | Christian Gmeiner <christian.gmeiner@gmail.com> | 2005-07-15 16:37:50 +0000 |
---|---|---|
committer | Christian Gmeiner <christian.gmeiner@gmail.com> | 2005-07-15 16:37:50 +0000 |
commit | bb0c7751f02842b873e3bc43d4cffe3f85146431 (patch) | |
tree | c861b310e2264dca3a5563de052d7ed7e63d048e /tools | |
parent | e6b43771e986a9a56257a291f2969d51f33622ee (diff) |
iAudio: first version of a tool to update fw checksum
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@7156 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'tools')
-rw-r--r-- | tools/Makefile | 4 | ||||
-rw-r--r-- | tools/iaudio.c | 108 |
2 files changed, 111 insertions, 1 deletions
diff --git a/tools/Makefile b/tools/Makefile index 16a690df5b..faea49cb2a 100644 --- a/tools/Makefile +++ b/tools/Makefile @@ -9,17 +9,19 @@ CFLAGS := -O -ansi -g LDFLAGS := -g -TARGETS := scramble descramble sh2d bmp2rb rdf2binary convbdf generate_rocklatin mkboot +TARGETS := scramble descramble iaudio sh2d bmp2rb rdf2binary convbdf generate_rocklatin mkboot all: $(TARGETS) @echo "tools done" scramble: scramble.o iriver.o descramble: descramble.o iriver.o +iaudio: iaudio.o scramble.o: scramble.c iriver.h descramble.o: descramble.c iriver.h iriver.o: iriver.c iriver.h +iaudio.o: iaudio.c sh2d: sh2d.c diff --git a/tools/iaudio.c b/tools/iaudio.c new file mode 100644 index 0000000000..2c59b3cd55 --- /dev/null +++ b/tools/iaudio.c @@ -0,0 +1,108 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2005 by Christian Gmeiner + * + * This particular source code file is licensed under the X11 license. See the + * bottom of the COPYING file for details on this license. + * + ****************************************************************************/ + +/* This little application updates the checksum of a modifized iAudio x5 + firmware bin. + And this is how it works: + + The byte at offset 0x102b contains the 8-bit sum of all the bytes starting with the one at 0x1030. +*/ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#define CHECKSUM_BIT 0x102b +#define CHECKSUM_START 0x1030 + +void usage(void) { + + printf("usage: iaudio <input file> <output file>\n"); + printf("\n\nThis tool updates the checksum of an iaudio fw bin\n"); + exit(1); +} + +int main (int argc, char* argv[]) { + + char byte = '\0'; + char checksum = '\0'; + unsigned long length, i; + unsigned char* inbuf; + unsigned char* iname = argv[1]; + unsigned char* oname = argv[2]; + FILE* pFile; + + if (argc < 2) { + usage(); + } + + /* open file */ + pFile = fopen(iname,"rb"); + if (!pFile) { + perror(oname); + return -1; + } + + /* print old checksum */ + fseek (pFile, CHECKSUM_BIT, SEEK_SET); + byte = fgetc(pFile); + printf("Old checksum: 0x%02x\n", (unsigned char) byte); + + /* get file size*/ + fseek(pFile,0,SEEK_END); + length = ftell(pFile); + fseek(pFile,0,SEEK_SET); + + /* try to allocate memory */ + inbuf = malloc(length); + if (!inbuf) { + printf("out of memory!\n"); + return -1; + } + + /* read file */ + i = fread(inbuf, 1, length, pFile); + if (!i) { + perror(iname); + return -1; + } + fclose(pFile); + + /* calculate new checksum */ + for (i = CHECKSUM_START; i < length; i++) { + checksum += inbuf[i]; + } + printf("New checksum: 0x%02x\n", (unsigned char) checksum); + + /* save new checksum */ + inbuf[CHECKSUM_BIT] = (unsigned char) checksum; + + /* save inbuf */ + pFile = fopen(oname,"wb"); + if (!pFile) { + perror(oname); + return -1; + } + + i = fwrite(inbuf, 1, length, pFile); + if (!i) { + perror(oname); + return -1; + } + fclose(pFile); + + return 0; +} |