From 427fff4320df478cc0d7a6fa5d68e08d70a844b8 Mon Sep 17 00:00:00 2001 From: Dave Chapman Date: Fri, 13 Apr 2007 23:28:20 +0000 Subject: Add -rfb option for reading the main firmware (OSOS image) as a binary file. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@13148 a1c6a512-1295-4272-9138-f99709370657 --- rbutil/ipodpatcher/ipodpatcher.c | 25 ++++++++++++++----------- rbutil/ipodpatcher/ipodpatcher.h | 2 +- rbutil/ipodpatcher/main.c | 12 +++++++++++- 3 files changed, 26 insertions(+), 13 deletions(-) diff --git a/rbutil/ipodpatcher/ipodpatcher.c b/rbutil/ipodpatcher/ipodpatcher.c index 6fcf0c8c27..331c7f0322 100644 --- a/rbutil/ipodpatcher/ipodpatcher.c +++ b/rbutil/ipodpatcher/ipodpatcher.c @@ -885,7 +885,7 @@ int write_firmware(struct ipod_t* ipod, char* filename, int type) return 0; } -int read_firmware(struct ipod_t* ipod, char* filename) +int read_firmware(struct ipod_t* ipod, char* filename, int type) { int length; int i; @@ -921,22 +921,25 @@ int read_firmware(struct ipod_t* ipod, char* filename) return -1; } - chksum = ipod->modelnum; - for (i = 0; i < length; i++) { - /* add 8 unsigned bits but keep a 32 bit sum */ - chksum += sectorbuf[i]; - } - - int2be(chksum,header); - memcpy(header+4, ipod->modelname,4); - outfile = open(filename,O_CREAT|O_TRUNC|O_WRONLY|O_BINARY,0666); if (outfile < 0) { fprintf(stderr,"[ERR] Couldn't open file %s\n",filename); return -1; } - write(outfile,header,8); + if (type == FILETYPE_DOT_IPOD) { + chksum = ipod->modelnum; + for (i = 0; i < length; i++) { + /* add 8 unsigned bits but keep a 32 bit sum */ + chksum += sectorbuf[i]; + } + + int2be(chksum,header); + memcpy(header+4, ipod->modelname,4); + + write(outfile,header,8); + } + write(outfile,sectorbuf,length); close(outfile); diff --git a/rbutil/ipodpatcher/ipodpatcher.h b/rbutil/ipodpatcher/ipodpatcher.h index 4c1eee58af..2339687318 100644 --- a/rbutil/ipodpatcher/ipodpatcher.h +++ b/rbutil/ipodpatcher/ipodpatcher.h @@ -41,7 +41,7 @@ int diskmove(struct ipod_t* ipod, int delta); int add_bootloader(struct ipod_t* ipod, char* filename, int type); int delete_bootloader(struct ipod_t* ipod); int write_firmware(struct ipod_t* ipod, char* filename, int type); -int read_firmware(struct ipod_t* ipod, char* filename); +int read_firmware(struct ipod_t* ipod, char* filename, int type); int read_directory(struct ipod_t* ipod); int list_images(struct ipod_t* ipod); int getmodel(struct ipod_t* ipod, int ipod_version); diff --git a/rbutil/ipodpatcher/main.c b/rbutil/ipodpatcher/main.c index e60b1d7034..6328e2df99 100644 --- a/rbutil/ipodpatcher/main.c +++ b/rbutil/ipodpatcher/main.c @@ -76,6 +76,7 @@ void print_usage(void) fprintf(stderr," -r, --read-partition bootpartition.bin\n"); fprintf(stderr," -w, --write-partition bootpartition.bin\n"); fprintf(stderr," -rf, --read-firmware filename.ipod\n"); + fprintf(stderr," -rfb, --read-firmware-bin filename.bin\n"); fprintf(stderr," -wf, --write-firmware filename.ipod\n"); fprintf(stderr," -wfb, --write-firmware-bin filename.bin\n"); fprintf(stderr," -a, --add-bootloader filename.ipod\n"); @@ -234,6 +235,15 @@ int main(int argc, char* argv[]) } else if ((strcmp(argv[i],"-rf")==0) || (strcmp(argv[i],"--read-firmware")==0)) { action = READ_FIRMWARE; + type = FILETYPE_DOT_IPOD; + i++; + if (i == argc) { print_usage(); return 1; } + filename=argv[i]; + i++; + } else if ((strcmp(argv[i],"-rfb")==0) || + (strcmp(argv[i],"--read-firmware-bin")==0)) { + action = READ_FIRMWARE; + type = FILETYPE_DOT_BIN; i++; if (i == argc) { print_usage(); return 1; } filename=argv[i]; @@ -399,7 +409,7 @@ int main(int argc, char* argv[]) fprintf(stderr,"[ERR] --write-firmware failed.\n"); } } else if (action==READ_FIRMWARE) { - if (read_firmware(&ipod, filename)==0) { + if (read_firmware(&ipod, filename, type)==0) { fprintf(stderr,"[INFO] Firmware read to file %s.\n",filename); } else { fprintf(stderr,"[ERR] --read-firmware failed.\n"); -- cgit v1.2.3