summaryrefslogtreecommitdiffstats
path: root/tools/ipodpatcher/ipodpatcher.c
diff options
context:
space:
mode:
authorDave Chapman <dave@dchapman.com>2006-12-21 21:34:46 +0000
committerDave Chapman <dave@dchapman.com>2006-12-21 21:34:46 +0000
commit26b02415cbea9d1247319d4f6d41ea9f95c00e83 (patch)
tree8e6fca8b05581f40c37fe76ff085e6faeff6c289 /tools/ipodpatcher/ipodpatcher.c
parent5d61c0b46c37c03d88ef3bacd4c2717e5f101f54 (diff)
downloadrockbox-26b02415cbea9d1247319d4f6d41ea9f95c00e83.tar.gz
rockbox-26b02415cbea9d1247319d4f6d41ea9f95c00e83.zip
Add the --add-bootloader-bin (-ab) option to add a binary bootloader (a raw .bin file with no kind of header). This can be used to install the ipodlinux loader2 bootloader without needing to convert it to the Rockbox ".ipod" format.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@11831 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'tools/ipodpatcher/ipodpatcher.c')
-rw-r--r--tools/ipodpatcher/ipodpatcher.c91
1 files changed, 55 insertions, 36 deletions
diff --git a/tools/ipodpatcher/ipodpatcher.c b/tools/ipodpatcher/ipodpatcher.c
index b474355d82..29a5939cea 100644
--- a/tools/ipodpatcher/ipodpatcher.c
+++ b/tools/ipodpatcher/ipodpatcher.c
@@ -25,12 +25,11 @@
#include <inttypes.h>
#include <sys/types.h>
#include <sys/stat.h>
-#include <dirent.h>
#include "parttypes.h"
#include "ipodio.h"
-#define VERSION "0.5"
+#define VERSION "0.6cvs"
int verbose = 0;
@@ -338,11 +337,12 @@ void print_usage(void) {
fprintf(stderr,"\n");
fprintf(stderr,"Where [action] is one of the following options:\n");
fprintf(stderr," -l, --list\n");
- 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," -wf, --write-firmware filename.ipod\n");
- fprintf(stderr," -a, --add-bootloader filename.ipod\n");
+ 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," -wf, --write-firmware filename.ipod\n");
+ fprintf(stderr," -a, --add-bootloader filename.ipod\n");
+ fprintf(stderr," -ab, --add-bootloader-bin filename.bin\n");
fprintf(stderr," -d, --delete-bootloader\n");
fprintf(stderr,"\n");
@@ -371,6 +371,9 @@ enum {
WRITE_PARTITION
};
+#define DOT_IPOD 0
+#define DOT_BIN 1
+
char* ftypename[] = { "OSOS", "RSRC", "AUPD", "HIBE" };
enum firmwaretype_t {
@@ -472,7 +475,7 @@ int diskmove(HANDLE dh, int start, int nimages, struct ipod_directory_t* ipod_di
return 0;
}
-int add_bootloader(HANDLE dh, char* filename, int start, int sector_size,
+int add_bootloader(HANDLE dh, int type, char* filename, int start, int sector_size,
int nimages, struct ipod_directory_t* ipod_directory,
off_t diroffset, int modelnum, char* modelname)
{
@@ -495,23 +498,27 @@ int add_bootloader(HANDLE dh, char* filename, int start, int sector_size,
return -1;
}
- n = read(infile,header,8);
- if (n < 8) {
- fprintf(stderr,"[ERR] Failed to read header from %s\n",filename);
- close(infile);
- return -1;
- }
+ if (type==DOT_IPOD) {
+ n = read(infile,header,8);
+ if (n < 8) {
+ fprintf(stderr,"[ERR] Failed to read header from %s\n",filename);
+ close(infile);
+ return -1;
+ }
- if (memcmp(header+4,modelname,4)!=0) {
- fprintf(stderr,"[ERR] Model name in input file (%c%c%c%c) doesn't match ipod model (%s)\n",
- header[4],header[5],header[6],header[7],modelname);
- close(infile);
- return -1;
- }
+ if (memcmp(header+4,modelname,4)!=0) {
+ fprintf(stderr,"[ERR] Model name in input file (%c%c%c%c) doesn't match ipod model (%s)\n",
+ header[4],header[5],header[6],header[7],modelname);
+ close(infile);
+ return -1;
+ }
- filechksum = be2int(header);
+ filechksum = be2int(header);
- length=filesize(infile)-8;
+ length=filesize(infile)-8;
+ } else {
+ length=filesize(infile);
+ }
paddedlength=(length+sector_size-1)&~(sector_size-1);
/* Now read our bootloader - we need to check it before modifying the partition*/
@@ -522,18 +529,20 @@ int add_bootloader(HANDLE dh, char* filename, int start, int sector_size,
return -1;
}
- /* Calculate and confirm bootloader checksum */
- chksum = modelnum;
- for (i = 0; i < length; i++) {
- /* add 8 unsigned bits but keep a 32 bit sum */
- chksum += sectorbuf[i];
- }
+ if (type==DOT_IPOD) {
+ /* Calculate and confirm bootloader checksum */
+ chksum = modelnum;
+ for (i = 0; i < length; i++) {
+ /* add 8 unsigned bits but keep a 32 bit sum */
+ chksum += sectorbuf[i];
+ }
- if (chksum == filechksum) {
- fprintf(stderr,"[INFO] Checksum OK in %s\n",filename);
- } else {
- fprintf(stderr,"[ERR] Checksum in %s failed check\n",filename);
- return -1;
+ if (chksum == filechksum) {
+ fprintf(stderr,"[INFO] Checksum OK in %s\n",filename);
+ } else {
+ fprintf(stderr,"[ERR] Checksum in %s failed check\n",filename);
+ return -1;
+ }
}
if (ipod_directory[0].entryOffset>0) {
@@ -593,8 +602,8 @@ int add_bootloader(HANDLE dh, char* filename, int start, int sector_size,
return -1;
}
- /* Now read our bootloader - we need to seek back to 8 bytes from start */
- lseek(infile,8,SEEK_SET);
+ /* Now read our bootloader - we need to seek back to the start */
+ lseek(infile,(type == DOT_IPOD ? 8 : 0),SEEK_SET);
n = read(infile,sectorbuf+entryOffset,length);
if (n < 0) {
fprintf(stderr,"[ERR] Couldn't read input file\n");
@@ -1195,6 +1204,7 @@ int main(int argc, char* argv[])
struct ipod_directory_t ipod_directory[MAX_IMAGES];
int action = SHOW_INFO;
int sector_size;
+ int type;
char devicename[4096];
HANDLE dh;
@@ -1238,6 +1248,15 @@ int main(int argc, char* argv[])
} else if ((strcmp(argv[i],"-a")==0) ||
(strcmp(argv[i],"--add-bootloader")==0)) {
action = ADD_BOOTLOADER;
+ type = DOT_IPOD;
+ i++;
+ if (i == argc) { print_usage(); return 1; }
+ filename=argv[i];
+ i++;
+ } else if ((strcmp(argv[i],"-ab")==0) ||
+ (strcmp(argv[i],"--add-bootloader-bin")==0)) {
+ action = ADD_BOOTLOADER;
+ type = DOT_BIN;
i++;
if (i == argc) { print_usage(); return 1; }
filename=argv[i];
@@ -1341,7 +1360,7 @@ int main(int argc, char* argv[])
return 5;
}
- if (add_bootloader(dh, filename,pinfo[0].start*sector_size,
+ if (add_bootloader(dh, type, filename,pinfo[0].start*sector_size,
sector_size, nimages, ipod_directory, diroffset,
modelnum, modelname)==0) {
fprintf(stderr,"[INFO] Bootloader %s written to device.\n",filename);