diff options
Diffstat (limited to 'tools/scramble.c')
-rw-r--r-- | tools/scramble.c | 35 |
1 files changed, 32 insertions, 3 deletions
diff --git a/tools/scramble.c b/tools/scramble.c index 3be92d0605..3d7970c9f9 100644 --- a/tools/scramble.c +++ b/tools/scramble.c | |||
@@ -22,6 +22,26 @@ | |||
22 | 22 | ||
23 | #include "iriver.h" | 23 | #include "iriver.h" |
24 | 24 | ||
25 | enum | ||
26 | { | ||
27 | ARCHOS_PLAYER, | ||
28 | ARCHOS_V1RECORDER, | ||
29 | ARCHOS_V2RECORDER, | ||
30 | ARCHOS_FMRECORDER, | ||
31 | ARCHOS_ONDIO_SP, | ||
32 | ARCHOS_ONDIO_FM | ||
33 | }; | ||
34 | |||
35 | int size_limit[] = | ||
36 | { | ||
37 | 0x32000, /* ARCHOS_PLAYER */ | ||
38 | 0x32000, /* ARCHOS_V1RECORDER */ | ||
39 | 0x64000, /* ARCHOS_V2RECORDER */ | ||
40 | 0x64000, /* ARCHOS_FMRECORDER */ | ||
41 | 0x64000, /* ARCHOS_ONDIO_SP */ | ||
42 | 0x64000 /* ARCHOS_ONDIO_FM */ | ||
43 | }; | ||
44 | |||
25 | void int2le(unsigned int val, unsigned char* addr) | 45 | void int2le(unsigned int val, unsigned char* addr) |
26 | { | 46 | { |
27 | addr[0] = val & 0xFF; | 47 | addr[0] = val & 0xFF; |
@@ -71,8 +91,11 @@ int main (int argc, char** argv) | |||
71 | int version; | 91 | int version; |
72 | unsigned long irivernum; | 92 | unsigned long irivernum; |
73 | char irivermodel[5]; | 93 | char irivermodel[5]; |
94 | int model_id; | ||
74 | enum { none, scramble, xor, add } method = scramble; | 95 | enum { none, scramble, xor, add } method = scramble; |
75 | 96 | ||
97 | model_id = ARCHOS_PLAYER; | ||
98 | |||
76 | if (argc < 3) { | 99 | if (argc < 3) { |
77 | usage(); | 100 | usage(); |
78 | } | 101 | } |
@@ -82,6 +105,7 @@ int main (int argc, char** argv) | |||
82 | iname = argv[2]; | 105 | iname = argv[2]; |
83 | oname = argv[3]; | 106 | oname = argv[3]; |
84 | version = 4; | 107 | version = 4; |
108 | model_id = ARCHOS_FMRECORDER; | ||
85 | } | 109 | } |
86 | 110 | ||
87 | else if(!strcmp(argv[1], "-v2")) { | 111 | else if(!strcmp(argv[1], "-v2")) { |
@@ -89,6 +113,7 @@ int main (int argc, char** argv) | |||
89 | iname = argv[2]; | 113 | iname = argv[2]; |
90 | oname = argv[3]; | 114 | oname = argv[3]; |
91 | version = 2; | 115 | version = 2; |
116 | model_id = ARCHOS_V2RECORDER; | ||
92 | } | 117 | } |
93 | 118 | ||
94 | else if(!strcmp(argv[1], "-ofm")) { | 119 | else if(!strcmp(argv[1], "-ofm")) { |
@@ -96,6 +121,7 @@ int main (int argc, char** argv) | |||
96 | iname = argv[2]; | 121 | iname = argv[2]; |
97 | oname = argv[3]; | 122 | oname = argv[3]; |
98 | version = 8; | 123 | version = 8; |
124 | model_id = ARCHOS_ONDIO_FM; | ||
99 | } | 125 | } |
100 | 126 | ||
101 | else if(!strcmp(argv[1], "-osp")) { | 127 | else if(!strcmp(argv[1], "-osp")) { |
@@ -103,6 +129,7 @@ int main (int argc, char** argv) | |||
103 | iname = argv[2]; | 129 | iname = argv[2]; |
104 | oname = argv[3]; | 130 | oname = argv[3]; |
105 | version = 16; | 131 | version = 16; |
132 | model_id = ARCHOS_ONDIO_SP; | ||
106 | } | 133 | } |
107 | 134 | ||
108 | else if(!strcmp(argv[1], "-neo")) { | 135 | else if(!strcmp(argv[1], "-neo")) { |
@@ -164,12 +191,14 @@ int main (int argc, char** argv) | |||
164 | length = ftell(file); | 191 | length = ftell(file); |
165 | length = (length + 3) & ~3; /* Round up to nearest 4 byte boundary */ | 192 | length = (length + 3) & ~3; /* Round up to nearest 4 byte boundary */ |
166 | 193 | ||
167 | if ((method == scramble) && ((length + headerlen) >= 0x32000)) { | 194 | if ((method == scramble) && |
168 | printf("error: max firmware size is 200KB!\n"); | 195 | ((length + headerlen) >= size_limit[model_id])) { |
196 | printf("error: max firmware size is %dKB!\n", | ||
197 | size_limit[model_id]/1024); | ||
169 | fclose(file); | 198 | fclose(file); |
170 | return -1; | 199 | return -1; |
171 | } | 200 | } |
172 | 201 | ||
173 | fseek(file,0,SEEK_SET); | 202 | fseek(file,0,SEEK_SET); |
174 | inbuf = malloc(length); | 203 | inbuf = malloc(length); |
175 | if (method == xor) | 204 | if (method == xor) |