summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBarry Wardell <rockbox@barrywardell.net>2007-03-14 13:51:05 +0000
committerBarry Wardell <rockbox@barrywardell.net>2007-03-14 13:51:05 +0000
commit12df774d9f0093f614df6698231bdeb71934d416 (patch)
treec37009aa5aef8a56d59c3d0d745aa9d923d6a961
parent9d264806e87b4ded6b5fd88b14998e7311a8d53f (diff)
downloadrockbox-12df774d9f0093f614df6698231bdeb71934d416.tar.gz
rockbox-12df774d9f0093f614df6698231bdeb71934d416.zip
Add support for scramble to put a 4 character string indicating binary type and the 4 character model id at the end of the mi4 header.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@12760 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--tools/mi4.c8
-rw-r--r--tools/mi4.h3
-rw-r--r--tools/scramble.c53
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
105int mi4_encode(char *iname, char *oname, int version, int magic) 105int 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
26int mi4_encode(char *iname, char *oname, int version, int magic); 26int 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 */