summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tools/Makefile4
-rw-r--r--tools/iaudio.c108
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;
+}