diff options
Diffstat (limited to 'tools')
-rw-r--r-- | tools/mi4.c | 8 | ||||
-rw-r--r-- | tools/mi4.h | 3 | ||||
-rw-r--r-- | tools/scramble.c | 53 |
3 files changed, 49 insertions, 15 deletions
diff --git a/tools/mi4.c b/tools/mi4.c index f466ad779f..b9f7e25393 100644 --- a/tools/mi4.c +++ b/tools/mi4.c | |||
@@ -102,7 +102,8 @@ static void int2le(unsigned int val, unsigned char* addr) | |||
102 | addr[3] = (val >> 24) & 0xff; | 102 | addr[3] = (val >> 24) & 0xff; |
103 | } | 103 | } |
104 | 104 | ||
105 | int mi4_encode(char *iname, char *oname, int version, int magic) | 105 | int mi4_encode(char *iname, char *oname, int version, int magic, |
106 | char *model, char *type) | ||
106 | { | 107 | { |
107 | size_t len; | 108 | size_t len; |
108 | int length; | 109 | int length; |
@@ -150,7 +151,10 @@ int mi4_encode(char *iname, char *oname, int version, int magic) | |||
150 | int2le(length+4, &outbuf[0x2e8]); /* length plus 0xaa55aa55 */ | 151 | int2le(length+4, &outbuf[0x2e8]); /* length plus 0xaa55aa55 */ |
151 | 152 | ||
152 | int2le(0xaa55aa55, &outbuf[0x200+length]); /* More Magic */ | 153 | int2le(0xaa55aa55, &outbuf[0x200+length]); /* More Magic */ |
153 | 154 | ||
155 | strncpy((char *)outbuf+0x1f8, type, 4); /* type of binary - RBBL, RBOS, ... */ | ||
156 | strncpy((char *)outbuf+0x1fc, model, 4); /* type of binary - RBBL, RBOS, ... */ | ||
157 | |||
154 | /* Calculate CRC32 checksum */ | 158 | /* Calculate CRC32 checksum */ |
155 | chksum_crc32gentab (); | 159 | chksum_crc32gentab (); |
156 | crc = chksum_crc32 (outbuf+28,mi4length-28); | 160 | crc = chksum_crc32 (outbuf+28,mi4length-28); |
diff --git a/tools/mi4.h b/tools/mi4.h index ac55f59579..fa26f2ed57 100644 --- a/tools/mi4.h +++ b/tools/mi4.h | |||
@@ -23,6 +23,7 @@ | |||
23 | #define MI4_MAGIC_DEFAULT 0xec | 23 | #define MI4_MAGIC_DEFAULT 0xec |
24 | #define MI4_MAGIC_R 0xfc | 24 | #define MI4_MAGIC_R 0xfc |
25 | 25 | ||
26 | int mi4_encode(char *iname, char *oname, int version, int magic); | 26 | int mi4_encode(char *iname, char *oname, int version, int magic, |
27 | char *model, char *type); | ||
27 | 28 | ||
28 | #endif | 29 | #endif |
diff --git a/tools/scramble.c b/tools/scramble.c index ccd6712297..7e6ca1f51c 100644 --- a/tools/scramble.c +++ b/tools/scramble.c | |||
@@ -89,6 +89,10 @@ void usage(void) | |||
89 | "\t-mi4v2 PortalPlayer .mi4 format (revision 010201)\n" | 89 | "\t-mi4v2 PortalPlayer .mi4 format (revision 010201)\n" |
90 | "\t-mi4v3 PortalPlayer .mi4 format (revision 010301)\n" | 90 | "\t-mi4v3 PortalPlayer .mi4 format (revision 010301)\n" |
91 | "\t-mi4r Sandisk Rhapsody .mi4 format\n" | 91 | "\t-mi4r Sandisk Rhapsody .mi4 format\n" |
92 | "\t All mi4 options take two optional arguments:\n" | ||
93 | "\t -model=XXXX where XXXX is the model id string\n" | ||
94 | "\t -type=XXXX where XXXX is a string indicating the \n" | ||
95 | "\t type of binary, eg. RBOS, RBBL\n" | ||
92 | "\t-add=X Rockbox generic \"add-up\" checksum format\n" | 96 | "\t-add=X Rockbox generic \"add-up\" checksum format\n" |
93 | "\t (X values: h100, h120, h140, h300, ipco, nano, ipvd, mn2g\n" | 97 | "\t (X values: h100, h120, h140, h300, ipco, nano, ipvd, mn2g\n" |
94 | "\t ip3g, ip4g, mini, iax5, h10, h10_5gb, tpj2, e200)\n" | 98 | "\t ip3g, ip4g, mini, iax5, h10, h10_5gb, tpj2, e200)\n" |
@@ -266,20 +270,45 @@ int main (int argc, char** argv) | |||
266 | oname = argv[3]; | 270 | oname = argv[3]; |
267 | return ipod_encode(iname, oname, 3, true); /* Firmware image v3 */ | 271 | return ipod_encode(iname, oname, 3, true); /* Firmware image v3 */ |
268 | } | 272 | } |
269 | else if(!strcmp(argv[1], "-mi4v2")) { | 273 | else if(!strncmp(argv[1], "-mi4", 4)) { |
270 | iname = argv[2]; | 274 | int mi4magic; |
271 | oname = argv[3]; | 275 | int version; |
272 | return mi4_encode(iname, oname, 0x00010201, MI4_MAGIC_DEFAULT); | 276 | char model[4] = ""; |
273 | } | 277 | char type[4] = ""; |
274 | else if(!strcmp(argv[1], "-mi4v3")) { | 278 | |
275 | iname = argv[2]; | 279 | if(!strcmp(&argv[1][4], "v2")) { |
276 | oname = argv[3]; | 280 | mi4magic = MI4_MAGIC_DEFAULT; |
277 | return mi4_encode(iname, oname, 0x00010301, MI4_MAGIC_DEFAULT); | 281 | version = 0x00010201; |
278 | } | 282 | } |
279 | else if(!strcmp(argv[1], "-mi4r")) { | 283 | else if(!strcmp(&argv[1][4], "v3")) { |
284 | mi4magic = MI4_MAGIC_DEFAULT; | ||
285 | version = 0x00010301; | ||
286 | } | ||
287 | else if(!strcmp(&argv[1][4], "r")) { | ||
288 | mi4magic = MI4_MAGIC_R; | ||
289 | version = 0x00010301; | ||
290 | } | ||
291 | else { | ||
292 | printf( "Invalid mi4 version: %s\n", &argv[1][4]); | ||
293 | return -1; | ||
294 | } | ||
295 | |||
280 | iname = argv[2]; | 296 | iname = argv[2]; |
281 | oname = argv[3]; | 297 | oname = argv[3]; |
282 | return mi4_encode(iname, oname, 0x00010301, MI4_MAGIC_R); | 298 | |
299 | if(!strncmp(argv[2], "-model=", 7)) { | ||
300 | iname = argv[3]; | ||
301 | oname = argv[4]; | ||
302 | strncpy(model, &argv[2][7], 4); | ||
303 | |||
304 | if(!strncmp(argv[3], "-type=", 6)) { | ||
305 | iname = argv[4]; | ||
306 | oname = argv[5]; | ||
307 | strncpy(type, &argv[3][6], 4); | ||
308 | } | ||
309 | } | ||
310 | |||
311 | return mi4_encode(iname, oname, version, mi4magic, model, type); | ||
283 | } | 312 | } |
284 | 313 | ||
285 | /* open file */ | 314 | /* open file */ |